예제 #1
0
    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)
예제 #2
0
 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)
예제 #3
0
 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)
예제 #4
0
 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())
예제 #5
0
    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
예제 #6
0
 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()
예제 #7
0
 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)