Ejemplo n.º 1
0
    def from_stream(cls, stream, offset=None):
        """Creates a :class:`SHITEMID` from a stream.

        :type stream: :class:`lf.dec.IStream`
        :param stream: A stream that contains the structure.

        :type offset: ``int``
        :param offset: The start of the structure in :attr:`stream`

        :rtype: :class:`SHITEMID`
        :returns: The corresponding :class:`SHITEMID` object.

        """
        if offset is not None:
            stream.seek(offset, SEEK_SET)
        # end if

        data = stream.read(2)
        if len(data) < 2:
            return cls((len(data), 0, None))
        # end if

        size = uint16_le.from_buffer_copy(data).value
        if size <= 2:
            return cls((2, size, None))
        # end if

        data_size = size - 2
        data = stream.read(data_size)

        return cls((len(data) + 2, size, data))
Ejemplo n.º 2
0
    def from_stream(cls, stream, offset=None):
        """Creates a :class:`SHITEMID` from a stream.

        :type stream: :class:`lf.dec.IStream`
        :param stream: A stream that contains the structure.

        :type offset: ``int``
        :param offset: The start of the structure in :attr:`stream`

        :rtype: :class:`SHITEMID`
        :returns: The corresponding :class:`SHITEMID` object.

        """
        if offset is not None:
            stream.seek(offset, SEEK_SET)
        # end if

        data = stream.read(2)
        if len(data) < 2:
            return cls((len(data), 0, None))
        # end if

        size = uint16_le.from_buffer_copy(data).value
        if size <= 2:
            return cls((2, size, None))
        # end if

        data_size = size - 2
        data = stream.read(data_size)

        return cls((len(data) + 2, size, data))
Ejemplo n.º 3
0
    def uint16_le(self, offset=None):
        """ Reads an unsigned 16-bit integer (little endian).

        :type offset: :class:`int` or :keyword:`None`
        :param offset: The start of the integer.

        :except ValueError: if :attr:`stream` (starting at :attr:`offset` is
                            too small.)

        :rtype: :class:`int`
        :returns: The corresponding value.

        """
        if offset is not None:
            self.stream.seek(offset, SEEK_SET)
        # end if

        return uint16_le.from_buffer_copy(self.stream.read(2)).value