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
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
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
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
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'))
def get_xdata(ole: olefile.OleFileIO, header: Header) -> Optional[bytes]: return ole.openstream('X-Data').read() if ole.exists('X-Data') else None
def get_ydata(ole: olefile.OleFileIO, header: Header) -> Optional[bytes]: return ole.openstream('Y-Data').read()
def get_header(ole: olefile.OleFileIO) -> Header: data_info = ole.openstream('DataInfo').read() return Header(*unpack_data_info(data_info))
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
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'))
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
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]
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