-// Copyright 2002 Adam Megacz, see the COPYING file for licensing [GPL]
+// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL]
package org.xwt;
-import org.xwt.util.*;
-import java.lang.reflect.*;
-import java.applet.*;
import java.net.*;
import java.util.*;
import java.io.*;
import java.awt.*;
-import org.mozilla.javascript.*;
import org.bouncycastle.util.encoders.Base64;
+import org.xwt.js.*;
+import org.xwt.util.*;
+import org.xwt.translators.*;
/** Entry point for the XWT Engine; handles splash screen, initial xwar loading, and argument processing */
-public class Main extends Applet {
+public class Main {
/**
+ * FEATURE: this should be implemented using self-emulation
* Used for security checks. If this is null, it means that only
* scripts originating from the local filesystem are loaded in
* the engine (maximum permissions). If scripts have been loaded
* IP).
*/
public static java.net.InetAddress originAddr = null;
-
- /** the URL where the initial xwar came from. */
+ public static String originHost = null;
public static String origin = null;
-
- /** true iff the user asked for rendered regions to be shown with a red rectangle */
- public static boolean showRenders = false;
-
- public Main() { }
- public void paint(Graphics g) { } // do-nothing method to avoid repaints
- public void update(Graphics g) { } // do-nothing method, to avoid repaints
-
- public static Applet applet = null;
-
- /** don't check if all surfaces are gone (and quit) until this is true */
- public static boolean doneInitializing = false;
-
- /** applet entry point */
- public void init() {
- if ("true".equals(getParameter("showRenders"))) showRenders = true;
- if ("true".equals(getParameter("verbose"))) Log.verbose = true;
- applet = this;
- main(new String[] { getParameter("initial-xwar-url"), "main" });
+ public static String initialTemplate = null;
+
+ public static final Stream builtin = new Stream.Zip(new Stream.Builtin());
+ public static Picture scarImage = null;
+
+ public static void printUsage() {
+ System.err.println("Usage: xwt [-s] [-v] [-l <port>/<url>] source-location [initial-template]");
+ System.err.println("");
+ System.err.println("Options:");
+ System.err.println(" -v verbose logging");
+ System.err.println(" -s [not yet supported]");
+ System.err.println(" -l [not yet supported]");
+ System.err.println("");
+ System.err.println("Source-location is one of the following:");
+ System.err.println(" - the path to an xwar file");
+ System.err.println(" - the path to a directory to be used as an xwar");
+ System.err.println(" - the http url of an xwar");
+ System.err.println("");
+ System.err.println("Initial-template is the path of the template to load; defaults to 'main'");
+ Runtime.getRuntime().exit(-1);
}
- /** common entry point */
- public static void main(String[] args) {
- try {
- int startargs = 0;
- while (true) {
- if (startargs > args.length - 1) {
- System.err.println("Usage: xwt [-s] [-v] [-l <port>/<url>] source-location [initial-template]");
- System.err.println("");
- System.err.println("Options:");
- System.err.println(" -s show rendering activity with red rectangles");
- System.err.println(" -v verbose logging");
- System.err.println(" -l serve logs via HTTP on 127.0.0.1:<port>/<url>");
- System.err.println("");
- System.err.println("Source-location is one of the following:");
- System.err.println(" - the path to an xwar file");
- System.err.println(" - the path to a directory to be used as an xwar");
- System.err.println(" - the http url of an xwar");
- System.err.println("");
- System.err.println("Initial-template is the resource name of the template to load; defaults to 'main'");
- Runtime.getRuntime().exit(-1);
- }
- else if (args[startargs].equals("-s")) showRenders = true;
- else if (args[startargs].equals("-v")) Log.verbose = true;
- else if (args[startargs].equals("-l")) Log.enableHTTP(args[++startargs]);
- else break;
- startargs++;
- }
- final String instancename = args.length > startargs + 1 ? args[startargs + 1] : "main";
-
- Platform.forceLoad();
- if (Log.on) for(int i=0; i<args.length; i++) Log.log(Main.class, "argument " + i + ": " + args[i]);
-
- // we do this here instead of in a static initializer to avoid threading hazards
- if (Log.on) Log.log(Main.class, "loading scar image");
- PNG png = PNG.decode(new ByteArrayInputStream(Base64.decode(scarPicture_png_base64)), "bundled scar image");
- Surface.scarPicture = Platform.createPicture(png.getData(), png.getWidth(), png.getHeight());
-
- InputStream is = Main.class.getClassLoader().getResourceAsStream("org/xwt/builtin.xwar");
- if (is == null) Platform.criticalAbort("unable to load builtin.xwar");
- Resources.loadArchive(is);
-
- String initialTemplate = "main";
-
- if (args.length > startargs) {
- if (args[startargs].startsWith("http://")) {
- if (Log.on) Log.log(Main.class, "downloading xwar");
- origin = args[startargs];
- initialTemplate = "org.xwt.builtin.splash";
-
- } else {
- if (Log.on) Log.log(Main.class, "loading xwar from local filesystem");
+ public static void main(String[] args) throws Exception {
+ int startargs = 0;
+ while (true) {
+ if (startargs > args.length - 1) printUsage();
+ else if (args[startargs].equals("-v")) Log.verbose = true;
+ else break;
+ startargs++;
+ }
- // HACK because MSIE turns \'s into /'s in URLs... argh!!
- if (Platform.platform.getClass().getName().endsWith("Win32"))
- args[startargs] = args[startargs].replace('/', '\\');
+ Platform.forceLoad();
+ if (Log.on) for(int i=0; i<args.length; i++) Log.info(Main.class, "argument " + i + ": " + args[i]);
+
+ initialTemplate = args.length > startargs + 1 ? args[startargs + 1] : "main";
+ origin = args[startargs];
+
+ Stream rr;
+ final String startupTemplate;
+ if (origin.startsWith("http://") || origin.startsWith("https://")) {
+ originHost = origin.substring(origin.indexOf('/') + 2);
+ originHost = originHost.substring(0, originHost.indexOf('/') == -1 ? originHost.length() : originHost.indexOf('/'));
+ if (originHost.indexOf('@') != -1) originHost = originHost.substring(originHost.indexOf('@') + 1);
+ originAddr = InetAddress.getByName(originHost);
+ rr = builtin;
+ startupTemplate = "org.xwt.builtin.splash";
+ } else {
+ rr = new Stream.File(origin);
+ if (!new File(origin).isDirectory()) rr = new Stream.Zip(rr);
+ startupTemplate = initialTemplate;
+ }
- File f = new File(args[startargs]);
- origin = "file:" + f.getAbsolutePath();
- if (f.isDirectory()) {
- Resources.loadDirectory(f);
- Surface.scarAllSurfacesFromNowOn = true;
- } else {
- initialTemplate = "org.xwt.builtin.splash";
- }
+ if (Log.on) Log.info(Main.class, "loading xwar");
+ final XWT xwt = new XWT(rr);
+ final JS final_rr = (JS)xwt.get("");
- if (args.length > startargs + 1) initialTemplate = args[startargs + 1];
- }
- }
-
- if (Log.on) Log.log(Main.class, "instantiating " + initialTemplate);
- final String initialTemplate_f = initialTemplate;
- ThreadMessage.newthread(new JSObject.JSFunction() {
- public Object call(Context cx, Scriptable thisObj, Scriptable ctorObj, Object[] arg) throws JavaScriptException {
- new Box(initialTemplate_f, null);
- doneInitializing = true;
- if (Surface.allSurfaces.size() == 0) {
- Log.log(this, "exiting because all surfaces are gone");
- Platform.exit();
- }
- return null;
- }
- });
-
- // gcj-win32 exit()'s when the original thread dies, so we have to deadlock ourselves
- if (Log.on) Log.log(Main.class, "main thread blocking on new semaphore");
- new org.xwt.util.Semaphore().block();
+ scarImage =
+ Picture.load((Stream)Main.builtin.get("org/xwt/builtin/scar.png"),
+ new Scheduler.Task() { public void perform() throws Exception {
+ xwt.resolveString(startupTemplate, false).call(new Box(), null, null, null, 1);
+ } });
- } catch (Throwable e) {
- e.printStackTrace();
- Platform.criticalAbort("exception in Main.main(): " + e);
- }
+ Scheduler.init();
}
-
- /** a base64-encoded png image of the scar */
- public static final String scarPicture_png_base64 =
- "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAA" +
- "CXBIWXMAAAsRAAALEQF/ZF+RAAAAB3RJTUUH0gIYAgsIkuS+AwAAA7lJREFUeJzF1l9MW1Uc" +
- "wPHvvb3lz/oHOssd0hXo+NNONow102xDSXzoJGiyGBIyDNMlJvjn0USNL74ZY3wnxOgeWIxo" +
- "9uAmZBrMiNkYYw5xRGBFQdiuzgtl/Gmht7S9PsBM162lGwN+yU3uPTf3nM895/c7OXwOfSKI" +
- "23Z1yDJt0Ms2hQhwARa3CyHeudkuhJj4sB0IMblhqxH3ALYacV/AViJSArYKkRawFYh1AZuN" +
- "yAiwmQgpzTsBMMzVv14V00PWQGDhJpd/UNugdwBebIOFRwFINwOGwJHXPH/d9BdYrbXZpaV1" +
- "ZUPeZ8RuiHnhXAvYNxMghEEMaXO79rjqyLeV6c5iD01Nrz4bevnYwYFVxJkWsG4WQM+B+I6e" +
- "7/q0SH98srXuYufpk2NGo8Tx5jcF6/unDwyA5oVzmwUAiBlhReg622eG6L7xDuWbjp+iJSVO" +
- "Kisfl2Z8p8QLENxoYqatgjzQAeFy4QvOs0ZX5bGmeunvWxK//jaNQQpLsPHqSJkDgKT6GrxD" +
- "xZ6DkimrzFffUFS020dX50B8efaPyeyuN5ZZBW4IkQogqb6Gp0b9IxZJcmKzubCYvfT0KAjx" +
- "ES3r1LtTQDzxg4dFiA5V/UCRZUtio+p7xTtyfdgqiEXIBW5cew6xv/p5ap8zBVbi8ez5hg9d" +
- "O8DA6kxtCCG2w8/JiPngrMUgObE/VoHDeYAn9taytBxDRw+/VH9YlHJFR7Dxo4o1xF3xoAiD" +
- "AMI1mKwJhcYUWa63hkKRyXx7saZliU9WH8XjqSUciWHLs3HrX6x2e9a0212yqEXthWGPNzdy" +
- "9cdZkpZjCiLvwNvfwxcZAQASEe6JMWXGUeCM6TaKiqoxm8xMB26zM9+OOq2b9lYVWsrLyoWJ" +
- "G1FzvKo8L3r1/D/JHWeKuCsJE5ZDfPr3/l6BYX14tJvgUhBbfh7TgQDuCkvYarKg3BCIRu1E" +
- "V3bFUnWeyXLcUwVriE8UWTYUn//2UjTi1/3+iwSDi+zft5NSV27O6EiUwaE/CS8NaMaTLaPp" +
- "BlgPcd8ybIczDlX9VJFlg73zs0va8qA+PtGHxWTGfz3O4NA483O/aHrriStLEEkHWA/xfw4k" +
- "xzUYrQmF5hVZPlw42D216CrdPXfbKMzMRliYv6LReqJ/CVZISsBUkSonBHGd7bgZjiqy/F6F" +
- "qsZCjR87c0w2DF++Nbn25xkNnhg1YGmBQxkD1hDFiix/7VDVxQcdcD1ERkeydphyqOrx5B3z" +
- "YSMxJzKagTvRDKWKLH/VqKqPwgHAf3HDlnr6flmoAAAAAElFTkSuQmCC";
}