X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FXWT.java;h=e5c443f9aba8bbceec769f8592f1c4a3ba263a5f;hb=16c24a73c1c1b2955db0bbbaf5a940215329bca1;hp=f5785c2726527178cb515fa8a73f0c93c337a1d6;hpb=163ff4c57ec557bb8615f80e875f045cdfbad696;p=org.ibex.core.git diff --git a/src/org/xwt/XWT.java b/src/org/xwt/XWT.java index f5785c2..e5c443f 100644 --- a/src/org/xwt/XWT.java +++ b/src/org/xwt/XWT.java @@ -1,4 +1,3 @@ -// FIXME // Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL] package org.xwt; @@ -14,13 +13,25 @@ import org.bouncycastle.util.encoders.Base64; /** Singleton class that provides all functionality in the xwt.* namespace */ public final class XWT extends JS.Cloneable { + // FIXME remove this private final JS rr; public XWT(Stream rr) { this.rr = bless(rr); } - private Cache subCache = new Cache(20); - private Sub getSub(String s) { - Sub ret = (Sub)subCache.get(s); - if (ret == null) subCache.put(s, ret = new Sub(s)); + public JS resolveString(String str, boolean permitAbsolute) throws JSExn { + if (str.indexOf("://") != -1) { + if (permitAbsolute) return (Stream)url2res(str); + throw new JSExn("absolute URL " + str + " not permitted here"); + } + // root-relative + //JS ret = (JS)getAndTriggerTraps(""); + //FIXME + JS ret = rr; + while(str.indexOf('.') != -1) { + String path = str.substring(0, str.indexOf('.')); + str = str.substring(str.indexOf('.') + 1); + ret = (JS)ret.get(path); + } + ret = (JS)ret.get(str); return ret; } @@ -37,6 +48,12 @@ public final class XWT extends JS.Cloneable { return XWT.this.callMethod(this.key + "." + method, a0, a1, a2, rest, nargs); } } + private Cache subCache = new Cache(20); + private Sub getSub(String s) { + Sub ret = (Sub)subCache.get(s); + if (ret == null) subCache.put(s, ret = new Sub(s)); + return ret; + } public Object get(Object name) throws JSExn { if (name instanceof String && ((String)name).length() == 0) return rr; @@ -45,16 +62,14 @@ public final class XWT extends JS.Cloneable { case "string": return xwtString; case "date": return METHOD; case "box": return new Box(); - case "apply": return METHOD; - case "graft": return METHOD; case "clone": return METHOD; case "bless": return METHOD; case "regexp": return METHOD; + case "ui": return getSub("ui"); case "ui.font": return getSub("ui.font"); case "ui.font.sansserif": return Main.builtin.get("fonts/vera/Vera.ttf"); case "ui.font.monospace": return Main.builtin.get("fonts/vera/VeraMono.ttf"); case "ui.font.serif": return Main.builtin.get("fonts/vera/VeraSe.ttf"); - case "ui": return getSub("ui"); case "ui.browser": return METHOD; case "ui.mouse": return getSub("ui.mouse"); case "ui.mouse.button": @@ -75,6 +90,7 @@ public final class XWT extends JS.Cloneable { case "ui.screen.height": return N(Platform.getScreenHeight()); case "undocumented": return getSub("undocumented"); case "undocumented.initialOrigin": return Main.origin; + case "undocumented.initialTemplate": return Main.initialTemplate; case "thread": return getSub("thread"); case "thread.yield": return METHOD; case "thread.sleep": return METHOD; @@ -111,17 +127,13 @@ public final class XWT extends JS.Cloneable { //#switch(name) case "thread": Scheduler.add((Scheduler.Task)value); return; case "ui.clipboard": Platform.setClipBoard((String)value); return; - case "ui.frame": - Box b = (Box)value; - Surface s = Platform.createSurface(b,true, true); - if(b.get("titlebar") != null) s.setTitleBarText(JS.toString(b.get("titlebar"))); - return; + case "ui.frame": Platform.createSurface((Box)value, true, true); return; case "ui.window": Platform.createSurface((Box)value, false, true); return; case "undocumented.proxyAuthorization": HTTP.Proxy.Authorization.authorization = value.toString(); - HTTP.Proxy.Authorization.waitingForUser.release(); return; + HTTP.Proxy.Authorization.waitingForUser.release(); + return; //#end - throw new JSExn("attempted to put unknown property: xwt."+name); } @@ -130,6 +142,11 @@ public final class XWT extends JS.Cloneable { //#switch(name) case "date": return new JSDate(a, b, c, rest, nargs); case "net.rpc.soap": return new SOAP((String)a, "", (String)b, (String)c); + // FIXME support object dumping + case "log.debug": JS.debug(a== null ? "**null**" : a.toString()); return null; + case "log.info": JS.info(a== null ? "**null**" : a.toString()); return null; + case "log.warn": JS.warn(a== null ? "**null**" : a.toString()); return null; + case "log.error": JS.error(a== null ? "**null**" : a.toString()); return null; //#end switch (nargs) { @@ -147,8 +164,9 @@ public final class XWT extends JS.Cloneable { case "ui.browser": Platform.newBrowserWindow((String)a); return null; case "stream.unzip": return new Stream.Zip((Stream)a); case "stream.uncab": return new Stream.Cab((Stream)a); - case "stream.cache": try { return new Stream.CachedStream((Stream)a, "resources", true); } - catch (Stream.NotCacheableException e) { throw new JSExn("this resource cannot be cached"); } + case "stream.cache": + try { return new Stream.CachedStream((Stream)a, "resources", true); } + catch (Stream.NotCacheableException e) { throw new JSExn("this resource cannot be cached"); } case "stream.url": { String url = (String)a; if (url.startsWith("http://")) return new Stream.HTTP(url); @@ -158,21 +176,17 @@ public final class XWT extends JS.Cloneable { throw new JSExn("invalid resource specifier " + url); } case "thread.sleep": sleep(JS.toInt(a)); return null; - case "log.debug": JS.log(this, a== null ? "**null**" : a.toString()); return null; - case "log.info": JS.log(this, a== null ? "**null**" : a.toString()); return null; - case "log.warn": JS.log(this, a== null ? "**null**" : a.toString()); return null; - case "log.error": JS.log(this, a== null ? "**null**" : a.toString()); return null; case "regexp": return new JSRegexp(a, null); - case "rpc.xml": return new XMLRPC((String)a, ""); + case "net.rpc.xml": return new XMLRPC((String)a, ""); case "crypto.rsa": /* FEATURE */ return null; case "crypto.md5": /* FEATURE */ return null; case "crypto.sha1": /* FEATURE */ return null; case "crypto.rc4": /* FEATURE */ return null; case "stream.parse.html": throw new JSExn("not implemented yet"); //return null; case "stream.parse.xml": new XMLHelper((JS)b).doParse((JS)a); return null; - case "stream.parse.utf8": - //return new String(InputStreamToByteArray.convert(((Stream)a).getInputStream())); - return null; + // FIXME backgrounding + case "stream.parse.utf8": try { return new String(InputStreamToByteArray.convert(Stream.getInputStream(a))); } + catch (Exception e) { Log.warn(this, e); } //#end break; case 2: @@ -184,7 +198,7 @@ public final class XWT extends JS.Cloneable { } } catch (RuntimeException e) { // FIXME: maybe JSExn should take a second argument, Exception - Log.info(this, "xwt."+name+"() threw: " + e); + Log.warn(this, "xwt."+name+"() threw: " + e); throw new JSExn("invalid argument for xwt object method "+name+"()"); } @@ -204,6 +218,7 @@ public final class XWT extends JS.Cloneable { try { final JS.UnpauseCallback callback = JS.pause(); final long currentTime = System.currentTimeMillis(); + // FEATURE use a single sleeper thread new Thread() { public void run() { try { Thread.sleep(i); } catch (InterruptedException e) { } Scheduler.add(callback); @@ -215,7 +230,6 @@ public final class XWT extends JS.Cloneable { public static final JSMath xwtMath = new JSMath() { private JS gs = new JSScope.Global(); - public String toString() { return "XWTMATH"; } public Object get(Object key) throws JSExn { //#switch(key) case "isNaN": return gs.get("isNaN"); @@ -247,51 +261,39 @@ public final class XWT extends JS.Cloneable { }; private class XMLHelper extends XML { + private class Wrapper extends XML.Exn { public JSExn wrapee; public Wrapper(JSExn jse) { super(""); wrapee = jse; } } private JS characters, whitespace, endElement, startElement; public XMLHelper(JS b) throws JSExn { super(BUFFER_SIZE); - // FIXME: trigger traps? - startElement = (JS)b.get("startElement"); - endElement = (JS)b.get("endElement"); - characters = (JS)b.get("characters"); - whitespace = (JS)b.get("whitespace"); + startElement = (JS)b.getAndTriggerTraps("startElement"); + endElement = (JS)b.getAndTriggerTraps("endElement"); + characters = (JS)b.getAndTriggerTraps("characters"); + whitespace = (JS)b.getAndTriggerTraps("whitespace"); } - private class XMLJSWrapper extends XML.Exn { - public JSExn wrapee; public XMLJSWrapper(JSExn jse) { super(""); wrapee = jse; } } - public void startElement(XML.Element c) throws XML.Exn { - try { + + public void startElement(XML.Element c) throws XML.Exn { try { JS attrs = new JS(); - for(int i=0; i