1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski import java.util.Vector;
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski // __________ Implementation __________
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski /**
29*b1cdbd2cSJim Jagielski  * It's not allowed to call synchronoues back inside an oneway interface call.
30*b1cdbd2cSJim Jagielski  * (see IOnewayLink too). So we start a thread (implemented by this class), which
31*b1cdbd2cSJim Jagielski  * gets all neccessary parameters from the original called object and
32*b1cdbd2cSJim Jagielski  * call it back later inside his run() method. So the execution of such oneway call
33*b1cdbd2cSJim Jagielski  * will be asynchronous. It works in a generic way and can be used or any type
34*b1cdbd2cSJim Jagielski  * of oneway request. Because the source and the target of this call-link knows,
35*b1cdbd2cSJim Jagielski  * which method was used and which parameters must be handled.
36*b1cdbd2cSJim Jagielski  *
37*b1cdbd2cSJim Jagielski  * @author     Andreas Schlüns
38*b1cdbd2cSJim Jagielski  * @created    17.07.2002 08:18
39*b1cdbd2cSJim Jagielski  */
40*b1cdbd2cSJim Jagielski class OnewayExecutor extends Thread
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski     // _______________________________
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski     /**
45*b1cdbd2cSJim Jagielski      * const
46*b1cdbd2cSJim Jagielski      * We define some request for some well known oneway interface
47*b1cdbd2cSJim Jagielski      * calls here too. So they mustn't be declared more then ones.
48*b1cdbd2cSJim Jagielski      * Of course it's not necessary to use it ... but why not :-)
49*b1cdbd2cSJim Jagielski      */
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski     public static final int     REQUEST_FRAMEACTION             = 1     ;
52*b1cdbd2cSJim Jagielski     public static final int     REQUEST_STATUSCHANGED           = 2     ;
53*b1cdbd2cSJim Jagielski     public static final int     REQUEST_ADDSTATUSLISTENER       = 3     ;
54*b1cdbd2cSJim Jagielski     public static final int     REQUEST_REMOVESTATUSLISTENER    = 4     ;
55*b1cdbd2cSJim Jagielski     public static final int     REQUEST_DISPATCH                = 5     ;
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski     public static final boolean ENCODE_PARAMS                   = true  ;
58*b1cdbd2cSJim Jagielski     public static final boolean DECODE_PARAMS                   = false ;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski     // _______________________________
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski     /**
63*b1cdbd2cSJim Jagielski      * @member  m_rLink     the object, which wish to be called back by this thread
64*b1cdbd2cSJim Jagielski      * @member  m_nRequest  describes the type of the original request (means the
65*b1cdbd2cSJim Jagielski      *                      called oneyway method)
66*b1cdbd2cSJim Jagielski      * @member  m_lParams   list of parameters of the original request
67*b1cdbd2cSJim Jagielski      */
68*b1cdbd2cSJim Jagielski     private IOnewayLink m_rLink     ;
69*b1cdbd2cSJim Jagielski     private int         m_nRequest  ;
70*b1cdbd2cSJim Jagielski     private Vector      m_lParams   ;
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski     // _______________________________
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski     /**
75*b1cdbd2cSJim Jagielski      * ctor
76*b1cdbd2cSJim Jagielski      * It's initialize this thread with all neccessary parameters.
77*b1cdbd2cSJim Jagielski      * It gets the object, which wish to be called back and the type
78*b1cdbd2cSJim Jagielski      * and parameters of the original request.
79*b1cdbd2cSJim Jagielski      *
80*b1cdbd2cSJim Jagielski      * @param nRequest
81*b1cdbd2cSJim Jagielski      *          The two user of this callback can define an unique number,
82*b1cdbd2cSJim Jagielski      *          which identify the type of original interface method.
83*b1cdbd2cSJim Jagielski      *          So the called interface object can decide, which action will be
84*b1cdbd2cSJim Jagielski      *          neccessary.
85*b1cdbd2cSJim Jagielski      *
86*b1cdbd2cSJim Jagielski      * @param lParams
87*b1cdbd2cSJim Jagielski      *          If the original method used parameters, they will be coded here in
88*b1cdbd2cSJim Jagielski      *          a generic way. Only the called interface object know (it depends
89*b1cdbd2cSJim Jagielski      *          from the original request - see nRequest too), how this list must
90*b1cdbd2cSJim Jagielski      *          be interpreted.
91*b1cdbd2cSJim Jagielski      *          Note: Atomic types (e.g. int, long) will be transported as objects
92*b1cdbd2cSJim Jagielski      *          too (Integer, Long)!
93*b1cdbd2cSJim Jagielski      */
OnewayExecutor( IOnewayLink rLink , int nRequest , Vector lParams )94*b1cdbd2cSJim Jagielski     public OnewayExecutor( IOnewayLink rLink    ,
95*b1cdbd2cSJim Jagielski                            int         nRequest ,
96*b1cdbd2cSJim Jagielski                            Vector      lParams  )
97*b1cdbd2cSJim Jagielski     {
98*b1cdbd2cSJim Jagielski         m_rLink    = rLink   ;
99*b1cdbd2cSJim Jagielski         m_nRequest = nRequest;
100*b1cdbd2cSJim Jagielski         m_lParams  = lParams ;
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski         if (m_rLink==null)
103*b1cdbd2cSJim Jagielski             System.out.println("ctor ... m_rLink == null");
104*b1cdbd2cSJim Jagielski         if (m_lParams==null)
105*b1cdbd2cSJim Jagielski             System.out.println("ctor ... m_lParams == null");
106*b1cdbd2cSJim Jagielski     }
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski     // _______________________________
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski     /**
111*b1cdbd2cSJim Jagielski      * implements the thread function
112*b1cdbd2cSJim Jagielski      * Here we call the internal set link object back and
113*b1cdbd2cSJim Jagielski      * give him all neccessary parameters.
114*b1cdbd2cSJim Jagielski      * After that we die by ouerself ...
115*b1cdbd2cSJim Jagielski      */
run()116*b1cdbd2cSJim Jagielski     public void run()
117*b1cdbd2cSJim Jagielski     {
118*b1cdbd2cSJim Jagielski         if (m_rLink==null)
119*b1cdbd2cSJim Jagielski             System.out.println("run ... m_rLink == null");
120*b1cdbd2cSJim Jagielski         if (m_lParams==null)
121*b1cdbd2cSJim Jagielski             System.out.println("run ... m_lParams == null");
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski         if (m_rLink!=null)
124*b1cdbd2cSJim Jagielski             m_rLink.execOneway( m_nRequest, m_lParams );
125*b1cdbd2cSJim Jagielski     }
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski     // _______________________________
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski     /**
130*b1cdbd2cSJim Jagielski      * static helper!
131*b1cdbd2cSJim Jagielski      * To make convertion of the generic parameter list to the original
132*b1cdbd2cSJim Jagielski      * one easier - you can use this helper methods. They know how suchlist
133*b1cdbd2cSJim Jagielski      * must be coded. It's not a must to use it - but you can ...
134*b1cdbd2cSJim Jagielski      */
codeFrameAction( boolean bEncode, Vector[] lParams, com.sun.star.frame.FrameActionEvent[] aAction)135*b1cdbd2cSJim Jagielski     public static void codeFrameAction(
136*b1cdbd2cSJim Jagielski         boolean bEncode, Vector[] lParams,
137*b1cdbd2cSJim Jagielski         com.sun.star.frame.FrameActionEvent[] aAction)
138*b1cdbd2cSJim Jagielski     {
139*b1cdbd2cSJim Jagielski         if (bEncode)
140*b1cdbd2cSJim Jagielski         {
141*b1cdbd2cSJim Jagielski             lParams[0] = new Vector(1);
142*b1cdbd2cSJim Jagielski             lParams[0].add( (Object)(aAction[0]) );
143*b1cdbd2cSJim Jagielski         }
144*b1cdbd2cSJim Jagielski         else
145*b1cdbd2cSJim Jagielski         {
146*b1cdbd2cSJim Jagielski             aAction[0] = (com.sun.star.frame.FrameActionEvent)
147*b1cdbd2cSJim Jagielski                 (lParams[0].elementAt(0));
148*b1cdbd2cSJim Jagielski         }
149*b1cdbd2cSJim Jagielski     }
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski     // _______________________________
152*b1cdbd2cSJim Jagielski 
codeStatusChanged( boolean bEncode, Vector[] lParams, com.sun.star.frame.FeatureStateEvent[] aStatus)153*b1cdbd2cSJim Jagielski     public static void codeStatusChanged(
154*b1cdbd2cSJim Jagielski         boolean bEncode, Vector[] lParams,
155*b1cdbd2cSJim Jagielski         com.sun.star.frame.FeatureStateEvent[] aStatus)
156*b1cdbd2cSJim Jagielski     {
157*b1cdbd2cSJim Jagielski         if (bEncode)
158*b1cdbd2cSJim Jagielski         {
159*b1cdbd2cSJim Jagielski             lParams[0] = new Vector(1);
160*b1cdbd2cSJim Jagielski             lParams[0].add( (Object)aStatus[0] );
161*b1cdbd2cSJim Jagielski         }
162*b1cdbd2cSJim Jagielski         else
163*b1cdbd2cSJim Jagielski         {
164*b1cdbd2cSJim Jagielski             aStatus[0] = (com.sun.star.frame.FeatureStateEvent)
165*b1cdbd2cSJim Jagielski                 (lParams[0].elementAt(0));
166*b1cdbd2cSJim Jagielski         }
167*b1cdbd2cSJim Jagielski     }
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski     // _______________________________
170*b1cdbd2cSJim Jagielski 
codeAddOrRemoveStatusListener( boolean bEncode, Vector[] lParams, com.sun.star.frame.XStatusListener[] xListener, com.sun.star.util.URL[] aURL)171*b1cdbd2cSJim Jagielski     public static void codeAddOrRemoveStatusListener(
172*b1cdbd2cSJim Jagielski         boolean bEncode, Vector[] lParams,
173*b1cdbd2cSJim Jagielski         com.sun.star.frame.XStatusListener[] xListener,
174*b1cdbd2cSJim Jagielski         com.sun.star.util.URL[] aURL)
175*b1cdbd2cSJim Jagielski     {
176*b1cdbd2cSJim Jagielski         if (bEncode)
177*b1cdbd2cSJim Jagielski         {
178*b1cdbd2cSJim Jagielski             lParams[0] = new Vector(2);
179*b1cdbd2cSJim Jagielski             lParams[0].add( (Object)xListener[0] );
180*b1cdbd2cSJim Jagielski             lParams[0].add( (Object)aURL[0]      );
181*b1cdbd2cSJim Jagielski         }
182*b1cdbd2cSJim Jagielski         else
183*b1cdbd2cSJim Jagielski         {
184*b1cdbd2cSJim Jagielski             xListener[0] = (com.sun.star.frame.XStatusListener)
185*b1cdbd2cSJim Jagielski                 (lParams[0].elementAt(0));
186*b1cdbd2cSJim Jagielski             aURL[0] = (com.sun.star.util.URL)(lParams[0].elementAt(1));
187*b1cdbd2cSJim Jagielski         }
188*b1cdbd2cSJim Jagielski     }
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski     // _______________________________
191*b1cdbd2cSJim Jagielski 
codeDispatch( boolean bEncode, Vector[] lParams, com.sun.star.util.URL[] aURL, com.sun.star.beans.PropertyValue[][] lArgs)192*b1cdbd2cSJim Jagielski     public static void codeDispatch(
193*b1cdbd2cSJim Jagielski         boolean bEncode, Vector[] lParams,
194*b1cdbd2cSJim Jagielski         com.sun.star.util.URL[] aURL,
195*b1cdbd2cSJim Jagielski         com.sun.star.beans.PropertyValue[][] lArgs)
196*b1cdbd2cSJim Jagielski     {
197*b1cdbd2cSJim Jagielski         if (bEncode)
198*b1cdbd2cSJim Jagielski         {
199*b1cdbd2cSJim Jagielski             int nLength = lArgs.length+1;
200*b1cdbd2cSJim Jagielski             int nPos    = 0;
201*b1cdbd2cSJim Jagielski             lParams[0] = new Vector(nLength);
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski             lParams[0].add( (Object)aURL[0] );
204*b1cdbd2cSJim Jagielski             --nLength;
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski             while (nLength>0)
207*b1cdbd2cSJim Jagielski             {
208*b1cdbd2cSJim Jagielski                 lParams[0].add( (Object)lArgs[0][nPos] );
209*b1cdbd2cSJim Jagielski                 --nLength;
210*b1cdbd2cSJim Jagielski                 ++nPos   ;
211*b1cdbd2cSJim Jagielski             }
212*b1cdbd2cSJim Jagielski         }
213*b1cdbd2cSJim Jagielski         else
214*b1cdbd2cSJim Jagielski         {
215*b1cdbd2cSJim Jagielski             int nLength = lParams[0].size()-1;
216*b1cdbd2cSJim Jagielski             int nPos    = 0;
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski             lArgs[0] = new com.sun.star.beans.PropertyValue[nLength];
219*b1cdbd2cSJim Jagielski             aURL[0]  = (com.sun.star.util.URL)(lParams[0].elementAt(0));
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski             while (nPos<nLength)
222*b1cdbd2cSJim Jagielski             {
223*b1cdbd2cSJim Jagielski                 lArgs[0][nPos] = (com.sun.star.beans.PropertyValue)
224*b1cdbd2cSJim Jagielski                     (lParams[0].elementAt(nPos+1));
225*b1cdbd2cSJim Jagielski                 ++nPos;
226*b1cdbd2cSJim Jagielski             }
227*b1cdbd2cSJim Jagielski         }
228*b1cdbd2cSJim Jagielski     }
229*b1cdbd2cSJim Jagielski }
230