示例#1
0
    def __init__(self,
                 header=None,
                 stringCount=0,
                 styleCount=0,
                 flags=0,
                 stringsStart=0,
                 stylesStart=0):
        if header is None:
            header = ResChunk_header(ResourceType.RES_STRING_POOL_TYPE,
                                     headerSize=ResStringPool_header.len,
                                     size=ResStringPool_header.len)
        if not isinstance(header, ResChunk_header):
            raise WrongTypeException('header', ResChunk_header)
        if header.type is not ResourceType.RES_STRING_POOL_TYPE:
            raise ChunkHeaderWrongTypeException(
                ResourceType.RES_STRING_POOL_TYPE)
        self.header = header

        if isinstance(stringCount, uint32):
            ## Number of strings in this pool (number of uint32_t indices that
            #  follow in the data).
            self.stringCount = stringCount
        else:
            self.stringCount = uint32(stringCount, little=True)

        if isinstance(styleCount, uint32):
            ## Number of style span arrays in the pool (number of uint32_t
            #  indices follow the string indices).
            self.styleCount = styleCount
        else:
            self.styleCount = uint32(styleCount, little=True)

        if isinstance(flags, ResStringPool_header.Flags):
            ## Flags.
            self.flags = flags
        else:
            self.flags = ResStringPool_header.Flags(flags)

        if isinstance(stringsStart, uint32):
            ## Index from header of the string data.
            self.stringsStart = stringsStart
        else:
            self.stringsStart = uint32(stringsStart, little=True)

        if isinstance(stylesStart, uint32):
            ## Index from header of the style data.
            self.stylesStart = stylesStart
        else:
            self.stylesStart = uint32(stylesStart, little=True)
示例#2
0
    def from_bytes(b, little=True):
        content = b
        header, b = ResStringPool_header.from_bytes(b)

        # drop everything inside size declared in ResStringPool_header
        content, rest = content[:header.header.size.integer], \
        content[header.header.size.integer:]

        # split content
        strrefslen = header.stringCount.integer * len(uint32(0))
        stylerefslen = header.styleCount.integer * len(uint32(0))

        if strrefslen > 0:
            strrefs_b, b = b[:strrefslen], b[strrefslen:]
            strings_b = content[header.stringsStart.integer:]
        else:
            strrefs_b = bytes()
            strings_b = bytes()

        if stylerefslen > 0:
            stylerefs_b, b = b[:stylerefslen], b[stylerefslen:]
            styles_b = content[header.stylesStart.integer:]
        else:
            stylerefs_b = bytes()
            styles_b = bytes()

        # split ref list buffers into Python lists
        strrefs, r = ResStringPool._split_fixed_list(
            strrefs_b, header.stringCount.integer, uint32)
        if len(r) > 0:
            raise Exception('String pool inconsistent')
        stylerefs, r = ResStringPool._split_fixed_list(
            stylerefs_b, header.styleCount.integer, uint32)
        if len(r) > 0:
            raise Exception('Style span pool inconsistent')

        # count lengths of entries
        strlengths = ResStringPool._offsets_to_length(strrefs + \
                [uint32(len(strings_b))])
        stylelengths = ResStringPool._offsets_to_length(stylerefs + \
                [uint32(len(styles_b))])

        # split strings and styles into lists
        strings = ResStringPool._split_variable_length_strings(
            strings_b, strlengths)
        styles = ResStringPool._split_variable_length_strings(
            styles_b, stylelengths)

        return ResStringPool(header, strrefs, stylerefs, strings, styles), rest
示例#3
0
    def __init__(self, header=None, id=1, res0=0, res1=0, entryCount=0):
        if header is None:
            header = ResChunk_header(ResourceType.RES_TABLE_TYPE_SPEC_TYPE,
                    headerSize=ResTable_typeSpec_header.len,
                    size=ResTable_typeSpec_header.len)
        if not isinstance(header, ResChunk_header):
            raise WrongTypeException('header', ResChunk_header)
        if header.type is not ResourceType.RES_TABLE_TYPE_SPEC_TYPE:
            raise ChunkHeaderWrongTypeException(
                    ResourceType.RES_TABLE_TYPE_SPEC_TYPE)

        if not isinstance(id, uint8):
            id = uint8(id, little=True)

        if not isinstance(res0, uint8):
            res0 = uint8(res0, little=True)

        if not isinstance(res1, uint16):
            res1 = uint16(res1, little=True)

        if not isinstance(entryCount, uint32):
            entryCount = uint32(entryCount, little=True)

        self.header = header
        ## The type identifier this chunk is holding.  Type IDs start
        #  at 1 (corresponding to the value of the type bits in a
        #  resource identifier).  0 is invalid.
        self.id = id
        ## Must be 0.
        self.res0 = res0
        ## Must be 0.
        self.res1 = res1
        ## Number of uint32_t entry configuration masks that follow.
        self.entryCount = entryCount
