1*cdf0e10cSrcweir### ************************************************************************* 2*cdf0e10cSrcweir### * 3*cdf0e10cSrcweir# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir# 5*cdf0e10cSrcweir# Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir# 7*cdf0e10cSrcweir# OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir# 9*cdf0e10cSrcweir# This file is part of OpenOffice.org. 10*cdf0e10cSrcweir# 11*cdf0e10cSrcweir# OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir# it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir# only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir# 15*cdf0e10cSrcweir# OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir# but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir# GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir# (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir# 21*cdf0e10cSrcweir# You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir# version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir# <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir# for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir# 26*cdf0e10cSrcweir### ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir# 29*cdf0e10cSrcweir# Translated to python from "Bootstrap.java" by Kim Kulak 30*cdf0e10cSrcweir# 31*cdf0e10cSrcweir 32*cdf0e10cSrcweirimport os 33*cdf0e10cSrcweirimport random 34*cdf0e10cSrcweirfrom sys import platform 35*cdf0e10cSrcweirfrom time import sleep 36*cdf0e10cSrcweir 37*cdf0e10cSrcweirimport uno 38*cdf0e10cSrcweirfrom com.sun.star.connection import NoConnectException 39*cdf0e10cSrcweirfrom com.sun.star.uno import Exception as UnoException 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir 42*cdf0e10cSrcweirclass BootstrapException(UnoException): 43*cdf0e10cSrcweir pass 44*cdf0e10cSrcweir 45*cdf0e10cSrcweirdef bootstrap(): 46*cdf0e10cSrcweir """Bootstrap OOo and PyUNO Runtime. 47*cdf0e10cSrcweir The soffice process is started opening a named pipe of random name, then the local context is used 48*cdf0e10cSrcweir to access the pipe. This function directly returns the remote component context, from whereon you can 49*cdf0e10cSrcweir get the ServiceManager by calling getServiceManager() on the returned object. 50*cdf0e10cSrcweir """ 51*cdf0e10cSrcweir try: 52*cdf0e10cSrcweir # soffice script used on *ix, Mac; soffice.exe used on Windoof 53*cdf0e10cSrcweir if "UNO_PATH" in os.environ: 54*cdf0e10cSrcweir sOffice = os.environ["UNO_PATH"] 55*cdf0e10cSrcweir else: 56*cdf0e10cSrcweir sOffice = "" # lets hope for the best 57*cdf0e10cSrcweir sOffice = os.path.join(sOffice, "soffice") 58*cdf0e10cSrcweir if platform.startswith("win"): 59*cdf0e10cSrcweir sOffice += ".exe" 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir # Generate a random pipe name. 62*cdf0e10cSrcweir random.seed() 63*cdf0e10cSrcweir sPipeName = "uno" + str(random.random())[2:] 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir # Start the office proces, don't check for exit status since an exception is caught anyway if the office terminates unexpectedly. 66*cdf0e10cSrcweir cmdArray = (sOffice, "-nologo", "-nodefault", "".join(["-accept=pipe,name=", sPipeName, ";urp;"])) 67*cdf0e10cSrcweir os.spawnv(os.P_NOWAIT, sOffice, cmdArray) 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir # --------- 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir xLocalContext = uno.getComponentContext() 72*cdf0e10cSrcweir resolver = xLocalContext.ServiceManager.createInstanceWithContext( 73*cdf0e10cSrcweir "com.sun.star.bridge.UnoUrlResolver", xLocalContext) 74*cdf0e10cSrcweir sConnect = "".join(["uno:pipe,name=", sPipeName, ";urp;StarOffice.ComponentContext"]) 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir # Wait until an office is started, but loop only nLoop times (can we do this better???) 77*cdf0e10cSrcweir nLoop = 20 78*cdf0e10cSrcweir while True: 79*cdf0e10cSrcweir try: 80*cdf0e10cSrcweir xContext = resolver.resolve(sConnect) 81*cdf0e10cSrcweir break 82*cdf0e10cSrcweir except NoConnectException: 83*cdf0e10cSrcweir nLoop -= 1 84*cdf0e10cSrcweir if nLoop <= 0: 85*cdf0e10cSrcweir raise BootstrapException("Cannot connect to soffice server.", None) 86*cdf0e10cSrcweir sleep(0.5) # Sleep 1/2 second. 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir except BootstrapException: 89*cdf0e10cSrcweir raise 90*cdf0e10cSrcweir except Exception, e: # Any other exception 91*cdf0e10cSrcweir raise BootstrapException("Caught exception " + str(e), None) 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir return xContext 94