123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- #
- # This file is part of the LibreOffice project.
- #
- # This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This file incorporates work covered by the following license notice:
- #
- # Licensed to the Apache Software Foundation (ASF) under one or more
- # contributor license agreements. See the NOTICE file distributed
- # with this work for additional information regarding copyright
- # ownership. The ASF licenses this file to you under the Apache
- # License, Version 2.0 (the "License"); you may not use this file
- # except in compliance with the License. You may obtain a copy of
- # the License at http://www.apache.org/licenses/LICENSE-2.0 .
- import uno
- import traceback
- from abc import abstractmethod
- from ..common.FileAccess import FileAccess
- from com.sun.star.beans import Property
- from com.sun.star.ucb import Command
- from com.sun.star.ucb import GlobalTransferCommandArgument
- from com.sun.star.ucb.NameClash import OVERWRITE
- from com.sun.star.ucb import OpenCommandArgument2
- from com.sun.star.ucb.OpenMode import ALL
- from com.sun.star.ucb.TransferCommandOperation import COPY
- # This class is used to copy the content of a folder to
- # another folder.
- # There is an inconsistency with argument order.
- # It should be always: dir,filename.
- class UCB(object):
- ucb = None
- fa = None
- xmsf = None
- def __init__(self, xmsf):
- self.ucb = xmsf.createInstanceWithArguments("com.sun.star.ucb.UniversalContentBroker", ())
- self.fa = FileAccess(xmsf)
- self.xmsf = xmsf
- def delete(self, filename):
- # System.out.println("UCB.delete(" + filename)
- self.executeCommand(self.getContent(filename),"delete", True)
- def copy(self, sourceDir, targetDir):
- self.copy1(sourceDir,targetDir, None)
- def copy1(self, sourceDir, targetDir, verifier):
- files = self.listFiles(sourceDir, verifier)
- for i in range(len(files)):
- self.copy2(sourceDir, files[i], targetDir, "")
- def copy2(self, sourceDir, filename, targetDir, targetName):
- if (not self.fa.exists(targetDir, True)):
- self.fa.xInterface.createFolder(targetDir)
- self.executeCommand(self.ucb, "globalTransfer", self.copyArg(sourceDir, filename, targetDir, targetName))
- # target name can be PropertyNames.EMPTY_STRING, in which case the name stays lige the source name
- # @param sourceDir
- # @param sourceFilename
- # @param targetDir
- # @param targetFilename
- # @return
- def copyArg(self, sourceDir, sourceFilename, targetDir, targetFilename):
- aArg = GlobalTransferCommandArgument()
- aArg.Operation = COPY
- aArg.SourceURL = self.fa.getURL(sourceDir, sourceFilename)
- aArg.TargetURL = targetDir
- aArg.NewTitle = targetFilename
- # fail, if object with same name exists in target folder
- aArg.NameClash = OVERWRITE
- return aArg
- def executeCommand(self, xContent, aCommandName, aArgument):
- aCommand = Command()
- aCommand.Name = aCommandName
- aCommand.Handle = -1 # not available
- aCommand.Argument = aArgument
- return xContent.execute(aCommand, 0, None)
- def listFiles(self, path, verifier):
- xContent = self.getContent(path)
- aArg = OpenCommandArgument2()
- aArg.Mode = ALL
- aArg.Priority = 32768
- # Fill info for the properties wanted.
- aArg.Properties = (Property(),)
- aArg.Properties[0].Name = "Title"
- aArg.Properties[0].Handle = -1
- xSet = self.executeCommand(xContent, "open", aArg)
- xResultSet = xSet.getStaticResultSet()
- files = []
- if (xResultSet.first()):
- # obtain XContentAccess interface for child content access and XRow for properties
- while (True):
- # Obtain URL of child.
- if (hasattr(xResultSet, "queryContentIdentifierString")):
- aId = xResultSet.queryContentIdentifierString()
- aTitle = FileAccess.getFilename(aId)
- elif (hasattr(xResultSet, "getString")):
- # First column: Title (column numbers are 1-based!)
- aTitle = xResultSet.getString(1)
- else:
- aTitle = ""
- #if (len(aTitle) == 0 and xResultSet.wasNull()):
- if (len(aTitle) == 0):
- # ignore
- pass
- else:
- files.append(aTitle)
- if (not xResultSet.next()):
- break
- # next child
- if (verifier is not None):
- for i in range(len(files)):
- if (not verifier.verify(files[i])):
- files.pop(i) # FIXME !!! dangerous
- return files
- def getContent(self, path):
- try:
- ident = self.ucb.createContentIdentifier(path)
- return self.ucb.queryContent(ident)
- except Exception:
- traceback.print_exc()
- return None
- class Verifier:
- @abstractmethod
- def verify(object):
- pass
|