123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import os
- import random
- from sys import platform
- from time import sleep
- import uno
- from com.sun.star.connection import NoConnectException
- from com.sun.star.uno import Exception as UnoException
- class BootstrapException(UnoException):
- pass
- def bootstrap():
- """Bootstrap OOo and PyUNO Runtime.
- The soffice process is started opening a named pipe of random name, then the local context is used
- to access the pipe. This function directly returns the remote component context, from whereon you can
- get the ServiceManager by calling getServiceManager() on the returned object.
- """
- try:
-
- if "UNO_PATH" in os.environ:
- sOffice = os.environ["UNO_PATH"]
- else:
- sOffice = ""
- sOffice = os.path.join(sOffice, "soffice")
- if platform.startswith("win"):
- sOffice += ".exe"
-
- random.seed()
- sPipeName = "uno" + str(random.random())[2:]
-
- cmdArray = (sOffice, "--nologo", "--nodefault", "".join(["--accept=pipe,name=", sPipeName, ";urp;"]))
- os.spawnv(os.P_NOWAIT, sOffice, cmdArray)
-
- xLocalContext = uno.getComponentContext()
- resolver = xLocalContext.ServiceManager.createInstanceWithContext(
- "com.sun.star.bridge.UnoUrlResolver", xLocalContext)
- sConnect = "".join(["uno:pipe,name=", sPipeName, ";urp;StarOffice.ComponentContext"])
-
- nLoop = 20
- while True:
- try:
- xContext = resolver.resolve(sConnect)
- break
- except NoConnectException:
- nLoop -= 1
- if nLoop <= 0:
- raise BootstrapException("Cannot connect to soffice server.", None)
- sleep(0.5)
- except BootstrapException:
- raise
- except Exception as e:
- raise BootstrapException("Caught exception " + str(e), None)
- return xContext
|