public final InputStream getInputStream() throws IOException { return getInputStream(""); }
public Res graft(Object newResource) { throw new JS.Exn("cannot graft onto this resource"); }
- public Object get(Object key) { return new Ref(this, key); }
+
+ private Hash refCache = null;
+ public Object get(Object key) {
+ Object ret = refCache == null ? null : refCache.get(key);
+ if (ret != null) return ret;
+ ret = new Ref(this, key);
+ if (refCache == null) refCache = new Hash();
+ refCache.put(key, ret);
+ return ret;
+ }
+
public void put(Object key, Object val) { throw new JS.Exn("cannot put to a resource"); }
public Object[] keys() { throw new JS.Exn("cannot enumerate a resource"); }
return ((i & 0xff) << 24) | ((i & 0xff00) << 8) | ((i & 0xff0000) >>> 8) | (i >>> 24);
}
public InputStream getInputStream(String path) throws IOException {
- InputStream is = new InputStream(parent.getInputStream());
+ InputStream is = parent.getInputStream();
byte[] scan = new byte[4];
- while(scan[0] != 'M' || scan[1] != 'S' || scan[2] != 'C' || scan[3] != 'F') {
- System.arraycopy(scan, 1, scan, 0, 3);
- int read = is.read();
- if (read == -1) throw new JS.Exn("MSCF header tag not found in file");
- scan[3] = (byte)read;
+ int ofs = 0;
+ for(int i=0; i<2; i++) {
+ // wierdly, .exe files have three MSCF's
+ while(scan[0] != 'M' || scan[1] != 'S' || scan[2] != 'C' || scan[3] != 'F') {
+ System.arraycopy(scan, 1, scan, 0, 3);
+ int read = is.read();
+ if (read == -1) throw new JS.Exn("MSCF header tag not found in file");
+ scan[3] = (byte)read;
+ ofs++;
+ }
+ scan[0] = 0;
}
- return org.xwt.util.CAB.getFileInputStream(is, path);
+ Log.log(this, "found MSCF header at offset " + ofs);
+ return org.xwt.util.CAB.getFileInputStream(is, path, true);
}
}