← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~gerald-britton/openlp/newbugs into lp:openlp

 

jerryb has proposed merging lp:~gerald-britton/openlp/newbugs into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~gerald-britton/openlp/newbugs/+merge/62211

This patch adds some robustness to the OpenOffice importer module and the Songs of Fellowship importer, which uses it.  Primarily, it tries to avoid giving tracebacks.  First off, it detects failed OpenOffice connections and reports on them.  Then, it catches openoffice errors during import.  Finally, it checks the result of the call to songimport.finish() and checks the result to give a error message in the import dialog, if unsuccessful.  

With this patch, you should be able to point the SoF importer at completely garbage files and get an error message in the dialog instead of a traceback.  Of course, properly formatted files will go through.
-- 
https://code.launchpad.net/~gerald-britton/openlp/newbugs/+merge/62211
Your team OpenLP Core is requested to review the proposed merge of lp:~gerald-britton/openlp/newbugs into lp:openlp.
=== modified file 'openlp/plugins/songs/lib/oooimport.py'
--- openlp/plugins/songs/lib/oooimport.py	2011-04-18 18:57:58 +0000
+++ openlp/plugins/songs/lib/oooimport.py	2011-05-24 21:06:10 +0000
@@ -40,6 +40,7 @@
     PAGE_BOTH = 6
 else:
     import uno
+    from com.sun.star.connection import NoConnectException
     from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH
 
 class OooImport(SongImport):
@@ -56,7 +57,16 @@
         self.process_started = False
 
     def do_import(self):
-        self.start_ooo()
+        if not isinstance(self.import_source, list):
+            return
+        try:
+            self.start_ooo()
+        except NoConnectException as exc:
+            self.log_error(
+                self.import_source[0],
+                u'Unable to connect to OpenOffice.org or LibreOffice')
+            log.error(exc)
+            return
         self.import_wizard.progressBar.setMaximum(len(self.import_source))
         for filename in self.import_source:
             if self.stop_import_flag:
@@ -98,13 +108,16 @@
             while uno_instance is None and loop < 5:
                 try:
                     uno_instance = get_uno_instance(resolver)
-                except:
+                except NoConnectException:
                     log.exception("Failed to resolve uno connection")
                     self.start_ooo_process()
                     loop += 1
-            manager = uno_instance.ServiceManager
-            self.desktop = manager.createInstanceWithContext(
-                "com.sun.star.frame.Desktop", uno_instance)
+                else:
+                    manager = uno_instance.ServiceManager
+                    self.desktop = manager.createInstanceWithContext(
+                        "com.sun.star.frame.Desktop", uno_instance)
+                    return
+                raise
 
     def start_ooo_process(self):
         try:

=== modified file 'openlp/plugins/songs/lib/sofimport.py'
--- openlp/plugins/songs/lib/sofimport.py	2011-04-17 15:47:02 +0000
+++ openlp/plugins/songs/lib/sofimport.py	2011-05-24 21:06:10 +0000
@@ -30,10 +30,14 @@
 # http://www.oooforum.org/forum/viewtopic.phtml?t=14409
 # http://wiki.services.openoffice.org/wiki/Python
 
+import logging
 import os
 import re
 
 from oooimport import OooImport
+from com.sun.star.uno import RuntimeException
+
+log = logging.getLogger(__name__)
 
 if os.name == u'nt':
     BOLD = 150.0
@@ -85,16 +89,18 @@
         """
         self.blanklines = 0
         self.new_song()
-        paragraphs = self.document.getText().createEnumeration()
-        while paragraphs.hasMoreElements():
-            if self.stop_import_flag:
-                return
-            paragraph = paragraphs.nextElement()
-            if paragraph.supportsService("com.sun.star.text.Paragraph"):
-                self.process_paragraph(paragraph)
-        if self.song:
-            self.finish()
-            self.song = False
+        try:
+            paragraphs = self.document.getText().createEnumeration()
+            while paragraphs.hasMoreElements():
+                if self.stop_import_flag:
+                    return
+                paragraph = paragraphs.nextElement()
+                if paragraph.supportsService("com.sun.star.text.Paragraph"):
+                    self.process_paragraph(paragraph)
+        except RuntimeException as exc:
+            log.exception(u'Error processing file: %s', exc)
+        if not self.finish():
+            self.log_error(self.filepath)
 
     def process_paragraph(self, paragraph):
         """


Follow ups