home *** CD-ROM | disk | FTP | other *** search
- package opera;
-
- import java.io.DataInputStream;
- import java.io.IOException;
-
- class StripClassFile {
- private static final int CONSTANT_Class = 7;
- private static final int CONSTANT_Fieldref = 9;
- private static final int CONSTANT_Methodref = 10;
- private static final int CONSTANT_InterfaceMethodref = 11;
- private static final int CONSTANT_String = 8;
- private static final int CONSTANT_Integer = 3;
- private static final int CONSTANT_Float = 4;
- private static final int CONSTANT_Long = 5;
- private static final int CONSTANT_Double = 6;
- private static final int CONSTANT_NameAndType = 12;
- private static final int CONSTANT_Utf8 = 1;
- private static final String[] requiredTypes = new String[]{"Code", "ConstantValue", "Exceptions", "InnerClasses", "Synthetic"};
- // $FF: renamed from: bs opera.StripClassFile.ByteStream
- private ByteStream field_0;
- private DataInputStream dis;
- int magic;
- short minor_version;
- short major_version;
- int constant_pool_count;
- ConstantPool[] constant_pool;
-
- public byte[] strip(byte[] var1) throws Exception {
- int var2 = var1.length;
- byte[] var3 = new byte[var2];
- System.arraycopy(var1, 0, var3, 0, var2);
-
- try {
- this.field_0 = new ByteStream(this, var3);
- this.dis = new DataInputStream(this.field_0);
- this.stripClassFile();
- } catch (Exception var6) {
- throw var6;
- }
-
- int var4 = this.field_0.getOffset();
- byte[] var5 = new byte[var4];
- var3 = this.field_0.getArray();
- System.arraycopy(var3, 0, var5, 0, var4);
- return var5;
- }
-
- private boolean validateClassName(int var1) throws IOException {
- ConstantPool var2 = this.constant_pool[var1 - 1];
- var1 = var2.nameIndex;
- return this.validateName(var1);
- }
-
- private static boolean validJavaCharacter(char var0, boolean var1) {
- if (var0 != '/' && var0 != '(' && var0 != ')' && var0 != ';' && var0 != '[') {
- return var1 ? Character.isJavaIdentifierStart(var0) : Character.isJavaIdentifierPart(var0);
- } else {
- return true;
- }
- }
-
- private boolean validateName(int var1) throws IOException {
- ConstantPool var2 = this.constant_pool[var1 - 1];
- if (var2.string != null && !var2.string.equals("<init>") && !var2.string.equals("<clinit>")) {
- for(int var3 = 0; var3 < var2.string.length(); ++var3) {
- char var4 = var2.string.charAt(var3);
- if (!validJavaCharacter(var4, var3 == 0)) {
- var2.invalid = true;
- return false;
- }
- }
-
- return true;
- } else {
- return true;
- }
- }
-
- static void charToUnicode(char var0, StringBuffer var1) {
- var1.append("U");
- String var2 = Integer.toHexString(var0);
-
- for(int var3 = var2.length(); var3 < 4; ++var3) {
- var1.append('0');
- }
-
- var1.append(var2);
- }
-
- static String makeValid(String var0) {
- int var1 = var0.length();
- if (var1 == 0) {
- return "";
- } else {
- StringBuffer var2 = new StringBuffer(var1 * 5);
- char[] var3 = var0.toCharArray();
-
- for(int var4 = 0; var4 < var1; ++var4) {
- char var5 = var3[var4];
- if (validJavaCharacter(var5, var4 == 0)) {
- var2.append(var3[var4]);
- } else {
- charToUnicode(var3[var4], var2);
- }
- }
-
- return var2.toString();
- }
- }
-
- private void stripClassFile() throws IOException {
- this.magic = this.dis.readInt();
- this.minor_version = this.dis.readShort();
- this.major_version = this.dis.readShort();
- this.constant_pool_count = this.dis.readUnsignedShort();
- this.constant_pool = new ConstantPool[this.constant_pool_count - 1];
- int var1 = this.field_0.getOffset();
-
- for(int var2 = 0; var2 < 2; ++var2) {
- boolean var3 = var2 == 0;
- boolean var4 = var2 != 0;
- this.field_0.setOffset(var1);
-
- for(int var5 = 0; var5 < this.constant_pool_count - 1; ++var5) {
- ConstantPool var6 = this.constant_pool[var5];
- var6 = new ConstantPool(this, var4 && var6.invalid);
- this.constant_pool[var5] = var6;
- if (var6.tag == 5 || var6.tag == 6) {
- ++var5;
- }
- }
-
- for(int var19 = 0; var19 < this.constant_pool_count - 1; ++var19) {
- ConstantPool var7 = this.constant_pool[var19];
- var7.verify(this.constant_pool);
- if (var7.tag == 5 || var7.tag == 6) {
- ++var19;
- }
- }
-
- this.dis.skip(2L);
- int var21 = this.dis.readUnsignedShort();
- int var8 = this.dis.readUnsignedShort();
- short var9 = this.dis.readShort();
-
- for(int var10 = 0; var10 < var9; ++var10) {
- int var11 = this.dis.readUnsignedShort();
- }
-
- short var22 = this.dis.readShort();
-
- for(int var12 = 0; var12 < var22; ++var12) {
- this.parseFieldInfo();
- }
-
- short var13 = this.dis.readShort();
-
- for(int var14 = 0; var14 < var13; ++var14) {
- this.parseMethodInfo();
- }
- }
-
- int var15 = this.field_0.getOffset();
- short var16 = this.dis.readShort();
-
- for(int var17 = 0; var17 < var16; ++var17) {
- int var20 = this.field_0.getOffset();
- if (!this.parseAttributeInfo()) {
- this.field_0.decrementCount(var15);
- this.field_0.removeBytes(var20, this.field_0.getOffset());
- this.field_0.setOffset(var20);
- }
- }
-
- }
-
- private void parseFieldInfo() throws IOException {
- int var1 = this.dis.readUnsignedShort();
- int var2 = this.dis.readUnsignedShort();
- this.validateName(var2);
- int var3 = this.dis.readUnsignedShort();
- this.validateName(var3);
- int var4 = this.dis.readUnsignedShort();
-
- for(int var5 = 0; var5 < var4; ++var5) {
- this.parseAttributeInfo();
- }
-
- }
-
- private void parseMethodInfo() throws IOException {
- this.dis.skip(2L);
- int var1 = this.dis.readUnsignedShort();
- this.validateName(var1);
- int var2 = this.dis.readUnsignedShort();
- this.validateName(var2);
- int var3 = this.dis.readUnsignedShort();
-
- for(int var4 = 0; var4 < var3; ++var4) {
- this.parseAttributeInfo();
- }
-
- }
-
- private boolean parseAttributeInfo() throws IOException {
- int var1 = this.dis.readUnsignedShort();
- ConstantPool var2 = this.constant_pool[var1 - 1];
- String var3 = var2.string;
- if (var3.equals("Code")) {
- this.parseCodeAttribute();
- return true;
- } else {
- int var4 = this.dis.readInt();
- this.dis.skip((long)var4);
- return this.attributeRequired(var3);
- }
- }
-
- boolean attributeRequired(String var1) {
- for(int var2 = 0; var2 < requiredTypes.length; ++var2) {
- if (var1.equals(requiredTypes[var2])) {
- return true;
- }
- }
-
- return false;
- }
-
- private void parseCodeAttribute() throws IOException {
- int var1 = this.field_0.getOffset();
- int var2 = this.dis.readInt();
- this.dis.skip(2L);
- this.dis.skip(2L);
- int var3 = this.dis.readInt();
- this.dis.skip((long)var3);
- int var4 = this.dis.readUnsignedShort();
- this.dis.skip((long)(8 * var4));
- int var5 = this.field_0.getOffset();
- int var6 = this.dis.readUnsignedShort();
-
- for(int var7 = 0; var7 < var6; ++var7) {
- int var8 = this.field_0.getOffset();
- if (!this.parseAttributeInfo()) {
- int var9 = this.field_0.getOffset() - var8;
- this.field_0.decrementCount(var5);
- this.field_0.removeBytes(var8, this.field_0.getOffset());
- this.field_0.setOffset(var8);
- this.field_0.decrementLength(var1, var9);
- }
- }
-
- }
-
- // $FF: synthetic method
- static DataInputStream access$000(StripClassFile var0) {
- return var0.dis;
- }
-
- // $FF: synthetic method
- static ByteStream access$100(StripClassFile var0) {
- return var0.field_0;
- }
-
- // $FF: synthetic method
- static boolean access$200(StripClassFile var0, int var1) throws IOException {
- return var0.validateClassName(var1);
- }
-
- // $FF: synthetic method
- static boolean access$300(StripClassFile var0, int var1) throws IOException {
- return var0.validateName(var1);
- }
- }
-