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