private final JS rr;
private static final JS.Method METHOD = new JS.Method();
- public Ibex(Stream rr) { try { this.rr = bless(rr);} catch(JSExn e) { throw new Error("should never happen: " + e); } }
+ public Ibex(Fountain rr) { try { this.rr = bless(rr);} catch(JSExn e) { throw new Error("should never happen: " + e); } }
public JS resolveString(String str, boolean permitAbsolute) throws JSExn {
if (str.indexOf("://") != -1) {
Sub(JS key) { this.key = key; }
public void put(JS key, JS val) throws JSExn { Ibex.this.put(JSU.S(JSU.toString(this.key) + "." + JSU.toString(key)), val); }
public JS get(JS key) throws JSExn { return Ibex.this.get(JSU.S(JSU.toString(this.key) + "." + JSU.toString(key))); }
- public JS call(JS[] args) throws JSExn { return Ibex.this.call(this.key, args); }
public JS call(JS method, JS[] args) throws JSExn {
+ if (method == null) return super.call(null, args);
return Ibex.this.call(JSU.S(JSU.toString(this.key) + "." + JSU.toString(method)), args);
}
}
case "ui.font.wait": return METHOD;
case "ui.font.width": return METHOD;
case "ui.font.height": return METHOD;
- case "ui.font.sansserif": return Main.builtin.get(JSU.S("fonts/vera/Vera.ttf"));
- case "ui.font.monospace": return Main.builtin.get(JSU.S("fonts/vera/VeraMono.ttf"));
- case "ui.font.serif": return Main.builtin.get(JSU.S("fonts/vera/VeraSe.ttf"));
+ case "ui.font.sansserif": return Main.vera;
+ case "ui.font.monospace": return Main.vera;
+ case "ui.font.serif": return Main.vera;
case "ui.browser": return METHOD;
case "ui.mouse": return getSub(name);
case "ui.mouse.button":
public void put(JS name, JS value) throws JSExn {
//#switch(JSU.toString(name))
- case "thread": Scheduler.add((Callable)value); return;
+ case "thread": Platform.Scheduler.add((Callable)value); return;
case "ui.clipboard": Platform.setClipBoard(JSU.toString(value)); return;
case "ui.frame": Platform.createSurface((Box)value, true, true); return;
case "ui.window": Platform.createSurface((Box)value, false, true); return;
return new JS.Clone((JS)args[0]);
case "bless": return bless((JS)args[0]);
case "ui.browser": Platform.newBrowserWindow(JSU.toString(args[0])); return null;
- case "stream.unzip": return args[0] == null ? null : new Stream.Zip((Stream)args[0]);
+ case "stream.unzip": return args[0] == null ? null : new Fountain.Zip((Fountain)args[0]);
//case "stream.uncab": return a == null ? null : new Stream.Cab(a);
case "stream.cache":
- try { return args[0] == null ? null : new Stream.CachedStream((Stream)args[0], "resources", true); }
- catch (Stream.NotCacheableException e) { throw new JSExn("this resource cannot be cached"); }
+ //try { return args[0] == null ? null : new Fountain.CachedStream((Stream)args[0], "resources", true); }
+ //catch (Stream.NotCacheableException e) { throw new JSExn("this resource cannot be cached"); }
case "stream.url": {
String url = JSU.toString(args[0]);
- 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(Encode.fromBase64(url.substring(5)), null);
- else if (url.startsWith("utf8:")) return new Stream.ByteArray(url.substring(5).getBytes(), null);
+ if (url.startsWith("http://")) return new Fountain.HTTP(url);
+ else if (url.startsWith("https://")) return new Fountain.HTTP(url);
+ else if (url.startsWith("data:")) return new Fountain.ByteArray(Encode.fromBase64(url.substring(5)), null);
+ else if (url.startsWith("utf8:")) return new Fountain.ByteArray(url.substring(5).getBytes(), null);
else if (url.startsWith("file:")) {
// FIXME
Platform.fileDialog(url.substring(5), false);
case "stream.parse.xml": if(args[0] == null) return null; new XMLHelper(args[1]).doParse(args[0]); return null;
// FIXME backgrounding
case "stream.parse.utf8": if(args[0] == null) return null;
- try { return JSU.S(new String(InputStreamToByteArray.convert(args[0].getInputStream()))); }
+ try { return JSU.S(new String(InputStreamToByteArray.convert(JSU.getInputStream(args[0])))); }
catch (Exception e) { Log.warn(this, e); }
//#end
break;
case 2:
//#switch(JSU.toString(method))
- case "stream.watch": return new Stream.ProgressWatcher((Stream)args[0], args[1]);
+ case "stream.watch":
+ final JS func = args[1];
+ return new Fountain.ProgressWatcher((Fountain)args[0],
+ new Callable() {
+ public Object run(Object o) throws Exception {
+ JS[] args = (JS[])o;
+ return func.call(null, args);
+ }
+ });
case "regexp": return new JSRegexp(args[0], args[1]);
//#end
case 3:
}
public JS url2res(String url) throws JSExn {
- 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(Encode.fromBase64(url.substring(5)), null);
- else if (url.startsWith("utf8:")) return new Stream.ByteArray(url.substring(5).getBytes(), null);
+ if (url.startsWith("http://")) return new Fountain.HTTP(url);
+ else if (url.startsWith("https://")) return new Fountain.HTTP(url);
+ else if (url.startsWith("data:")) return new Fountain.ByteArray(Encode.fromBase64(url.substring(5)), null);
+ else if (url.startsWith("utf8:")) return new Fountain.ByteArray(url.substring(5).getBytes(), null);
else throw new JSExn("invalid resource specifier " + url);
// FIXME support file:// via dialog boxes
}
// FEATURE use a single sleeper thread
new Thread() { public void run() {
try { Thread.sleep(i); } catch (InterruptedException e) { }
- Scheduler.add(callback);
+ Platform.Scheduler.add(callback);
} }.start();
} catch (Pausable.NotPausableException npe) {
throw new JSExn("you cannot sleep or yield in the foreground thread");
callargs3[0] = JSU.S(c.getLocalName());
callargs3[1] = attrs;
callargs3[2] = JSU.S(c.getUri());
- startElement.call(callargs3);
+ startElement.call(null, callargs3);
} catch (JSExn jse) { throw new Wrapper(jse);
} finally { callargs3[0] = callargs3[1] = callargs3[2] = null; } }
public void endElement(Tree.Element c) throws XML.Exn { try {
callargs2[0] = JSU.S(c.getLocalName());
callargs2[1] = JSU.S(c.getUri());
- endElement.call(callargs2);
+ endElement.call(null, callargs2);
} catch (JSExn jse) { throw new Wrapper(jse); } finally { callargs2[0] = callargs2[1] = null; } }
public void characters(char[] ch, int start, int length) throws XML.Exn { try {
callargs1[0] = JSU.S(new String(ch, start, length));
- characters.call(callargs1);
+ characters.call(null, callargs1);
} catch (JSExn jse) { throw new Wrapper(jse); } finally { callargs1[0] = null; } }
public void whitespace(char[] ch, int start, int length) throws XML.Exn { try {
callargs1[0] = JSU.S(new String(ch, start, length));
- whitespace.call(callargs1);
+ whitespace.call(null, callargs1);
} catch (JSExn jse) { throw new Wrapper(jse); } finally { callargs1[0] = null; } }
public void doParse(JS s) throws JSExn {
try {
- parse(new BufferedReader(new InputStreamReader(s.getInputStream())));
+ parse(new BufferedReader(new InputStreamReader(JSU.getInputStream(s))));
} catch (Wrapper e) {
throw e.wrapee;
} catch (XML.Exn e) {
// FEATURE: move this into builtin.xwar
public Blessing bless(JS b) throws JSExn { return new Ibex.Blessing(b, this, null, null); }
// JS:FIXME: This doesn't properly handle traps
- public static class Blessing extends JS.Obj {
+ public static class Blessing extends JS.Clone {
private Ibex ibex;
private Template t = null;
public JS parentkey = null;
public Blessing parent = null;
public JS clonee;
- private Basket.Map cache = new Basket.HashMap();
+ private Basket.Map cache = new Basket.Hash();
public Blessing(JS clonee, Ibex ibex, Blessing parent, JS parentkey) throws JSExn {
- this.clonee = clonee; this.ibex = ibex; this.parentkey = parentkey; this.parent = parent; }
+ super(clonee); this.clonee = clonee; this.ibex = ibex; this.parentkey = parentkey; this.parent = parent; }
public JS get(JS key) throws JSExn {
if (JSU.isString(key) && JSU.toString(key).equals("")) return getStatic();
if (cache.get(key) != null) return (JS)cache.get(key);
- JS ret = new Blessing(clonee.get(key), ibex, this, key);
+ JS ret = new Blessing(super.get(key), ibex, this, key);
cache.put(key, ret);
return ret;
}
public static Blessing getBlessing(JS js) {
- // CHECKME: is unclone() good enough or do we need getClonee() in Cloneable?
while (js instanceof JS.Clone && !(js instanceof Blessing)) js = js.unclone();
if (!(js instanceof Blessing)) return null;
return (Blessing)js;
// FEATURE: This is a gross hack
public InputStream getImage() throws JSExn {
try {
- InputStream in = getInputStream();
+ InputStream in = JSU.getInputStream(this);
if (in != null) return in;
} catch (IOException e) { /* DELIBERATE */ }
String[] exts = new String[] { ".png", ".jpeg", ".gif" };
- for (int i=0; i < exts.length; i++)
+ for (int i=0; i < exts.length; i++) {
try {
- InputStream in = parent.get(JSU.S(JSU.toString(parentkey) + exts[i])).getInputStream();
+ InputStream in = JSU.getInputStream(parent.get(JSU.S(JSU.toString(parentkey) + exts[i])));
if (in != null) return in;
} catch (IOException f) { /* DELIBERATE */ }
+ }
return null;
}
public JS getStatic() throws JSExn {
for(Blessing b = parent; b.parentkey != null; b = b.parent) s = JSU.str(b.parentkey) + "." + s;
return s;
}
- public JS call(JS[] args) throws JSExn {
+ public JS call(JS method, JS[] args) throws JSExn {
+ if (method != null) return super.call(method, args);
if (args.length != 1) throw new JSExn("can only call a template with one arg");
getStatic();
if (t == null) throw new JSExn("No such template " + JSU.str(parentkey));
if (t == null) throw new JSExn("No such template " + JSU.str(parentkey));
return t;
}
- // JS:FIXME: Blessing shouldn't need to roll its own JS.Clone implementation
- public InputStream getInputStream() throws JSExn, IOException { return clonee.getInputStream(); }
}
}