Esempio n. 1
0
def checkVersion(file):
    vrs = None
    filename = os.path.abspath(file)
    ole = OleFileIO(filename)
    elements = ole.listdir(streams=True, storages=False)
    for e in elements:
        if (e[-1] == 'RSeDb'):
            data = ole.openstream(e).read()
            version, i = getVersionInfo(data, 20)
            if (version.major >= 14):
                setDumpFolder(file)
                return ole
            break

    if (version):
        vrsName = version.major
        if (version.major >= 11): vrsName += 1996
        QMessageBox.critical(
            FreeCAD.ActiveDocument, 'FreeCAD: Inventor workbench...',
            'Can\'t load file created with Inventor v%d' % (vrsName))
        logError('Can\'t load file created with Inventor v%d' % (vrsName))
    else:
        QMessageBox.critical(
            FreeCAD.ActiveDocument, 'FreeCAD: Inventor workbench...',
            'Can\'t determine Inventor version file was created with')
        logError('Can\'t determine Inventor version file was created with!')
    return None
Esempio n. 2
0
 def get_streams(self,dump) -> (list,list):
     '''
     get streams
     '''
     _Listobjects = []
     _List = []
     ole = OleFileIO(dump)
     listdir = ole.listdir()
     for direntry in listdir:
         dirs = re.sub(r'[^\x20-\x7f]',r'', " : ".join(direntry))
         tempdecoded = sub(br'[^\x20-\x7F]+',b'', ole.openstream(direntry).getvalue())
         _Listobjects.append(tempdecoded)
         _List.append({"Name":dirs,"Parsed":tempdecoded.decode("utf-8",errors="ignore")})
     return _List,_Listobjects
Esempio n. 3
0
class PcbDoc:

    #
    # Open and parse
    #
    def __init__(self, filename):

        self.OleFile = OleFileIO(filename)

        # Components
        self.Components = self.parseComponents(
            self.readStream("Components6/Data"))
        manifest = getU32(self.readStream("Components6/Header"))
        counted = len(self.Components)
        if manifest != counted:
            print "Warning: Header disagrees about component count, says there are " + str(
                manifest) + ", but we counted " + str(counted) + "."

    #
    # Read a file from OLE container and return it's contents
    #
    def readStream(self, path):
        f = self.OleFile.openstream(path)
        c = True
        buffer = ""
        while c:
            c = f.read(1)
            if c:
                buffer += c
        f.close()
        return buffer

    #
    # Parse all components from list
    #
    def parseComponents(self, buffer):

        result = []
        cursor = 0

        while cursor < len(buffer):
            length = getU32(buffer[cursor:cursor + 4])
            component = parseKeyValueString(buffer[cursor + 4:cursor + length])
            #print dumps(component, sort_keys=True, indent=4)
            result.append(component)
            cursor += length + 4

        return result
Esempio n. 4
0
class PcbDoc:
    
    #
    # Open and parse
    #
    def __init__(self, filename):
 
        self.OleFile = OleFileIO(filename)

        # Components
        self.Components = self.parseComponents(self.readStream("Components6/Data"))
        manifest = getU32(self.readStream("Components6/Header"))
        counted = len(self.Components)
        if manifest != counted:
            print "Warning: Header disagrees about component count, says there are "+str(manifest)+", but we counted "+str(counted)+"."


    #
    # Read a file from OLE container and return it's contents
    #
    def readStream(self, path):
        f = self.OleFile.openstream(path)
        c = True
        buffer = ""
        while c:
            c = f.read(1)
            if c:
                buffer += c
        f.close()
        return buffer


    #
    # Parse all components from list
    #
    def parseComponents(self, buffer):

        result = []
        cursor = 0

        while cursor < len(buffer):
            length = getU32(buffer[cursor:cursor+4])
            component = parseKeyValueString(buffer[cursor+4:cursor+length])
            #print dumps(component, sort_keys=True, indent=4)
            result.append(component)
            cursor += length+4

        return result