示例#4
0
    def test_objects_are_not_same(self):
        invector1 = ResTable_header()
        invector2 = ResTable_header()
        invector1.header.size = uint32(123)

        self.assertIsNot(invector1, invector2)
        self.assertNotEqual(invector1, invector2)
示例#5
0
    def test_packageCount_is_uint32(self):
        invector = ResTable_header(
            ResChunk_header(ResourceType.RES_TABLE_TYPE), uint32(0x8331337))
        expected = uint32
        actual = type(invector.packageCount)

        self.assertEqual(expected, actual)
示例#6
0
class ResChunk_header:

    ResChunk_header_len = len(ResourceType.RES_NULL_TYPE) + len(uint16(0)) + \
            len(uint32(0))

    def __init__(self,
                 chunkType=ResourceType.RES_NULL_TYPE,
                 headerSize=ResChunk_header_len,
                 size=ResChunk_header_len):
        if isinstance(chunkType, ResourceType):
            self.type = chunkType
        else:
            self.type = ResourceType(chunkType, little=True)

        if isinstance(headerSize, uint16):
            self.headerSize = headerSize
        else:
            self.headerSize = uint16(headerSize, little=True)

        if isinstance(size, uint32):
            self.size = size
        else:
            self.size = uint32(size, little=True)

    def __str__(self):
        return '{{type={type}, headerSize={headerSize}, size={size}}}'.format(
            type=str(self.type), headerSize=self.headerSize, size=self.size)

    def __repr__(self):
        return '{c}({type}, {headerSize}, {size})'.format(
            c=type(self).__name__,
            type=str(self.type),
            headerSize=self.headerSize,
            size=self.size)

    def __eq__(self, rhs):
        return self.type == rhs.type and self.headerSize == rhs.headerSize and \
                self.size == rhs.size

    def __len__(self):
        return len(bytes(self))

    def __bytes__(self):
        chunkType = bytes(reversed(bytes(self.type)))  # always little
        headerSize = bytes(self.headerSize)
        size = bytes(self.size)
        return chunkType + headerSize + size

    def from_bytes(b, little=True):
        chunkType, b = ResourceType.from_bytes(b, little=True)
        headerSize, b = uint16.from_bytes(b, little=True)
        size, b = uint32.from_bytes(b, little=True)
        return ResChunk_header(chunkType, headerSize, size), b
示例#7
0
    def __init__(self, header=None, packageCount=0):
        if header is None:
            header = ResChunk_header(ResourceType.RES_TABLE_TYPE,
                                     headerSize=ResTable_header.len,
                                     size=ResTable_header.len)
        if not isinstance(header, ResChunk_header):
            raise WrongTypeException('header', ResChunk_header)
        if header.type is not ResourceType.RES_TABLE_TYPE:
            raise ChunkHeaderWrongTypeException(ResourceType.RES_TABLE_TYPE,
                                                header.type)
        self.header = header

        if isinstance(packageCount, uint32):
            self.packageCount = packageCount
        else:
            self.packageCount = uint32(packageCount, little=True)
示例#8
0
    def __init__(self,
                 chunkType=ResourceType.RES_NULL_TYPE,
                 headerSize=ResChunk_header_len,
                 size=ResChunk_header_len):
        if isinstance(chunkType, ResourceType):
            self.type = chunkType
        else:
            self.type = ResourceType(chunkType, little=True)

        if isinstance(headerSize, uint16):
            self.headerSize = headerSize
        else:
            self.headerSize = uint16(headerSize, little=True)

        if isinstance(size, uint32):
            self.size = size
        else:
            self.size = uint32(size, little=True)
