diff --git a/src/bdf/file/BdfFileManager.java b/src/bdf/file/BdfFileManager.java index f03ff54..0a78daa 100644 --- a/src/bdf/file/BdfFileManager.java +++ b/src/bdf/file/BdfFileManager.java @@ -1,10 +1,12 @@ package bdf.file; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.zip.DeflaterOutputStream; +import java.util.zip.GZIPOutputStream; import bdf.data.BdfDatabase; import bdf.types.BdfObject; @@ -65,7 +67,7 @@ public class BdfFileManager extends BdfReader OutputStream out = new FileOutputStream(path); if(compressed) { - out = new DeflaterOutputStream(out); + out = new GZIPOutputStream(out); } // Write the database to the file diff --git a/src/bdf/types/BdfArray.java b/src/bdf/types/BdfArray.java index bef4473..eb857d9 100644 --- a/src/bdf/types/BdfArray.java +++ b/src/bdf/types/BdfArray.java @@ -41,25 +41,13 @@ public class BdfArray implements IBdfType, Iterable } } - public BdfObject createObject() { - return new BdfObject(lookupTable); - } - - public BdfNamedList createNamedList() { - return new BdfNamedList(lookupTable); - } - - public BdfArray createArray() { - return new BdfArray(lookupTable); - } - @Override - public int serializeSeeker() + public int serializeSeeker(int[] locations) { int size = 0; for(BdfObject o : elements) { - size += o.serializeSeeker(); + size += o.serializeSeeker(locations); size += 4; } @@ -67,13 +55,13 @@ public class BdfArray implements IBdfType, Iterable } @Override - public int serialize(IBdfDatabase database) + public int serialize(IBdfDatabase database, int[] locations) { int pos = 0; for(BdfObject o : elements) { - int size = o.serialize(database.getPointer(pos + 4)); + int size = o.serialize(database.getPointer(pos + 4), locations); database.setBytes(pos, DataHelpers.serializeInt(size)); pos += size; @@ -190,5 +178,12 @@ public class BdfArray implements IBdfType, Iterable } }; } + + @Override + public void getLocationUses(int[] locations) { + for(BdfObject element : elements) { + element.getLocationUses(locations); + } + } } diff --git a/src/bdf/types/BdfLookupTable.java b/src/bdf/types/BdfLookupTable.java index 68c34bd..ed60d51 100644 --- a/src/bdf/types/BdfLookupTable.java +++ b/src/bdf/types/BdfLookupTable.java @@ -11,14 +11,18 @@ import bdf.util.DataHelpers; class BdfLookupTable implements IBdfType { private ArrayList keys; + private BdfReader reader; - BdfLookupTable() { - keys = new ArrayList(); + BdfLookupTable(BdfReader reader) + { + this.keys = new ArrayList(); + this.reader = reader; } - BdfLookupTable(IBdfDatabase database) + BdfLookupTable(BdfReader reader, IBdfDatabase database) { - keys = new ArrayList(); + this.keys = new ArrayList(); + this.reader = reader; for(int i=0;i 0) { + locations[i] = next; + next += 1; + } else { + locations[i] = -1; + } + } + + return locations; + } @Override public void serializeHumanReadable(OutputStream stream, BdfIndent indent, int it) { } + + @Override + public void getLocationUses(int[] locations) { + } } diff --git a/src/bdf/types/BdfNamedList.java b/src/bdf/types/BdfNamedList.java index c8c5aea..3189023 100644 --- a/src/bdf/types/BdfNamedList.java +++ b/src/bdf/types/BdfNamedList.java @@ -56,17 +56,17 @@ public class BdfNamedList implements IBdfType } @Override - public int serialize(IBdfDatabase database) + public int serialize(IBdfDatabase database, int[] locations) { int pos = 0; for(Element o : elements) { - database.setBytes(pos, DataHelpers.serializeInt(o.key)); + database.setBytes(pos, DataHelpers.serializeInt(locations[o.key])); pos += 4; - int size = o.object.serialize(database.getPointer(pos + 4)); + int size = o.object.serialize(database.getPointer(pos + 4), locations); database.setBytes(pos, DataHelpers.serializeInt(size)); @@ -78,14 +78,14 @@ public class BdfNamedList implements IBdfType } @Override - public int serializeSeeker() + public int serializeSeeker(int[] locations) { int size = 0; for(Element o : elements) { size += 8; - size += o.object.serializeSeeker(); + size += o.object.serializeSeeker(locations); } return size; @@ -181,30 +181,6 @@ public class BdfNamedList implements IBdfType return null; } - public BdfNamedList remove(BdfObject bdf) - { - for(int i=0;i 1) - { - // Get the type and database values - type = data.getByte(0); - database = data.getPointer(1, data.size() - 1); - - // Set the object variable if there is an object specified - if(type == BdfTypes.STRING) object = database.getString(); - if(type == BdfTypes.ARRAY) object = new BdfArray(lookupTable, database); - if(type == BdfTypes.NAMED_LIST) object = new BdfNamedList(lookupTable, database); - - if(object != null) { - database = null; - } - } + // Get the type and database values + type = data.getByte(0); + database = data.getPointer(1, data.size() - 1); - else - { - // Create a new database - database = new BdfDatabase(0); + // Set the object variable if there is an object specified + if(type == BdfTypes.STRING) object = database.getString(); + if(type == BdfTypes.ARRAY) object = new BdfArray(lookupTable, database); + if(type == BdfTypes.NAMED_LIST) object = new BdfNamedList(lookupTable, database); + + if(object != null) { + database = null; } } @Override - public int serialize(IBdfDatabase database) + public void getLocationUses(int[] locations) + { + if(type == BdfTypes.NAMED_LIST || type == BdfTypes.ARRAY) { + ((IBdfType)object).getLocationUses(locations); + } + } + + @Override + public int serialize(IBdfDatabase database, int[] locations) { int size; @@ -59,11 +58,11 @@ public class BdfObject implements IBdfType switch(type) { case BdfTypes.ARRAY: - size = ((BdfArray)object).serialize(db) + 1; + size = ((BdfArray)object).serialize(db, locations) + 1; break; case BdfTypes.NAMED_LIST: - size = ((BdfNamedList)object).serialize(db) + 1; + size = ((BdfNamedList)object).serialize(db, locations) + 1; break; case BdfTypes.STRING: @@ -84,13 +83,13 @@ public class BdfObject implements IBdfType } @Override - public int serializeSeeker() + public int serializeSeeker(int[] locations) { // Objects switch(type) { - case BdfTypes.ARRAY: return ((BdfArray)object).serializeSeeker() + 1; - case BdfTypes.NAMED_LIST: return ((BdfNamedList)object).serializeSeeker() + 1; + case BdfTypes.ARRAY: return ((BdfArray)object).serializeSeeker(locations) + 1; + case BdfTypes.NAMED_LIST: return ((BdfNamedList)object).serializeSeeker(locations) + 1; case BdfTypes.STRING: return ((String)object).getBytes().length + 1; } @@ -158,7 +157,7 @@ public class BdfObject implements IBdfType int[] array = this.getIntegerArray(); for(int i=0;i