Esempio n. 5
0
class MdReader:
    """
    Чтение файла MD с извлечением примитивных структур и парсингом их в списки
    """
    class ReadedConfig:
        """
        Результат чтения конфигурации, является фабрикой для парсера
        """
        def __init__(self):
            self.dds = []
            self.dialog = []
            self.entry = {}
            self.md = None

        @property
        def MdObject(self):
            if not self.md:
                self.md = MDObject()
                self.md.parse(self.dds)
            return self.md

    def __init__(self, filename, metadata=True, dialog=False):
        self.filename = filename

        self.parse_metadata = metadata
        self.parse_dialog = dialog

        self.ole = None
        self.read_result = MdReader.ReadedConfig()

    def read(self):
        mylog.info(u'Начинаю чтение %s' % self.filename)
        self.ole = OleFileIO(self.filename)
        oledirs = self.ole.listdir()
        mylog.debug('OLE_DIRS: %s' % oledirs)
        for entry in oledirs:
            entry_name = entry[0]
            mylog.debug(u'entry_name: %s' % entry_name)
            try:
                if entry_name == 'Metadata':
                    if "Main MetaData Stream" in entry and self.parse_metadata:
                        self.handler_metadata(entry)
                if entry_name == 'Document':
                    if "Dialog Stream" in entry and self.parse_dialog:
                        self.handler_dialog(entry)
                    if "Container.Profile" in entry:
                        continue
                    if "Container.Contents" in entry:
                        continue
            except Exception as e:
                mylog.exception(u'Ошибка при чтении конфигурации %s' %
                                e.message)
        return self.read_result

    def handler_metadata(self, entry):
        if "Main MetaData Stream" in entry:
            with self.ole.openstream(entry) as f:
                tx = f.read()
            self.read_result.dds = ParseTree(
                tx.decode('cp1251', errors='ignore'))

    def handler_dialog(self, entry):
        if "Main MetaData Stream" in entry:
            with self.ole.openstream(entry) as f:
                tx = f.read()
            self.read_result.dialog = tx  # ParseTree(tx.decode('cp1251', errors='ignore'))
Esempio n. 6
0
def get_xdata(ole: olefile.OleFileIO, header: Header) -> Optional[bytes]:
    return ole.openstream('X-Data').read() if ole.exists('X-Data') else None
Esempio n. 7
0
def get_ydata(ole: olefile.OleFileIO, header: Header) -> Optional[bytes]:
    return ole.openstream('Y-Data').read()
Esempio n. 8
0
def get_header(ole: olefile.OleFileIO) -> Header:
    data_info = ole.openstream('DataInfo').read()
    return Header(*unpack_data_info(data_info))
Esempio n. 9
0
class PcbLib:
    
    #
    # Open and parse PcbLib file
    #
    def __init__(self, filename):

        self.OleFile = OleFileIO(filename)

        # TOC = Table Of Contents
        # A list of the footprints contained in this PcbLib can be found here:
        #self.TOC = TOC( self.readStream("Library/ComponentParamsTOC/Data") )
        # not always present

        #
        # Parse library parameters
        # Library/Data contains a list of parameters (string: "|"-separated key-value pairs)
        # followed by the count and names of footprints in the library
        #
        buffer = self.readStream("Library/Data")

        # Properties
        print "Library properties:"
        length = getU32(buffer[:4])
        self.Properties = parseKeyValueString(buffer[4:4+length])
        print self.Properties
        
        # Footprint list
        cursor = 4+length
        count = getU32(buffer[cursor:])
        cursor += 4
        print "Footprints in library: "+str(count)
        footprints = []
        for i in range(count):
            subrecord = SubRecord(buffer[cursor:])
            name = SubRecord_String(subrecord)
            print " * "+name
            footprints.append(name)
            cursor += subrecord.length

        # Parse all the footprints
        self.Footprints = []
        for footprint in footprints:
            print "Parsing "+footprint+" ..."
            self.Footprints.append(
                    Footprint(self.readStream(footprint+"/Data"))
                )
                
        # Create a dictionary of footprints to access them by name
        self.FootprintsByName = {}
        for footprint in self.Footprints:
            self.FootprintsByName[footprint.name] = footprint
        #print self.FootprintsByName

    #
    # Read file from OLE container and return it's contents
    #
    def readStream(self, path):
        f = self.OleFile.openstream(path)
        c = True
        buffer = ""
        while c:
            c = f.read(1)
            if c:
                buffer += c
        f.close()
        return buffer
