def from_stream(cls, stream, offset=None): """Creates a :class:`DirEntry` object from a stream. :type stream: :class:`lf.dec.IStream` :param stream: A stream that contains the directory entry. :type offset: ``int`` :param offset: The start of the directory entry in :attr:`stream`. :rtype: :class:`DirEntry` :returns: The corresponding :class:`DirEntry` object. """ if offset is not None: stream.seek(offset, SEEK_SET) # end if values = dir_entry.from_buffer_copy(stream.read(128)) name = bytes(values.name) if values.name_size <= 64: name = name[:values.name_size] # end if new_name = name.decode("utf_16_le", "ignore") if new_name: name = new_name.split("\x00", 1)[0] # end if clsid = CLSIDToUUID.from_ctype(values.clsid) btime = values.btime try: btime = FILETIMETodatetime.from_ctype(btime) except (ValueError, TypeError): btime = (btime.hi << 32) | btime.lo # end try mtime = values.mtime try: mtime = FILETIMETodatetime.from_ctype(mtime) except (ValueError, TypeError): mtime = (mtime.hi << 32) | mtime.lo # end try return DirEntry(( name, values.name_size, values.type, values.color, values.left_sid, values.right_sid, values.child_sid, clsid, values.state, btime, mtime, values.stream_sect_offset, values.stream_size ))
def from_stream(cls, stream, offset=None): """Creates a :class:`DirEntry` object from a stream. :type stream: :class:`lf.dec.IStream` :param stream: A stream that contains the directory entry. :type offset: ``int`` :param offset: The start of the directory entry in :attr:`stream`. :rtype: :class:`DirEntry` :returns: The corresponding :class:`DirEntry` object. """ if offset is not None: stream.seek(offset, SEEK_SET) # end if values = dir_entry.from_buffer_copy(stream.read(128)) name = bytes(values.name) if values.name_size <= 64: name = name[:values.name_size] # end if new_name = name.decode("utf_16_le", "ignore") if new_name: name = new_name.split("\x00", 1)[0] # end if clsid = CLSIDToUUID.from_ctype(values.clsid) btime = values.btime try: btime = FILETIMETodatetime.from_ctype(btime) except (ValueError, TypeError): btime = (btime.hi << 32) | btime.lo # end try mtime = values.mtime try: mtime = FILETIMETodatetime.from_ctype(mtime) except (ValueError, TypeError): mtime = (mtime.hi << 32) | mtime.lo # end try return DirEntry((name, values.name_size, values.type, values.color, values.left_sid, values.right_sid, values.child_sid, clsid, values.state, btime, mtime, values.stream_sect_offset, values.stream_size))
def test_from_ctype(self): ae = self.assertEqual ar = self.assertRaises data = b"\x00\x0E\x15\x91\xC4\x95\xC2\x01" data_bad = b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" filetime = filetime_le.from_buffer_copy(data) filetime = FILETIMETodatetime.from_ctype(filetime) ae(filetime, datetime(2002, 11, 27, 3, 25, 0)) filetime = filetime_le.from_buffer_copy(data_bad) ar(ValueError, FILETIMETodatetime.from_ctype, filetime)
def from_ctype(cls, ctype): """ Creates a :class:`INFO2Item` object from a ctype. :type ctype: :class:`~lf.win.shell.recyclebin.ctypes.info2_item` :param ctype: An info2_item object. :rtype: :class:`INFO2Item` :returns: The corresponding :class:`INFO2Item` object. """ if ctype.name_asc[0] == 0: exists = False start = 1 else: exists = True start = 0 # end if name_asc = bytes(ctype.name_asc) null_term = name_asc.find(b"\x00", start) if null_term != -1: name_asc = name_asc[:null_term] # end if name_uni = bytes(ctype.name_uni) new_name_uni = _utf16_le_decoder(name_uni, "ignore")[0] if new_name_uni: name_uni = new_name_uni.split("\x00", 1)[0] else: name_uni = name_uni.split(b"\x00", 1)[0] # end if try: dtime = FILETIMETodatetime.from_ctype(ctype.dtime) except ValueError: dtime = (ctype.dtime.hi << 32) | ctype.dtime.lo # end try return cls(( name_asc, ctype.id, ctype.drive_num, dtime, ctype.file_size, name_uni, exists ))
def from_stream(cls, stream, offset=None): """Creates a :class:`CatalogEntry` object 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:`CatalogEntry` :returns: The corresponding :class:`CatalogEntry` object. """ if offset is not None: stream.seek(offset, SEEK_SET) else: offset = stream.tell() # end if entry = catalog_entry_header.from_buffer_copy(stream.read(16)) if entry.size > 16: file_name = stream.read(entry.size - 16) new_file_name = _utf16_le_decoder(file_name, "ignore")[0] if new_file_name: file_name = new_file_name.split("\x00", 1)[0] # end if else: file_name = None # end if try: mtime = FILETIMETodatetime.from_ctype(entry.mtime) except (TypeError, ValueError): mtime = (entry.mtime.hi << 32) | entry.mtime.lo # end try stream_name = "{0}".format(entry.id) stream_name = stream_name[::-1] return cls((entry.size, entry.id, mtime, file_name, stream_name))
def from_ctype(cls, ctype): """ Creates a :class:`INFO2Item` object from a ctype. :type ctype: :class:`~lf.win.shell.recyclebin.ctypes.info2_item` :param ctype: An info2_item object. :rtype: :class:`INFO2Item` :returns: The corresponding :class:`INFO2Item` object. """ if ctype.name_asc[0] == 0: exists = False start = 1 else: exists = True start = 0 # end if name_asc = bytes(ctype.name_asc) null_term = name_asc.find(b"\x00", start) if null_term != -1: name_asc = name_asc[:null_term] # end if name_uni = bytes(ctype.name_uni) new_name_uni = _utf16_le_decoder(name_uni, "ignore")[0] if new_name_uni: name_uni = new_name_uni.split("\x00", 1)[0] else: name_uni = name_uni.split(b"\x00", 1)[0] # end if try: dtime = FILETIMETodatetime.from_ctype(ctype.dtime) except ValueError: dtime = (ctype.dtime.hi << 32) | ctype.dtime.lo # end try return cls((name_asc, ctype.id, ctype.drive_num, dtime, ctype.file_size, name_uni, exists))