From 2207c96005f2dbe92fb9a6e686fdf5a4cf84ecb6 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Thu, 17 Sep 2009 08:28:47 +0100 Subject: [PATCH 1/2] Impress support on Windows, via COM --- .../presentations/lib/impresscontroller.py | 57 ++++++++++++++----- .../presentations/presentationplugin.py | 8 ++- 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 854e1ff7e..dbcf4c0a4 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -29,9 +29,14 @@ Place, Suite 330, Boston, MA 02111-1307 USA import logging import os , subprocess import time -import uno import sys +if os.name == u'nt': + from win32com.client import Dispatch +else: + import uno + + from PyQt4 import QtCore class ImpressController(object): @@ -57,11 +62,12 @@ class ImpressController(object): when required. """ log.debug(u'start Openoffice') - # -headless - cmd = u'openoffice.org -nologo -norestore -minimized -invisible ' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"' - self.process = QtCore.QProcess() - self.process.startDetached(cmd) - self.process.waitForStarted() + if os.name != u'nt': + # -headless + cmd = u'openoffice.org -nologo -norestore -minimized -invisible ' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"' + self.process = QtCore.QProcess() + self.process.startDetached(cmd) + self.process.waitForStarted() def kill(self): """ @@ -81,6 +87,26 @@ class ImpressController(object): The file name of the presentatios to the run. """ log.debug(u'LoadPresentation') + if os.name == u'nt': + desktop = self.getCOMDesktop() + url = u'file:///' + presentation.replace(u'\\', u'/').replace(u':', u'|').replace(u' ', u'%20') + else: + desktop = self.getUNODesktop() + url = uno.systemPathToFileUrl(presentation) + if(desktop==None): + return + try: + properties = [] + properties = tuple(properties) + self.document = desktop.loadComponentFromURL(url, "_blank", 0, properties) + self.presentation = self.document.getPresentation() + self.presentation.start() + self.xSlideShowController = desktop.getCurrentComponent().Presentation.getController() + except: + log.error(u'Failed reason %s' % sys.exc_info()) + + def getUNODesktop(self): + log.debug(u'getUNODesktop') ctx = None loop = 0 context = uno.getComponentContext() @@ -94,15 +120,20 @@ class ImpressController(object): try: smgr = ctx.ServiceManager desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop", ctx ) - url = uno.systemPathToFileUrl(presentation) - properties = [] - properties = tuple(properties) - self.document = desktop.loadComponentFromURL(url, "_blank", 0, properties) - self.presentation = self.document.getPresentation() - self.presentation.start() - self.xSlideShowController = desktop.getCurrentComponent().Presentation.getController() + return desktop except: log.error(u'Failed reason %s' % sys.exc_info()) + return None + + def getCOMDesktop(self): + log.debug(u'getCOMDesktop') + try: + smgr = Dispatch("com.sun.star.ServiceManager") + desktop = smgr.createInstance( "com.sun.star.frame.Desktop") + return desktop + except: + log.error(u'Failed reason %s' % sys.exc_info()) + return None def closePresentation(self): """ diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 7f2d07c11..5c2c07d3d 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -79,8 +79,12 @@ class PresentationPlugin(Plugin): #Lets see if Impress is required (Default is Not wanted) if int(self.config.get_config(u'Impress', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: try: - #Check to see if we have uno installed - import uno + if os.name == u'nt': + #Check to see if we are Win32 + from win32com.client import Dispatch + else: + #Check to see if we have uno installed + import uno openoffice = ImpressController() self.registerControllers(u'Impress', openoffice) except: From 43b7951693d12b157be0fce977d4d8cebbccf9ed Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 18 Sep 2009 07:07:10 +0100 Subject: [PATCH 2/2] Fix presentation array issue --- openlp/core/ui/slidecontroller.py | 4 ++-- openlp/plugins/presentations/lib/impresscontroller.py | 6 +++--- openlp/plugins/presentations/lib/messagelistener.py | 5 ++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 393f48388..33c652389 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -254,7 +254,7 @@ class SlideController(QtGui.QWidget): self.enableToolBar(item) if item.service_item_type == ServiceType.Command: Receiver().send_message(u'%s_start'%item.name.lower(), \ - u'%s:%s:%s' % (item.shortname, item.service_item_path, item.service_frames[0][u'title'])) + [item.shortname, item.service_item_path, item.service_frames[0][u'title']]) else: self.displayServiceManagerItems(item, 0) @@ -272,7 +272,7 @@ class SlideController(QtGui.QWidget): self.enableToolBar(item) if item.service_item_type == ServiceType.Command: Receiver().send_message(u'%s_start'%item.name.lower(), \ - u'%s:%s:%s' % (item.shortname, item.service_item_path, item.service_frames[0][u'title'])) + [item.shortname, item.service_item_path, item.service_frames[0][u'title']]) else: self.displayServiceManagerItems(item, slideno) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index dbcf4c0a4..935dddaaa 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -89,12 +89,12 @@ class ImpressController(object): log.debug(u'LoadPresentation') if os.name == u'nt': desktop = self.getCOMDesktop() - url = u'file:///' + presentation.replace(u'\\', u'/').replace(u':', u'|').replace(u' ', u'%20') + url = u'file:///' + presentation.replace(u'\\', u'/').replace(u':', u'|').replace(u' ', u'%20') else: desktop = self.getUNODesktop() url = uno.systemPathToFileUrl(presentation) - if(desktop==None): - return + if desktop==None: + return try: properties = [] properties = tuple(properties) diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index d18b93a02..b34db57e2 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -83,6 +83,5 @@ class MessageListener(object): ``message`` Message containing Presentaion handler name and file to be presented. """ - bits = message.split(u':') - file = os.path.join(bits[1], bits[2]) - return bits[0], file + file = os.path.join(message[1], message[2]) + return message[0], file