Files
loongoffice/scripting/source/pyprov/pythonscript.py
Rüdiger Timm bca8d89fb3 INTEGRATION: CWS scriptingf2 (1.1.2); FILE ADDED
2003/12/15 17:38:41 toconnor 1.1.2.1: #i23308# - add ScriptProviderForPython to scripting framework, based on
code originally written by Joerg Budischewski, modified by Duncan Foster
to use C++ classes for parsing script metadata, implementing XBrowseNode
and XScriptProvider APIs
2004-01-05 13:38:06 +00:00

195 lines
5.8 KiB
Python

# XScript implementation for python
import uno
import unohelper
import sys
import imp
from com.sun.star.lang import typeOfXServiceInfo, typeOfXTypeProvider
from com.sun.star.io import IOException
from com.sun.star.ucb import CommandAbortedException
# pythonloader looks for a static g_ImplementationHelper variable
g_MyImplementationHelper = unohelper.ImplementationHelper()
g_implName = "org.openoffice.pyuno.PythonScriptImpl"
g_implementationId = uno.generateUuid()
g_types = None
BLOCK_SIZE = 65536
DEBUG = 0
class Context:
def __init__( self, ctx, doc ):
if DEBUG:
print "constructing Context!"
self.ctx = ctx
self.desktop = None
self.doc = doc
# XTypeProvider
# (can't use unohelper base class, because XScriptContext does not
# belong to core package )
def getTypes(self):
global g_types
if not g_types:
g_types = typeOfXTypeProvider, uno.getTypeByName( \
"drafts.com.sun.star.script.provider.XScriptContext" )
return g_types
def getImplementationId(self):
return g_implementationId
# XScriptContext
def getDocument(self):
if not self.doc:
self.doc = self.getDesktop().getCurrentComponent()
return self.doc
def getDesktop(self):
if not self.desktop:
self.desktop = self.ctx.ServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", self.ctx )
return self.desktop
def getComponentContext(self):
return self.ctx
class PScript:
def __init__( self, ctx, *args ):
if DEBUG:
print "Constructing PythonScript"
self.ctx = ctx
self.sfa = self.ctx.ServiceManager.createInstanceWithContext( \
"com.sun.star.ucb.SimpleFileAccess" , self.ctx )
fileName = args[0]
self.doc = args[1]
try:
if DEBUG:
print "Trying to open file " + fileName
inputStream = self.sfa.openFileRead( fileName )
code = uno.ByteSequence("")
if DEBUG:
print "Reading file " + fileName
while True:
read,out = inputStream.readBytes( None , BLOCK_SIZE )
if DEBUG:
print "read " + str(len( out ))
code = code + out
# does this impose a limit on the size of the script??
if read < BLOCK_SIZE:
break
if DEBUG:
print "File " + fileName + " read ("+str(len(code.value))+")"
idx = fileName.rfind("/")
tmp = fileName[idx+1:]
idx = tmp.find(".")
funcName = tmp[0:idx]
if DEBUG:
print "funcName " + funcName
mod = imp.new_module("scripting_framework")
exec code.value in mod.__dict__
self.func = mod.__dict__.get( funcName )
except CommandAbortedException,e:
if DEBUG:
print e
raise InvocationTargetException( \
"[PythonScript] Error during opening file " + \
filename + "("+e.Message+")", self, e )
except IOException,e:
if DEBUG:
print e
raise InvocationTargetException( \
"[PythonScript] Error during opening file " + \
filename + "("+e.Message+")", self, e )
except Exception,e:
if DEBUG:
print e
raise
if DEBUG:
print "Leaving PythonScript-setProperty"
# XServiceInfo
def getSupportedServices( self ):
if DEBUG:
print "PythonScript-getSupportedServices"
return g_MyImplementationHelper.getSupportedServices(g_implName)
def supportsService( self, ServiceName ):
if DEBUG:
print "PythonScript-supportsService"
return g_MyImplementationHelper.supportsService( g_implName, ServiceName )
def getImplementationName(self):
if DEBUG:
print "PythonScript-getImplementationName"
return g_implName
# XScript
def invoke( self, params, outIndex, outParams ):
if DEBUG:
print "PythonScript-invoke"
# obviously this needs to be worked on!!
outIndex = ()
outParams = ()
ret = None
try:
if self.func:
#and this, once the outParams are sorted
self.func( Context(self.ctx, self.doc), *params)
else:
raise InvocationTargetException( \
"Function has not been initialized correctly" )
except Exception,e:
if DEBUG:
print e
raise
if DEBUG:
print "Leaving script-runtime-invoke"
return ret, outIndex, outParams
# XTypeProvider
# (can't use unohelper base class, because XScript does
# not belong to core package )
def getTypes(self):
if DEBUG:
print "PythonScript-getTypes"
global g_types
if not g_types:
g_types = typeOfXTypeProvider,typeOfXServiceInfo, \
uno.getTypeByName( \
"drafts.com.sun.star.script.provider.XScript")
return g_types
def getImplementationId(self):
if DEBUG:
print "PythonScript-getTypes"
return g_implementationId
g_MyImplementationHelper.addImplementation( \
PScript,g_implName, \
("org.openoffice.pyuno.PythonScript",),)
def writeRegistryInfo( smgr, key ):
ret = g_MyImplementationHelper.writeRegistryInfo( key,smgr )
return ret
def getComponentFactory( implName, smgr , key ):
return g_MyImplementationHelper.getComponentFactory(implName,key,smgr)