Author: arielch
Date: Wed May 30 04:08:28 2012
New Revision: 1344092

URL: http://svn.apache.org/viewvc?rev=1344092&view=rev
Log:
i118478 - Implement getInvocationContext in PyUNO ScriptContext

Original author: Tsutomu Uchino <hanya.runo at gmail.com>

Modified:
    incubator/ooo/trunk/main/scripting/source/pyprov/pythonscript.py

Modified: incubator/ooo/trunk/main/scripting/source/pyprov/pythonscript.py
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/scripting/source/pyprov/pythonscript.py?rev=1344092&r1=1344091&r2=1344092&view=diff
==============================================================================
--- incubator/ooo/trunk/main/scripting/source/pyprov/pythonscript.py (original)
+++ incubator/ooo/trunk/main/scripting/source/pyprov/pythonscript.py Wed May 30 
04:08:28 2012
@@ -113,9 +113,9 @@ log.debug( "pythonscript loading" )
 from com.sun.star.uno import RuntimeException
 from com.sun.star.lang import XServiceInfo
 from com.sun.star.io import IOException
-from com.sun.star.ucb import CommandAbortedException, XCommandEnvironment, 
XProgressHandler
+from com.sun.star.ucb import CommandAbortedException, XCommandEnvironment, 
XProgressHandler, Command
 from com.sun.star.task import XInteractionHandler
-from com.sun.star.beans import XPropertySet
+from com.sun.star.beans import XPropertySet, Property
 from com.sun.star.container import XNameContainer
 from com.sun.star.xml.sax import XDocumentHandler, InputSource
 from com.sun.star.uno import Exception as UnoException
@@ -247,12 +247,15 @@ def checkForPythonPathBesideScript( url 
         
     
 class ScriptContext(unohelper.Base):
-    def __init__( self, ctx, doc ):
+    def __init__( self, ctx, doc, inv ):
         self.ctx = ctx
         self.doc = doc
+        self.inv = inv
        
    # XScriptContext
     def getDocument(self):
+        if self.doc:
+            return self.doc
         return self.getDesktop().getCurrentComponent()
 
     def getDesktop(self):
@@ -262,6 +265,9 @@ class ScriptContext(unohelper.Base):
     def getComponentContext(self):
         return self.ctx
 
+    def getInvocationContext(self):
+        return self.inv
+
 #----------------------------------
 # Global Module Administration
 # does not fit together with script
@@ -726,7 +732,32 @@ class CommandEnvironment(unohelper.Base,
 #        log.isDebugLevel() and log.debug( "pythonscript: 
ModifyListener.modified " + str( event ) )
 #    def disposing( self, event ):
 #        log.isDebugLevel() and log.debug( "pythonscript: 
ModifyListener.disposing " + str( event ) )
+
+def getModelFromDocUrl(ctx, url):
+    """Get document model from document url."""
+    doc = None
+    args = ("Local", "Office")
+    ucb = ctx.getServiceManager().createInstanceWithArgumentsAndContext(
+        "com.sun.star.ucb.UniversalContentBroker", args, ctx)
+    identifier = ucb.createContentIdentifier(url)
+    content = ucb.queryContent(identifier)
+    p = Property()
+    p.Name = "DocumentModel"
+    p.Handle = -1
+    
+    c = Command()
+    c.Handle = -1
+    c.Name = "getPropertyValues"
+    c.Argument = uno.Any("[]com.sun.star.beans.Property", (p,))
     
+    env = CommandEnvironment()
+    try:
+        ret = content.execute(c, 0, env)
+        doc = ret.getObject(1, None)
+    except Exception, e:
+        log.isErrorLevel() and log.error("getModelFromDocUrl: %s" % url)
+    return doc
+
 def mapStorageType2PackageContext( storageType ):
     ret = storageType
     if( storageType == "share:uno_packages" ):
@@ -853,11 +884,26 @@ class PythonScriptProvider( unohelper.Ba
                 mystr = mystr + str(i)
             log.debug( "Entering PythonScriptProvider.ctor" + mystr )
 
+        doc = None
+        inv = None
         storageType = ""
+
         if isinstance(args[0],unicode ):
             storageType = args[0]
+            if storageType.startswith( "vnd.sun.star.tdoc" ):
+                doc = getModelFromDocUrl(ctx, storageType)
         else:
-            storageType = args[0].SCRIPTING_DOC_URI
+            inv = args[0]
+            try:
+                doc = inv.ScriptContainer
+                content = ctx.getServiceManager().createInstanceWithContext(
+                    
"com.sun.star.frame.TransientDocumentsDocumentContentFactory", 
+                    ctx).createDocumentContent(doc)
+                storageType = content.getIdentifier().getContentIdentifier()
+            except Exception, e:
+                text = lastException2String()
+                log.error( text )
+
         isPackage = storageType.endswith( ":uno_packages" )
 
         try:
@@ -876,7 +922,7 @@ class PythonScriptProvider( unohelper.Ba
                 raise RuntimeException(
                     "PythonScriptProvider couldn't instantiate " +ucbService, 
self)
             self.provCtx = ProviderContext(
-                storageType, sfa, urlHelper, ScriptContext( 
uno.getComponentContext(), None ) )
+                storageType, sfa, urlHelper, ScriptContext( 
uno.getComponentContext(), doc, inv ) )
             if isPackage:
                 mapPackageName2Path = getPackageName2PathMap( sfa, storageType 
)
                 self.provCtx.setPackageAttributes( mapPackageName2Path , 
rootUrl )


Reply via email to