diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 9117a8e19..be5b2813b 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -47,6 +47,8 @@ from openlp.core.lib import Receiver, translate log = logging.getLogger(__name__) IMAGES_FILTER = None +UNO_CONNECTION_TYPE = u'pipe' +#UNO_CONNECTION_TYPE = u'socket' class VersionThread(QtCore.QThread): """ @@ -375,9 +377,37 @@ def string_is_unicode(test_string): log.exception("Error encoding string to unicode") return return_string +def get_uno_command(): + """ + Returns the UNO command to launch an openoffice.org instance. + """ + if UNO_CONNECTION_TYPE == u'pipe': + return u'openoffice.org -nologo -norestore -minimized -invisible ' \ + + u'-nofirststartwizard -accept=pipe,name=openlp_pipe;urp;' + else: + return u'openoffice.org -nologo -norestore -minimized ' \ + + u'-invisible -nofirststartwizard ' \ + + u'-accept=socket,host=localhost,port=2002;urp;' + +def get_uno_instance(resolver): + """ + Returns a running openoffice.org instance. + + ``resolver`` + The UNO resolver to use to find a running instance. + """ + log.debug(u'get UNO Desktop Openoffice - resolve') + if UNO_CONNECTION_TYPE == u'pipe': + return resolver.resolve(u'uno:pipe,name=openlp_pipe;' \ + + u'urp;StarOffice.ComponentContext') + else: + return resolver.resolve(u'uno:socket,host=localhost,port=2002;' \ + + u'urp;StarOffice.ComponentContext') + from languagemanager import LanguageManager from actions import ActionList __all__ = [u'AppLocation', u'check_latest_version', u'add_actions', u'get_filesystem_encoding', u'LanguageManager', u'ActionList', - u'get_web_page', u'file_is_unicode', u'string_is_unicode'] + u'get_web_page', u'file_is_unicode', u'string_is_unicode', + u'get_uno_command', u'get_uno_instance', u'delete_file'] diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 516c595c7..6ca67c2ae 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -51,7 +51,7 @@ else: from PyQt4 import QtCore -from openlp.core.utils import delete_file +from openlp.core.utils import delete_file, get_uno_command, get_uno_instance from presentationcontroller import PresentationController, PresentationDocument log = logging.getLogger(__name__) @@ -75,7 +75,6 @@ class ImpressController(PresentationController): self.process = None self.desktop = None self.manager = None - self.uno_connection_type = u'pipe' #u'socket' def check_available(self): """ @@ -100,14 +99,7 @@ class ImpressController(PresentationController): self.manager._FlagAsMethod(u'Bridge_GetValueObject') else: # -headless - if self.uno_connection_type == u'pipe': - cmd = u'openoffice.org -nologo -norestore -minimized ' \ - + u'-invisible -nofirststartwizard ' \ - + u'-accept=pipe,name=openlp_pipe;urp;' - else: - cmd = u'openoffice.org -nologo -norestore -minimized ' \ - + u'-invisible -nofirststartwizard ' \ - + u'-accept=socket,host=localhost,port=2002;urp;' + cmd = get_uno_command() self.process = QtCore.QProcess() self.process.startDetached(cmd) self.process.waitForStarted() @@ -118,7 +110,7 @@ class ImpressController(PresentationController): which will be used to manage impress """ log.debug(u'get UNO Desktop Openoffice') - ctx = None + uno_instance = None loop = 0 log.debug(u'get UNO Desktop Openoffice - getComponentContext') context = uno.getComponentContext() @@ -126,27 +118,19 @@ class ImpressController(PresentationController): u'UnoUrlResolver') resolver = context.ServiceManager.createInstanceWithContext( u'com.sun.star.bridge.UnoUrlResolver', context) - while ctx is None and loop < 3: + while uno_instance is None and loop < 3: try: - log.debug(u'get UNO Desktop Openoffice - resolve') - if self.uno_connection_type == u'pipe': - ctx = resolver.resolve(u'uno:' \ - + u'pipe,name=openlp_pipe;' \ - + u'urp;StarOffice.ComponentContext') - else: - ctx = resolver.resolve(u'uno:' \ - + u'socket,host=localhost,port=2002;' \ - + u'urp;StarOffice.ComponentContext') + uno_instance = get_uno_instance(resolver) except: log.exception(u'Unable to find running instance ') self.start_process() loop += 1 try: - self.manager = ctx.ServiceManager + self.manager = uno_instance.ServiceManager log.debug(u'get UNO Desktop Openoffice - createInstanceWithContext' u' - Desktop') desktop = self.manager.createInstanceWithContext( - "com.sun.star.frame.Desktop", ctx ) + "com.sun.star.frame.Desktop", uno_instance) return desktop except: log.exception(u'Failed to get UNO desktop') diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py index 7da8ddd81..93a01623e 100644 --- a/openlp/plugins/songs/forms/songmaintenanceform.py +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -535,4 +535,3 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): else: self.booksDeleteButton.setEnabled(True) self.booksEditButton.setEnabled(True) - diff --git a/openlp/plugins/songs/lib/easislidesimport.py b/openlp/plugins/songs/lib/easislidesimport.py index 93bf2a01d..64523fd3a 100644 --- a/openlp/plugins/songs/lib/easislidesimport.py +++ b/openlp/plugins/songs/lib/easislidesimport.py @@ -81,44 +81,43 @@ class EasiSlidesImport(SongImport): def _parse_song(self, song): self._success = True - self._add_title(song) - self._add_alttitle(song) - self._add_number(song) + self._add_title(self.title, song.Title1, True) + self._add_alttitle(self.alternate_title, song.Title2) + self._add_number(self.song_number, song.SongNumber) + if self.song_number == u'0': + self.song_number = u'' self._add_authors(song) self._add_copyright(song) - self._add_book(song) + self._add_book(self.song_book_name, song.BookReference) self._parse_and_add_lyrics(song) return self._success - def _add_title(self, song): - try: - self.title = unicode(song.Title1).strip() - except UnicodeDecodeError: - log.exception(u'Unicode decode error while decoding Title1') - self._success = False - except AttributeError: - log.exception(u'no Title1') - self._success = False + def _add_unicode_attribute(self, self_attribute, import_attribute, + mandatory=False): + """ + Add imported values to the song model converting them to unicode at the + same time. If the unicode decode fails or a mandatory attribute is not + present _success is set to False so the importer can react + appropriately. - def _add_alttitle(self, song): - try: - self.alternate_title = unicode(song.Title2).strip() - except UnicodeDecodeError: - log.exception(u'Unicode decode error while decoding Title2') - self._success = False - except AttributeError: - pass + ``self_attribute`` + The attribute in the song model to populate. - def _add_number(self, song): + ``import_attribute`` + The imported value to convert to unicode and save to the song. + + ``mandatory`` + Signals that this attribute must exist in a valid song. + """ try: - number = unicode(song.SongNumber) - if number != u'0': - self.song_number = number + self_attribute = unicode(import_attribute).strip() except UnicodeDecodeError: - log.exception(u'Unicode decode error while decoding SongNumber') + log.exception(u'UnicodeDecodeError decoding %s' % import_attribute) self._success = False except AttributeError: - pass + log.exception(u'No attribute %s' % import_attribute) + if mandatory: + self._success = False def _add_authors(self, song): try: @@ -158,15 +157,6 @@ class EasiSlidesImport(SongImport): pass self.add_copyright(u' '.join(copyright)) - def _add_book(self, song): - try: - self.song_book_name = unicode(song.BookReference).strip() - except UnicodeDecodeError: - log.exception(u'Unicode decode error while decoding BookReference') - self._success = False - except AttributeError: - pass - def _parse_and_add_lyrics(self, song): try: lyrics = unicode(song.Contents).strip() diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py index be33cb8fb..45d1ce5b9 100644 --- a/openlp/plugins/songs/lib/oooimport.py +++ b/openlp/plugins/songs/lib/oooimport.py @@ -29,6 +29,7 @@ import os from PyQt4 import QtCore from openlp.core.lib import Receiver +from openlp.core.utils import get_uno_command, get_uno_instance from songimport import SongImport log = logging.getLogger(__name__) @@ -61,7 +62,6 @@ class OooImport(SongImport): self.document = None self.process_started = False self.filenames = kwargs[u'filenames'] - self.uno_connection_type = u'pipe' #u'socket' QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import) @@ -105,25 +105,18 @@ class OooImport(SongImport): context = uno.getComponentContext() resolver = context.ServiceManager.createInstanceWithContext( u'com.sun.star.bridge.UnoUrlResolver', context) - ctx = None + uno_instance = None loop = 0 - while ctx is None and loop < 5: + while uno_instance is None and loop < 5: try: - if self.uno_connection_type == u'pipe': - ctx = resolver.resolve(u'uno:' \ - + u'pipe,name=openlp_pipe;' \ - + u'urp;StarOffice.ComponentContext') - else: - ctx = resolver.resolve(u'uno:' \ - + u'socket,host=localhost,port=2002;' \ - + u'urp;StarOffice.ComponentContext') + uno_instance = get_uno_instance(resolver) except: log.exception("Failed to resolve uno connection") - self.start_ooo_process() - loop += 1 - manager = ctx.ServiceManager + self.start_ooo_process() + loop += 1 + manager = uno_instance.ServiceManager self.desktop = manager.createInstanceWithContext( - "com.sun.star.frame.Desktop", ctx) + "com.sun.star.frame.Desktop", uno_instance) def start_ooo_process(self): try: @@ -132,14 +125,7 @@ class OooImport(SongImport): self.manager._FlagAsMethod(u'Bridge_GetStruct') self.manager._FlagAsMethod(u'Bridge_GetValueObject') else: - if self.uno_connection_type == u'pipe': - cmd = u'openoffice.org -nologo -norestore -minimized ' \ - + u'-invisible -nofirststartwizard ' \ - + u'-accept=pipe,name=openlp_pipe;urp;' - else: - cmd = u'openoffice.org -nologo -norestore -minimized ' \ - + u'-invisible -nofirststartwizard ' \ - + u'-accept=socket,host=localhost,port=2002;urp;' + cmd = get_uno_command() process = QtCore.QProcess() process.startDetached(cmd) process.waitForStarted()