summaryrefslogtreecommitdiff
path: root/pyuno
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-11-19 16:26:50 +0100
committerMichael Stahl <mstahl@redhat.com>2014-12-02 13:47:26 +0000
commit8eb37e74fff1806608563ee49489b8a1f71fc6b0 (patch)
treea3ae406c348f4258fe587143306ccb02c20e6d33 /pyuno
parenta143d7d14db9b12064391879822120260eda2702 (diff)
pyuno: move "officehelper.py" from scripting to pyuno
... because at least in Fedora packages with system python it's a pain to use officehelper.bootstrap() because unlike pyuno it is not installed in the standard python directories but in libreoffice/program. You might think that bootstrap() is not appropriate functionality for a UNO langauge binding, but then why does ::cppu::bootstrap() exist? Change-Id: I5fd4b344a811c087d32fb6304e55105ab3cb137e Reviewed-on: https://gerrit.libreoffice.org/12968 Reviewed-by: Michael Stahl <mstahl@redhat.com> Tested-by: Michael Stahl <mstahl@redhat.com>
Diffstat (limited to 'pyuno')
-rw-r--r--pyuno/Package_python_scripts.mk1
-rwxr-xr-xpyuno/source/officehelper.py84
2 files changed, 85 insertions, 0 deletions
diff --git a/pyuno/Package_python_scripts.mk b/pyuno/Package_python_scripts.mk
index 80af45922d43..0588af3705a7 100644
--- a/pyuno/Package_python_scripts.mk
+++ b/pyuno/Package_python_scripts.mk
@@ -13,6 +13,7 @@ $(eval $(call gb_Package_add_files,pyuno_python_scripts,$(LIBO_LIB_PYUNO_FOLDER)
loader/pythonloader.py \
module/uno.py \
module/unohelper.py \
+ officehelper.py \
))
# vim: set noet sw=4 ts=4:
diff --git a/pyuno/source/officehelper.py b/pyuno/source/officehelper.py
new file mode 100755
index 000000000000..0b0bb68af5e5
--- /dev/null
+++ b/pyuno/source/officehelper.py
@@ -0,0 +1,84 @@
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+#
+# Translated to python from "Bootstrap.java" by Kim Kulak
+#
+
+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:
+ # soffice script used on *ix, Mac; soffice.exe used on Win
+ if "UNO_PATH" in os.environ:
+ sOffice = os.environ["UNO_PATH"]
+ else:
+ sOffice = "" # lets hope for the best
+ sOffice = os.path.join(sOffice, "soffice")
+ if platform.startswith("win"):
+ sOffice += ".exe"
+
+ # Generate a random pipe name.
+ random.seed()
+ sPipeName = "uno" + str(random.random())[2:]
+
+ # Start the office process, don't check for exit status since an exception is caught anyway if the office terminates unexpectedly.
+ 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"])
+
+ # Wait until an office is started, but loop only nLoop times (can we do this better???)
+ 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) # Sleep 1/2 second.
+
+ except BootstrapException:
+ raise
+ except Exception as e: # Any other exception
+ raise BootstrapException("Caught exception " + str(e), None)
+
+ return xContext