def read_class_definition(self, data_in, factory_id, class_id, version):
        register = True
        builder = ClassDefinitionBuilder(factory_id, class_id, version)

        # final position after portable is read
        data_in.read_int()

        # field count
        field_count = data_in.read_int()
        offset = data_in.position()
        for i in range(0, field_count):
            pos = data_in.read_int(offset + i * bits.INT_SIZE_IN_BYTES)
            data_in.set_position(pos)

            _len = data_in.read_short()
            field_name = bytearray(_len)
            data_in.read_into(field_name)

            field_type = data_in.read_byte()

            field_factory_id = 0
            field_class_id = 0
            field_version = version
            if field_type == FieldType.PORTABLE:
                # is null
                if data_in.read_boolean():
                    register = False
                field_factory_id = data_in.read_int()
                field_class_id = data_in.read_int()

                # TODO: what there's a null inner Portable field
                if register:
                    field_version = data_in.read_int()
                    self.read_class_definition(data_in, field_factory_id,
                                               field_class_id, field_version)
            elif field_type == FieldType.PORTABLE_ARRAY:
                k = data_in.read_int()
                field_factory_id = data_in.read_int()
                field_class_id = data_in.read_int()

                # TODO: what there's a null inner Portable field
                if k > 0:
                    p = data_in.read_int()
                    data_in.set_position(p)
                    field_version = data_in.read_int()
                    self.read_class_definition(data_in, field_factory_id,
                                               field_class_id, field_version)
                else:
                    register = False
            builder.add_field_def(
                FieldDefinition(i, field_name.decode('ascii'), field_type,
                                field_version, field_factory_id,
                                field_class_id))
        class_def = builder.build()
        if register:
            class_def = self.register_class_definition(class_def)
        return class_def
Beispiel #2
0
    def read_class_definition(self, data_in, factory_id, class_id, version):
        register = True
        builder = ClassDefinitionBuilder(factory_id, class_id, version)

        # final position after portable is read
        data_in.read_int()

        # field count
        field_count = data_in.read_int()
        offset = data_in.position()
        for i in xrange(0, field_count):
            pos = data_in.read_int(offset + i * bits.INT_SIZE_IN_BYTES)
            data_in.set_position(pos)

            _len = data_in.read_short()
            field_name = bytearray(_len)
            data_in.read_into(field_name)

            field_type = data_in.read_byte()

            field_factory_id = 0
            field_class_id = 0
            if field_type == FieldType.PORTABLE:
                # is null
                if data_in.read_boolean():
                    register = False
                field_factory_id = data_in.read_int()
                field_class_id = data_in.read_int()

                # TODO: what there's a null inner Portable field
                if register:
                    field_version = data_in.read_int()
                    self.read_class_definition(data_in, field_factory_id, field_class_id, field_version)
            elif field_type == FieldType.PORTABLE_ARRAY:
                k = data_in.read_int()
                field_factory_id = data_in.read_int()
                field_class_id = data_in.read_int()

                # TODO: what there's a null inner Portable field
                if k > 0:
                    p = data_in.read_int()
                    data_in.set_position(p)
                    field_version = data_in.read_int()
                    self.read_class_definition(data_in, field_factory_id, field_class_id, field_version)
                else:
                    register = False
            builder.add_field_def(FieldDefinition(i, field_name.decode('ascii'), field_type, field_factory_id, field_class_id))
        class_def = builder.build()
        if register:
            class_def = self.register_class_definition(class_def)
        return class_def