summaryrefslogtreecommitdiff
path: root/odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/OnewayExecutor.java
diff options
context:
space:
mode:
Diffstat (limited to 'odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/OnewayExecutor.java')
-rw-r--r--odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/OnewayExecutor.java240
1 files changed, 240 insertions, 0 deletions
diff --git a/odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/OnewayExecutor.java b/odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/OnewayExecutor.java
new file mode 100644
index 000000000000..7d84d7c5fcca
--- /dev/null
+++ b/odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/OnewayExecutor.java
@@ -0,0 +1,240 @@
+/*************************************************************************
+ *
+ * The Contents of this file are made available subject to the terms of
+ * the BSD license.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Sun Microsystems, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *************************************************************************/
+
+import java.util.Vector;
+
+// __________ Implementation __________
+
+/**
+ * It's not allowed to call synchronoues back inside an oneway interface call.
+ * (see IOnewayLink too). So we start a thread (implemented by this class), which
+ * gets all neccessary parameters from the original called object and
+ * call it back later inside his run() method. So the execution of such oneway call
+ * will be asynchronous. It works in a generic way and can be used or any type
+ * of oneway request. Because the source and the target of this call-link knows,
+ * which method was used and which parameters must be handled.
+ *
+ * @author Andreas Schlüns
+ * @created 17.07.2002 08:18
+ */
+class OnewayExecutor extends Thread
+{
+ // _______________________________
+
+ /**
+ * const
+ * We define some request for some well known oneway interface
+ * calls here too. So they mustn't be declared more then ones.
+ * Of course it's not necessary to use it ... but why not :-)
+ */
+
+ public static final int REQUEST_FRAMEACTION = 1 ;
+ public static final int REQUEST_STATUSCHANGED = 2 ;
+ public static final int REQUEST_ADDSTATUSLISTENER = 3 ;
+ public static final int REQUEST_REMOVESTATUSLISTENER = 4 ;
+ public static final int REQUEST_DISPATCH = 5 ;
+
+ public static final boolean ENCODE_PARAMS = true ;
+ public static final boolean DECODE_PARAMS = false ;
+
+ // _______________________________
+
+ /**
+ * @member m_rLink the object, which wish to be called back by this thread
+ * @member m_nRequest describes the type of the original request (means the
+ * called oneyway method)
+ * @member m_lParams list of parameters of the original request
+ */
+ private IOnewayLink m_rLink ;
+ private int m_nRequest ;
+ private Vector m_lParams ;
+
+ // _______________________________
+
+ /**
+ * ctor
+ * It's initialize this thread with all neccessary parameters.
+ * It gets the object, which wish to be called back and the type
+ * and parameters of the original request.
+ *
+ * @param nRequest
+ * The two user of this callback can define an unique number,
+ * which identify the type of original interface method.
+ * So the called interface object can decide, which action will be
+ * neccessary.
+ *
+ * @param lParams
+ * If the original method used parameters, they will be coded here in
+ * a generic way. Only the called interface object know (it depends
+ * from the original request - see nRequest too), how this list must
+ * be interpreted.
+ * Note: Atomic types (e.g. int, long) will be transported as objects
+ * too (Integer, Long)!
+ */
+ public OnewayExecutor( IOnewayLink rLink ,
+ int nRequest ,
+ Vector lParams )
+ {
+ m_rLink = rLink ;
+ m_nRequest = nRequest;
+ m_lParams = lParams ;
+
+ if (m_rLink==null)
+ System.out.println("ctor ... m_rLink == null");
+ if (m_lParams==null)
+ System.out.println("ctor ... m_lParams == null");
+ }
+
+ // _______________________________
+
+ /**
+ * implements the thread function
+ * Here we call the internal set link object back and
+ * give him all neccessary parameters.
+ * After that we die by ouerself ...
+ */
+ public void run()
+ {
+ if (m_rLink==null)
+ System.out.println("run ... m_rLink == null");
+ if (m_lParams==null)
+ System.out.println("run ... m_lParams == null");
+
+ if (m_rLink!=null)
+ m_rLink.execOneway( m_nRequest, m_lParams );
+ }
+
+ // _______________________________
+
+ /**
+ * static helper!
+ * To make convertion of the generic parameter list to the original
+ * one easier - you can use this helper methods. They know how suchlist
+ * must be coded. It's not a must to use it - but you can ...
+ */
+ public static void codeFrameAction(
+ boolean bEncode, Vector[] lParams,
+ com.sun.star.frame.FrameActionEvent[] aAction)
+ {
+ if (bEncode)
+ {
+ lParams[0] = new Vector(1);
+ lParams[0].add( (Object)(aAction[0]) );
+ }
+ else
+ {
+ aAction[0] = (com.sun.star.frame.FrameActionEvent)
+ (lParams[0].elementAt(0));
+ }
+ }
+
+ // _______________________________
+
+ public static void codeStatusChanged(
+ boolean bEncode, Vector[] lParams,
+ com.sun.star.frame.FeatureStateEvent[] aStatus)
+ {
+ if (bEncode)
+ {
+ lParams[0] = new Vector(1);
+ lParams[0].add( (Object)aStatus[0] );
+ }
+ else
+ {
+ aStatus[0] = (com.sun.star.frame.FeatureStateEvent)
+ (lParams[0].elementAt(0));
+ }
+ }
+
+ // _______________________________
+
+ public static void codeAddOrRemoveStatusListener(
+ boolean bEncode, Vector[] lParams,
+ com.sun.star.frame.XStatusListener[] xListener,
+ com.sun.star.util.URL[] aURL)
+ {
+ if (bEncode)
+ {
+ lParams[0] = new Vector(2);
+ lParams[0].add( (Object)xListener[0] );
+ lParams[0].add( (Object)aURL[0] );
+ }
+ else
+ {
+ xListener[0] = (com.sun.star.frame.XStatusListener)
+ (lParams[0].elementAt(0));
+ aURL[0] = (com.sun.star.util.URL)(lParams[0].elementAt(1));
+ }
+ }
+
+ // _______________________________
+
+ public static void codeDispatch(
+ boolean bEncode, Vector[] lParams,
+ com.sun.star.util.URL[] aURL,
+ com.sun.star.beans.PropertyValue[][] lArgs)
+ {
+ if (bEncode)
+ {
+ int nLength = lArgs.length+1;
+ int nPos = 0;
+ lParams[0] = new Vector(nLength);
+
+ lParams[0].add( (Object)aURL[0] );
+ --nLength;
+
+ while (nLength>0)
+ {
+ lParams[0].add( (Object)lArgs[0][nPos] );
+ --nLength;
+ ++nPos ;
+ }
+ }
+ else
+ {
+ int nLength = lParams[0].size()-1;
+ int nPos = 0;
+
+ lArgs[0] = new com.sun.star.beans.PropertyValue[nLength];
+ aURL[0] = (com.sun.star.util.URL)(lParams[0].elementAt(0));
+
+ while (nPos<nLength)
+ {
+ lArgs[0][nPos] = (com.sun.star.beans.PropertyValue)
+ (lParams[0].elementAt(nPos+1));
+ ++nPos;
+ }
+ }
+ }
+}