1*b1cdbd2cSJim Jagielski#************************************************************** 2*b1cdbd2cSJim Jagielski# 3*b1cdbd2cSJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski# or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski# distributed with this work for additional information 6*b1cdbd2cSJim Jagielski# regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski# to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski# "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski# with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski# 11*b1cdbd2cSJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski# 13*b1cdbd2cSJim Jagielski# Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski# software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski# KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski# specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski# under the License. 19*b1cdbd2cSJim Jagielski# 20*b1cdbd2cSJim Jagielski#************************************************************** 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski# 23*b1cdbd2cSJim Jagielski# Translated to python from "Bootstrap.java" by Kim Kulak 24*b1cdbd2cSJim Jagielski# 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielskiimport os 27*b1cdbd2cSJim Jagielskiimport random 28*b1cdbd2cSJim Jagielskifrom sys import platform 29*b1cdbd2cSJim Jagielskifrom time import sleep 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielskiimport uno 32*b1cdbd2cSJim Jagielskifrom com.sun.star.connection import NoConnectException 33*b1cdbd2cSJim Jagielskifrom com.sun.star.uno import Exception as UnoException 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielskiclass BootstrapException(UnoException): 37*b1cdbd2cSJim Jagielski pass 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielskidef bootstrap(): 40*b1cdbd2cSJim Jagielski """Bootstrap OOo and PyUNO Runtime. 41*b1cdbd2cSJim Jagielski The soffice process is started opening a named pipe of random name, then the local context is used 42*b1cdbd2cSJim Jagielski to access the pipe. This function directly returns the remote component context, from whereon you can 43*b1cdbd2cSJim Jagielski get the ServiceManager by calling getServiceManager() on the returned object. 44*b1cdbd2cSJim Jagielski """ 45*b1cdbd2cSJim Jagielski try: 46*b1cdbd2cSJim Jagielski # soffice script used on *ix, Mac; soffice.exe used on Windoof 47*b1cdbd2cSJim Jagielski if "UNO_PATH" in os.environ: 48*b1cdbd2cSJim Jagielski sOffice = os.environ["UNO_PATH"] 49*b1cdbd2cSJim Jagielski else: 50*b1cdbd2cSJim Jagielski sOffice = "" # lets hope for the best 51*b1cdbd2cSJim Jagielski sOffice = os.path.join(sOffice, "soffice") 52*b1cdbd2cSJim Jagielski if platform.startswith("win"): 53*b1cdbd2cSJim Jagielski sOffice += ".exe" 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski # Generate a random pipe name. 56*b1cdbd2cSJim Jagielski random.seed() 57*b1cdbd2cSJim Jagielski sPipeName = "uno" + str(random.random())[2:] 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski # Start the office proces, don't check for exit status since an exception is caught anyway if the office terminates unexpectedly. 60*b1cdbd2cSJim Jagielski cmdArray = (sOffice, "-nologo", "-nodefault", "".join(["-accept=pipe,name=", sPipeName, ";urp;"])) 61*b1cdbd2cSJim Jagielski os.spawnv(os.P_NOWAIT, sOffice, cmdArray) 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski # --------- 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski xLocalContext = uno.getComponentContext() 66*b1cdbd2cSJim Jagielski resolver = xLocalContext.ServiceManager.createInstanceWithContext( 67*b1cdbd2cSJim Jagielski "com.sun.star.bridge.UnoUrlResolver", xLocalContext) 68*b1cdbd2cSJim Jagielski sConnect = "".join(["uno:pipe,name=", sPipeName, ";urp;StarOffice.ComponentContext"]) 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski # Wait until an office is started, but loop only nLoop times (can we do this better???) 71*b1cdbd2cSJim Jagielski nLoop = 20 72*b1cdbd2cSJim Jagielski while True: 73*b1cdbd2cSJim Jagielski try: 74*b1cdbd2cSJim Jagielski xContext = resolver.resolve(sConnect) 75*b1cdbd2cSJim Jagielski break 76*b1cdbd2cSJim Jagielski except NoConnectException: 77*b1cdbd2cSJim Jagielski nLoop -= 1 78*b1cdbd2cSJim Jagielski if nLoop <= 0: 79*b1cdbd2cSJim Jagielski raise BootstrapException("Cannot connect to soffice server.", None) 80*b1cdbd2cSJim Jagielski sleep(0.5) # Sleep 1/2 second. 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski except BootstrapException: 83*b1cdbd2cSJim Jagielski raise 84*b1cdbd2cSJim Jagielski except Exception as e: # Any other exception 85*b1cdbd2cSJim Jagielski raise BootstrapException("Caught exception " + str(e), None) 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski return xContext 88