- private XWT() {
- super.put("maxdim", new Integer(Short.MAX_VALUE));
- super.put("origin", Main.origin);
- super.put("altKeyName", Platform.altKeyName());
- super.put("screenWidth", new Integer(Platform.getScreenWidth()));
- super.put("screenHeight", new Integer(Platform.getScreenHeight()));
- super.put("fileSeparator", File.separator);
- super.put("homeDir", System.getProperty("user.home"));
- super.put("tempDir", System.getProperty("java.io.tempdir"));
- super.put("math", xwtMath);
- super.put("string", xwtString);
-
- super.put("newBrowserWindow", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- if (args.length() != 1 || args.elementAt(0) == null) return null;
- Platform.newBrowserWindow(args.elementAt(0).toString());
- return null;
- }});
-
- super.put("parseInt",xwtString.get("parseInt"));
- super.put("parseFloat",xwtString.get("parseFloat"));
-
- super.put("yield", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- sleep(0);
- return null;
- }});
-
- super.put("load", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- return Res.stringToRes(args.elementAt(0).toString());
- }});
-
- super.put("println", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- if (args.length() != 1) return null;
- if (Log.on) Log.logJS(this, (args.elementAt(0) == null ? "**null**" : args.elementAt(0).toString()));
- return null;
- }});
-
- super.put("date", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- Log.log(XWT.class, "date not implemented");
- //throw new Error("not implemented");
- return null;
- }});
-
- super.put("regexp", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- return new Regexp(args);
- }});
-
- super.put("listfonts", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- Object[] fonts = Platform.listFonts();
- JS.Array ret = new JS.Array();
- for(int i=0; i<fonts.length; i++) ret.addElement(fonts[i]);
- return ret;
- }});
-
- super.put("xmlrpc", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- if (args.length() != 1 || args.elementAt(0) == null) return null;
- return new XMLRPC(args.elementAt(0).toString(), "");
- }});
-
- super.put("soap", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- if (args.length() == 1 && args.elementAt(0) != null) return new SOAP(args.elementAt(0).toString(), "", null, null);
- else if (args.length() == 2 && args.elementAt(0) != null && args.elementAt(1) != null)
- return new SOAP(args.elementAt(0).toString(), "", args.elementAt(1).toString(), null);
- else if (args.length() == 3 && args.elementAt(0) != null && args.elementAt(1) != null && args.elementAt(2) != null)
- return new SOAP(args.elementAt(0).toString(), "", args.elementAt(1).toString(), args.elementAt(2).toString());
- else return null;
- }});
-
- super.put("textwidth", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- if (args.length() < 1 || args.length() > 2) return null;
- if (args.elementAt(0) == null || (args.length() == 2 && args.elementAt(1) == null)) return null;
- String font = args.length() == 1 ? Platform.getDefaultFont() : args.elementAt(0).toString();
- String text = args.length() == 1 ? args.elementAt(0).toString() : args.elementAt(1).toString();
- return new Integer(Platform.stringWidth(font, text));
- }});
-
- super.put("textheight", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- if (args.length() > 1) return null;
- if (args.length() == 1 && args.elementAt(0) == null) return null;
- String font = args.length() == 0 || args.elementAt(0) == null ? Platform.getDefaultFont() : args.elementAt(0).toString();
- return new Integer(Platform.getMaxAscent(font) + Platform.getMaxDescent(font));
- }});
-
- super.put("newBox", new JS.Callable() { public Object call(JS.Array args) throws JS.Exn {
- if (args.length() > 0) Log.log(XWT.class, "DEPRECATED: xwt.newBox() with multiple arguments is deprecated; use xwt.newBox().apply()");
- JS.Callable callback = null;
- for(int i=1; i<args.length(); i++)
- if (args.elementAt(i) instanceof JS.Callable && callback == null)
- callback = (JS.Callable)args.elementAt(i);
- Box ret = new Box();
- if (!(args.length() == 0 || args.elementAt(0) == null))
- Template.getTemplate(args.elementAt(0).toString(),
- Template.defaultImportList).apply(ret, null, null, callback, 0, 1, resourceRoot);
- for(int i=1; i<args.length(); i++)
- if (args.elementAt(i) instanceof Box)
- ret.put(ret.numChildren(), (Box)args.elementAt(i));
- for(int i=1; i<args.length(); i++)
- if (args.elementAt(i) instanceof JS && !(args.elementAt(i) instanceof Box) && !(args.elementAt(i) instanceof JS.Callable)) {
- JS s = (JS)args.elementAt(i);
- Object[] keys = s.keys();
- for(int j=0; j<keys.length; j++) ret.put(keys[j].toString(), s.get(keys[j].toString()));
- }
- return ret;
- }});
+ public Object callMethod(Object name, Object a, Object b, Object c, Object[] rest, int nargs) throws JSExn {
+ try {
+ //#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) {
+ case 0:
+ //#switch(name)
+ case "thread.yield": sleep(0); return null;
+ //#end
+ break;
+ case 1:
+ //#switch(name)
+ case "clone":
+ if (!(a instanceof JS.Cloneable)) throw new JSExn("cannot clone a " + a.getClass().getName());
+ return ((JS.Cloneable)a).jsclone();
+ case "bless": return bless((JS)a);
+ 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.url": {
+ String url = (String)a;
+ if (url.startsWith("http://")) return new Stream.HTTP(url);
+ else if (url.startsWith("https://")) return new Stream.HTTP(url);
+ else if (url.startsWith("data:")) return new Stream.ByteArray(Base64.decode(url.substring(5)), null);
+ else if (url.startsWith("utf8:")) return new Stream.ByteArray(url.substring(5).getBytes(), null);
+ throw new JSExn("invalid resource specifier " + url);
+ }
+ case "thread.sleep": sleep(JS.toInt(a)); return null;
+ case "regexp": return new JSRegexp(a, null);
+ 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;
+ // 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:
+ //#switch(name)
+ case "stream.watch": return new Stream.ProgressWatcher((Stream)a, (JS)b);
+ case "regexp": return new JSRegexp(a, b);
+ //#end
+ break;
+ }
+ } catch (RuntimeException e) {
+ // FIXME: maybe JSExn should take a second argument, Exception
+ Log.warn(this, "xwt."+name+"() threw: " + e);
+ throw new JSExn("invalid argument for xwt object method "+name+"()");
+ }