home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 January / PCO0198.ISO / browser / net_linx / java40.jar / netscape / util / Archive.class (.txt) next >
Encoding:
Java Class File  |  1997-11-03  |  4.4 KB  |  281 lines

  1. package netscape.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6.  
  7. public class Archive {
  8.    public static final int ARCHIVE_MAGIC = 1852138529;
  9.    static final int ARCHIVE_VERSION = 1;
  10.    static Hashtable externalCoders;
  11.    int version;
  12.    int rootCount = 0;
  13.    int[] roots = new int[4];
  14.    int idCount = 1;
  15.    int[] rowForId = new int[4];
  16.    ClassTable[] tableForId = new ClassTable[4];
  17.    Hashtable classTables = new Hashtable();
  18.    public boolean performanceDebug = false;
  19.  
  20.    private static int[] growIntArray(int[] var0) {
  21.       int[] var1 = new int[var0.length * 2];
  22.       System.arraycopy(var0, 0, var1, 0, var0.length);
  23.       return var1;
  24.    }
  25.  
  26.    private static ClassTable[] growTableArray(ClassTable[] var0) {
  27.       ClassTable[] var1 = new ClassTable[var0.length * 2];
  28.       System.arraycopy(var0, 0, var1, 0, var0.length);
  29.       return var1;
  30.    }
  31.  
  32.    public void addRootIdentifier(int var1) {
  33.       if (this.rootCount >= this.roots.length) {
  34.          this.roots = growIntArray(this.roots);
  35.       }
  36.  
  37.       this.roots[this.rootCount] = var1;
  38.       ++this.rootCount;
  39.    }
  40.  
  41.    public boolean removeRootIdentifier(int var1) {
  42.       boolean var3 = false;
  43.  
  44.       int var2;
  45.       for(var2 = 0; var2 < this.rootCount; ++var2) {
  46.          if (this.roots[var2] == var1) {
  47.             var3 = true;
  48.             --this.rootCount;
  49.             break;
  50.          }
  51.       }
  52.  
  53.       while(var2 < this.rootCount) {
  54.          this.roots[var2] = this.roots[var2 + 1];
  55.          ++var2;
  56.       }
  57.  
  58.       return var3;
  59.    }
  60.  
  61.    public int[] rootIdentifiers() {
  62.       int[] var1 = new int[this.rootCount];
  63.       System.arraycopy(this.roots, 0, var1, 0, this.rootCount);
  64.       return var1;
  65.    }
  66.  
  67.    public ClassTable classTableForName(String var1) {
  68.       return (ClassTable)this.classTables.get(var1);
  69.    }
  70.  
  71.    public void addClassTable(ClassTable var1) {
  72.       this.classTables.put(var1.className(), var1);
  73.    }
  74.  
  75.    public ClassTable classTableForIdentifier(int var1) {
  76.       if (var1 >= this.idCount) {
  77.          throw new ArrayIndexOutOfBoundsException(var1);
  78.       } else {
  79.          return this.tableForId[var1];
  80.       }
  81.    }
  82.  
  83.    public int rowForIdentifier(int var1) {
  84.       if (var1 >= this.idCount) {
  85.          throw new ArrayIndexOutOfBoundsException(var1);
  86.       } else {
  87.          return this.rowForId[var1];
  88.       }
  89.    }
  90.  
  91.    public int mapIdentifier(ClassTable var1, int var2) {
  92.       if (this.idCount >= this.rowForId.length) {
  93.          this.rowForId = growIntArray(this.rowForId);
  94.          this.tableForId = growTableArray(this.tableForId);
  95.       }
  96.  
  97.       int var3 = this.idCount;
  98.       this.rowForId[var3] = var2;
  99.       this.tableForId[var3] = var1;
  100.       ++this.idCount;
  101.       return var3;
  102.    }
  103.  
  104.    public int identifierCount() {
  105.       return this.idCount;
  106.    }
  107.  
  108.    static synchronized void setupExternalCoders() {
  109.       if (externalCoders == null) {
  110.          externalCoders = new Hashtable(24);
  111.          PrimitiveCoder var0 = new PrimitiveCoder((byte)0);
  112.          externalCoders.put(var0.className(), var0);
  113.          var0 = new PrimitiveCoder((byte)1);
  114.          externalCoders.put(var0.className(), var0);
  115.          var0 = new PrimitiveCoder((byte)2);
  116.          externalCoders.put(var0.className(), var0);
  117.          var0 = new PrimitiveCoder((byte)3);
  118.          externalCoders.put(var0.className(), var0);
  119.          var0 = new PrimitiveCoder((byte)4);
  120.          externalCoders.put(var0.className(), var0);
  121.          var0 = new PrimitiveCoder((byte)5);
  122.          externalCoders.put(var0.className(), var0);
  123.          var0 = new PrimitiveCoder((byte)6);
  124.          externalCoders.put(var0.className(), var0);
  125.          var0 = new PrimitiveCoder((byte)7);
  126.          externalCoders.put(var0.className(), var0);
  127.          var0 = new PrimitiveCoder((byte)8);
  128.          externalCoders.put(var0.className(), var0);
  129.          var0 = new PrimitiveCoder((byte)9);
  130.          externalCoders.put(var0.className(), var0);
  131.          var0 = new PrimitiveCoder((byte)10);
  132.          externalCoders.put(var0.className(), var0);
  133.          var0 = new PrimitiveCoder((byte)11);
  134.          externalCoders.put(var0.className(), var0);
  135.          var0 = new PrimitiveCoder((byte)12);
  136.          externalCoders.put(var0.className(), var0);
  137.          var0 = new PrimitiveCoder((byte)13);
  138.          externalCoders.put(var0.className(), var0);
  139.          var0 = new PrimitiveCoder((byte)14);
  140.          externalCoders.put(var0.className(), var0);
  141.          var0 = new PrimitiveCoder((byte)15);
  142.          externalCoders.put(var0.className(), var0);
  143.          var0 = new PrimitiveCoder((byte)16);
  144.          externalCoders.put(var0.className(), var0);
  145.          var0 = new PrimitiveCoder((byte)17);
  146.          externalCoders.put(var0.className(), var0);
  147.       }
  148.    }
  149.  
  150.    ExternalCoder externalCoderForName(String var1) {
  151.       if (externalCoders == null) {
  152.          setupExternalCoders();
  153.       }
  154.  
  155.       return (ExternalCoder)externalCoders.get(var1);
  156.    }
  157.  
  158.    public void read(InputStream var1) throws IOException {
  159.       CompactInputStream var7;
  160.       if (var1 instanceof CompactInputStream) {
  161.          var7 = (CompactInputStream)var1;
  162.       } else {
  163.          var7 = new CompactInputStream(var1);
  164.       }
  165.  
  166.       int var4 = var7.readInt();
  167.       if (var4 != 1852138529) {
  168.          throw new IOException("Bad magic number " + var4);
  169.       } else {
  170.          this.version = var7.readInt();
  171.          if (this.version != 1) {
  172.             throw new IOException("Unknown archiveVersion " + this.version);
  173.          } else {
  174.             int var3 = var7.readCompactInt();
  175.             ClassTable[] var6 = new ClassTable[var3];
  176.  
  177.             for(int var2 = 0; var2 < var3; ++var2) {
  178.                ClassTable var5 = new ClassTable(this);
  179.                var6[var2] = var5;
  180.                var5.readInfo(var7);
  181.                this.addClassTable(var5);
  182.             }
  183.  
  184.             for(int var8 = 0; var8 < var3; ++var8) {
  185.                ClassTable var14 = var6[var8];
  186.                var14.readData(var7);
  187.             }
  188.  
  189.             var3 = var7.readCompactInt();
  190.             this.roots = new int[var3];
  191.             this.rootCount = var3;
  192.  
  193.             for(int var9 = 0; var9 < var3; ++var9) {
  194.                this.roots[var9] = var7.readCompactInt();
  195.             }
  196.  
  197.             var3 = var7.readCompactInt();
  198.             this.rowForId = new int[var3];
  199.             this.tableForId = new ClassTable[var3];
  200.             this.idCount = var3;
  201.  
  202.             for(int var10 = 1; var10 < var3; ++var10) {
  203.                this.rowForId[var10] = var7.readCompactInt();
  204.                this.tableForId[var10] = var6[var7.readCompactInt()];
  205.             }
  206.  
  207.             var3 = var7.readCompactInt();
  208.             if (var3 > 0) {
  209.                var7.skipBytes(var3);
  210.             }
  211.  
  212.          }
  213.       }
  214.    }
  215.  
  216.    public void write(OutputStream var1) throws IOException {
  217.       CompactOutputStream var5;
  218.       if (var1 instanceof CompactOutputStream) {
  219.          var5 = (CompactOutputStream)var1;
  220.       } else {
  221.          var5 = new CompactOutputStream(var1);
  222.       }
  223.  
  224.       var5.writeInt(1852138529);
  225.       var5.writeInt(1);
  226.       Object[] var4 = this.classTables.elementsArray();
  227.       int var3;
  228.       if (var4 == null) {
  229.          var3 = 0;
  230.       } else {
  231.          var3 = var4.length;
  232.       }
  233.  
  234.       var5.writeCompactInt(var3);
  235.  
  236.       for(int var2 = 0; var2 < var3; ++var2) {
  237.          ClassTable var6 = (ClassTable)var4[var2];
  238.          var6.tableId = var2;
  239.          var6.writeInfo(var5);
  240.       }
  241.  
  242.       for(int var7 = 0; var7 < var3; ++var7) {
  243.          ClassTable var12 = (ClassTable)var4[var7];
  244.          var12.writeData(var5);
  245.       }
  246.  
  247.       var3 = this.rootCount;
  248.       var5.writeCompactInt(var3);
  249.  
  250.       for(int var8 = 0; var8 < var3; ++var8) {
  251.          var5.writeCompactInt(this.roots[var8]);
  252.       }
  253.  
  254.       var3 = this.idCount;
  255.       var5.writeCompactInt(var3);
  256.  
  257.       for(int var9 = 1; var9 < var3; ++var9) {
  258.          var5.writeCompactInt(this.rowForId[var9]);
  259.          ClassTable var13 = this.tableForId[var9];
  260.          if (var13 == null) {
  261.             var5.writeCompactInt(0);
  262.          } else {
  263.             var5.writeCompactInt(var13.tableId);
  264.          }
  265.       }
  266.  
  267.       var5.writeCompactInt(0);
  268.       var5.flush();
  269.    }
  270.  
  271.    public void readASCII(InputStream var1) throws CodingException, DeserializationException, IOException {
  272.       ASCIIArchiveLoader var2 = new ASCIIArchiveLoader(this);
  273.       var2.readASCII(var1);
  274.    }
  275.  
  276.    public void writeASCII(OutputStream var1, boolean var2) throws CodingException, IOException {
  277.       ASCIIArchiveLoader var3 = new ASCIIArchiveLoader(this);
  278.       var3.writeASCII(var1, var2);
  279.    }
  280. }
  281.