Esempio n. 10
0
class MdReader:
    """
    Чтение файла MD с извлечением примитивных структур и парсингом их в списки
    """

    class ReadedConfig:
        """
        Результат чтения конфигурации, является фабрикой для парсера
        """
        def __init__(self):
            self.dds = []
            self.dialog = []
            self.entry = {}
            self.md = None

        @property
        def MdObject(self):
            if not self.md:
                self.md = MDObject()
                self.md.parse(self.dds)
            return self.md

    def __init__(self, filename, metadata=True, dialog=False):
        self.filename = filename

        self.parse_metadata = metadata
        self.parse_dialog = dialog

        self.ole = None
        self.read_result = MdReader.ReadedConfig()

    def read(self):
        mylog.info(u'Начинаю чтение %s' % self.filename)
        self.ole = OleFileIO(self.filename)
        oledirs = self.ole.listdir()
        mylog.debug('OLE_DIRS: %s' % oledirs)
        for entry in oledirs:
            entry_name = entry[0]
            mylog.debug(u'entry_name: %s' % entry_name)
            try:
                if entry_name == 'Metadata':
                    if "Main MetaData Stream" in entry and self.parse_metadata:
                        self.handler_metadata(entry)
                if entry_name == 'Document':
                    if "Dialog Stream" in entry and self.parse_dialog:
                        self.handler_dialog(entry)
                    if "Container.Profile" in entry:
                        continue
                    if "Container.Contents" in entry:
                        continue
            except Exception as e:
                mylog.exception(u'Ошибка при чтении конфигурации %s' % e.message)
        return self.read_result

    def handler_metadata(self, entry):
        if "Main MetaData Stream" in entry:
            with self.ole.openstream(entry) as f:
                tx = f.read()
            self.read_result.dds = ParseTree(tx.decode('cp1251', errors='ignore'))

    def handler_dialog(self, entry):
        if "Main MetaData Stream" in entry:
            with self.ole.openstream(entry) as f:
                tx = f.read()
            self.read_result.dialog = tx  # ParseTree(tx.decode('cp1251', errors='ignore'))
