| Clazz.declarePackage ("JU"); | |
| Clazz.load (["JU.BinaryDocument", "$.CompoundDocHeader", "$.Lst"], "JU.CompoundDocument", ["java.io.DataInputStream", "JU.CompoundDocDirEntry", "$.SB", "$.ZipData"], function () { | |
| c$ = Clazz.decorateAsClass (function () { | |
| this.header = null; | |
| this.directory = null; | |
| this.rootEntry = null; | |
| this.jzt = null; | |
| this.SAT = null; | |
| this.SSAT = null; | |
| this.sectorSize = 0; | |
| this.shortSectorSize = 0; | |
| this.nShortSectorsPerStandardSector = 0; | |
| this.nIntPerSector = 0; | |
| this.nDirEntriesperSector = 0; | |
| Clazz.instantialize (this, arguments); | |
| }, JU, "CompoundDocument", JU.BinaryDocument); | |
| Clazz.prepareFields (c$, function () { | |
| this.header = new JU.CompoundDocHeader (this); | |
| this.directory = new JU.Lst (); | |
| }); | |
| Clazz.makeConstructor (c$, | |
| function () { | |
| Clazz.superConstructor (this, JU.CompoundDocument); | |
| this.isBigEndian = true; | |
| }); | |
| Clazz.defineMethod (c$, "setDocStream", | |
| function (jzt, bis) { | |
| this.jzt = jzt; | |
| if (!this.isRandom) { | |
| this.stream = new java.io.DataInputStream (bis); | |
| }this.stream.mark (2147483647); | |
| if (!this.readHeader ()) return; | |
| this.getSectorAllocationTable (); | |
| this.getShortSectorAllocationTable (); | |
| this.getDirectoryTable (); | |
| }, "javajs.api.GenericZipTools,java.io.BufferedInputStream"); | |
| Clazz.defineMethod (c$, "getDirectory", | |
| function () { | |
| return this.directory; | |
| }); | |
| Clazz.defineMethod (c$, "getDirectoryListing", | |
| function (separator) { | |
| var sb = new JU.SB (); | |
| for (var i = 0; i < this.directory.size (); i++) { | |
| var thisEntry = this.directory.get (i); | |
| if (!thisEntry.isEmpty) sb.append (separator).append (thisEntry.entryName).append ("\tlen=").appendI (thisEntry.lenStream).append ("\tSID=").appendI (thisEntry.SIDfirstSector).append (thisEntry.isStandard ? "\tfileOffset=" + this.getOffset (thisEntry.SIDfirstSector) : ""); | |
| } | |
| return sb.toString (); | |
| }, "~S"); | |
| Clazz.defineMethod (c$, "getAllData", | |
| function () { | |
| return this.getAllDataFiles (null, null); | |
| }); | |
| Clazz.overrideMethod (c$, "getAllDataMapped", | |
| function (prefix, binaryFileList, fileData) { | |
| fileData.put ("#Directory_Listing", this.getDirectoryListing ("|")); | |
| binaryFileList = "|" + binaryFileList + "|"; | |
| for (var i = 0; i < this.directory.size (); i++) { | |
| var thisEntry = this.directory.get (i); | |
| if (!thisEntry.isEmpty && thisEntry.entryType != 5) { | |
| var name = thisEntry.entryName; | |
| System.out.println ("CompoundDocument file " + name); | |
| var isBinary = (binaryFileList.indexOf ("|" + name + "|") >= 0); | |
| if (isBinary) name += ":asBinaryString"; | |
| fileData.put (prefix + "/" + name, this.appendData ( new JU.SB (), name, thisEntry, isBinary).toString ()); | |
| }} | |
| this.close (); | |
| }, "~S,~S,java.util.Map"); | |
| Clazz.overrideMethod (c$, "getAllDataFiles", | |
| function (binaryFileList, firstFile) { | |
| var data = new JU.SB (); | |
| data.append ("Compound Document File Directory: "); | |
| data.append (this.getDirectoryListing ("|")); | |
| data.append ("\n"); | |
| var thisEntry; | |
| binaryFileList = "|" + binaryFileList + "|"; | |
| for (var i = 0, n = this.directory.size (); i < n; i++) { | |
| thisEntry = this.directory.get (i); | |
| var name = thisEntry.entryName; | |
| switch (thisEntry.entryType) { | |
| case 5: | |
| break; | |
| case 1: | |
| data.append ("NEW Directory ").append (name).append ("\n"); | |
| break; | |
| case 2: | |
| if (name.endsWith (".gz")) name = name.substring (0, name.length - 3); | |
| this.appendData (data, name, thisEntry, binaryFileList.indexOf ("|" + thisEntry.entryName + "|") >= 0); | |
| break; | |
| } | |
| } | |
| this.close (); | |
| return data; | |
| }, "~S,~S"); | |
| Clazz.defineMethod (c$, "appendData", | |
| function (data, name, thisEntry, isBinary) { | |
| data.append ("BEGIN Directory Entry ").append (name).append ("\n"); | |
| data.appendSB (this.getEntryAsString (thisEntry, isBinary)); | |
| data.append ("\nEND Directory Entry ").append (name).append ("\n"); | |
| return data; | |
| }, "JU.SB,~S,JU.CompoundDocDirEntry,~B"); | |
| Clazz.defineMethod (c$, "getFileAsString", | |
| function (entryName) { | |
| for (var i = 0; i < this.directory.size (); i++) { | |
| var thisEntry = this.directory.get (i); | |
| if (thisEntry.entryName.equals (entryName)) return this.getEntryAsString (thisEntry, false); | |
| } | |
| return new JU.SB (); | |
| }, "~S"); | |
| Clazz.defineMethod (c$, "getOffset", | |
| function (SID) { | |
| return (SID + 1) * this.sectorSize; | |
| }, "~N"); | |
| Clazz.defineMethod (c$, "gotoSector", | |
| function (SID) { | |
| this.seek (this.getOffset (SID)); | |
| }, "~N"); | |
| Clazz.defineMethod (c$, "readHeader", | |
| function () { | |
| if (!this.header.readData ()) return false; | |
| this.sectorSize = 1 << this.header.sectorPower; | |
| this.shortSectorSize = 1 << this.header.shortSectorPower; | |
| this.nShortSectorsPerStandardSector = Clazz.doubleToInt (this.sectorSize / this.shortSectorSize); | |
| this.nIntPerSector = Clazz.doubleToInt (this.sectorSize / 4); | |
| this.nDirEntriesperSector = Clazz.doubleToInt (this.sectorSize / 128); | |
| return true; | |
| }); | |
| Clazz.defineMethod (c$, "getSectorAllocationTable", | |
| function () { | |
| var nSID = 0; | |
| var thisSID; | |
| this.SAT = Clazz.newIntArray (this.header.nSATsectors * this.nIntPerSector + 109, 0); | |
| try { | |
| for (var i = 0; i < 109; i++) { | |
| thisSID = this.header.MSAT0[i]; | |
| if (thisSID < 0) break; | |
| this.gotoSector (thisSID); | |
| for (var j = 0; j < this.nIntPerSector; j++) { | |
| this.SAT[nSID++] = this.readInt (); | |
| } | |
| } | |
| var nMaster = this.header.nAdditionalMATsectors; | |
| thisSID = this.header.SID_MSAT_next; | |
| var MSAT = Clazz.newIntArray (this.nIntPerSector, 0); | |
| out : while (nMaster-- > 0 && thisSID >= 0) { | |
| this.gotoSector (thisSID); | |
| for (var i = 0; i < this.nIntPerSector; i++) MSAT[i] = this.readInt (); | |
| for (var i = 0; i < this.nIntPerSector - 1; i++) { | |
| thisSID = MSAT[i]; | |
| if (thisSID < 0) break out; | |
| this.gotoSector (thisSID); | |
| for (var j = this.nIntPerSector; --j >= 0; ) this.SAT[nSID++] = this.readInt (); | |
| } | |
| thisSID = MSAT[this.nIntPerSector - 1]; | |
| } | |
| } catch (e) { | |
| if (Clazz.exceptionOf (e, Exception)) { | |
| System.out.println (e.toString ()); | |
| } else { | |
| throw e; | |
| } | |
| } | |
| }); | |
| Clazz.defineMethod (c$, "getShortSectorAllocationTable", | |
| function () { | |
| var nSSID = 0; | |
| var thisSID = this.header.SID_SSAT_start; | |
| var nMax = this.header.nSSATsectors * this.nIntPerSector; | |
| this.SSAT = Clazz.newIntArray (nMax, 0); | |
| try { | |
| while (thisSID > 0 && nSSID < nMax) { | |
| this.gotoSector (thisSID); | |
| for (var j = 0; j < this.nIntPerSector; j++) { | |
| this.SSAT[nSSID++] = this.readInt (); | |
| } | |
| thisSID = this.SAT[thisSID]; | |
| } | |
| } catch (e) { | |
| if (Clazz.exceptionOf (e, Exception)) { | |
| System.out.println (e.toString ()); | |
| } else { | |
| throw e; | |
| } | |
| } | |
| }); | |
| Clazz.defineMethod (c$, "getDirectoryTable", | |
| function () { | |
| var thisSID = this.header.SID_DIR_start; | |
| var thisEntry; | |
| this.rootEntry = null; | |
| try { | |
| while (thisSID > 0) { | |
| this.gotoSector (thisSID); | |
| for (var j = this.nDirEntriesperSector; --j >= 0; ) { | |
| thisEntry = new JU.CompoundDocDirEntry (this); | |
| thisEntry.readData (); | |
| this.directory.addLast (thisEntry); | |
| if (thisEntry.entryType == 5) this.rootEntry = thisEntry; | |
| } | |
| thisSID = this.SAT[thisSID]; | |
| } | |
| } catch (e) { | |
| if (Clazz.exceptionOf (e, Exception)) { | |
| System.out.println (e.toString ()); | |
| } else { | |
| throw e; | |
| } | |
| } | |
| }); | |
| Clazz.defineMethod (c$, "getEntryAsString", | |
| function (thisEntry, asBinaryString) { | |
| if (thisEntry.isEmpty) return new JU.SB (); | |
| return (thisEntry.isStandard ? this.getStandardStringData (thisEntry.SIDfirstSector, thisEntry.lenStream, asBinaryString) : this.getShortStringData (thisEntry.SIDfirstSector, thisEntry.lenStream, asBinaryString)); | |
| }, "JU.CompoundDocDirEntry,~B"); | |
| Clazz.defineMethod (c$, "getStandardStringData", | |
| function (thisSID, nBytes, asBinaryString) { | |
| var data = new JU.SB (); | |
| var byteBuf = Clazz.newByteArray (this.sectorSize, 0); | |
| var gzipData = new JU.ZipData (nBytes); | |
| try { | |
| while (thisSID > 0 && nBytes > 0) { | |
| this.gotoSector (thisSID); | |
| nBytes = this.getSectorData (data, byteBuf, this.sectorSize, nBytes, asBinaryString, gzipData); | |
| thisSID = this.SAT[thisSID]; | |
| } | |
| if (nBytes == -9999) return new JU.SB (); | |
| } catch (e) { | |
| if (Clazz.exceptionOf (e, Exception)) { | |
| System.out.println (e.toString ()); | |
| } else { | |
| throw e; | |
| } | |
| } | |
| if (gzipData.isEnabled) gzipData.addTo (this.jzt, data); | |
| return data; | |
| }, "~N,~N,~B"); | |
| Clazz.defineMethod (c$, "getSectorData", | |
| function (data, byteBuf, nSectorBytes, nBytes, asBinaryString, gzipData) { | |
| this.readByteArray (byteBuf, 0, byteBuf.length); | |
| var n = gzipData.addBytes (byteBuf, nSectorBytes, nBytes); | |
| if (n >= 0) return n; | |
| if (asBinaryString) { | |
| for (var i = 0; i < nSectorBytes; i++) { | |
| data.append (Integer.toHexString (byteBuf[i] & 0xFF)).appendC (' '); | |
| if (--nBytes < 1) break; | |
| } | |
| } else { | |
| for (var i = 0; i < nSectorBytes; i++) { | |
| if (byteBuf[i] == 0) return -9999; | |
| data.appendC (String.fromCharCode (byteBuf[i])); | |
| if (--nBytes < 1) break; | |
| } | |
| }return nBytes; | |
| }, "JU.SB,~A,~N,~N,~B,JU.ZipData"); | |
| Clazz.defineMethod (c$, "getShortStringData", | |
| function (shortSID, nBytes, asBinaryString) { | |
| var data = new JU.SB (); | |
| if (this.rootEntry == null) return data; | |
| var thisSID = this.rootEntry.SIDfirstSector; | |
| var ptShort = 0; | |
| var byteBuf = Clazz.newByteArray (this.shortSectorSize, 0); | |
| var gzipData = new JU.ZipData (nBytes); | |
| try { | |
| while (thisSID >= 0 && shortSID >= 0 && nBytes > 0) { | |
| while (shortSID - ptShort >= this.nShortSectorsPerStandardSector) { | |
| ptShort += this.nShortSectorsPerStandardSector; | |
| thisSID = this.SAT[thisSID]; | |
| } | |
| this.seek (this.getOffset (thisSID) + (shortSID - ptShort) * this.shortSectorSize); | |
| nBytes = this.getSectorData (data, byteBuf, this.shortSectorSize, nBytes, asBinaryString, gzipData); | |
| shortSID = this.SSAT[shortSID]; | |
| } | |
| } catch (e) { | |
| if (Clazz.exceptionOf (e, Exception)) { | |
| System.out.println (data.toString ()); | |
| System.out.println ("reader error in CompoundDocument " + e.toString ()); | |
| } else { | |
| throw e; | |
| } | |
| } | |
| if (gzipData.isEnabled) gzipData.addTo (this.jzt, data); | |
| return data; | |
| }, "~N,~N,~B"); | |
| }); | |