Lines 91-97
Link Here
|
91 |
from com.sun.star.uno import RuntimeException |
91 |
from com.sun.star.uno import RuntimeException |
92 |
from com.sun.star.lang import XServiceInfo |
92 |
from com.sun.star.lang import XServiceInfo |
93 |
from com.sun.star.io import IOException |
93 |
from com.sun.star.io import IOException |
94 |
from com.sun.star.ucb import CommandAbortedException |
94 |
from com.sun.star.ucb import CommandAbortedException, XCommandEnvironment, XProgressHandler |
|
|
95 |
from com.sun.star.task import XInteractionHandler |
95 |
from com.sun.star.beans import XPropertySet |
96 |
from com.sun.star.beans import XPropertySet |
96 |
from com.sun.star.container import XNameContainer |
97 |
from com.sun.star.container import XNameContainer |
97 |
from com.sun.star.xml.sax import XDocumentHandler, InputSource |
98 |
from com.sun.star.xml.sax import XDocumentHandler, InputSource |
Lines 102-107
Link Here
|
102 |
from com.sun.star.script.provider import XScriptProvider, XScript, XScriptContext, ScriptFrameworkErrorException |
103 |
from com.sun.star.script.provider import XScriptProvider, XScript, XScriptContext, ScriptFrameworkErrorException |
103 |
from com.sun.star.script.browse import XBrowseNode |
104 |
from com.sun.star.script.browse import XBrowseNode |
104 |
from com.sun.star.script.browse.BrowseNodeTypes import SCRIPT, CONTAINER, ROOT |
105 |
from com.sun.star.script.browse.BrowseNodeTypes import SCRIPT, CONTAINER, ROOT |
|
|
106 |
from com.sun.star.util import XModifyListener |
105 |
|
107 |
|
106 |
LANGUAGENAME = "Python" |
108 |
LANGUAGENAME = "Python" |
107 |
GLOBAL_SCRIPTCONTEXT_NAME = "XSCRIPTCONTEXT" |
109 |
GLOBAL_SCRIPTCONTEXT_NAME = "XSCRIPTCONTEXT" |
Lines 238-244
Link Here
|
238 |
def addPackageByUrl( self, url ): |
240 |
def addPackageByUrl( self, url ): |
239 |
packageName = self.getPackageNameFromUrl( url ) |
241 |
packageName = self.getPackageNameFromUrl( url ) |
240 |
transientPart = self.getTransientPartFromUrl( url ) |
242 |
transientPart = self.getTransientPartFromUrl( url ) |
241 |
log.isDebugLevel() and log.debug( "addPackageByUrl : " + packageName + ", " + transientPart ) |
243 |
log.isDebugLevel() and log.debug( "addPackageByUrl : " + packageName + ", " + transientPart + "("+url+")" + ", rootUrl="+self.rootUrl ) |
242 |
if self.mapPackageName2Path.has_key( packageName ): |
244 |
if self.mapPackageName2Path.has_key( packageName ): |
243 |
package = self.mapPackageName2Path[ packageName ] |
245 |
package = self.mapPackageName2Path[ packageName ] |
244 |
package.pathes = package.pathes + (url, ) |
246 |
package.pathes = package.pathes + (url, ) |
Lines 249-256
Link Here
|
249 |
def isUrlInPackage( self, url ): |
251 |
def isUrlInPackage( self, url ): |
250 |
values = self.mapPackageName2Path.values() |
252 |
values = self.mapPackageName2Path.values() |
251 |
for i in values: |
253 |
for i in values: |
|
|
254 |
# print "checking " + url + " in " + str(i.pathes) |
252 |
if url in i.pathes: |
255 |
if url in i.pathes: |
253 |
return True |
256 |
return True |
|
|
257 |
# print "false" |
254 |
return False |
258 |
return False |
255 |
|
259 |
|
256 |
def setPackageAttributes( self, mapPackageName2Path, rootUrl ): |
260 |
def setPackageAttributes( self, mapPackageName2Path, rootUrl ): |
Lines 545-550
Link Here
|
545 |
def setDocumentLocator( self, locator ): |
549 |
def setDocumentLocator( self, locator ): |
546 |
pass |
550 |
pass |
547 |
|
551 |
|
|
|
552 |
def isPyFileInPath( sfa, path ): |
553 |
ret = False |
554 |
contents = sfa.getFolderContents( path, True ) |
555 |
for i in contents: |
556 |
if sfa.isFolder(i): |
557 |
ret = isPyFileInPath(sfa,i) |
558 |
else: |
559 |
if i.endswith(".py"): |
560 |
ret = True |
561 |
if ret: |
562 |
break |
563 |
return ret |
548 |
|
564 |
|
549 |
# extracts META-INF directory from |
565 |
# extracts META-INF directory from |
550 |
def getPathesFromPackage( rootUrl, sfa ): |
566 |
def getPathesFromPackage( rootUrl, sfa ): |
Lines 556-561
Link Here
|
556 |
handler = ManifestHandler( rootUrl ) |
572 |
handler = ManifestHandler( rootUrl ) |
557 |
parser.setDocumentHandler( handler ) |
573 |
parser.setDocumentHandler( handler ) |
558 |
parser.parseStream( InputSource( inputStream , "", fileUrl, fileUrl ) ) |
574 |
parser.parseStream( InputSource( inputStream , "", fileUrl, fileUrl ) ) |
|
|
575 |
for i in tuple(handler.urlList): |
576 |
if not isPyFileInPath( sfa, i ): |
577 |
handler.urlList.remove(i) |
559 |
ret = tuple( handler.urlList ) |
578 |
ret = tuple( handler.urlList ) |
560 |
except UnoException, e: |
579 |
except UnoException, e: |
561 |
text = lastException2String() |
580 |
text = lastException2String() |
Lines 569-592
Link Here
|
569 |
self.pathes = pathes |
588 |
self.pathes = pathes |
570 |
self.transientPathElement = transientPathElement |
589 |
self.transientPathElement = transientPathElement |
571 |
|
590 |
|
572 |
def getPackageName2PathMap( sfa, rootUrl ): |
591 |
class DummyInteractionHandler( unohelper.Base, XInteractionHandler ): |
|
|
592 |
def __init__( self ): |
593 |
pass |
594 |
def handle( self, event): |
595 |
log.isDebugLevel() and log.debug( "pythonscript: DummyInteractionHandler.handle " + str( event ) ) |
596 |
|
597 |
class DummyProgressHandler( unohelper.Base, XProgressHandler ): |
598 |
def __init__( self ): |
599 |
pass |
600 |
|
601 |
def push( self,status ): |
602 |
log.isDebugLevel() and log.debug( "pythonscript: DummyProgressHandler.push " + str( status ) ) |
603 |
def update( self,status ): |
604 |
log.isDebugLevel() and log.debug( "pythonscript: DummyProgressHandler.update " + str( status ) ) |
605 |
def pop( self ): |
606 |
log.isDebugLevel() and log.debug( "pythonscript: DummyProgressHandler.push " + str( event ) ) |
607 |
|
608 |
class CommandEnvironment(unohelper.Base, XCommandEnvironment): |
609 |
def __init__( self ): |
610 |
self.progressHandler = DummyProgressHandler() |
611 |
self.interactionHandler = DummyInteractionHandler() |
612 |
def getInteractionHandler( self ): |
613 |
return self.interactionHandler |
614 |
def getProgressHandler( self ): |
615 |
return self.progressHandler |
616 |
|
617 |
#maybe useful for debugging purposes |
618 |
#class ModifyListener( unohelper.Base, XModifyListener ): |
619 |
# def __init__( self ): |
620 |
# pass |
621 |
# def modified( self, event ): |
622 |
# log.isDebugLevel() and log.debug( "pythonscript: ModifyListener.modified " + str( event ) ) |
623 |
# def disposing( self, event ): |
624 |
# log.isDebugLevel() and log.debug( "pythonscript: ModifyListener.disposing " + str( event ) ) |
625 |
|
626 |
def mapStorageType2PackageContext( storageType ): |
627 |
ret = storageType |
628 |
if( storageType == "share:uno_packages" ): |
629 |
ret = "shared" |
630 |
if( storageType == "user:uno_packages" ): |
631 |
ret = "user" |
632 |
return ret |
633 |
|
634 |
def getPackageName2PathMap( sfa, storageType ): |
573 |
ret = {} |
635 |
ret = {} |
574 |
contents = sfa.getFolderContents( rootUrl, True ) |
636 |
packageManagerFactory = uno.getComponentContext().getValueByName( |
575 |
for i in contents: |
637 |
"/singletons/com.sun.star.deployment.thePackageManagerFactory" ) |
576 |
if sfa.isFolder( i ): |
638 |
packageManager = packageManagerFactory.getPackageManager( |
577 |
transientPathElement = lastElement( i ) |
639 |
mapStorageType2PackageContext(storageType)) |
578 |
subcontents = sfa.getFolderContents( i , True ) |
640 |
# packageManager.addModifyListener( ModifyListener() ) |
579 |
for j in subcontents: |
641 |
log.isDebugLevel() and log.debug( "pythonscript: getPackageName2PathMap start getDeployedPackages" ) |
580 |
if sfa.isFolder( j ): |
642 |
packages = packageManager.getDeployedPackages( |
581 |
# ok, found a package. Now let's have a look, if |
643 |
packageManager.createAbortChannel(), CommandEnvironment( ) ) |
582 |
# it contains scripts |
644 |
log.isDebugLevel() and log.debug( "pythonscript: getPackageName2PathMap end getDeployedPackages (" + str(len(packages))+")" ) |
583 |
pathes = getPathesFromPackage( j, sfa ) |
645 |
|
584 |
if len( pathes ) > 0: |
646 |
for i in packages: |
585 |
# map package name to url, we need this later |
647 |
log.isDebugLevel() and log.debug( "inspecting package " + i.Name + "("+i.Identifier.Value+")" ) |
586 |
log.isErrorLevel() and log.error( "adding Package " + transientPathElement + " " + str( pathes ) ) |
648 |
transientPathElement = penultimateElement( i.URL ) |
587 |
ret[ lastElement( j ) ] = Package( pathes, transientPathElement ) |
649 |
j = expandUri( i.URL ) |
|
|
650 |
pathes = getPathesFromPackage( j, sfa ) |
651 |
if len( pathes ) > 0: |
652 |
# map package name to url, we need this later |
653 |
log.isErrorLevel() and log.error( "adding Package " + transientPathElement + " " + str( pathes ) ) |
654 |
ret[ lastElement( j ) ] = Package( pathes, transientPathElement ) |
588 |
return ret |
655 |
return ret |
589 |
|
656 |
|
|
|
657 |
def penultimateElement( aStr ): |
658 |
lastSlash = aStr.rindex("/") |
659 |
penultimateSlash = aStr.rindex("/",0,lastSlash-1) |
660 |
return aStr[ penultimateSlash+1:lastSlash ] |
661 |
|
590 |
def lastElement( aStr): |
662 |
def lastElement( aStr): |
591 |
return aStr[ aStr.rfind( "/" )+1:len(aStr)] |
663 |
return aStr[ aStr.rfind( "/" )+1:len(aStr)] |
592 |
|
664 |
|
Lines 690-696
Link Here
|
690 |
|
762 |
|
691 |
log.isDebugLevel() and log.debug( "got urlHelper " + str( urlHelper ) ) |
763 |
log.isDebugLevel() and log.debug( "got urlHelper " + str( urlHelper ) ) |
692 |
|
764 |
|
693 |
rootUrl = urlHelper.getRootStorageURI() |
765 |
rootUrl = expandUri( urlHelper.getRootStorageURI() ) |
694 |
log.isDebugLevel() and log.debug( storageType + " transformed to " + rootUrl ) |
766 |
log.isDebugLevel() and log.debug( storageType + " transformed to " + rootUrl ) |
695 |
|
767 |
|
696 |
ucbService = "com.sun.star.ucb.SimpleFileAccess" |
768 |
ucbService = "com.sun.star.ucb.SimpleFileAccess" |
Lines 702-708
Link Here
|
702 |
self.provCtx = ProviderContext( |
774 |
self.provCtx = ProviderContext( |
703 |
storageType, sfa, urlHelper, ScriptContext( uno.getComponentContext(), None ) ) |
775 |
storageType, sfa, urlHelper, ScriptContext( uno.getComponentContext(), None ) ) |
704 |
if isPackage: |
776 |
if isPackage: |
705 |
mapPackageName2Path = getPackageName2PathMap( sfa, rootUrl ) |
777 |
mapPackageName2Path = getPackageName2PathMap( sfa, storageType ) |
706 |
self.provCtx.setPackageAttributes( mapPackageName2Path , rootUrl ) |
778 |
self.provCtx.setPackageAttributes( mapPackageName2Path , rootUrl ) |
707 |
self.dirBrowseNode = PackageBrowseNode( self.provCtx, LANGUAGENAME, rootUrl ) |
779 |
self.dirBrowseNode = PackageBrowseNode( self.provCtx, LANGUAGENAME, rootUrl ) |
708 |
else: |
780 |
else: |
Lines 787-800
Link Here
|
787 |
def removeByName( self, name ): |
859 |
def removeByName( self, name ): |
788 |
log.debug( "removeByName called" + str( name )) |
860 |
log.debug( "removeByName called" + str( name )) |
789 |
uri = expandUri( name ) |
861 |
uri = expandUri( name ) |
790 |
self.provCtx.removePackageByUrl( uri ) |
862 |
if self.provCtx.isUrlInPackage( uri ): |
|
|
863 |
self.provCtx.removePackageByUrl( uri ) |
864 |
else: |
865 |
log.debug( "removeByName unknown uri " + str( name ) + ", ignoring" ) |
866 |
raise NoSuchElementException( uri + "is not in package" , self ) |
791 |
log.debug( "removeByName called" + str( uri ) + " successful" ) |
867 |
log.debug( "removeByName called" + str( uri ) + " successful" ) |
792 |
|
868 |
|
793 |
def insertByName( self, name, value ): |
869 |
def insertByName( self, name, value ): |
794 |
log.debug( "insertByName called " + str( name ) + " " + str( value )) |
870 |
log.debug( "insertByName called " + str( name ) + " " + str( value )) |
795 |
uri = expandUri( name ) |
871 |
uri = expandUri( name ) |
796 |
self.provCtx.addPackageByUrl( uri ) |
872 |
if isPyFileInPath( self.provCtx.sfa, uri ): |
797 |
log.debug( "insertByName called" + str( uri ) + " successful" ) |
873 |
self.provCtx.addPackageByUrl( uri ) |
|
|
874 |
else: |
875 |
# package is no python package ... |
876 |
log.debug( "insertByName: no python files in " + str( uri ) + ", ignoring" ) |
877 |
raise IllegalArgumentException( uri + " does not contain .py files", self, 1 ) |
878 |
log.debug( "insertByName called " + str( uri ) + " successful" ) |
798 |
|
879 |
|
799 |
def replaceByName( self, name, value ): |
880 |
def replaceByName( self, name, value ): |
800 |
log.debug( "replaceByName called " + str( name ) + " " + str( value )) |
881 |
log.debug( "replaceByName called " + str( name ) + " " + str( value )) |