summaryrefslogtreecommitdiffstats
path: root/tdehtml/java/org/kde/kjas/server/KJASAppletContext.java
diff options
context:
space:
mode:
Diffstat (limited to 'tdehtml/java/org/kde/kjas/server/KJASAppletContext.java')
-rw-r--r--tdehtml/java/org/kde/kjas/server/KJASAppletContext.java473
1 files changed, 473 insertions, 0 deletions
diff --git a/tdehtml/java/org/kde/kjas/server/KJASAppletContext.java b/tdehtml/java/org/kde/kjas/server/KJASAppletContext.java
new file mode 100644
index 000000000..f868b7b64
--- /dev/null
+++ b/tdehtml/java/org/kde/kjas/server/KJASAppletContext.java
@@ -0,0 +1,473 @@
+package org.kde.kjas.server;
+
+import java.applet.*;
+import java.util.*;
+import java.net.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import org.kde.javascript.JSObject;
+
+final class KJASAuthenticator extends Authenticator {
+ private Hashtable authentication;
+
+ KJASAuthenticator() {
+ authentication = new Hashtable();
+ setDefault(this);
+ }
+ final void addURL(URL url, String user, String password, String authname) {
+ String key = new String(url.getProtocol() + ":" + url.getHost() + ":" +
+ url.getPort() + "_" + authname);
+ String [] auths = { user, password };
+ authentication.put(key, auths);
+ }
+ final protected PasswordAuthentication getPasswordAuthentication() {
+ URL url;
+ String key = new String(getRequestingProtocol() + ":" + getRequestingHost() + ":" + getRequestingPort() + "_" + getRequestingPrompt());
+ String [] auths = (String []) authentication.get(key);
+ if (auths != null) {
+ char [] pw = new char[auths[1].length()];
+ auths[1].getChars(0, auths[1].length(), pw, 0);
+ return new PasswordAuthentication(auths[0], pw);
+ }
+ return null;
+ }
+}
+
+/**
+ * The context in which applets live.
+ */
+public class KJASAppletContext implements AppletContext
+{
+ private Hashtable stubs;
+ private Hashtable images;
+ private Vector pendingImages;
+ private Hashtable streams;
+ private Stack jsobjects;
+
+ private String myID;
+ private KJASAppletClassLoader loader;
+ private boolean active;
+ private final static KJASAuthenticator authenticator = new KJASAuthenticator();
+
+ /**
+ * Create a KJASAppletContext
+ */
+ public KJASAppletContext( String _contextID )
+ {
+ stubs = new Hashtable();
+ images = new Hashtable();
+ pendingImages = new Vector();
+ streams = new Hashtable();
+ jsobjects = new Stack();
+ myID = _contextID;
+ active = true;
+ }
+
+ public String getID()
+ {
+ return myID;
+ }
+
+ public String getAppletID(Applet applet)
+ {
+ Enumeration e = stubs.keys();
+ while ( e.hasMoreElements() )
+ {
+ String appletID = (String) e.nextElement();
+ KJASAppletStub stub = (KJASAppletStub) stubs.get(appletID);
+ if (stub.getApplet() == applet)
+ return appletID;
+ }
+ return null;
+ }
+
+ public Applet getAppletById(String appletId) {
+ return ((KJASAppletStub) stubs.get( appletId )).getApplet();
+ }
+
+ public String getAppletName(String appletID) {
+ KJASAppletStub stub = (KJASAppletStub) stubs.get(appletID);
+ if (stub == null)
+ return null;
+ return stub.getAppletName();
+ }
+ public void createApplet( String appletID, String name,
+ String className, String docBase,
+ String username, String password, String authname,
+ String codeBase, String archives,
+ String width, String height,
+ String windowName, Hashtable params )
+ {
+ //do kludges to support mess with parameter table and
+ //the applet variables
+ String key = new String( "ARCHIVE" );
+ if (params.containsKey(key)) {
+ String param_archive = (String)params.get(key);
+ if (archives == null) {
+ // There is no 'archive' attribute
+ // but a 'archive' param. fix archive list
+ // from param value
+ archives = param_archive;
+ } else {
+ // there is already an archive attribute.
+ // just add the value of the param to the list.
+ // But ignore bill$ personal archive format called
+ // .cab because java doesn't understand it.
+ if (!param_archive.toLowerCase().endsWith(".cab")) {
+ archives = param_archive + "," + archives;
+ }
+ }
+ } else if (archives != null) {
+ // add param if it is not present
+ params.put( key, archives);
+ }
+
+ if( codeBase == null )
+ {
+ key = new String( "CODEBASE" );
+ if( params.containsKey( key ) )
+ codeBase = (String) params.get( key );
+ }
+
+ if (username != null && !username.equals("")) {
+ try {
+ URL url = new URL(docBase);
+ int port = url.getPort();
+ if (port < 0)
+ port = url.getDefaultPort();
+ authenticator.addURL(new URL(url.getProtocol(), url.getHost(), port, ""), username, password, authname);
+ } catch (MalformedURLException muex) {
+ }
+ }
+ try
+ {
+ String sorted_archives = "";
+ TreeSet archive_set = new TreeSet();
+ if( archives != null )
+ {
+ StringTokenizer parser = new StringTokenizer( archives, ",", false );
+ while( parser.hasMoreTokens() )
+ archive_set.add ( parser.nextToken().trim() );
+ }
+ Iterator it = archive_set.iterator();
+ while (it.hasNext())
+ sorted_archives += (String) it.next();
+ KJASAppletClassLoader loader =
+ KJASAppletClassLoader.getLoader( docBase, codeBase, sorted_archives );
+ it = archive_set.iterator();
+ while (it.hasNext())
+ loader.addArchiveName( (String) it.next() );
+ loader.paramsDone();
+
+ KJASAppletStub stub = new KJASAppletStub
+ (
+ this, appletID, loader.getCodeBase(),
+ loader.getDocBase(), name, className,
+ new Dimension( Integer.parseInt(width), Integer.parseInt(height) ),
+ params, windowName, loader
+ );
+ stubs.put( appletID, stub );
+
+ stub.createApplet();
+ }
+ catch ( Exception e )
+ {
+ Main.kjas_err( "Something bad happened in createApplet: " + e, e );
+ }
+ }
+
+ public void initApplet( String appletID )
+ {
+ KJASAppletStub stub = (KJASAppletStub) stubs.get( appletID );
+ if( stub == null )
+ {
+ Main.debug( "could not init and show applet: " + appletID );
+ }
+ else
+ {
+ stub.initApplet();
+ }
+ }
+
+ public void destroyApplet( String appletID )
+ {
+ KJASAppletStub stub = (KJASAppletStub) stubs.get( appletID );
+
+ if( stub == null )
+ {
+ Main.debug( "could not destroy applet: " + appletID );
+ }
+ else
+ {
+ //Main.debug( "stopping applet: " + appletID );
+ stubs.remove( appletID );
+
+ stub.destroyApplet();
+ }
+ }
+
+ public void startApplet( String appletID )
+ {
+ KJASAppletStub stub = (KJASAppletStub) stubs.get( appletID );
+ if( stub == null )
+ {
+ Main.debug( "could not start applet: " + appletID );
+ }
+ else
+ {
+ stub.startApplet();
+ }
+ }
+
+ public void stopApplet( String appletID )
+ {
+ KJASAppletStub stub = (KJASAppletStub) stubs.get( appletID );
+ if( stub == null )
+ {
+ Main.debug( "could not stop applet: " + appletID );
+ }
+ else
+ {
+ stub.stopApplet();
+ }
+ }
+
+ public void destroy()
+ {
+ Enumeration e = stubs.elements();
+ while ( e.hasMoreElements() )
+ {
+ KJASAppletStub stub = (KJASAppletStub) e.nextElement();
+ stub.destroyApplet();
+ stub.loader.getJSReferencedObjects().clear();
+ }
+
+ stubs.clear();
+ active = false;
+ }
+
+ /***************************************************************************
+ **** AppletContext interface
+ ***************************************************************************/
+ public Applet getApplet( String appletName )
+ {
+ if( active )
+ {
+ Enumeration e = stubs.elements();
+ while( e.hasMoreElements() )
+ {
+ KJASAppletStub stub = (KJASAppletStub) e.nextElement();
+
+ if( stub.getAppletName().equals( appletName ) )
+ return stub.getApplet();
+ }
+ }
+
+ return null;
+ }
+
+ public Enumeration getApplets()
+ {
+ if( active )
+ {
+ Vector v = new Vector();
+ Enumeration e = stubs.elements();
+ while( e.hasMoreElements() )
+ {
+ KJASAppletStub stub = (KJASAppletStub) e.nextElement();
+ v.add( stub.getApplet() );
+ }
+
+ return v.elements();
+ }
+
+ return null;
+ }
+
+ public AudioClip getAudioClip( URL url )
+ {
+ Main.debug( "getAudioClip, url = " + url );
+ //AudioClip clip = java.applet.Applet.newAudioClip(url);
+ AudioClip clip = new KJASAudioClip(url);
+ Main.debug( "got AudioClip " + clip);
+ return clip;
+ // return new KJASSoundPlayer( myID, url );
+ }
+
+ public void addImage( String url, byte[] data )
+ {
+ Main.debug( "addImage for url = " + url );
+ images.put( url, data );
+ if (Main.cacheImages) {
+ pendingImages.remove(url);
+ }
+ }
+
+ public Image getImage( URL url )
+ {
+ if( active && url != null )
+ {
+ // directly load images using JVM
+ if (true) {
+ // Main.info("Getting image using ClassLoader:" + url);
+ if (loader != null) {
+ url = loader.findResource(url.toString());
+ //Main.debug("Resulting URL:" + url);
+ }
+ Toolkit kit = Toolkit.getDefaultToolkit();
+ Image img = kit.createImage(url);
+ return img;
+ }
+
+ //check with the Web Server
+ String str_url = url.toString();
+ Main.debug( "getImage, url = " + str_url );
+ if (Main.cacheImages && images.containsKey(str_url)) {
+ Main.debug("Cached: url=" + str_url);
+ }
+ else
+ {
+ if (Main.cacheImages) {
+ if (!pendingImages.contains(str_url)) {
+ Main.protocol.sendGetURLDataCmd( myID, str_url );
+ pendingImages.add(str_url);
+ }
+ } else {
+ Main.protocol.sendGetURLDataCmd( myID, str_url );
+ }
+ while( !images.containsKey( str_url ) && active )
+ {
+ try { Thread.sleep( 200 ); }
+ catch( InterruptedException e ){}
+ }
+ }
+ if( images.containsKey( str_url ) )
+ {
+ byte[] data = (byte[]) images.get( str_url );
+ if( data.length > 0 )
+ {
+ Toolkit kit = Toolkit.getDefaultToolkit();
+ return kit.createImage( data );
+ } else return null;
+ }
+ }
+
+ return null;
+ }
+
+ public void showDocument( URL url )
+ {
+ //Main.debug( "showDocument, url = " + url );
+
+ if( active && (url != null) )
+ {
+ Main.protocol.sendShowDocumentCmd( myID, url.toString() );
+ }
+ }
+
+ public void showDocument( URL url, String targetFrame )
+ {
+ //Main.debug( "showDocument, url = " + url + " targetFrame = " + targetFrame );
+
+ if( active && (url != null) && (targetFrame != null) )
+ {
+ Main.protocol.sendShowDocumentCmd( myID, url.toString(), targetFrame );
+ }
+ }
+
+ public void showStatus( String message )
+ {
+ if( active && (message != null) )
+ {
+ Main.protocol.sendShowStatusCmd( myID, message );
+ }
+ }
+ public boolean evaluateJavaScript(String script, String appletID, JSObject jso) {
+ KJASAppletStub stub = (KJASAppletStub) stubs.get( appletID );
+ if( active && stub != null && stub.isLoaded ()) {
+ if( jso != null ) {
+ synchronized (jsobjects) {
+ jsobjects.push(jso);
+ }
+ }
+ int [] types = { KJASAppletStub.JString };
+ String [] arglist = { script };
+ Main.protocol.sendJavaScriptEventCmd(myID, appletID, 0, "eval", types, arglist);
+ return true;
+ }
+ Main.debug( "evaluateJavaScript failure, context active:" + active + " stub:" + stub);
+ return false;
+ }
+
+ public boolean getMember(String appletID, int callid, int objid, String name)
+ {
+ KJASAppletStub stub = (KJASAppletStub) stubs.get( appletID );
+ if (stub == null || !stub.isLoaded())
+ return false;
+ return stub.getMember(callid, objid, name);
+ }
+
+ public boolean putMember(String appletID, int callid, int objid, String name, String value)
+ {
+ if (name.equals("__lc_ret")) {
+ // special case; return value of JS script evaluation
+ Main.debug("putValue: applet " + name + "=" + value);
+ JSObject jso = null;
+ synchronized (jsobjects) {
+ if (!jsobjects.empty())
+ jso = (JSObject) jsobjects.pop();
+ }
+ if (jso == null)
+ return false;
+ jso.returnvalue = value;
+ try {
+ jso.thread.interrupt();
+ } catch (SecurityException ex) {}
+ Main.protocol.sendPutMember( myID, callid, true );
+ }
+ KJASAppletStub stub = (KJASAppletStub) stubs.get( appletID );
+ if (stub == null || !stub.isLoaded())
+ return false;
+ return stub.putMember(callid, objid, name, value);
+ }
+
+ public Object getJSReferencedObject(Applet applet, int objid)
+ {
+ return ((KJASAppletClassLoader)(applet.getClass().getClassLoader())).getJSReferencedObjects().get(new Integer(objid));
+ }
+ boolean callMember(String appletID, int cid, int oid, String n, java.util.List args)
+ {
+ KJASAppletStub stub = (KJASAppletStub) stubs.get( appletID );
+ if (stub == null || !stub.isLoaded())
+ return false;
+ return stub.callMember( cid, oid, n, args);
+ }
+ public void derefObject(String appletID, int objid) {
+ if (objid == 0)
+ return; // that's an applet
+ KJASAppletStub stub = (KJASAppletStub) stubs.get( appletID );
+ if (stub == null)
+ return;
+ Hashtable jsRefs = stub.loader.getJSReferencedObjects();
+ if (jsRefs.remove(new Integer(objid)) == null)
+ Main.debug("couldn't remove referenced object");
+ }
+
+ public void setStream(String key, InputStream stream) throws IOException {
+ Main.debug("setStream, key = " + key);
+ streams.put(key, stream);
+ }
+ public InputStream getStream(String key){
+ Main.debug("getStream, key = " + key);
+ return (InputStream) streams.get(key);
+ }
+ public Iterator getStreamKeys() {
+ Main.debug("getStreamKeys");
+ return streams.keySet().iterator();
+ }
+
+
+}