Esempio n. 11
0
def parse_md(filename):
    mylog.info(u'Начинаю чтение %s' % filename)
    m = {'dds':[]}
    ole = OleFileIO(filename)
    # mylog.debug('OLE_DIRS: %s' % ole.listdir())
    m['entry'] = {}
    for entry in ole.listdir():
        mylog.debug(entry[0])

        #with open("stream_%s" % entry[0],'w+') as f:
        #    f.write(repr(entry))

        if entry[0]=='Document':
            #print entry
            if "Dialog Stream" in entry:
                continue
                try:
                    sz= ole.get_size(entry)
                    f=ole.openstream(entry)
                    #print f.read(sz)
                    f.close()
                except Exception as e:
                    mylog.exception(repr(e.args))
            if "Container.Profile" in entry:
                continue
                try:
                    sz= ole.get_size(entry)
                    f=ole.openstream(entry)
                    #print f.read(sz)
                    f.close()
                except:
                    mylog.exception()
            if "Container.Contents" in entry:
                continue
                sz= ole.get_size(entry)
                f=ole.openstream(entry)
                #print f.read(sz)
                f.close()

            if "MD Programm text" in entry:
                continue
                '''
                Пока что не работает, работало в прежних версиях python
                try:
                    sz= ole.get_size(entry)
                    f=ole.openstream(entry)
                    tx= f.read(sz)
                    f.close()
                    #print zlib.compress('test').encode('hex')
                    zi=zlib.decompress((zlib_head+tx))
                    print zi
                except Exception,e:
                    mylog.exception('read MD Programm text')
                    mylog.info(tx[:10].encode('hex'))
                    #print e
                '''
        if entry[0]=='Metadata':
            if "Main MetaData Stream" in entry:

                try:
                    #sz= ole.get_size(entry)
                    f = ole.openstream(entry)
                    tx = f.read()
                    f.close()
                    #print zlib.compress('test').encode('hex')
                    #d=zlib.decompressobj()
                    #zi=zlib.decompress(zlib_head+tx)
                    #tx_fixed = utils.fixunicode(tx,'cp1251')
                    #mylog.debug(tx.decode('cp1251'))
                    m['dds'] = ParseTree(tx.decode('cp1251', errors='ignore'))
                except Exception as e:
                    mylog.exception('parse metadata error')
        #if entry[0] == 'Journal':
        #write dumps
        if DUMP_META:
            if "MD Programm text" in entry:
                sz= ole.get_size(entry)
                f=ole.openstream(entry)
                tx= f.read(sz)
                f.close()
                hx = tx.encode('hex')
                if ztest.find(hx) > 0:
                    #print entry
                    #print hx
                    pass
                try:
                    #zlib.compress("//test").encode('hex')
                    #'789c d3d72f492d2e0100 0664021f'
                    #      d3d72f492d2e0100
                    tx=zlib.decompress(zlib_head+tx)
                    #print "MODULE:", tx
                    pass
                except Exception as e:
                    #print "size MD text:", sz, e.message
                    pass
                dump_stream("entry-%s" % entry, zlib_head+tx)
            else:
                dump_stream("entry-%s" % entry, ole.openstream(entry).read())
    return m
Esempio n. 12
0
class OleFileFS(FS):

    _meta = dict(read_only=True, thread_safe=False, network=False, unicode_paths=True, case_insensitive_paths=True)

    def __init__(self, path):
        try:
            self._olefile = OleFileIO(path, path_encoding=None)
        except IOError as e:
            raise CreateFailedError(str(e), details=e)

    #
    # Essential methods
    #

    def open(
        self, path, mode="r", buffering=-1, encoding=None, errors=None, newline=None, line_buffering=False, **kwargs
    ):
        for unsupported in "w", "a", "+":
            if unsupported in mode:
                raise OperationFailedError("open", path=path)
        segments = path_to_segments_normalized(path)
        return self._olefile.openstream(segments)

    def isdir(self, path):
        segments = path_to_segments_normalized(path)
        sty = self._olefile.get_type(segments)
        return sty in (STGTY_STORAGE, STGTY_ROOT)

    def isfile(self, path):
        segments = path_to_segments_normalized(path)
        sty = self._olefile.get_type(segments)
        return sty is STGTY_STREAM

    def listdir(self, path="./", wildcard=None, full=False, absolute=False, dirs_only=False, files_only=False):
        items = self.ilistdir(
            path=path, wildcard=wildcard, full=full, absolute=absolute, dirs_only=dirs_only, files_only=files_only
        )
        return list(items)

    def getinfo(self, path):
        segments = path_to_segments_normalized(path)
        size = self._olefile.get_size(segments)
        ctime = self._olefile.getctime(segments)
        mtime = self._olefile.getmtime(segments)
        return {"size": size, "created_time": ctime, "modified_time": mtime}

    #
    # Non-essential methods
    #

    def close(self):
        self._olefile.close()
        FS.close(self)

    def ilistdir(self, path="./", wildcard=None, full=False, absolute=False, dirs_only=False, files_only=False):
        if dirs_only:
            olefile_listdir_args = dict(streams=False, storages=True)
        elif files_only:
            olefile_listdir_args = dict(streams=True, storages=False)
        else:
            olefile_listdir_args = dict()
        given_node = path_to_segments_normalized(path)
        leafs = self._olefile.listdir(**olefile_listdir_args)
        leafs = map(tuple, leafs)
        nodes = find_children(given_node, leafs)
        for segments in nodes:
            stgty = self._olefile.get_type(segments)
            if dirs_only and stgty not in (STGTY_STORAGE, STGTY_ROOT):
                continue
            elif files_only and stgty is not STGTY_STREAM:
                continue
            if absolute:
                yield absolute_path_from_segments(segments)
            elif full:
                yield full_path_from_segments(segments)
            else:
                yield segments[-1]
