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