/** * parse resource table file. */ public async Task parse() { // read resource file header. ResourceTableHeader resourceTableHeader = (ResourceTableHeader) await readChunkHeader(); // read string pool chunk stringPool = await ParseUtils.readStringPool(buffer, (StringPoolHeader)await readChunkHeader()); resourceTable = new ResourceTable(); resourceTable.setStringPool(stringPool); PackageHeader packageHeader = (PackageHeader) await readChunkHeader(); for (int i = 0; i < resourceTableHeader.getPackageCount(); i++) { Pair <ResourcePackage, PackageHeader> pair = await readPackage(packageHeader); resourceTable.addPackage(pair.getLeft()); //.getLeft()); //This maybe null, may cause a bug. packageHeader = pair.getRight(); //.getRight(); } }
private async Task <ChunkHeader> readChunkHeader() { long begin = buffer.position(); int chunkType = await Buffers.readUShort(buffer); int headerSize = await Buffers.readUShort(buffer); long chunkSize = Buffers.readUInt(buffer); switch (chunkType) { case ChunkType.TABLE: ResourceTableHeader resourceTableHeader = new ResourceTableHeader(chunkType, headerSize, chunkSize); resourceTableHeader.setPackageCount(Buffers.readUInt(buffer)); buffer.position((int)(begin + headerSize)); return(resourceTableHeader); case ChunkType.STRING_POOL: StringPoolHeader stringPoolHeader = new StringPoolHeader(chunkType, headerSize, chunkSize); stringPoolHeader.setStringCount(Buffers.readUInt(buffer)); stringPoolHeader.setStyleCount(Buffers.readUInt(buffer)); stringPoolHeader.setFlags(Buffers.readUInt(buffer)); stringPoolHeader.setStringsStart(Buffers.readUInt(buffer)); stringPoolHeader.setStylesStart(Buffers.readUInt(buffer)); buffer.position((int)(begin + headerSize)); return(stringPoolHeader); case ChunkType.TABLE_PACKAGE: PackageHeader packageHeader = new PackageHeader(chunkType, headerSize, chunkSize); packageHeader.setId(Buffers.readUInt(buffer)); packageHeader.setName(ParseUtils.readStringUTF16(buffer, 128)); packageHeader.setTypeStrings(Buffers.readUInt(buffer)); packageHeader.setLastPublicType(Buffers.readUInt(buffer)); packageHeader.setKeyStrings(Buffers.readUInt(buffer)); packageHeader.setLastPublicKey(Buffers.readUInt(buffer)); buffer.position((int)(begin + headerSize)); return(packageHeader); case ChunkType.TABLE_TYPE_SPEC: TypeSpecHeader typeSpecHeader = new TypeSpecHeader(chunkType, headerSize, chunkSize); typeSpecHeader.setId(Buffers.readUByte(buffer)); typeSpecHeader.setRes0(Buffers.readUByte(buffer)); typeSpecHeader.setRes1(await Buffers.readUShort(buffer)); typeSpecHeader.setEntryCount(Buffers.readUInt(buffer)); buffer.position((int)(begin + headerSize)); return(typeSpecHeader); case ChunkType.TABLE_TYPE: TypeHeader typeHeader = new TypeHeader(chunkType, headerSize, chunkSize); typeHeader.setId(Buffers.readUByte(buffer)); typeHeader.setRes0(Buffers.readUByte(buffer)); typeHeader.setRes1(await Buffers.readUShort(buffer)); typeHeader.setEntryCount(Buffers.readUInt(buffer)); typeHeader.setEntriesStart(Buffers.readUInt(buffer)); typeHeader.setConfig(readResTableConfig()); buffer.position((int)(begin + headerSize)); return(typeHeader); case ChunkType.TABLE_LIBRARY: //DynamicRefTable LibraryHeader libraryHeader = new LibraryHeader(chunkType, headerSize, chunkSize); libraryHeader.setCount(Buffers.readUInt(buffer)); buffer.position((int)(begin + headerSize)); return(libraryHeader); case ChunkType.NULL: //buffer.skip((int) (chunkSize - headerSize)); default: throw new ParserException("Unexpected chunk Type: 0x" + chunkType.ToString("X")); } }