summaryrefslogtreecommitdiffstats
path: root/tdehtml/java/org/kde/kjas/server/KJASProtocolHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'tdehtml/java/org/kde/kjas/server/KJASProtocolHandler.java')
-rw-r--r--tdehtml/java/org/kde/kjas/server/KJASProtocolHandler.java900
1 files changed, 900 insertions, 0 deletions
diff --git a/tdehtml/java/org/kde/kjas/server/KJASProtocolHandler.java b/tdehtml/java/org/kde/kjas/server/KJASProtocolHandler.java
new file mode 100644
index 000000000..f8b50a91d
--- /dev/null
+++ b/tdehtml/java/org/kde/kjas/server/KJASProtocolHandler.java
@@ -0,0 +1,900 @@
+package org.kde.kjas.server;
+
+import java.io.*;
+import java.util.*;
+import java.awt.*;
+import java.net.*;
+
+/**
+ * Encapsulates the KJAS protocol and manages the contexts
+ *
+ */
+public class KJASProtocolHandler
+{
+ // Command codes- always need to be synced up with
+ // what's in kjavaappletserver.cpp
+ private static final int CreateContextCode = 1;
+ private static final int DestroyContextCode = 2;
+ private static final int CreateAppletCode = 3;
+ private static final int DestroyAppletCode = 4;
+ private static final int StartAppletCode = 5;
+ private static final int StopAppletCode = 6;
+ private static final int InitAppletCode = 7;
+ private static final int ShowDocumentCode = 8;
+ private static final int ShowURLInFrameCode = 9;
+ private static final int ShowStatusCode = 10;
+ private static final int ResizeAppletCode = 11;
+ private static final int GetURLDataCode = 12;
+ private static final int URLDataCode = 13;
+ private static final int ShutdownServerCode = 14;
+ private static final int JavaScriptEvent = 15;
+ static final int GetMember = 16;
+ static final int CallMember = 17;
+ private static final int PutMember = 18;
+ private static final int DerefObject = 19;
+
+ private static final int AudioClipPlayCode = 20;
+ private static final int AudioClipLoopCode = 21;
+ private static final int AudioClipStopCode = 22;
+
+ private static final int AppletStateNotificationCode = 23;
+ private static final int AppletFailedCode = 24;
+ private static final int DataCommand = 25;
+ private static final int PutURLDataCode = 26;
+ private static final int PutDataCode = 27;
+ private static final int SecurityConfirmCode = 28;
+ private static final int ShowConsole = 29;
+
+ //Holds contexts in contextID-context pairs
+ private Hashtable contexts;
+
+ private PushbackInputStream commands; //Stream for reading in commands
+ private PrintStream signals; //Stream for writing out callbacks
+
+ //used for parsing each command as it comes in
+ private int cmd_index;
+ private final static char sep = (char) 0;
+
+ public KJASProtocolHandler( InputStream _commands,
+ OutputStream _signals )
+ {
+ commands = new PushbackInputStream( _commands );
+ signals = new PrintStream( _signals );
+ contexts = new Hashtable();
+ }
+
+ public void commandLoop()
+ {
+ try
+ {
+ while( true )
+ {
+ try
+ {
+ int cmd_length = readPaddedLength( 8 );
+ Main.debug( "PH: cmd_length = " + cmd_length );
+
+ //We need to have this while loop since we're not guaranteed to get
+ //all the bytes we want back, especially with large jars
+ byte[] cmd_data = new byte[cmd_length];
+ int total_read = 0;
+ while( total_read < cmd_length )
+ {
+ int numread = commands.read( cmd_data, total_read, cmd_length-total_read );
+ Main.debug( "PH: read in " + numread + " bytes for command" );
+ total_read += numread;
+ }
+
+ //parse the rest of the command and execute it
+ processCommand( cmd_data );
+ }
+ catch( NumberFormatException e )
+ {
+ Main.kjas_err( "Could not parse out message length", e );
+ e.printStackTrace();
+ System.exit( 1 );
+ }
+ catch( Throwable t )
+ {
+ Main.debug( "commandLoop caught a throwable, still going" );
+ t.printStackTrace();
+ }
+ }
+ }
+ catch( Exception i )
+ {
+ Main.kjas_err( "commandLoop exited on exception: ", i );
+ i.printStackTrace();
+ System.exit( 1 );
+ }
+ }
+
+ public void processCommand( byte[] command )
+ {
+ // Sanity checks
+ if ( command == null )
+ return;
+
+ //do all the parsing here and pass arguments as individual variables to the
+ //handler functions
+ int cmd_length = command.length;
+ cmd_index = 0;
+
+ int cmd_code_value = (int) command[cmd_index++];
+ if( cmd_code_value == CreateContextCode )
+ {
+ //parse out contextID- 1 argument
+ String contextID = getArg( command );
+ Main.debug( "createContext, id = " + contextID );
+
+ KJASAppletContext context = new KJASAppletContext( contextID );
+ contexts.put( contextID, context );
+ } else
+ if( cmd_code_value == DestroyContextCode )
+ {
+ //parse out contextID- 1 argument
+ String contextID = getArg( command );
+ Main.debug( "destroyContext, id = " + contextID );
+
+ KJASAppletContext context = (KJASAppletContext) contexts.get( contextID );
+ if( contexts != null )
+ {
+ context.destroy();
+ contexts.remove( contextID );
+ }
+ } else
+ if( cmd_code_value == CreateAppletCode )
+ {
+ //9 arguments- this order is important...
+ final String contextID = getArg( command );
+ final String appletID = getArg( command );
+ final String appletName = getArg( command );
+ final String className = getArg( command );
+ final String baseURL = getArg( command );
+ final String username = getArg( command );
+ final String password = getArg( command );
+ final String authname = getArg( command );
+ final String codeBase = getArg( command );
+ final String archives = getArg( command );
+ final String width = getArg( command );
+ final String height = getArg( command );
+ final String title = getArg( command );
+
+ //get the number of parameter pairs...
+ String str_params = getArg( command );
+ int num_params = Integer.parseInt( str_params.trim() );
+ final Hashtable params = new Hashtable();
+ for( int i = 0; i < num_params; i++ )
+ {
+ String name = getArg( command ); // note name is in uppercase
+ if( name == null )
+ name = new String();
+
+ String value = getArg( command );
+ if( value == null )
+ value = new String();
+ params.put( name, value );
+ //Main.debug( "parameter, name = " + name + ", value = " + value );
+ }
+
+ Main.debug( "createApplet, context = " + contextID + ", applet = " + appletID );
+ Main.debug( " name = " + appletName + ", classname = " + className );
+ Main.debug( " baseURL = " + baseURL + ", codeBase = " + codeBase );
+ Main.debug( " archives = " + archives + ", width = " + width +
+ ", height = " + height );
+
+ final KJASAppletContext context = (KJASAppletContext) contexts.get( contextID );
+ if( context != null )
+ {
+ context.createApplet( appletID, appletName, className,
+ baseURL, username, password, authname,
+ codeBase, archives,
+ width, height, title, params );
+ }
+
+ } else
+ if( cmd_code_value == DestroyAppletCode )
+ {
+ //2 arguments
+ String contextID = getArg( command );
+ String appletID = getArg( command );
+ Main.debug( "destroyApplet, context = " + contextID + ", applet = " + appletID );
+
+ KJASAppletContext context = (KJASAppletContext) contexts.get( contextID );
+ if ( context != null )
+ context.destroyApplet( appletID );
+ } else
+ if( cmd_code_value == StartAppletCode )
+ {
+ //2 arguments
+ String contextID = getArg( command );
+ String appletID = getArg( command );
+ Main.debug( "startApplet, context = " + contextID + ", applet = " + appletID );
+
+ KJASAppletContext context = (KJASAppletContext) contexts.get( contextID );
+ if ( context != null )
+ context.startApplet( appletID );
+ } else
+ if( cmd_code_value == StopAppletCode )
+ {
+ //2 arguments
+ String contextID = getArg( command );
+ String appletID = getArg( command );
+ Main.debug( "stopApplet, context = " + contextID + ", applet = " + appletID );
+
+ KJASAppletContext context = (KJASAppletContext) contexts.get( contextID );
+ if ( context != null )
+ context.stopApplet( appletID );
+ } else
+ if( cmd_code_value == ShutdownServerCode )
+ {
+ Main.debug( "shutDownServer received" );
+ KJASAppletStub.waitForAppletThreads();
+ System.exit( 1 );
+ }
+ else
+ if( cmd_code_value == URLDataCode )
+ {
+
+ String id = getArg( command );
+ String code = getArg( command );
+ Main.debug( "KIO URLData received(" + id + ") code:" + code );
+
+ //rest of the command should be the data...
+ byte[] data = null;
+ if (cmd_length - cmd_index > 0) {
+ data = new byte[ cmd_length - cmd_index ];
+ System.arraycopy( command, cmd_index, data, 0, data.length );
+ }
+ KIOConnection.setData(id, Integer.parseInt(code), data);
+ } else
+ if (cmd_code_value == GetMember)
+ {
+ int ticketnr = Integer.parseInt( getArg( command ) );
+ String contextID = getArg( command );
+ String appletID = getArg( command );
+ int objid = Integer.parseInt( getArg( command ) );
+ String name = getArg( command );
+ KJASAppletContext context = (KJASAppletContext) contexts.get( contextID );
+ if ( context == null || !context.getMember(appletID, ticketnr, objid, name))
+ sendMemberValue(contextID, GetMember, ticketnr, -1, 0, "");
+ } else
+ if (cmd_code_value == PutMember)
+ {
+ int ticketnr = Integer.parseInt( getArg( command ) );
+ String contextID = getArg( command );
+ String appletID = getArg( command );
+ int objid = Integer.parseInt( getArg( command ) );
+ String name = getArg( command );
+ String value = getArg( command );
+ boolean ret = false;
+ KJASAppletContext context = (KJASAppletContext) contexts.get( contextID );
+ if (context == null || !context.putMember(appletID, ticketnr, objid, name, value))
+ sendPutMember(contextID, ticketnr, false);
+ } else
+ if (cmd_code_value == CallMember)
+ {
+ int ticketnr = Integer.parseInt( getArg( command ) );
+ String contextID = getArg( command );
+ String appletID = getArg( command );
+ int objid = Integer.parseInt( getArg( command ) );
+ String name = getArg( command );
+ int arg_count = Integer.parseInt( getArg( command ) );
+ java.util.List args = new java.util.Vector();
+ try { // fix getArg
+ String param = getArg(command);
+ while (arg_count-- > 0) {
+ if (param == null)
+ param = new String();
+ args.add(param);
+ param = getArg(command);
+ }
+ } catch (Exception e) {}
+
+ KJASAppletContext context = (KJASAppletContext) contexts.get( contextID );
+ if ( context == null || !context.callMember(appletID, ticketnr, objid, name, args))
+ Main.protocol.sendMemberValue(contextID, CallMember, ticketnr, -1, 0, "");
+ } else
+ if (cmd_code_value == DerefObject)
+ {
+ String contextID = getArg( command );
+ String appletID = getArg( command );
+ String objid = getArg( command );
+ KJASAppletContext context = (KJASAppletContext) contexts.get( contextID );
+ if ( context != null )
+ context.derefObject(appletID, Integer.parseInt(objid));
+ Main.debug( "DerefObject " + objid);
+ } else
+ if (cmd_code_value == SecurityConfirmCode)
+ {
+ String id = getArg( command );
+ String confirm = getArg( command );
+ Thread t = (Thread) KJASSecurityManager.confirmRequests.get(id);
+ Main.debug( "SecurityConfirmCode " + id + " confirm:" + confirm );
+ if (t != null) {
+ KJASSecurityManager.confirmRequests.put(id, confirm);
+ try {
+ t.interrupt();
+ } catch (SecurityException se) {}
+ }
+ } else
+ if (cmd_code_value == ShowConsole)
+ {
+ Main.console.setVisible(true);
+ }
+ else
+ {
+ throw new IllegalArgumentException( "Unknown command code" );
+ }
+ }
+
+ /**************************************************************
+ ***** Methods for talking to the applet server **************
+ **************************************************************/
+
+ /**
+ * sends get url request
+ */
+ public void sendGetURLDataCmd( String jobid, String url )
+ {
+ Main.debug( "sendGetURLCmd(" + jobid + ") url = " + url );
+ //length = length of args plus 1 for code, 2 for seps and 1 for end
+ byte [] url_bytes = url.getBytes();
+ int length = jobid.length() + url_bytes.length + 4;
+ byte [] bytes = new byte[ length + 8 ];
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) GetURLDataCode;
+ bytes[index++] = sep;
+
+ tmp_bytes = jobid.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( url_bytes, 0, bytes, index, url_bytes.length );
+ index += url_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+
+ /**
+ * sends command for get url request (stop/hold/resume) or put (stop)
+ */
+ public void sendDataCmd( String id, int cmd )
+ {
+ Main.debug( "sendDataCmd(" + id + ") command = " + cmd );
+ byte [] cmd_bytes = String.valueOf( cmd ).getBytes();
+ int length = id.length() + cmd_bytes.length + 4;
+ byte [] bytes = new byte[ length + 8 ];
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) DataCommand;
+ bytes[index++] = sep;
+
+ tmp_bytes = id.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( cmd_bytes, 0, bytes, index, cmd_bytes.length );
+ index += cmd_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+ /**
+ * sends put url request
+ */
+ public void sendPutURLDataCmd( String jobid, String url )
+ {
+ Main.debug( "sendPutURLCmd(" + jobid + ") url = " + url );
+ //length = length of args plus 1 for code, 2 for seps and 1 for end
+ byte [] url_bytes = url.getBytes();
+ int length = jobid.length() + url_bytes.length + 4;
+ byte [] bytes = new byte[ length + 8 ];
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) PutURLDataCode;
+ bytes[index++] = sep;
+
+ tmp_bytes = jobid.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( url_bytes, 0, bytes, index, url_bytes.length );
+ index += url_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+ /**
+ * sends put data
+ */
+ public void sendPutData( String jobid, byte [] b, int off, int len )
+ {
+ Main.debug( "sendPutData(" + jobid + ") len = " + len );
+ //length = length of args plus 1 for code, 2 for seps and 1 for end
+ int length = jobid.length() + len + 4;
+ byte [] bytes = new byte[ length + 8 ];
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) PutDataCode;
+ bytes[index++] = sep;
+
+ tmp_bytes = jobid.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( b, off, bytes, index, len );
+ index += len;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+ /**
+ * sends notification about the state of the applet.
+ * @see org.kde.kjas.server.KJASAppletStub for valid states
+ */
+ public void sendAppletStateNotification( String contextID, String appletID, int state )
+ {
+ Main.debug( "sendAppletStateNotification, contextID = " + contextID + ", appletID = " +
+ appletID + ", state=" + state );
+
+ byte [] state_bytes = String.valueOf( state ).getBytes();
+
+ int length = contextID.length() + appletID.length() + state_bytes.length + 5;
+ byte [] bytes = new byte[ length + 8 ]; //for length of message
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) AppletStateNotificationCode;
+ bytes[index++] = sep;
+
+ tmp_bytes = contextID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ tmp_bytes = appletID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( state_bytes, 0, bytes, index, state_bytes.length );
+ index += state_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+
+ /**
+ * sends notification about applet failure.
+ * This can happen in any state.
+ * @param contextID context ID of the applet's context
+ * @param appletID ID of the applet
+ * @param errorMessage any message
+ */
+ public void sendAppletFailed ( String contextID, String appletID, String errorMessage)
+ {
+ Main.debug( "sendAppletFailed, contextID = " + contextID + ", appletID = " +
+ appletID + ", errorMessage=" + errorMessage );
+ byte [] msg_bytes = errorMessage.getBytes();
+ int length = contextID.length() + appletID.length() + msg_bytes.length + 5;
+ byte [] bytes = new byte[ length + 8 ]; //for length of message
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) AppletFailedCode;
+ bytes[index++] = sep;
+
+ tmp_bytes = contextID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ tmp_bytes = appletID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( msg_bytes, 0, bytes, index, msg_bytes.length );
+ index += msg_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+
+ public void sendShowDocumentCmd( String loaderKey, String url )
+ {
+ Main.debug( "sendShowDocumentCmd from context#" + loaderKey + " url = " + url );
+
+ //length = length of args + 2 for seps + 1 for end + 1 for code
+ byte [] url_bytes = url.getBytes();
+ byte [] key_bytes = loaderKey.getBytes();
+ int length = key_bytes.length + url_bytes.length + 4;
+ byte [] bytes = new byte[ length + 8 ]; //8 for the length of this message
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) ShowDocumentCode;
+ bytes[index++] = sep;
+
+ System.arraycopy( key_bytes, 0, bytes, index, key_bytes.length );
+ index += key_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( url_bytes, 0, bytes, index, url_bytes.length );
+ index += url_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+
+ public void sendShowDocumentCmd( String contextID, String url, String frame)
+ {
+ Main.debug( "sendShowDocumentCmd from context#" + contextID +
+ " url = " + url + ", frame = " + frame );
+
+ //length = length of args plus code, 3 seps, end
+ byte [] url_bytes = url.getBytes();
+ byte [] frame_bytes = frame.getBytes();
+ int length = contextID.length() + url_bytes.length + frame_bytes.length + 5;
+ byte [] bytes = new byte[ length + 8 ]; //for length of message
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) ShowURLInFrameCode;
+ bytes[index++] = sep;
+
+ tmp_bytes = contextID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( url_bytes, 0, bytes, index, url_bytes.length );
+ index += url_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( frame_bytes, 0, bytes, index, frame_bytes.length );
+ index += frame_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+
+ public void sendShowStatusCmd( String contextID, String msg )
+ {
+ Main.debug( "sendShowStatusCmd, contextID = " + contextID + " msg = " + msg );
+
+ byte [] msg_bytes = msg.getBytes();
+ int length = contextID.length() + msg_bytes.length + 4;
+ byte [] bytes = new byte[ length + 8 ]; //for length of message
+ int index = 0;
+
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) ShowStatusCode;
+ bytes[index++] = sep;
+
+ tmp_bytes = contextID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( msg_bytes, 0, bytes, index, msg_bytes.length );
+ index += msg_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+
+ public void sendResizeAppletCmd( String contextID, String appletID,
+ int width, int height )
+ {
+ Main.debug( "sendResizeAppletCmd, contextID = " + contextID + ", appletID = " +
+ appletID + ", width = " + width + ", height = " + height );
+
+ byte [] width_bytes = String.valueOf( width ).getBytes();
+ byte [] height_bytes = String.valueOf( height ).getBytes();
+
+ //length = length of args plus code, 4 seps, end
+ int length = contextID.length() + appletID.length() + width_bytes.length +
+ height_bytes.length + 6;
+ byte [] bytes = new byte[ length + 8 ]; //for length of message
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) ResizeAppletCode;
+ bytes[index++] = sep;
+
+ tmp_bytes = contextID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ tmp_bytes = appletID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( width_bytes, 0, bytes, index, width_bytes.length );
+ index += width_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( height_bytes, 0, bytes, index, height_bytes.length );
+ index += height_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+ public void sendJavaScriptEventCmd( String contextID, String appletID, int objid, String event, int [] types, String [] args )
+ {
+ Main.debug( "sendJavaScriptEventCmd, contextID = " + contextID + " event = " + event );
+ String objstr = new String("" + objid);
+ int length = contextID.length() + appletID.length() + event.length() + objstr.length() + 6;
+ byte [][][] arglist = null;
+ if (types != null) {
+ arglist = new byte[args.length][2][];
+ for (int i = 0; i < types.length; i++) {
+ arglist[i][0] = (new String("" + types[i])).getBytes();
+ arglist[i][1] = args[i].getBytes();
+ length += 2 + arglist[i][0].length + arglist[i][1].length;
+ }
+ }
+ byte [] bytes = new byte[ length + 8 ]; //for length of message
+ int index = 0;
+
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) JavaScriptEvent;
+ bytes[index++] = sep;
+
+ tmp_bytes = contextID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ tmp_bytes = appletID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ tmp_bytes = objstr.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ tmp_bytes = event.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ if (types != null)
+ for (int i = 0; i < types.length; i++) {
+ System.arraycopy( arglist[i][0], 0, bytes, index, arglist[i][0].length );
+ index += arglist[i][0].length;
+ bytes[index++] = sep;
+ System.arraycopy( arglist[i][1], 0, bytes, index, arglist[i][1].length );
+ index += arglist[i][1].length;
+ bytes[index++] = sep;
+ }
+
+ signals.write( bytes, 0, bytes.length );
+ }
+ public void sendMemberValue( String contextID, int cmd, int ticketnr, int type, int rid, String value )
+ {
+ Main.debug( "sendMemberValue, contextID = " + contextID + " value = " + value + " type=" + type + " rid=" + rid );
+
+ String strticket = String.valueOf( ticketnr );
+ String strtype = String.valueOf( type );
+ String strobj = String.valueOf( rid );
+ byte [] value_bytes = value.getBytes();
+ int length = contextID.length() + value_bytes.length + strtype.length() + strobj.length() + strticket.length() + 7;
+ byte [] bytes = new byte[ length + 8 ]; //for length of message
+ int index = 0;
+
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) cmd;
+ bytes[index++] = sep;
+
+ tmp_bytes = contextID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ tmp_bytes = strticket.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ tmp_bytes = strtype.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ tmp_bytes = strobj.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( value_bytes, 0, bytes, index, value_bytes.length );
+ index += value_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+
+ private void sendAudioClipCommand(String contextId, String url, int cmd) {
+ byte [] url_bytes = url.getBytes();
+ int length = contextId.length() + url_bytes.length + 4;
+ byte [] bytes = new byte[ length + 8 ];
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) cmd;
+ bytes[index++] = sep;
+
+ tmp_bytes = contextId.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( url_bytes, 0, bytes, index, url_bytes.length );
+ index += url_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+
+ public void sendAudioClipPlayCommand(String contextId, String url) {
+ sendAudioClipCommand(contextId, url, AudioClipPlayCode);
+ }
+ public void sendAudioClipLoopCommand(String contextId, String url) {
+ sendAudioClipCommand(contextId, url, AudioClipLoopCode);
+ }
+ public void sendAudioClipStopCommand(String contextId, String url) {
+ sendAudioClipCommand(contextId, url, AudioClipStopCode);
+ }
+
+ public void sendPutMember( String contextID, int ticketnr, boolean success )
+ {
+ Main.debug("sendPutMember, contextID = " + contextID + " success = " + success);
+
+ byte [] ticket_bytes = String.valueOf( ticketnr ).getBytes();
+ byte [] ret_bytes = String.valueOf( success ? "1" : "0" ).getBytes();
+ int length = contextID.length() + ret_bytes.length + ticket_bytes.length + 5;
+ byte [] bytes = new byte[ length + 8 ]; //for length of message
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) PutMember;
+ bytes[index++] = sep;
+
+ tmp_bytes = contextID.getBytes();
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( ticket_bytes, 0, bytes, index, ticket_bytes.length );
+ index += ticket_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( ret_bytes, 0, bytes, index, ret_bytes.length );
+ index += ret_bytes.length;
+ bytes[index++] = sep;
+
+ signals.write( bytes, 0, bytes.length );
+ }
+ public void sendSecurityConfirm( String [] certs, int certsnr, String perm, String id )
+ {
+ Main.debug("sendSecurityConfirm, ID = " + id + " certsnr = " + certsnr);
+
+ byte [] id_bytes = id.getBytes();
+ byte [] perm_bytes = perm.getBytes();
+ byte [] certsnr_bytes = String.valueOf( certsnr ).getBytes();
+ int length = perm_bytes.length + id_bytes.length + certsnr_bytes.length + 5;
+ for (int i = 0; i < certsnr; i++)
+ length += certs[i].length() + 1;
+ byte [] bytes = new byte[ length + 8 ]; //for length of message
+ byte [] tmp_bytes = getPaddedLengthBytes( length );
+ int index = 0;
+
+ System.arraycopy( tmp_bytes, 0, bytes, index, tmp_bytes.length );
+ index += tmp_bytes.length;
+ bytes[index++] = (byte) SecurityConfirmCode;
+ bytes[index++] = sep;
+
+ System.arraycopy( id_bytes, 0, bytes, index, id_bytes.length );
+ index += id_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( perm_bytes, 0, bytes, index, perm_bytes.length );
+ index += perm_bytes.length;
+ bytes[index++] = sep;
+
+ System.arraycopy( certsnr_bytes, 0, bytes, index, certsnr_bytes.length );
+ index += certsnr_bytes.length;
+ bytes[index++] = sep;
+
+ for (int i = 0; i < certsnr; i++) {
+ byte [] cert_bytes = certs[i].getBytes();
+ System.arraycopy( cert_bytes, 0, bytes, index, cert_bytes.length );
+ index += cert_bytes.length;
+ bytes[index++] = sep;
+ }
+
+ signals.write( bytes, 0, bytes.length );
+ }
+ /**************************************************************
+ ***** Utility functions for parsing commands ****************
+ **************************************************************/
+ private String getArg( byte[] command )
+ {
+ int begin = cmd_index;
+ while( 0 != ((int) command[cmd_index++]) );
+
+ if( cmd_index > (begin + 1) )
+ {
+ String rval = new String( command, begin, (cmd_index - begin - 1) );
+ return rval;
+ }
+ else
+ return null;
+ }
+
+ private byte[] getPaddedLengthBytes( int length )
+ {
+ byte[] length_bytes = String.valueOf( length ).getBytes();
+ if( length_bytes.length > 8 )
+ throw new IllegalArgumentException( "can't create string number of length = 8" );
+ byte [] bytes = { (byte) ' ', (byte) ' ', (byte) ' ', (byte) ' ',
+ (byte) ' ', (byte) ' ', (byte) ' ', (byte) ' '};
+ System.arraycopy( length_bytes, 0, bytes, 0, length_bytes.length );
+ return bytes;
+ }
+ private int readPaddedLength( int string_size )
+ throws IOException
+ {
+ //read in 8 bytes for command length- length will be sent as a padded string
+ byte[] length = new byte[string_size];
+ commands.read( length, 0, string_size );
+
+ String length_str = new String( length );
+ return Integer.parseInt( length_str.trim() );
+ }
+
+}