Esempio n. 13
0
def parse_md(filename):
    mylog.info(u'Начинаю чтение %s' % filename)
    m = {'dds': []}
    ole = OleFileIO(filename)
    # mylog.debug('OLE_DIRS: %s' % ole.listdir())
    m['entry'] = {}
    for entry in ole.listdir():
        mylog.debug(entry[0])

        #with open("stream_%s" % entry[0],'w+') as f:
        #    f.write(repr(entry))

        if entry[0] == 'Document':
            #print entry
            if "Dialog Stream" in entry:
                continue
                try:
                    sz = ole.get_size(entry)
                    f = ole.openstream(entry)
                    #print f.read(sz)
                    f.close()
                except Exception as e:
                    mylog.exception(repr(e.args))
            if "Container.Profile" in entry:
                continue
                try:
                    sz = ole.get_size(entry)
                    f = ole.openstream(entry)
                    #print f.read(sz)
                    f.close()
                except:
                    mylog.exception()
            if "Container.Contents" in entry:
                continue
                sz = ole.get_size(entry)
                f = ole.openstream(entry)
                #print f.read(sz)
                f.close()

            if "MD Programm text" in entry:
                continue
                '''
                Пока что не работает, работало в прежних версиях python
                try:
                    sz= ole.get_size(entry)
                    f=ole.openstream(entry)
                    tx= f.read(sz)
                    f.close()
                    #print zlib.compress('test').encode('hex')
                    zi=zlib.decompress((zlib_head+tx))
                    print zi
                except Exception,e:
                    mylog.exception('read MD Programm text')
                    mylog.info(tx[:10].encode('hex'))
                    #print e
                '''
        if entry[0] == 'Metadata':
            if "Main MetaData Stream" in entry:

                try:
                    #sz= ole.get_size(entry)
                    f = ole.openstream(entry)
                    tx = f.read()
                    f.close()
                    #print zlib.compress('test').encode('hex')
                    #d=zlib.decompressobj()
                    #zi=zlib.decompress(zlib_head+tx)
                    #tx_fixed = utils.fixunicode(tx,'cp1251')
                    #mylog.debug(tx.decode('cp1251'))
                    m['dds'] = ParseTree(tx.decode('cp1251', errors='ignore'))
                except Exception as e:
                    mylog.exception('parse metadata error')
        #if entry[0] == 'Journal':
        #write dumps
        if DUMP_META:
            if "MD Programm text" in entry:
                sz = ole.get_size(entry)
                f = ole.openstream(entry)
                tx = f.read(sz)
                f.close()
                hx = tx.encode('hex')
                if ztest.find(hx) > 0:
                    #print entry
                    #print hx
                    pass
                try:
                    #zlib.compress("//test").encode('hex')
                    #'789c d3d72f492d2e0100 0664021f'
                    #      d3d72f492d2e0100
                    tx = zlib.decompress(zlib_head + tx)
                    #print "MODULE:", tx
                    pass
                except Exception as e:
                    #print "size MD text:", sz, e.message
                    pass
                dump_stream("entry-%s" % entry, zlib_head + tx)
            else:
                dump_stream("entry-%s" % entry, ole.openstream(entry).read())
    return m