View | Details | Raw Unified | Return to issue 98990
Collapse All | Expand All

(-)pythonscript.py (-22 / +103 lines)
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 ))

Return to issue 98990