def _list_recursive(self, obj, _depth=0): ind = ' ' * _depth if not getattr(obj, 'isListable', False): #log.debug("Can't list object: %s", obj) return #else: # log.debug("Listing object: %s", obj) try: name = obj.toString() except AttributeError: name = str(obj) try: print('%s[%s] %s' % (ind, _format_size(obj.size), name)) except AttributeError: print('%s%s' % (ind, name)) with tempfile.TemporaryFile() as file: try: file.write(obj.toData()) except AttributeError: return file.seek(0, 0) file = self.makeFileReader(file) try: decoder = codec.getDecoderForFile(file) except codec.UnsupportedFileTypeError: return decoder = decoder(file, None) for item in decoder.objects: self._list_recursive(item, _depth + 1)
def toString(self): """Return pretty string describing this object.""" try: typ = codec.getDecoderForFile(self).__codec_name__ except: typ = '<unknown type>' return '%s file "%s"' % (typ, self.name)
def list_file_recursive(self, path): """Print list of given file's contents recursively.""" with FileReader(path, 'rb') as file: decoder = codec.getDecoderForFile(file) decoder = decoder(file, None) items = [] for obj in decoder.objects: self._list_recursive(obj)
def extract_recursive(self, path, dest): with self.makeFileReader(path) as file: decoder = codec.getDecoderForFile(file) decoder = decoder(file, None) log.debug("get_files(%s, %s)", decoder, path) items = self.get_files(decoder, path) for item in items: log.info("Extracting %s/%s...", dest, item['name']) if not self.readOnly: with FileWriter(dest + '/' + item['name']) as output: if 'file' in item: item['file'].seek(0) output.write(item['file'].read()) else: output.write(item['obj'].toData())
def get_files(self, obj, name, _depth=0): """Recursively get all files in given object. Returns list of files. """ #log.debug("listing %s", obj) items = [] # name might be int if input is a temp file, # so ignore it in that case. oname = getattr(obj, 'name', name) if type(oname) is str: name = oname if (hasattr(obj, 'defaultFileExt') and not name.endswith(obj.defaultFileExt)): name += '.' + obj.defaultFileExt if hasattr(obj, 'toData'): log.debug("recursing into %s, name=%s", obj, name) file = tempfile.TemporaryFile() data = obj.toData() if type(data) is str: data = bytes(data, 'utf-8') file.write(data) file.seek(0, 0) file = self.makeFileReader(file) try: decoder = codec.getDecoderForFile(file) except codec.UnsupportedFileTypeError: log.debug("can't decode %s", obj) return [{'name': name, 'obj': obj, 'file': file}] decoder = decoder(file, None) items += self.get_files(decoder, name, _depth + 1) #for item in decoder.objects: # items += get_files(item, _depth+1) if len(items) == 0: items = [{'name': name, 'obj': obj, 'file': file}] #log.debug("%s => %s", obj, items) else: if not getattr(obj, 'isListable', False): log.debug("Can't list object: %s", obj) return items log.debug("no data in %s", obj) for item in getattr(obj, 'objects', []): items += self.get_files(item, name, _depth + 1) #log.debug("%s => %s", obj, items) return items
def list_file(self, path): """Print list of given file's contents.""" with FileReader(path, 'rb') as file: decoder = codec.getDecoderForFile(file) decoder = decoder(file, None) decoder.printList()
def extract_file(self, path, dest): with self.makeFileReader(path) as file: decoder = codec.getDecoderForFile(file) decoder = decoder(file, None) self.write_file(path, decoder, dest)