home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2003 January / maximum-cd-2003-01.iso / Software / Apps / OperawithJava / ow32enen700b1j.exe / OPERA.JAR / opera / StripClassFile.class (.txt) < prev   
Encoding:
Java Class File  |  2002-11-05  |  5.7 KB  |  274 lines

  1. package opera;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.IOException;
  5.  
  6. class StripClassFile {
  7.    private static final int CONSTANT_Class = 7;
  8.    private static final int CONSTANT_Fieldref = 9;
  9.    private static final int CONSTANT_Methodref = 10;
  10.    private static final int CONSTANT_InterfaceMethodref = 11;
  11.    private static final int CONSTANT_String = 8;
  12.    private static final int CONSTANT_Integer = 3;
  13.    private static final int CONSTANT_Float = 4;
  14.    private static final int CONSTANT_Long = 5;
  15.    private static final int CONSTANT_Double = 6;
  16.    private static final int CONSTANT_NameAndType = 12;
  17.    private static final int CONSTANT_Utf8 = 1;
  18.    private static final String[] requiredTypes = new String[]{"Code", "ConstantValue", "Exceptions", "InnerClasses", "Synthetic"};
  19.    // $FF: renamed from: bs opera.StripClassFile.ByteStream
  20.    private ByteStream field_0;
  21.    private DataInputStream dis;
  22.    int magic;
  23.    short minor_version;
  24.    short major_version;
  25.    int constant_pool_count;
  26.    ConstantPool[] constant_pool;
  27.  
  28.    public byte[] strip(byte[] var1) throws Exception {
  29.       int var2 = var1.length;
  30.       byte[] var3 = new byte[var2];
  31.       System.arraycopy(var1, 0, var3, 0, var2);
  32.  
  33.       try {
  34.          this.field_0 = new ByteStream(this, var3);
  35.          this.dis = new DataInputStream(this.field_0);
  36.          this.stripClassFile();
  37.       } catch (Exception var6) {
  38.          throw var6;
  39.       }
  40.  
  41.       int var4 = this.field_0.getOffset();
  42.       byte[] var5 = new byte[var4];
  43.       var3 = this.field_0.getArray();
  44.       System.arraycopy(var3, 0, var5, 0, var4);
  45.       return var5;
  46.    }
  47.  
  48.    private boolean validateClassName(int var1) throws IOException {
  49.       ConstantPool var2 = this.constant_pool[var1 - 1];
  50.       var1 = var2.nameIndex;
  51.       return this.validateName(var1);
  52.    }
  53.  
  54.    private static boolean validJavaCharacter(char var0, boolean var1) {
  55.       if (var0 != '/' && var0 != '(' && var0 != ')' && var0 != ';' && var0 != '[') {
  56.          return var1 ? Character.isJavaIdentifierStart(var0) : Character.isJavaIdentifierPart(var0);
  57.       } else {
  58.          return true;
  59.       }
  60.    }
  61.  
  62.    private boolean validateName(int var1) throws IOException {
  63.       ConstantPool var2 = this.constant_pool[var1 - 1];
  64.       if (var2.string != null && !var2.string.equals("<init>") && !var2.string.equals("<clinit>")) {
  65.          for(int var3 = 0; var3 < var2.string.length(); ++var3) {
  66.             char var4 = var2.string.charAt(var3);
  67.             if (!validJavaCharacter(var4, var3 == 0)) {
  68.                var2.invalid = true;
  69.                return false;
  70.             }
  71.          }
  72.  
  73.          return true;
  74.       } else {
  75.          return true;
  76.       }
  77.    }
  78.  
  79.    static void charToUnicode(char var0, StringBuffer var1) {
  80.       var1.append("U");
  81.       String var2 = Integer.toHexString(var0);
  82.  
  83.       for(int var3 = var2.length(); var3 < 4; ++var3) {
  84.          var1.append('0');
  85.       }
  86.  
  87.       var1.append(var2);
  88.    }
  89.  
  90.    static String makeValid(String var0) {
  91.       int var1 = var0.length();
  92.       if (var1 == 0) {
  93.          return "";
  94.       } else {
  95.          StringBuffer var2 = new StringBuffer(var1 * 5);
  96.          char[] var3 = var0.toCharArray();
  97.  
  98.          for(int var4 = 0; var4 < var1; ++var4) {
  99.             char var5 = var3[var4];
  100.             if (validJavaCharacter(var5, var4 == 0)) {
  101.                var2.append(var3[var4]);
  102.             } else {
  103.                charToUnicode(var3[var4], var2);
  104.             }
  105.          }
  106.  
  107.          return var2.toString();
  108.       }
  109.    }
  110.  
  111.    private void stripClassFile() throws IOException {
  112.       this.magic = this.dis.readInt();
  113.       this.minor_version = this.dis.readShort();
  114.       this.major_version = this.dis.readShort();
  115.       this.constant_pool_count = this.dis.readUnsignedShort();
  116.       this.constant_pool = new ConstantPool[this.constant_pool_count - 1];
  117.       int var1 = this.field_0.getOffset();
  118.  
  119.       for(int var2 = 0; var2 < 2; ++var2) {
  120.          boolean var3 = var2 == 0;
  121.          boolean var4 = var2 != 0;
  122.          this.field_0.setOffset(var1);
  123.  
  124.          for(int var5 = 0; var5 < this.constant_pool_count - 1; ++var5) {
  125.             ConstantPool var6 = this.constant_pool[var5];
  126.             var6 = new ConstantPool(this, var4 && var6.invalid);
  127.             this.constant_pool[var5] = var6;
  128.             if (var6.tag == 5 || var6.tag == 6) {
  129.                ++var5;
  130.             }
  131.          }
  132.  
  133.          for(int var19 = 0; var19 < this.constant_pool_count - 1; ++var19) {
  134.             ConstantPool var7 = this.constant_pool[var19];
  135.             var7.verify(this.constant_pool);
  136.             if (var7.tag == 5 || var7.tag == 6) {
  137.                ++var19;
  138.             }
  139.          }
  140.  
  141.          this.dis.skip(2L);
  142.          int var21 = this.dis.readUnsignedShort();
  143.          int var8 = this.dis.readUnsignedShort();
  144.          short var9 = this.dis.readShort();
  145.  
  146.          for(int var10 = 0; var10 < var9; ++var10) {
  147.             int var11 = this.dis.readUnsignedShort();
  148.          }
  149.  
  150.          short var22 = this.dis.readShort();
  151.  
  152.          for(int var12 = 0; var12 < var22; ++var12) {
  153.             this.parseFieldInfo();
  154.          }
  155.  
  156.          short var13 = this.dis.readShort();
  157.  
  158.          for(int var14 = 0; var14 < var13; ++var14) {
  159.             this.parseMethodInfo();
  160.          }
  161.       }
  162.  
  163.       int var15 = this.field_0.getOffset();
  164.       short var16 = this.dis.readShort();
  165.  
  166.       for(int var17 = 0; var17 < var16; ++var17) {
  167.          int var20 = this.field_0.getOffset();
  168.          if (!this.parseAttributeInfo()) {
  169.             this.field_0.decrementCount(var15);
  170.             this.field_0.removeBytes(var20, this.field_0.getOffset());
  171.             this.field_0.setOffset(var20);
  172.          }
  173.       }
  174.  
  175.    }
  176.  
  177.    private void parseFieldInfo() throws IOException {
  178.       int var1 = this.dis.readUnsignedShort();
  179.       int var2 = this.dis.readUnsignedShort();
  180.       this.validateName(var2);
  181.       int var3 = this.dis.readUnsignedShort();
  182.       this.validateName(var3);
  183.       int var4 = this.dis.readUnsignedShort();
  184.  
  185.       for(int var5 = 0; var5 < var4; ++var5) {
  186.          this.parseAttributeInfo();
  187.       }
  188.  
  189.    }
  190.  
  191.    private void parseMethodInfo() throws IOException {
  192.       this.dis.skip(2L);
  193.       int var1 = this.dis.readUnsignedShort();
  194.       this.validateName(var1);
  195.       int var2 = this.dis.readUnsignedShort();
  196.       this.validateName(var2);
  197.       int var3 = this.dis.readUnsignedShort();
  198.  
  199.       for(int var4 = 0; var4 < var3; ++var4) {
  200.          this.parseAttributeInfo();
  201.       }
  202.  
  203.    }
  204.  
  205.    private boolean parseAttributeInfo() throws IOException {
  206.       int var1 = this.dis.readUnsignedShort();
  207.       ConstantPool var2 = this.constant_pool[var1 - 1];
  208.       String var3 = var2.string;
  209.       if (var3.equals("Code")) {
  210.          this.parseCodeAttribute();
  211.          return true;
  212.       } else {
  213.          int var4 = this.dis.readInt();
  214.          this.dis.skip((long)var4);
  215.          return this.attributeRequired(var3);
  216.       }
  217.    }
  218.  
  219.    boolean attributeRequired(String var1) {
  220.       for(int var2 = 0; var2 < requiredTypes.length; ++var2) {
  221.          if (var1.equals(requiredTypes[var2])) {
  222.             return true;
  223.          }
  224.       }
  225.  
  226.       return false;
  227.    }
  228.  
  229.    private void parseCodeAttribute() throws IOException {
  230.       int var1 = this.field_0.getOffset();
  231.       int var2 = this.dis.readInt();
  232.       this.dis.skip(2L);
  233.       this.dis.skip(2L);
  234.       int var3 = this.dis.readInt();
  235.       this.dis.skip((long)var3);
  236.       int var4 = this.dis.readUnsignedShort();
  237.       this.dis.skip((long)(8 * var4));
  238.       int var5 = this.field_0.getOffset();
  239.       int var6 = this.dis.readUnsignedShort();
  240.  
  241.       for(int var7 = 0; var7 < var6; ++var7) {
  242.          int var8 = this.field_0.getOffset();
  243.          if (!this.parseAttributeInfo()) {
  244.             int var9 = this.field_0.getOffset() - var8;
  245.             this.field_0.decrementCount(var5);
  246.             this.field_0.removeBytes(var8, this.field_0.getOffset());
  247.             this.field_0.setOffset(var8);
  248.             this.field_0.decrementLength(var1, var9);
  249.          }
  250.       }
  251.  
  252.    }
  253.  
  254.    // $FF: synthetic method
  255.    static DataInputStream access$000(StripClassFile var0) {
  256.       return var0.dis;
  257.    }
  258.  
  259.    // $FF: synthetic method
  260.    static ByteStream access$100(StripClassFile var0) {
  261.       return var0.field_0;
  262.    }
  263.  
  264.    // $FF: synthetic method
  265.    static boolean access$200(StripClassFile var0, int var1) throws IOException {
  266.       return var0.validateClassName(var1);
  267.    }
  268.  
  269.    // $FF: synthetic method
  270.    static boolean access$300(StripClassFile var0, int var1) throws IOException {
  271.       return var0.validateName(var1);
  272.    }
  273. }
  274.