def _build(self, obj, stream, context, path):
        if not isinstance(obj, integertypes):
            raise IntegerError("value is not an integer", path=path)
        if obj < 0:
            raise IntegerError("cannot build from negative number: %r" %
                               (obj, ),
                               path=path)
        if obj > 0xFFFF:
            raise IntegerError(
                "cannot build from number above short range: %r" % (obj, ),
                path=path)

        x = obj

        if (x > 0x3FFF):
            x |= 0xFF0000
            nbytes = 3
        elif (x > 0x7F):
            x |= 0x8000
            nbytes = 2
        else:
            nbytes = 1

        for i in range(nbytes, 0, -1):
            stream_write(stream, int2byte((x >> (8 * (i - 1))) & 0xFF), 1,
                         path)

        return obj
Exemplo n.º 2
0
 def _build(self, obj, stream, context, path):
     try:
         data = self.packer.pack(obj)
     except Exception:
         raise FormatFieldError(
             "struct %r error during building, given value %r" %
             (self.fmtstr, obj))
     data = swapbitsinbytes(data)
     stream_write(stream, data, self.length)
     return obj
Exemplo n.º 3
0
    def _build(self, obj, stream, context, path):
        opcode = obj["opcode"]

        try:
            message = self._opcodes[opcode]
        except KeyError:
            Opcode()._build(opcode, stream, context, path)
            stream_write(stream, obj["params"])
            return obj

        return message._build(obj, stream, context, path)
Exemplo n.º 4
0
    def _build_sensor_setting(self, obj, stream, context, path, sensor_setting_property_id):
        try:
            sensor_setting_property_id = PropertyID(sensor_setting_property_id)
            sensor_setting_name = sensor_setting_property_id.name.lower()
        except ValueError:
            sensor_setting_name = "sensor_setting_raw"

        sensor_setting_raw = obj.get(sensor_setting_name, obj.get("sensor_setting_raw"))

        try:
            PropertyDict[sensor_setting_property_id]._build(sensor_setting_raw, stream, context, path)
        except KeyError:
            stream_write(stream, bytes(sensor_setting_raw))

        return obj
Exemplo n.º 5
0
    def _build(self, obj, stream, context, path):
        format = obj["format"]
        length = obj["length"]
        sensor_setting_property_id = obj["sensor_setting_property_id"]
        sensor_setting_raw = obj["sensor_setting_raw"]

        if format:
            stream_write(stream, bytes([(length - 1) << 1 | 0x01]))
            stream_write(stream, sensor_setting_property_id.to_bytes(2, byteorder='little'))
            stream_write(stream, bytes(sensor_setting_raw))
        else:
            stream_write(stream, bytes([(length - 1) << 1 | (sensor_setting_property_id & 0b111) << 5]))
            stream_write(stream, bytes([sensor_setting_property_id >> 3]))
            PropertyDict[sensor_setting_property_id]._build(sensor_setting_raw, stream, context, path)

        return obj
Exemplo n.º 6
0
    def _build(self, obj, stream, context, path):
        # expect `None`, we're building a placeholder instead of a real value
        if obj is not None:
            raise DeferredError(f'building expected `None`, but got {obj}',
                                path=path)

        # calculate current offset in outermost stream
        target_offset = get_offset_in_outer_stream(stream, context, path)

        # build placeholder value in place of real value
        placeholder_data = os.urandom(self.placeholder_size)
        stream_write(stream, placeholder_data, len(placeholder_data), path)

        # create and return meta object, which can later be used by `WriteDeferredValue`
        return self._create_global_meta(context, path, self.subcon,
                                        target_offset, placeholder_data)
Exemplo n.º 7
0
    def _build(self, obj, stream, context, path):
        opcode = obj["opcode"]

        try:
            if isinstance(opcode, str):
                opcode, message = next(v for k, v in self._opcodes.items()
                                       if v[0].name == opcode)
                obj["opcode"] = opcode
            else:
                opcode, message = self._opcodes[opcode]
        except KeyError:
            Opcode()._build(opcode, stream, context, path)
            stream_write(stream, obj["params"])
            return obj

        return message._build(obj, stream, context, path)
Exemplo n.º 8
0
 def _build(self, obj, stream, context, path):
     if not isinstance(obj, integertypes):
         raise IntegerError("value %r is not an integer" % (obj,))
     if obj < 0 and not self.signed:
         raise IntegerError("value %r is negative, but field is not signed" % (obj,))
     length = self.length
     if callable(length):
         length = length(context)
     if length < 0:
         raise IntegerError("length must be non-negative")
     data = integer2bits(obj, length)
     if self.swapped:
         if length & 7:
             raise IntegerError(
                 "little-endianness is only defined for multiples of 8 bits"
             )
         data = swapbytes(data)
     data = data[::-1]
     stream_write(stream, data, length, path)
     return obj
Exemplo n.º 9
0
 def _build(self, obj, stream, context, path):
     if not isinstance(obj, integertypes):
         raise IntegerError("Value is not an integer")
     to_write = obj
     for i in range(5):
         byte = 0
         length = self.lengths[i]
         if i == 0:
             negative = obj < 0
             byte |= self.negative_bit * negative
             if negative:
                 to_write *= -1
         mask = self._get_data_mask(length)
         byte |= to_write & mask
         to_write >>= length
         more_bit = (to_write > 0) and self._get_more_bit(length)
         byte |= more_bit
         byte &= 0xFF
         stream_write(stream, int2byte(byte), 1, path)
         if not more_bit:
             break
     return obj
Exemplo n.º 10
0
    def _build(self, obj, stream, context, path):
        if obj < 0xff:
            stream_write(stream, bytes([obj]), 1, path)

        else:
            stream_write(stream, bytes([0xff]), 1, path)
            stream_write(stream, struct.pack('<l', obj), 4, path)

        return obj
Exemplo n.º 11
0
    def _build(self, obj, stream, context, path):
        if obj > 0xFFFF:
            stream_write(stream, obj.to_bytes(3, byteorder="big"))
        elif obj > 0xFF:
            stream_write(stream, obj.to_bytes(2, byteorder="big"))
        else:
            stream_write(stream, obj.to_bytes(1, byteorder="big"))

        return self.type(obj)
Exemplo n.º 12
0
 def _build(self, obj, stream, context, path):
     buildret = self.subcon._build(obj, stream, context, path)
     pad = self._pad(stream, path)
     stream_write(stream, self.pattern * pad, pad, path)
     return buildret