|
|
|
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();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|