00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 """helper tools for using pyUNO"""
00021
00022 import sys
00023 try:
00024 import uno, unohelper
00025 from com.sun.star.connection import NoConnectException
00026 from com.sun.star.beans import PropertyValue
00027
00028
00029 localoContext = uno.getComponentContext()
00030
00031 resolver = localoContext.ServiceManager.createInstanceWithContext(
00032 "com.sun.star.bridge.UnoUrlResolver",
00033 localoContext )
00034 isOpenOfficeAvailable = True
00035 except:
00036 isOpenOfficeAvailable = False
00037
00038 class OpenOffice:
00039 """helper tools for using pyUNO"""
00040 def __init__(self, host=None, port=None):
00041 self.host = host or 'localhost'
00042 self.port = port or 2002
00043 self.ctx, self.desktop = self.connect()
00044 self.oCoreReflection = None
00045
00046 @staticmethod
00047 def start(host=None, port=None):
00048 import subprocess
00049 host = host or 'localhost'
00050 port = port or 2002
00051 subprocess.call(["soffice", "-accept=socket,host=%s,port=%d;urp;" % (host, port), "-nodefault"], shell=False)
00052
00053 def connect(self):
00054 """Connection to OOo instance using pyUNO"""
00055
00056
00057 try:
00058 oContext = resolver.resolve(
00059 "uno:socket,host=%s,port=%i;urp;StarOffice.ComponentContext" %
00060 (self.host, self.port))
00061 except NoConnectException:
00062 oContext = None
00063
00064
00065 if oContext is not None:
00066 smgr = oContext.ServiceManager
00067 desktop = smgr.createInstanceWithContext(
00068 "com.sun.star.frame.Desktop",
00069 oContext)
00070 else:
00071 desktop = None
00072
00073 return oContext, desktop
00074
00075 def closeAll(self, close_desktop = False):
00076 """ close all components and terminates desktop if requested"""
00077 enum = self.desktop.Components.createEnumeration()
00078 while enum.hasMoreElements():
00079 elem = enum.nextElement()
00080 try:
00081 elem.close(False)
00082 except AttributeError:
00083 if not elem.supportsService("com.sun.star.frame.StartModule"):
00084 elem.terminate()
00085 if close_desktop:
00086 self.desktop.terminate()
00087 return
00088
00089
00090
00091
00092
00093
00094 def getServiceManager( self ):
00095 """Get the ServiceManager from the running OpenOffice.org.
00096 """
00097 return self.ctx.ServiceManager
00098
00099 def createUnoService( self, cClass ):
00100 """A handy way to create a global objects within the running OOo.
00101 """
00102 oServiceManager = self.getServiceManager()
00103 oObj = oServiceManager.createInstance( cClass )
00104 return oObj
00105
00106 def getDesktop( self ):
00107 """An easy way to obtain the Desktop object from a running OOo.
00108 """
00109 if self.desktop == None:
00110 self.desktop = self.createUnoService("com.sun.star.frame.Desktop")
00111 return self.desktop
00112
00113 def getCoreReflection( self ):
00114 if self.oCoreReflection == None:
00115 self.oCoreReflection = self.createUnoService(
00116 "com.sun.star.reflection.CoreReflection" )
00117 return self.oCoreReflection
00118
00119 def createUnoStruct( self, cTypeName ):
00120 """Create a UNO struct and return it.
00121 """
00122 oCoreReflection = self.getCoreReflection()
00123
00124
00125 oXIdlClass = oCoreReflection.forName( cTypeName )
00126
00127
00128 oReturnValue, oStruct = oXIdlClass.createObject( None )
00129
00130 return oStruct
00131
00132 def makePropertyValue( self, cName=None, uValue=None,
00133 nHandle=None, nState=None ):
00134 """Create a com.sun.star.beans.PropertyValue struct and return it.
00135 """
00136 oPropertyValue = self.createUnoStruct(
00137 "com.sun.star.beans.PropertyValue" )
00138
00139 if cName != None:
00140 oPropertyValue.Name = cName
00141 if uValue != None:
00142 oPropertyValue.Value = uValue
00143 if nHandle != None:
00144 oPropertyValue.Handle = nHandle
00145 if nState != None:
00146 oPropertyValue.State = nState
00147
00148 return oPropertyValue