示例#9
0
    def __init__(self,
                 size=0x30,
                 imsi=None,
                 locale=None,
                 screenType=None,
                 input=None,
                 screenSize=None,
                 version=None,
                 screenConfig=None,
                 screenSizeDp=None):
        notimpl = None
        if isinstance(size, uint32):
            ## Number of bytes in this structure
            self.size = size
        elif isinstance(size, bytes):
            # TODO: remove after full implementation
            self.size, notimpl = uint32.from_bytes(size, little=True)
        else:
            self.size = uint32(size, little=True)

        if notimpl is None:
            notimpl = bytes(self.size.integer - 4)
        self.notimpl = notimpl
示例#10
0
class ResTable_packageTests(unittest.TestCase):

    # FIXME: a bit ugly, maybe change ?
    Flags = ResStringPool_header.Flags

    # ResTable_package_header(name='test')
    package_header = b'\0\2\x20\1\x08\3\0\0\x7f\0\0\0t\0e\0s\0t\0\0\0' + \
            bytes(246) + b'\x20\1\0\0\1\0\0\0\xb4\1\0\0\4\0\0\0' + \
            b'\0\0\0\0'

    # ResStringPool
    type_strings = \
            b'\1\0\x1c\0\x94\0\0\0\x0a\0\0\0\0\0\0\0\0\1\0\0\x44\0\0\0' + \
            b'\0\0\0\0\0\0\0\0\7\0\0\0\x12\0\0\0\x1b\0\0\0\x21\0\0\0' + \
            b'\x29\0\0\0\x31\0\0\0\x3a\0\0\0\x42\0\0\0\x49\0\0\0\4\4attr\0' + \
            b'\x08\x08drawable\0\6\6layout\0\3\3raw\0\5\5color\0\5\5dimen\0' + \
            b'\6\6string\0\5\5style\0\4\4menu\0\2\2id\0' + \
            b'\0\0'

    # ResStringPool
    key_strings = \
            b'\1\0\x1c\0\x4c\0\0\0' + \
            b'\4\0\0\0\0\0\0\0\0\1\0\0\x2c\0\0\0\0\0\0\0' + \
            b'\0\0\0\0\x08\0\0\0\x11\0\0\0\x19\0\0\0' + \
            b'\5\5alarm\0\6\6alarm1\0\5\5arrow\0\4\4back\0'

    typeSpec = b'\2\2\x10\0\x20\0\0\0\7\0\0\0\4\0\0\0' + (b'\4\0\0\0' * 4)  #20

    type1 = b'\1\2\x44\0\x74\0\0\0\7\0\0\0\4\0\0\0\x54\0\0\0' + \
            b'\x30\0\0\0' + bytes(0x2c) + \
            b'\0\0\0\0\x10\0\0\0\x20\0\0\0\x30\0\0\0' + \
            b'\x08\0\0\0\0\0\0\0\x08\0\0\0\x08\0\0\0' + \
            b'\x08\0\0\0\x11\0\0\0\x08\0\0\0\x19\0\0\0'

    type2 = b'\1\2\x44\0\x74\0\0\0\7\0\0\0\4\0\0\0\x54\0\0\0' + \
            b'\x30\0\0\0\0\0\0\0de' + bytes(0x26) + \
            b'\0\0\0\0\x10\0\0\0\x20\0\0\0\x30\0\0\0' + \
            b'\x08\0\0\0\0\0\0\0\x08\0\0\0\x08\0\0\0' + \
            b'\x08\0\0\0\x11\0\0\0\x08\0\0\0\x19\0\0\0'

    tv1_bytes = package_header + type_strings + key_strings + typeSpec + type1 + \
            type2

    tv1_obj = \
            ResTable_package(
                ResTable_package_header(
                    ResChunk_header(
                        ResourceType.RES_TABLE_PACKAGE_TYPE, 288, 776
                    ),
                    127, b't\x00e\x00s\x00t\x00\x00\x00', 288, 1, 436, 4
                ),
                ResStringPool(
                    ResStringPool_header(
                        ResChunk_header(
                            ResourceType.RES_STRING_POOL_TYPE, 28, 148
                        ),
                        10, 0, Flags.UTF8_FLAG, 68, 0
                    ),
                    [
                        uint32(0),
                        uint32(7),
                        uint32(18),
                        uint32(27),
                        uint32(33),
                        uint32(41),
                        uint32(49),
                        uint32(58),
                        uint32(66),
                        uint32(73)
                    ],
                    [],
                    [
                        b'\x04\x04attr\x00',
                        b'\x08\x08drawable\x00',
                        b'\x06\x06layout\x00',
                        b'\x03\x03raw\x00',
                        b'\x05\x05color\x00',
                        b'\x05\x05dimen\x00',
                        b'\x06\x06string\x00',
                        b'\x05\x05style\x00',
                        b'\x04\x04menu\x00',
                        b'\x02\x02id\x00\x00\x00'
                    ],
                    []
                ),
                ResStringPool(
                    ResStringPool_header(
                        ResChunk_header(
                            ResourceType.RES_STRING_POOL_TYPE, 28, 76
                        ),
                        4, 0, Flags.UTF8_FLAG, 44, 0
                    ),
                    [
                        uint32(0),
                        uint32(8),
                        uint32(17),
                        uint32(25)
                    ],
                    [],
                    [
                        b'\x05\x05alarm\x00',
                        b'\x06\x06alarm1\x00',
                        b'\x05\x05arrow\x00',
                        b'\x04\x04back\x00'
                    ],
                    []
                ),
                [
                    [
                        ResTable_typeSpec(
                            ResTable_typeSpec_header(
                                ResChunk_header(
                                    ResourceType.RES_TABLE_TYPE_SPEC_TYPE,
                                    16, 32
                                ),
                                7, 0, 0, 4
                            ),
                            (b'\x04\x00\x00\x00' * 4)
                        ),
                        ResTable_type(
                            ResTable_type_header(
                                ResChunk_header(
                                    ResourceType.RES_TABLE_TYPE_TYPE, 68, 116
                                ),
                                7, 0, 0, 4, 84,
                                b'0' + bytes(0x2f)
                            ),
                            b'\x00\x00\x00\x00\x10\x00\x00\x00'\
                                    b' \x00\x00\x000\x00\x00\x00'\
                                    b'\x08\x00\x00\x00\x00\x00\x00\x00'\
                                    b'\x08\x00\x00\x00\x08\x00\x00\x00'\
                                    b'\x08\x00\x00\x00\x11\x00\x00\x00'\
                                    b'\x08\x00\x00\x00\x19\x00\x00\x00'
                        ),
                        ResTable_type(
                            ResTable_type_header(
                                ResChunk_header(
                                    ResourceType.RES_TABLE_TYPE_TYPE, 68, 116
                                ),
                                7, 0, 0, 4, 84,
                                b'0\x00\x00\x00\x00\x00\x00\x00de'+bytes(0x26)
                            ),
                            b'\x00\x00\x00\x00\x10\x00\x00\x00'\
                                    b' \x00\x00\x000\x00\x00\x00'\
                                    b'\x08\x00\x00\x00\x00\x00\x00\x00'\
                                    b'\x08\x00\x00\x00\x08\x00\x00\x00'\
                                    b'\x08\x00\x00\x00\x11\x00\x00\x00'\
                                    b'\x08\x00\x00\x00\x19\x00\x00\x00'
                        )
                    ]
                ]
            )

    def test_str(self):
        invector = ResTable_packageTests.tv1_obj
        expected = "{header={header={type="\
                "ResourceType.RES_TABLE_PACKAGE_TYPE, headerSize=288, "\
                "size=776}, id=127, name=b't\\x00e\\x00s\\x00t\\x00\\x00\\x00"+\
                ("\\x00" * 246)+"', typeStrings=288, lastPublicType=1, "\
                "keyStrings=436, lastPublicKey=4}, typeStrings={"\
                "header={header={"\
                "type=ResourceType.RES_STRING_POOL_TYPE, headerSize=28, "\
                "size=148}, stringCount=10, styleCount=0, "\
                "flags=Flags.UTF8_FLAG, stringsStart=68, stylesStart=0}, "\
                "strrefs=[uint32(0), uint32(7), uint32(18), uint32(27), "\
                "uint32(33), uint32(41), uint32(49), uint32(58), uint32(66), "\
                "uint32(73)], stylerefs=[], strings=[b'\\x04\\x04attr\\x00', "\
                "b'\\x08\\x08drawable\\x00', b'\\x06\\x06layout\\x00', "\
                "b'\\x03\\x03raw\\x00', b'\\x05\\x05color\\x00', "\
                "b'\\x05\\x05dimen\\x00', b'\\x06\\x06string\\x00', "\
                "b'\\x05\\x05style\\x00', b'\\x04\\x04menu\\x00', "\
                "b'\\x02\\x02id\\x00\\x00\\x00'], styles=[]}, "\
                "keyStrings={header={header={"\
                "type=ResourceType.RES_STRING_POOL_TYPE, headerSize=28, "\
                "size=76}, stringCount=4, styleCount=0, "\
                "flags=Flags.UTF8_FLAG, stringsStart=44, stylesStart=0}, "\
                "strrefs=[uint32(0), uint32(8), uint32(17), uint32(25)], "\
                "stylerefs=[], strings=[b'\\x05\\x05alarm\\x00', "\
                "b'\\x06\\x06alarm1\\x00', b'\\x05\\x05arrow\\x00', "\
                "b'\\x04\\x04back\\x00'], styles=[]}, "\
                "types=[[ResTable_typeSpec(ResTable_typeSpec_header("\
                "ResChunk_header(ResourceType.RES_TABLE_TYPE_SPEC_TYPE, 16, "\
                "32), 7, 0, 0, 4), b'\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00"\
                "\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00'), ResTable_type("\
                "ResTable_type_header(ResChunk_header("\
                "ResourceType.RES_TABLE_TYPE_TYPE, 68, 116), 7, 0, 0, 4, 84, "\
                "b'0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'"\
                "), b'\\x00\\x00\\x00\\x00\\x10\\x00\\x00\\x00 \\x00\\x00\\x00"\
                "0\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08"\
                "\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x11"\
                "\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x19\\x00\\x00\\x00'), "\
                "ResTable_type(ResTable_type_header(ResChunk_header("\
                "ResourceType.RES_TABLE_TYPE_TYPE, 68, 116), 7, 0, 0, 4, 84, "\
                "b'0\\x00\\x00\\x00\\x00\\x00\\x00\\x00de\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'), b'\\x00"\
                "\\x00\\x00\\x00\\x10\\x00\\x00\\x00 \\x00\\x00\\x000\\x00"\
                "\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00"\
                "\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x11\\x00"\
                "\\x00\\x00\\x08\\x00\\x00\\x00\\x19\\x00\\x00\\x00')]]}"
        actual = str(invector)

        self.assertEqual(expected, actual)

    def test_repr(self):
        invector = ResTable_packageTests.tv1_obj
        expected = "ResTable_package(ResTable_package_header(ResChunk_header("\
                "ResourceType.RES_TABLE_PACKAGE_TYPE, 288, 776), 127, "\
                "b't\\x00e\\x00s\\x00t\\x00\\x00\\x00" + ("\\x00" * 246) + \
                "', 288, 1, 436, 4), ResStringPool(ResStringPool_header("\
                "ResChunk_header(ResourceType.RES_STRING_POOL_TYPE, 28, 148"\
                "), 10, 0, Flags.UTF8_FLAG, 68, 0), [uint32(0), uint32(7), "\
                "uint32(18), uint32(27), uint32(33), uint32(41), uint32(49), "\
                "uint32(58), uint32(66), uint32(73)], [], ["\
                "b'\\x04\\x04attr\\x00', b'\\x08\\x08drawable\\x00', "\
                "b'\\x06\\x06layout\\x00', b'\\x03\\x03raw\\x00', "\
                "b'\\x05\\x05color\\x00', b'\\x05\\x05dimen\\x00', "\
                "b'\\x06\\x06string\\x00', b'\\x05\\x05style\\x00', "\
                "b'\\x04\\x04menu\\x00', b'\\x02\\x02id\\x00\\x00\\x00'], "\
                "[]), ResStringPool(ResStringPool_header(ResChunk_header("\
                "ResourceType.RES_STRING_POOL_TYPE, 28, 76), 4, 0, "\
                "Flags.UTF8_FLAG, 44, 0), [uint32(0), uint32(8), uint32(17), "\
                "uint32(25)], [], [b'\\x05\\x05alarm\\x00', "\
                "b'\\x06\\x06alarm1\\x00', b'\\x05\\x05arrow\\x00', "\
                "b'\\x04\\x04back\\x00'], []), [[ResTable_typeSpec("\
                "ResTable_typeSpec_header(ResChunk_header("\
                "ResourceType.RES_TABLE_TYPE_SPEC_TYPE, 16, 32), 7, 0, 0, 4), "\
                "b'\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x04\\x00\\x00"\
                "\\x00\\x04\\x00\\x00\\x00'), ResTable_type("\
                "ResTable_type_header(ResChunk_header("\
                "ResourceType.RES_TABLE_TYPE_TYPE, 68, 116), 7, 0, 0, 4, 84, "\
                "b'0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'"\
                "), b'\\x00\\x00\\x00\\x00\\x10\\x00\\x00\\x00 \\x00\\x00\\x00"\
                "0\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08"\
                "\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x11"\
                "\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x19\\x00\\x00\\x00'), "\
                "ResTable_type(ResTable_type_header(ResChunk_header("\
                "ResourceType.RES_TABLE_TYPE_TYPE, 68, 116), 7, 0, 0, 4, 84, "\
                "b'0\\x00\\x00\\x00\\x00\\x00\\x00\\x00de\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\
                "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'), b'\\x00"\
                "\\x00\\x00\\x00\\x10\\x00\\x00\\x00 \\x00\\x00\\x000\\x00"\
                "\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00"\
                "\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x11\\x00"\
                "\\x00\\x00\\x08\\x00\\x00\\x00\\x19\\x00\\x00\\x00')]])"
        actual = repr(invector)

        self.assertEqual(expected, actual)

    def test_bytes(self):
        invector = ResTable_packageTests.tv1_obj
        expected = ResTable_packageTests.tv1_bytes
        actual = bytes(invector)

        self.assertEqual(expected, actual)

    def test_from_bytes(self):
        invector = ResTable_packageTests.tv1_bytes + b'\x13\x37'
        expected = ResTable_packageTests.tv1_obj, b'\x13\x37'
        actual = ResTable_package.from_bytes(invector)

        self.assertEqual(expected, actual)
