def registerInstance(self, scheme, plugin, replace): msg = "ContentProvider registerInstance: Scheme/Plugin: %s/%s ... Started" % ( scheme, plugin) logMessage(self.ctx, INFO, msg, 'ContentProvider', 'registerInstance()') try: datasource = DataSource(self.ctx, scheme, plugin) except Exception as e: msg = "ContentProvider registerInstance: Error: %s - %s" % ( e, traceback.print_exc()) logMessage(self.ctx, SEVERE, msg, 'ContentProvider', 'registerInstance()') return None if not datasource.IsValid: logMessage(self.ctx, SEVERE, datasource.Error, 'ContentProvider', 'registerInstance()') return None self.Scheme = scheme self.Plugin = plugin msg = "ContentProvider registerInstance: addCloseListener ... Done" logMessage(self.ctx, INFO, msg, 'ContentProvider', 'registerInstance()') datasource.Connection.Parent.DatabaseDocument.addCloseListener(self) self.DataSource = datasource msg = "ContentProvider registerInstance: Scheme/Plugin: %s/%s ... Done" % ( scheme, plugin) logMessage(self.ctx, INFO, msg, 'ContentProvider', 'registerInstance()') return self
def queryClosing(self, source, ownership): self.deregisterInstance(self.Scheme, self.Plugin) query = 'SHUTDOWN COMPACT;' statement = self.DataSource.Connection.createStatement() statement.execute(query) msg = "ContentProvider queryClosing: Scheme: %s ... Done" % self.Scheme logMessage(self.ctx, INFO, msg, 'ContentProvider', 'queryClosing()')
def compareContentIds(self, id1, id2): print("ContentProvider.compareContentIds() 1") try: init1 = True init2 = True compare = -1 identifier1 = id1.getContentIdentifier() identifier2 = id2.getContentIdentifier() msg = "Identifiers: %s - %s ..." % (identifier1, identifier2) if not id1.IsInitialized: init1 = id1.initialize(self._defaultUser) if not id2.IsInitialized: init2 = id2.initialize(self._defaultUser) if not init1: compare = -10 elif not init2: compare = 10 elif identifier1 == identifier2 and id1.User.Name == id2.User.Name: msg += " seem to be the same..." compare = 0 msg += " ... Done" logMessage(self.ctx, INFO, msg, 'ContentProvider', 'compareContentIds()') return compare except Exception as e: print("ContentProvider.compareContentIds() Error: %s - %s" % (e, traceback.print_exc()))
def __init__(self, ctx): self.ctx = ctx self.Scheme = '' self.Plugin = '' self.DataSource = None self._defaultUser = '' msg = "ContentProvider: %s loading ... Done" % g_identifier logMessage(self.ctx, INFO, msg, 'ContentProvider', '__init__()')
def _clearLog(self, dialog): try: clearLogger() logMessage(self.ctx, INFO, "ClearingLog ... Done", 'OptionsDialog', '_doClearLog()') url = getLoggerUrl(self.ctx) self._setDialogText(dialog, url) except Exception as e: msg = "Error: %s - %s" % (e, traceback.print_exc()) logMessage(self.ctx, SEVERE, msg, "OptionsDialog", "_doClearLog()")
def initialize(self, identifier, data): self.Identifier = identifier self.MetaData = data msg = "Content loading ... " creatablecontent = self._getCreatableContentsInfo() self.MetaData.insertValue('CreatableContentsInfo', creatablecontent) self._commandInfo = self._getCommandInfo() self._propertySetInfo = self._getPropertySetInfo() self.contentListeners = [] self._propertiesListener = {} msg += "Done." logMessage(self.ctx, INFO, msg, 'Content', 'initialize()')
def createContentIdentifier(self, url): try: msg = "Identifier: %s ... " % url identifier = Identifier(self.ctx, self.DataSource, url) msg += "Done" logMessage(self.ctx, INFO, msg, 'ContentProvider', 'createContentIdentifier()') return identifier except Exception as e: msg += "Error: %s - %s" % (e, traceback.print_exc()) logMessage(self.ctx, SEVERE, msg, 'ContentProvider', 'createContentIdentifier()')
def queryContent(self, identifier): url = identifier.getContentIdentifier() print("ContentProvider.queryContent() %s" % url) if not identifier.IsInitialized: if not identifier.initialize(self._defaultUser): msg = "Identifier: %s ... Error: %s" % (url, identifier.Error) print("ContentProvider.queryContent() %s" % msg) logMessage(self.ctx, INFO, msg, 'ContentProvider', 'queryContent()') raise IllegalIdentifierException(identifier.Error, self) self._defaultUser = identifier.User.Name content = identifier.getContent() msg = "Identitifer: %s ... Done" % url logMessage(self.ctx, INFO, msg, 'ContentProvider', 'queryContent()') return content
def execute(self, command, id, environment): try: msg = "command.Name: %s" % command.Name print("Content.execute() %s **********************************" % msg) logMessage(self.ctx, INFO, msg, 'Content', 'execute()') if command.Name == 'getCommandInfo': msg = "command.Name: %s ******************************************" % command.Name logMessage(self.ctx, INFO, msg, 'Content', 'execute()') return CommandInfo(self._commandInfo) elif command.Name == 'getPropertySetInfo': return PropertySetInfo(self._propertySetInfo) elif command.Name == 'getPropertyValues': namedvalues = getPropertiesValues(self.ctx, self, command.Argument) return Row(namedvalues) elif command.Name == 'setPropertyValues': return setPropertiesValues(self.ctx, self, environment, command.Argument) elif command.Name == 'delete': self.MetaData.insertValue( 'Trashed', self.Identifier.updateTrashed(True, False)) elif command.Name == 'open': print("Content.execute() open 1") if self.IsFolder: print("Content.execute() open 2") # Not Used: command.Argument.Properties - Implement me ;-) select = self.Identifier.getFolderContent(self.MetaData) msg += " IsFolder: %s" % self.IsFolder logMessage(self.ctx, INFO, msg, 'Content', 'execute()') return DynamicResultSet(self.ctx, select) elif self.IsDocument: print("Content.execute() open 3") sf = getSimpleFile(self.ctx) url, size = self.Identifier.getDocumentContent( sf, self.MetaData, 0) if not size: print("Content.execute() open 4") title = self.MetaData.getValue('Title') msg = "Error while downloading file: %s" % title raise CommandAbortedException(msg, self) print("Content.execute() open 5") s = command.Argument.Sink sink = uno.getTypeByName('com.sun.star.io.XActiveDataSink') stream = uno.getTypeByName( 'com.sun.star.io.XActiveDataStreamer') isreadonly = self.MetaData.getValue('IsReadOnly') if s.queryInterface(sink): s.setInputStream(sf.openFileRead(url)) elif not isreadonly and s.queryInterface(stream): s.setStream(sf.openFileReadWrite(url)) print("Content.execute() open 6") elif command.Name == 'insert': if self.IsFolder: mediatype = self.Identifier.DataSource.Provider.Folder self.MetaData.insertValue('MediaType', mediatype) if self.Identifier.insertNewFolder(self.MetaData): pass #identifier = self.getIdentifier() #ucp = getUcp(self.ctx, identifier.getContentProviderScheme()) #self.addPropertiesChangeListener(('Id', 'Name', 'Size', 'Trashed', 'Loaded'), ucp) #propertyChange(self, 'Id', identifier.Id, CREATED | FOLDER) #parent = identifier.getParent() #event = getContentEvent(self, INSERTED, self, parent) #ucp.queryContent(parent).notify(event) elif self.IsDocument: # The Insert command is only used to create a new document (File Save As) # it saves content from createNewContent from the parent folder stream = command.Argument.Data replace = command.Argument.ReplaceExisting sf = getSimpleFile(self.ctx) url = self.Identifier.DataSource.Provider.SourceURL target = '%s/%s' % (url, self.Identifier.Id) if sf.exists(target) and not replace: pass elif stream.queryInterface( uno.getTypeByName('com.sun.star.io.XInputStream')): sf.writeFile(target, stream) mediatype = getMimeType(self.ctx, stream) self.MetaData.insertValue('MediaType', mediatype) stream.closeInput() if self.Identifier.insertNewDocument(self.MetaData): pass #ucp = getUcp(self.ctx, identifier.getContentProviderScheme()) #self.addPropertiesChangeListener(('Id', 'Name', 'Size', 'Trashed', 'Loaded'), ucp) #propertyChange(self, 'Id', identifier.Id, CREATED | FILE) #parent = identifier.getParent() #event = getContentEvent(self, INSERTED, self, parent) #ucp.queryContent(parent).notify(event) elif command.Name == 'createNewContent' and self.IsFolder: return self.createNewContent(command.Argument) elif command.Name == 'transfer' and self.IsFolder: # Transfer command is used for document 'File Save' or 'File Save As' # NewTitle come from: # - Last segment path of 'XContent.getIdentifier().getContentIdentifier()' for OpenOffice # - Property 'Title' of 'XContent' for LibreOffice # If the content has been renamed, the last segment is the new Title of the content title = command.Argument.NewTitle source = command.Argument.SourceURL move = command.Argument.MoveData clash = command.Argument.NameClash # We check if 'command.Argument.NewTitle' is an Id if self.Identifier.isChildId(title): id = title else: # It appears that 'command.Argument.NewTitle' is not an Id but a Title... # If 'NewTitle' exist and is unique in the folder, we can retrieve its Id id = self.Identifier.selectChildId(title) if not id: # Id could not be found: NewTitle does not exist in the folder... # For new document (File Save As) we use commands: # - createNewContent: for creating an empty new Content # - Insert at new Content for committing change # To execute these commands, we must throw an exception msg = "Couln't handle Url: %s" % source raise InteractiveBadTransferURLException(msg, self) sf = getSimpleFile(self.ctx) if not sf.exists(source): raise CommandAbortedException( "Error while saving file: %s" % source, self) inputstream = sf.openFileRead(source) target = '%s/%s' % ( self.Identifier.DataSource.Provider.SourceURL, id) sf.writeFile(target, inputstream) inputstream.closeInput() # We need to commit change: Size is the property chainning all DataSource change if not self.Identifier.updateSize(id, self.Identifier.Id, sf.getSize(target)): raise CommandAbortedException( "Error while saving file: %s" % source, self) #ucb = getUcb(self.ctx) #identifier = ucb.createContentIdentifier('%s/%s' % (self.Identifier.BaseURL, title)) #data = getPropertyValueSet({'Size': sf.getSize(target)}) #content = ucb.queryContent(identifier) #executeContentCommand(content, 'setPropertyValues', data, environment) if move: pass #must delete object elif command.Name == 'flush' and self.IsFolder: pass except CommandAbortedException as e: raise e except InteractiveBadTransferURLException as e: raise e except Exception as e: msg += " ERROR: %s" % e print("Content.execute() ERROR: %s" % msg) logMessage(self.ctx, SEVERE, msg, 'Content', 'execute()')
def deregisterInstance(self, scheme, argument): msg = "ContentProvider deregisterInstance: Scheme: %s ... Done" % scheme logMessage(self.ctx, INFO, msg, 'ContentProvider', 'deregisterInstance()')
def __del__(self): msg = "ContentProvider; %s unloading ... Done" % g_identifier logMessage(self.ctx, INFO, msg, 'ContentProvider', '__del__()')