X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FRes.java;h=1f1a9279e90f20b458962cfedaeeb8595de95d31;hb=1019725cfa88d9ad5dfabaf178e87da79c9c3e17;hp=3f705893d4dbb70bf0baac64ca756d250773b3b8;hpb=a81a151e639664cb340cf3726f9e8b9c77d125fb;p=org.ibex.core.git diff --git a/src/org/xwt/Res.java b/src/org/xwt/Res.java index 3f70589..1f1a927 100644 --- a/src/org/xwt/Res.java +++ b/src/org/xwt/Res.java @@ -6,18 +6,20 @@ import java.util.*; import java.util.zip.*; import org.xwt.js.*; import org.xwt.util.*; +import org.bouncycastle.util.encoders.Base64; /** base class for XWT resources */ public abstract class Res extends JS { - public String getDescriptiveName() { return "FIXME"; } - - /** if this Res corresponds to a Template, it is cached here */ - Template t = null; + public String getDescriptiveName() { return ""; } /** cache of subresources so that the equality operator works on them */ private Hash refCache = null; + public Template t = null; + + public Res getParent() { return null; } + /** returns an InputStream containing the Resource's contents */ public InputStream getInputStream() throws IOException { return getInputStream(""); } public abstract InputStream getInputStream(String path) throws IOException; @@ -43,14 +45,16 @@ public abstract class Res extends JS { return ret; } - public static Res stringToRes(String url) { + public static Res stringToRes(String url) { return stringToRes(url, false); } + public static Res stringToRes(String url, boolean permitLocalFilesystem) { if (url.indexOf('!') != -1) return (Res)(new Zip(stringToRes(url.substring(0, url.lastIndexOf('!')))).get(url.substring(url.lastIndexOf('!') + 1))); if (url.startsWith("http://")) return new HTTP(url); if (url.startsWith("https://")) return new HTTP(url); - if (url.startsWith("file:")) return new File(url.substring(5)); + if (url.startsWith("file:") && permitLocalFilesystem) return new File(url.substring(5)); if (url.startsWith("cab:")) return new CAB(stringToRes(url.substring(4))); - throw new JS.Exn("invalid resource specifier"); + if (url.startsWith("data:")) return new ByteArray(Base64.decode(url.substring(5))); + throw new JS.Exn("invalid resource specifier " + url); } /** HTTP or HTTPS resource */ @@ -70,7 +74,6 @@ public abstract class Res extends JS { } } - // FIXME: dangerous /** a file */ public static class File extends Res { private String path; @@ -94,10 +97,11 @@ public abstract class Res extends JS { private Res parent; Zip(Res parent) { this.parent = parent; } public InputStream getInputStream(String path) throws IOException { + if (path.startsWith("/")) path = path.substring(1); ZipInputStream zis = new ZipInputStream(parent.getInputStream()); ZipEntry ze = zis.getNextEntry(); while(ze != null && !ze.getName().equals(path)) ze = zis.getNextEntry(); - if (ze == null) throw new JS.Exn("zip file not found in archive"); + if (ze == null) throw new JS.Exn("requested file not found in archive"); return zis; } } @@ -107,12 +111,17 @@ public abstract class Res extends JS { Res parent; Object key; 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()); + } public Res addExtension(String extension) { - return (key instanceof String && ((String)key).endsWith(extension)) ? this : new Ref(this, extension); + return (key instanceof String && ((String)key).endsWith(extension)) ? this : new Ref(parent, key + extension); } public InputStream getInputStream(String path) throws IOException { return parent.getInputStream("/" + key + path); } + public Res getParent() { return parent; } public Res graft(Object newResource) { return new Graft(parent, key, newResource); } } @@ -126,6 +135,8 @@ public abstract class Res extends JS { public int hashCode() { return graftee.hashCode(); } public InputStream getInputStream(String s) throws IOException { return graftee.getInputStream(s); } public Object get(Object key) { return replaced_key.equals(key) ? replaced_val : graftee.get(key); } + public String getDescriptiveName() { return graftee.getDescriptiveName(); } + public Res getParent() { return graftee.getParent(); } } /** unpacks a Microsoft CAB file (possibly embedded in another file; we scan for 'MSCF' */