示例#11
0
    def __init__(self,
                 header=None,
                 id=0,
                 name=b'\0\0',
                 typeStrings=0,
                 lastPublicType=0,
                 keyStrings=0,
                 lastPublicKey=0):
        if header is None:
            header = ResChunk_header(ResourceType.RES_TABLE_PACKAGE_TYPE,
                                     headerSize=ResTable_package_header.len,
                                     size=ResTable_package_header.len)
        if not isinstance(header, ResChunk_header):
            raise WrongTypeException('header', ResChunk_header)
        if header.type is not ResourceType.RES_TABLE_PACKAGE_TYPE:
            raise ChunkHeaderWrongTypeException(
                ResourceType.RES_TABLE_PACKAGE_TYPE)
        ## \link ResChunk_header \endlink instance
        # \details Identifies structure and defines its size
        self.header = header

        if isinstance(id, uint32):
            ## If this is a base package, its ID
            # \details Package IDs start at 1 (corresponding to the value of the
            # package bits in a resource identifier). 0 means this is not a base
            # package.
            self.id = id
        else:
            self.id = uint32(id, little=True)

        if isinstance(name, bytes):
            name_length = len(name)
            if name_length > ResTable_package_header.MAX_NAME_LEN * 2:
                raise Exception('name is longer than maximum ({l}>{m})'.format(
                    l=name_length, m=ResTable_package_header.MAX_NAME_LEN))
            if name[-2:] != b'\0\0':
                raise (Exception('name does not end with NULL'))
            ## Actual name of this package
            # \details NULL-terminated, UTF-16 string.
            self.name = name + bytes((ResTable_package_header.MAX_NAME_LEN * \
                    2) - name_length)
        else:
            raise Exception('name must be of type bytes')

        if isinstance(typeStrings, uint32):
            self.typeStrings = typeStrings
        else:
            self.typeStrings = uint32(typeStrings, little=True)

        if isinstance(lastPublicType, uint32):
            self.lastPublicType = lastPublicType
        else:
            self.lastPublicType = uint32(lastPublicType, little=True)

        if isinstance(keyStrings, uint32):
            self.keyStrings = keyStrings
        else:
            self.keyStrings = uint32(keyStrings, little=True)

        if isinstance(lastPublicKey, uint32):
            self.lastPublicKey = lastPublicKey
        else:
            self.lastPublicKey = uint32(lastPublicKey, little=True)