use of info.ata4.junity.serialize.SerializedFileHeader in project disunity by ata4.
the class SerializedFileReader method readMetadata.
private void readMetadata(DataReader in) throws IOException {
SerializedFileMetadata metadata = serialized.metadata();
SerializedFileHeader header = serialized.header();
DataBlock metadataBlock = serialized.metadataBlock();
metadataBlock.markBegin(in);
metadata.version(header.version());
in.readStruct(metadata);
metadataBlock.markEnd(in);
L.log(Level.FINER, "metadataBlock: {0}", metadataBlock);
}
use of info.ata4.junity.serialize.SerializedFileHeader in project disunity by ata4.
the class SerializedFileReader method readObjects.
private void readObjects(DataReader in) throws IOException {
long ofsMin = Long.MAX_VALUE;
long ofsMax = Long.MIN_VALUE;
SerializedFileHeader header = serialized.header();
SerializedFileMetadata metadata = serialized.metadata();
Map<Long, ObjectInfo> objectInfoMap = metadata.objectInfoTable().infoMap();
Map<Integer, TypeRoot<Type>> typeTreeMap = metadata.typeTree().typeMap();
List<SerializedObjectData> objectData = serialized.objectData();
for (Map.Entry<Long, ObjectInfo> infoEntry : objectInfoMap.entrySet()) {
ObjectInfo info = infoEntry.getValue();
long id = infoEntry.getKey();
long ofs = header.dataOffset() + info.offset();
ofsMin = Math.min(ofsMin, ofs);
ofsMax = Math.max(ofsMax, ofs + info.length());
SerializedObjectData object = new SerializedObjectData(id);
object.info(info);
// create and read object data buffer
ByteBuffer buf = ByteBufferUtils.allocate((int) info.length());
in.position(ofs);
in.readBuffer(buf);
object.buffer(buf);
// get type tree if possible
TypeRoot typeRoot = typeTreeMap.get(info.typeID());
if (typeRoot != null) {
object.typeTree(typeRoot.nodes());
}
objectData.add(object);
}
DataBlock objectDataBlock = serialized.objectDataBlock();
objectDataBlock.offset(ofsMin);
objectDataBlock.endOffset(ofsMax);
L.log(Level.FINER, "objectDataBlock: {0}", objectDataBlock);
}
use of info.ata4.junity.serialize.SerializedFileHeader in project disunity by ata4.
the class SerializedFileWriter method writeMetadata.
private void writeMetadata(DataWriter out) throws IOException {
SerializedFileMetadata metadata = serialized.metadata();
SerializedFileHeader header = serialized.header();
DataBlock metadataBlock = serialized.metadataBlock();
metadataBlock.markBegin(out);
metadata.version(header.version());
out.writeStruct(metadata);
metadataBlock.markEnd(out);
L.log(Level.FINER, "metadataBlock: {0}", metadataBlock);
}
use of info.ata4.junity.serialize.SerializedFileHeader in project disunity by ata4.
the class SerializedFileTest method offsetsAndSizesValid.
@Test
public void offsetsAndSizesValid() throws IOException {
SerializedFileHeader header = asset.header();
long fileSize = Files.size(readFile);
assertEquals("Header file size and actual file size must be equal", header.fileSize(), fileSize);
assertTrue("Data offset must be within file", header.dataOffset() < header.fileSize());
// allowing a difference of 3 bytes because of padding
assertEquals("Metadata sizes in data block and header must match", header.metadataSize(), asset.metadataBlock().length(), 3);
// check blocks
List<DataBlock> blocks = asset.dataBlocks();
blocks.forEach(block1 -> blocks.forEach(block2 -> {
if (block1 != block2) {
assertFalse("Blocks are overlapping: " + block1 + " / " + block2, block1.isIntersecting(block2));
}
}));
}
use of info.ata4.junity.serialize.SerializedFileHeader in project disunity by ata4.
the class AssetHeader method tableModel.
@Override
protected TableModel tableModel(SerializedFile serialized) {
SerializedFileHeader header = serialized.header();
TableBuilder table = new TableBuilder();
table.row("Field", "Value");
table.row("metadataSize", header.metadataSize());
table.row("fileSize", header.fileSize());
table.row("version", header.version());
table.row("dataOffset", header.dataOffset());
if (header.version() >= 9) {
table.row("endianness", header.endianness());
}
return new TableModel("Header", table.get());
}
Aggregations