2004/01/19 05:51:38
[org.ibex.core.git] / src / org / xwt / Main.java
index df1718a..533e763 100644 (file)
@@ -1,20 +1,24 @@
-// 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.xwt.js.*;
+import org.xwt.util.*;
+import org.xwt.translators.*;
+import org.xwt.plat.*;
 import org.bouncycastle.util.encoders.Base64;
 
 /** Entry point for the XWT Engine; handles splash screen, initial xwar loading, and argument processing */
-public class Main extends Applet {
+public class Main {
+
+    // to prevent GCJ from dropping these classes
+    private static final Class[] keep = new Class[] { GCJ.class, Linux.class, Solaris.class, Darwin.class, Win32.class };
 
     /**
+     *  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
@@ -22,143 +26,70 @@ public class Main extends Applet {
      *  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";
 }