def COMOpen(progID, events=None): try: if events == None: return win32com.client.Dispatch(progID) else: return win32com.client.DispatchWithEvents(progID, events) except: error.abortCheck() error.traceback() return None
def getFromFile(filename): props = docProps() try: props.fileOwner = fileOwner(filename) except: error.abortCheck() props.fileOwner = None stg = wincom.StgOpenStorage( filename, None, wincom.storagecon.STGM_READ | wincom.storagecon.STGM_SHARE_EXCLUSIVE) pss = stg.QueryInterface(wincom.IID_IPropertySetStorage) ps = pss.Open(FMTID_SummaryInformation) data = ps.ReadMultiple(allSummaryInformation) props.path = filename props.title = unicodeFix(data[0]) props.author = unicodeFix(data[2]) props.subject = unicodeFix(data[1]) props.keywords = unicodeFix(data[3]) props.comments = unicodeFix(data[4]) props.template = unicodeFix(data[5]) props.lastAuthor = unicodeFix(data[6]) props.revNumber = unicodeFix(data[7]) props.lastEditTime = PyTime2datetime(data[8]) props.lastPrintedTime = PyTime2datetime(data[9]) props.createdTime = PyTime2datetime(data[10]) props.lastSavedTime = PyTime2datetime(data[11]) props.pageCount = data[12] props.wordCount = data[13] props.charCount = data[14] props.appName = unicodeFix(data[15]) props.docSecurity = data[16] try: ps = pss.Open(FMTID_DocSummaryInformation) data = ps.ReadMultiple([PIDDSI_COMPANY]) # except pythoncom.com_err: No workum, use plain except instead. Sigh. except: error.abortCheck() error.traceback() data = [""] props.company = unicodeFix(data[0]) return props
def processFile(entry, options): if entry.attributes & iolib.FILE_ATTRIBUTE_DIRECTORY: return filename = entry.path filename2 = filename tempFilename = None if iolib.webfile.isWebPath(filename) or iolib.zipfile.isZipPath(filename): tempFilename = iolib.makeTempCopy(filename) if tempFilename == None: return filename2 = tempFilename oldStdout = options.outRedirector.redirect(entry, options) if oldStdout == None: iolib.removeTempCopy(tempFilename) return if not wincom.StgIsStorageFile(filename2): error.signal("File %s is not a Micorosft Office document file", (filename)) iolib.removeTempCopy(tempFilename) return try: props = docProps.getFromFile(filename2) props.path = filename except: error.exception("Unable to access file %s", (filename)) iolib.removeTempCopy(tempFilename) return try: revLog = wordRevLog(filename2) except: error.abortCheck() revLog = None entry.md5 = None if options.md5f: entry.md5 = md5file(filename2) iolib.removeTempCopy(tempFilename) options.outClass.showMetadata(entry, props, revLog, options) options.outRedirector.restore(oldStdout) return
def getFromFile(filename): props = docProps() try: props.fileOwner = fileOwner(filename) except: error.abortCheck() props.fileOwner = None stg = wincom.StgOpenStorage(filename, None, wincom.storagecon.STGM_READ | wincom.storagecon.STGM_SHARE_EXCLUSIVE) pss = stg.QueryInterface(wincom.IID_IPropertySetStorage) ps = pss.Open(FMTID_SummaryInformation) data = ps.ReadMultiple(allSummaryInformation) props.path = filename props.title = unicodeFix(data[0]) props.author = unicodeFix(data[2]) props.subject = unicodeFix(data[1]) props.keywords = unicodeFix(data[3]) props.comments = unicodeFix(data[4]) props.template = unicodeFix(data[5]) props.lastAuthor = unicodeFix(data[6]) props.revNumber = unicodeFix(data[7]) props.lastEditTime = PyTime2datetime(data[8]) props.lastPrintedTime = PyTime2datetime(data[9]) props.createdTime = PyTime2datetime(data[10]) props.lastSavedTime = PyTime2datetime(data[11]) props.pageCount = data[12] props.wordCount = data[13] props.charCount = data[14] props.appName = unicodeFix(data[15]) props.docSecurity = data[16] try: ps = pss.Open(FMTID_DocSummaryInformation) data = ps.ReadMultiple([PIDDSI_COMPANY]) # except pythoncom.com_err: No workum, use plain except instead. Sigh. except: error.abortCheck() error.traceback() data = [""] props.company = unicodeFix(data[0]) return props
def wordRevLog(filename): try: stg = wincom.StgOpenStorage( filename, None, wincom.storagecon.STGM_READ | wincom.storagecon.STGM_SHARE_EXCLUSIVE) except: error.abortCheck("Cannot open file -- %s", filename) return None try: stream = stg.OpenStream("WordDocument", None, wincom.storagecon.STGM_SHARE_EXCLUSIVE, 0) contents = stream.Read(0x02DA) if contents == None: return None except: error.abortCheck() return None filehdr = BinReader(contents) sign = filehdr.getWord() if sign != WIN95_IDENT and sign != WIN97_IDENT: return None filehdr.seek(0x02D2) revLogOffset = filehdr.getDWord() revLogSize = filehdr.getDWord() if revLogOffset == None or revLogSize == None or revLogSize == 0: return None try: stream = stg.OpenStream("1Table", None, wincom.storagecon.STGM_SHARE_EXCLUSIVE, 0) contents = stream.Read(revLogOffset + revLogSize) if contents == None: return None except: error.abortCheck() return None revLog = BinReader(contents) revLogTable = [] revLog.seek(revLogOffset + 2) count = revLog.getDWord() if count == None or count == 0 or count > 20 or (count % 2) != 0: return None count = count / 2 for i in xrange(count): entry = SimpleStruct() n = revLog.getWord() if n == 0 or n > 512: break entry.person = revLog.getUString(n) n = revLog.getWord() if n == 0 or n > 512: break entry.filePath = revLog.getUString(n) revLogTable.append(entry) return revLogTable
def wordRevLog(filename): try: stg = wincom.StgOpenStorage(filename, None, wincom.storagecon.STGM_READ | wincom.storagecon.STGM_SHARE_EXCLUSIVE) except: error.abortCheck("Cannot open file -- %s", filename) return None try: stream = stg.OpenStream("WordDocument", None, wincom.storagecon.STGM_SHARE_EXCLUSIVE, 0) contents = stream.Read(0x02DA); if contents == None: return None except: error.abortCheck() return None filehdr = BinReader(contents) sign = filehdr.getWord(); if sign != WIN95_IDENT and sign != WIN97_IDENT: return None filehdr.seek(0x02D2) revLogOffset = filehdr.getDWord() revLogSize = filehdr.getDWord() if revLogOffset == None or revLogSize == None or revLogSize == 0: return None try: stream = stg.OpenStream("1Table", None, wincom.storagecon.STGM_SHARE_EXCLUSIVE, 0) contents = stream.Read(revLogOffset + revLogSize); if contents == None: return None except: error.abortCheck() return None revLog = BinReader(contents) revLogTable = [] revLog.seek(revLogOffset + 2) count = revLog.getDWord() if count == None or count == 0 or count > 20 or (count % 2) != 0: return None count = count / 2 for i in xrange(count): entry = SimpleStruct() n = revLog.getWord() if n == 0 or n > 512: break entry.person = revLog.getUString(n) n = revLog.getWord() if n == 0 or n > 512: break entry.filePath = revLog.getUString(n) revLogTable.append(entry) return revLogTable