コード例 #1
0
        /**
         * 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();
            }
        }
コード例 #2
0
        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"));
            }
        }