home *** CD-ROM | disk | FTP | other *** search
- package netscape.util;
-
- import java.io.FilterInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.StringBufferInputStream;
-
- public class Deserializer extends FilterInputStream {
- private TokenGenerator tokenGenerator;
-
- public static Object readObject(InputStream var0) {
- Object var1;
- try {
- Deserializer var2 = new Deserializer(var0);
- var1 = var2.readObject();
- } catch (IOException var3) {
- var1 = null;
- } catch (DeserializationException var4) {
- var1 = null;
- }
-
- return var1;
- }
-
- public Deserializer(InputStream var1) {
- super(var1);
- this.tokenGenerator = new TokenGenerator(var1);
- }
-
- public static Object deserializeObject(String var0) {
- if (var0 == null) {
- return null;
- } else {
- StringBufferInputStream var1 = new StringBufferInputStream(var0);
- return readObject(var1);
- }
- }
-
- public Object readObject() throws IOException, DeserializationException {
- return this.readObjectInternal();
- }
-
- private final Object readObjectInternal() throws IOException, DeserializationException {
- if (!this.tokenGenerator.hasMoreTokens()) {
- return null;
- } else {
- int var1 = this.tokenGenerator.nextToken();
- switch (var1) {
- case 1:
- return this.stringForToken();
- case 2:
- return this.readArray();
- case 3:
- case 5:
- default:
- this.syntaxError();
- return null;
- case 4:
- return this.readVector();
- case 6:
- return this.readHashtable();
- }
- }
- }
-
- private final void readKeyValuePair(Hashtable var1) throws IOException, DeserializationException {
- Object var2 = this.readObjectInternal();
- if (var2 == null) {
- this.unterminatedExpression();
- }
-
- if (!this.tokenGenerator.hasMoreTokens()) {
- this.unterminatedExpression();
- }
-
- int var4 = this.tokenGenerator.nextToken();
- if (var4 != 7) {
- this.syntaxError();
- }
-
- if (!this.tokenGenerator.hasMoreTokens()) {
- this.unterminatedExpression();
- }
-
- Object var3 = this.readObjectInternal();
- if (var3 == null) {
- this.unterminatedExpression();
- }
-
- var1.put(var2, var3);
- if (!this.tokenGenerator.hasMoreTokens()) {
- this.unterminatedExpression();
- }
-
- var4 = this.tokenGenerator.peekNextToken();
- if (var4 == 8 || var4 == 10) {
- this.tokenGenerator.nextToken();
- }
-
- }
-
- private final Hashtable readHashtable() throws IOException, DeserializationException {
- Hashtable var1 = new Hashtable();
-
- while(true) {
- if (!this.tokenGenerator.hasMoreTokens()) {
- this.unterminatedExpression();
- }
-
- int var2 = this.tokenGenerator.peekNextToken();
- if (var2 == 9) {
- this.tokenGenerator.nextToken();
- return var1;
- }
-
- this.readKeyValuePair(var1);
- }
- }
-
- private final Vector readVector() throws IOException, DeserializationException {
- Vector var1 = new Vector();
- boolean var3 = false;
-
- while(true) {
- if (!this.tokenGenerator.hasMoreTokens()) {
- this.unterminatedExpression();
- }
-
- int var2 = this.tokenGenerator.peekNextToken();
- if (var2 == 5) {
- this.tokenGenerator.nextToken();
- return var1;
- }
-
- if (var2 == 10) {
- this.tokenGenerator.nextToken();
- if (var3) {
- var3 = false;
- } else {
- this.syntaxError();
- }
- } else if (var3) {
- this.syntaxError();
- }
-
- Object var4 = this.readObjectInternal();
- if (var4 != null) {
- var1.addElement(var4);
- var3 = true;
- }
- }
- }
-
- private final Object[] readArray() throws IOException, DeserializationException {
- Object[] var1 = new Object[16];
- int var2 = 0;
- boolean var5 = false;
-
- while(true) {
- if (!this.tokenGenerator.hasMoreTokens()) {
- this.unterminatedExpression();
- }
-
- int var4 = this.tokenGenerator.peekNextToken();
- if (var4 == 3) {
- this.tokenGenerator.nextToken();
- Object[] var9 = new Object[var2];
- System.arraycopy(var1, 0, var9, 0, var2);
- return var9;
- }
-
- if (var4 == 10) {
- this.tokenGenerator.nextToken();
- if (var5) {
- var5 = false;
- } else {
- this.syntaxError();
- }
- } else if (var5) {
- this.syntaxError();
- }
-
- var4 = this.tokenGenerator.peekNextToken();
- Object var3;
- if (var4 == 11) {
- this.tokenGenerator.nextToken();
- var3 = null;
- } else {
- var3 = this.readObjectInternal();
- }
-
- var1[var2++] = var3;
- if (var2 == var1.length) {
- Object[] var6 = new Object[var1.length * 2];
- System.arraycopy(var1, 0, var6, 0, var1.length);
- var1 = var6;
- }
-
- var5 = true;
- }
- }
-
- private final String stringForToken() throws DeserializationException {
- byte[] var1 = this.tokenGenerator.bytesForLastToken();
- if (var1 == null || var1.length == 0) {
- this.internalInconsistency("empty string");
- }
-
- if (var1[0] != 34) {
- return new String(var1, 0);
- } else {
- char[] var3 = new char[32];
- int var4 = 0;
- int var5 = 1;
-
- for(int var6 = var1.length - 1; var5 < var6; ++var5) {
- byte var2 = var1[var5];
- if (var2 == 92) {
- byte var7 = 0;
- char var8 = 0;
- ++var5;
- if (var5 < var6) {
- var7 = var1[var5];
- } else {
- this.malformedString();
- }
-
- switch (var7) {
- case 34:
- var8 = (char)var7;
- break;
- case 92:
- var8 = '\\';
- break;
- case 110:
- var8 = '\n';
- break;
- case 114:
- var8 = '\r';
- break;
- case 116:
- var8 = '\t';
- break;
- case 117:
- byte var9 = 0;
- byte var10 = 0;
- byte var11 = 0;
- byte var12 = 0;
- ++var5;
- if (var5 < var6) {
- var9 = var1[var5];
- } else {
- this.malformedString();
- }
-
- ++var5;
- if (var5 < var6) {
- var10 = var1[var5];
- } else {
- this.malformedString();
- }
-
- ++var5;
- if (var5 < var6) {
- var11 = var1[var5];
- } else {
- this.malformedString();
- }
-
- ++var5;
- if (var5 < var6) {
- var12 = var1[var5];
- } else {
- this.malformedString();
- }
-
- if (this.isHexa(var9) && this.isHexa(var10) && this.isHexa(var11) && this.isHexa(var12)) {
- var8 = (char)(this.asciiToFourBits(var9) << 12 | this.asciiToFourBits(var10) << 8 | this.asciiToFourBits(var11) << 4 | this.asciiToFourBits(var12));
- break;
- }
-
- this.malformedString();
- break;
- default:
- boolean var13 = false;
- byte var14 = 0;
- byte var15 = 0;
- ++var5;
- if (var5 < var6) {
- var14 = var1[var5];
- } else {
- --var5;
- }
-
- ++var5;
- if (var5 < var6) {
- var15 = var1[var5];
- } else {
- --var5;
- }
-
- if (var7 >= 48 && var7 <= 55 && var14 >= 48 && var14 <= 55 && var15 >= 48 && var15 <= 55) {
- var8 = (char)(var7 - 48 << 6 | var14 - 48 << 3 | var15 - 48);
- } else {
- this.malformedString();
- }
- }
-
- var3[var4++] = var8;
- if (var4 == var3.length) {
- char[] var21 = new char[var3.length * 2];
- System.arraycopy(var3, 0, var21, 0, var3.length);
- var3 = var21;
- }
- } else {
- var3[var4++] = (char)var2;
- if (var4 == var3.length) {
- char[] var20 = new char[var3.length * 2];
- System.arraycopy(var3, 0, var20, 0, var3.length);
- var3 = var20;
- }
- }
- }
-
- return new String(var3, 0, var4);
- }
- }
-
- private final boolean isHexa(byte var1) {
- return var1 >= 48 && var1 <= 57 || var1 >= 97 && var1 <= 102 || var1 >= 65 && var1 <= 70;
- }
-
- private final byte asciiToFourBits(byte var1) {
- if (var1 >= 48 && var1 <= 57) {
- return (byte)(var1 - 48);
- } else {
- return var1 >= 97 && var1 <= 102 ? (byte)(var1 - 97 + 10) : (byte)(var1 - 65 + 10);
- }
- }
-
- private void malformedString() throws DeserializationException {
- int var1 = this.tokenGenerator.lineForLastToken();
- throw new DeserializationException("Malformed string at line " + var1 + ":" + new String(this.tokenGenerator.bytesForLastToken(), 0), var1);
- }
-
- private void syntaxError() throws DeserializationException {
- int var1 = this.tokenGenerator.lineForLastToken();
- throw new DeserializationException("Syntax error at line " + var1, var1);
- }
-
- private void internalInconsistency(String var1) throws DeserializationException {
- int var2 = this.tokenGenerator.lineForLastToken();
- throw new DeserializationException("Internal inconsistency exception. Please report this problem. " + var1 + " " + var2, var2);
- }
-
- private void unterminatedExpression() throws DeserializationException {
- int var1 = this.tokenGenerator.lineForLastToken();
- throw new DeserializationException("Unterminated expression at line " + var1, var1);
- }
- }
-