X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FRes.java;h=196bb2c04146f01f7c6c14d67019b1db72f22f45;hb=6a96430e10e27fc1de5754cb5add705f929dd109;hp=60a9437748ac85b9fec8c7f1353b49058dc779ab;hpb=f3ad5161a913d512a977ebab0767b27fa463f012;p=org.ibex.core.git diff --git a/src/org/xwt/Res.java b/src/org/xwt/Res.java index 60a9437..196bb2c 100644 --- a/src/org/xwt/Res.java +++ b/src/org/xwt/Res.java @@ -22,8 +22,10 @@ public abstract class Res extends JS { public Res getParent() { return null; } /** an InputStream that makes sure it is not in the MessageQueue when blocked on a read */ + // FIXME private static class BackgroundInputStream extends FilterInputStream { BackgroundInputStream(InputStream i) { super(i); } + /* private void suspend() throws IOException { if (!ThreadMessage.suspendThread()) throw new IOException("attempt to perform background-only operation in a foreground thread"); @@ -41,6 +43,7 @@ public abstract class Res extends JS { try { return super.read(b, off, len); } finally { resume(); } } + */ } /** returns an InputStream containing the Resource's contents */ @@ -69,9 +72,12 @@ public abstract class Res extends JS { } public static Res stringToRes(String url) { - if (url.indexOf('!') != -1) - return (Res)(new Zip(stringToRes(url.substring(0, url.lastIndexOf('!')))). - get(url.substring(url.lastIndexOf('!') + 1))); + if (url.indexOf('!') != -1) { + Res ret = new Zip(stringToRes(url.substring(0, url.lastIndexOf('!')))); + String subpath = url.substring(url.lastIndexOf('!') + 1); + if (subpath.length() > 0) ret = (Res)ret.get(subpath); + return ret; + } if (url.startsWith("http://")) return new HTTP(url); if (url.startsWith("https://")) return new HTTP(url); if (url.startsWith("cab:")) return new CAB(stringToRes(url.substring(4))); @@ -98,6 +104,7 @@ public abstract class Res extends JS { public static class HTTP extends CachedRes { private String url; HTTP(String url) { this.url = url; } + public String getDescriptiveName() { return url; } public InputStream _getInputStream(String path) throws IOException { return new org.xwt.HTTP(url + path).GET(); } } @@ -106,6 +113,7 @@ public abstract class Res extends JS { public static class ByteArray extends Res { private byte[] bytes; ByteArray(byte[] bytes) { this.bytes = bytes; } + public String getDescriptiveName() { return "byte[]"; } public InputStream getInputStream(String path) throws IOException { if (!"".equals(path)) throw new JS.Exn("can't get subresources of a byte[] resource"); return new ByteArrayInputStream(bytes); @@ -116,6 +124,7 @@ public abstract class Res extends JS { public static class File extends Res { private String path; File(String path) { this.path = path; } + public String getDescriptiveName() { return "file://" + path; } public InputStream getInputStream(String rest) throws IOException { return new FileInputStream((path + rest).replace('/', java.io.File.separatorChar)); } } @@ -124,16 +133,28 @@ public abstract class Res extends JS { public static class Zip extends Res { private Res parent; Zip(Res parent) { this.parent = parent; } + public String getDescriptiveName() { return parent.getDescriptiveName() + "!"; } public InputStream getInputStream(String path) throws IOException { if (path.startsWith("/")) path = path.substring(1); - ZipInputStream zis = new ZipInputStream(parent.getInputStream()); + InputStream pis = parent.getInputStream(); + ZipInputStream zis = new ZipInputStream(pis); ZipEntry ze = zis.getNextEntry(); while(ze != null && !ze.getName().equals(path)) ze = zis.getNextEntry(); if (ze == null) throw new JS.Exn("requested file (" + path + ") not found in archive"); - return zis; + return new KnownLength.KnownLengthInputStream(zis, (int)ze.getSize()); } } + /** the Builtin resource */ + public static class Builtin extends Res { + public Builtin() { }; + public String getDescriptiveName() { return "[builtin]"; } + public InputStream getInputStream(String path) throws IOException { + if (!path.equals("")) throw new IOException("the builtin resource has no subresources"); + return Platform.getBuiltinInputStream(); + } + } + /** what you get when you reference a subresource */ public static class Ref extends Res { Res parent; @@ -141,7 +162,9 @@ public abstract class Res extends JS { Ref(Res parent, Object key) { this.parent = parent; this.key = key; } public String getDescriptiveName() { String pdn = parent.getDescriptiveName(); - return pdn.equals("") ? key.toString() : (pdn + "." + key.toString()); + if (pdn.equals("")) return key.toString(); + if (!pdn.endsWith("!")) pdn += "."; + return pdn + key.toString(); } public Res addExtension(String extension) { return (key instanceof String && ((String)key).endsWith(extension)) ? this : new Ref(parent, key + extension); @@ -180,11 +203,13 @@ public abstract class Res extends JS { /** shadow resource which replaces the graft */ public static class ProgressWatcher extends Res { - Res watchee; - JS.Callable callback; - ProgressWatcher(Res watchee, JS.Callable callback) { this.watchee = watchee; this.callback = callback; } + final Res watchee; + JS.CompiledFunction callback; + ProgressWatcher(Res watchee, JS.CompiledFunction callback) { this.watchee = watchee; this.callback = callback; } + public String getDescriptiveName() { return watchee.getDescriptiveName(); } public InputStream getInputStream(String s) throws IOException { - return new FilterInputStream(watchee.getInputStream(s)) { + final InputStream is = watchee.getInputStream(s); + return new FilterInputStream(is) { int bytesDownloaded = 0; public int read() throws IOException { int ret = super.read(); @@ -194,10 +219,12 @@ public abstract class Res extends JS { public int read(byte[] b, int off, int len) throws IOException { int ret = super.read(b, off, len); if (ret != 1) bytesDownloaded += ret; - ThreadMessage.newthread(new JS.Callable() { public Object call(JS.Array a) { + Scheduler.add(new Scheduler.Task() { public Object call(Object arg) { JS.Array args = new JS.Array(); args.addElement(new Integer(bytesDownloaded)); - callback.call(args); + args.addElement(new Integer(is instanceof KnownLength ? ((KnownLength)is).getLength() : 0)); + // FIXME + // new JS.Thread(callback, callbackScope).resume(); return null; } }); return ret;