← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~tomasgroth/openlp/bug1473632 into lp:openlp

 

Tomas Groth has proposed merging lp:~tomasgroth/openlp/bug1473632 into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)
Related bugs:
  Bug #1473632 in OpenLP: "crash on every file dialog"
  https://bugs.launchpad.net/openlp/+bug/1473632

For more details, see:
https://code.launchpad.net/~tomasgroth/openlp/bug1473632/+merge/266778

Ignore Libre/OpenOffice exceptions if we are closing it.
Move call to XInitThreads for linux-vlc setup to module-load. Fixes bug 1473632.

-- 
Your team OpenLP Core is requested to review the proposed merge of lp:~tomasgroth/openlp/bug1473632 into lp:openlp.
=== modified file 'openlp/core/ui/media/vlcplayer.py'
--- openlp/core/ui/media/vlcplayer.py	2015-04-28 14:01:09 +0000
+++ openlp/core/ui/media/vlcplayer.py	2015-08-03 19:02:18 +0000
@@ -84,7 +84,6 @@
             pass
         else:
             raise
-
     if is_vlc_available:
         try:
             VERSION = vlc.libvlc_get_version().decode('UTF-8')
@@ -95,21 +94,24 @@
         if LooseVersion(VERSION.split()[0]) < LooseVersion('1.1.0'):
             is_vlc_available = False
             log.debug('VLC could not be loaded, because the vlc version is too old: %s' % VERSION)
-        # On linux we need to initialise X threads, but not when running tests.
-        if is_vlc_available and is_linux() and 'nose' not in sys.argv[0]:
-            import ctypes
-            try:
-                x11 = ctypes.cdll.LoadLibrary('libX11.so')
-                x11.XInitThreads()
-            except:
-                log.exception('Failed to run XInitThreads(), VLC might not work properly!')
-
     if is_vlc_available:
         return vlc
     else:
         return None
 
 
+# On linux we need to initialise X threads, but not when running tests.
+# This needs to happen on module load and not in get_vlc(), otherwise it can cause crashes on some DE on some setups
+# (reported on Gnome3, Unity, Cinnamon, all GTK+ based) when using native filedialogs...
+if get_vlc() and is_linux() and 'nose' not in sys.argv[0]:
+    import ctypes
+    try:
+        x11 = ctypes.cdll.LoadLibrary('libX11.so')
+        x11.XInitThreads()
+    except:
+        log.exception('Failed to run XInitThreads(), VLC might not work properly!')
+
+
 class VlcPlayer(MediaPlayer):
     """
     A specialised version of the MediaPlayer class, which provides a VLC display.

=== modified file 'openlp/plugins/songs/lib/importers/openoffice.py'
--- openlp/plugins/songs/lib/importers/openoffice.py	2015-01-18 13:39:21 +0000
+++ openlp/plugins/songs/lib/importers/openoffice.py	2015-08-03 19:02:18 +0000
@@ -38,6 +38,7 @@
 else:
     import uno
     from com.sun.star.connection import NoConnectException
+    from com.sun.star.beans import PropertyValue
 try:
     from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH
 except ImportError:
@@ -54,7 +55,7 @@
         """
         Initialise the class. Requires a songmanager class which is passed to SongImport for writing song to disk
         """
-        SongImport.__init__(self, manager, **kwargs)
+        super(OpenOfficeImport, self).__init__(manager, **kwargs)
         self.document = None
         self.process_started = False
 
@@ -151,6 +152,7 @@
         else:
             url = uno.systemPathToFileUrl(file_path)
         properties = []
+        properties.append(self.create_property('Hidden', True))
         properties = tuple(properties)
         try:
             self.document = self.desktop.loadComponentFromURL(url, '_blank', 0, properties)
@@ -163,11 +165,27 @@
             log.exception("open_ooo_file failed: %s", url)
         return
 
+    def create_property(self, name, value):
+        """
+        Create an OOo style property object which are passed into some Uno methods.
+        """
+        log.debug('create property OpenOffice')
+        if is_win():
+            property_object = self.controller.manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')
+        else:
+            property_object = PropertyValue()
+        property_object.Name = name
+        property_object.Value = value
+        return property_object
+
     def close_ooo_file(self):
         """
         Close file.
         """
-        self.document.close(True)
+        try:
+            self.document.close(True)
+        except:
+            log.exception('Exception in close_ooo_file - trying to ignore it.')
         self.document = None
 
     def close_ooo(self):
@@ -175,7 +193,10 @@
         Close OOo. But only if we started it and not on windows
         """
         if self.process_started:
-            self.desktop.terminate()
+            try:
+                self.desktop.terminate()
+            except:
+                log.exception('Exception in close_ooo - trying to ignore it.')
 
     def process_presentation(self):
         """

=== added file 'tests/functional/openlp_plugins/songs/test_openoffice.py'
--- tests/functional/openlp_plugins/songs/test_openoffice.py	1970-01-01 00:00:00 +0000
+++ tests/functional/openlp_plugins/songs/test_openoffice.py	2015-08-03 19:02:18 +0000
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+"""
+This module contains tests for the OpenOffice/LibreOffice importer.
+"""
+from unittest import TestCase
+
+from openlp.core.common import Registry
+from openlp.plugins.songs.lib.importers.openoffice import OpenOfficeImport
+
+from tests.functional import MagicMock, patch
+from tests.helpers.testmixin import TestMixin
+
+
+class TestOpenOfficeImport(TestCase, TestMixin):
+    """
+    Test the :class:`~openlp.plugins.songs.lib.importer.openoffice.OpenOfficeImport` class
+    """
+
+    def setUp(self):
+        """
+        Create the registry
+        """
+        Registry.create()
+
+    @patch('openlp.plugins.songs.lib.importers.openoffice.SongImport')
+    def create_importer_test(self, mocked_songimport):
+        """
+        Test creating an instance of the OpenOfficeImport file importer
+        """
+        # GIVEN: A mocked out SongImport class, and a mocked out "manager"
+        mocked_manager = MagicMock()
+
+        # WHEN: An importer object is created
+        importer = OpenOfficeImport(mocked_manager, filenames=[])
+
+        # THEN: The importer object should not be None
+        self.assertIsNotNone(importer, 'Import should not be none')
+
+    @patch('openlp.plugins.songs.lib.importers.openoffice.SongImport')
+    def close_ooo_file_test(self, mocked_songimport):
+        """
+        Test that close_ooo_file catches raised exceptions
+        """
+        # GIVEN: A mocked out SongImport class, a mocked out "manager" and a document that raises an exception
+        mocked_manager = MagicMock()
+        importer = OpenOfficeImport(mocked_manager, filenames=[])
+        importer.document = MagicMock()
+        importer.document.close = MagicMock(side_effect=Exception())
+
+        # WHEN: Calling close_ooo_file
+        importer.close_ooo_file()
+
+        # THEN: The document attribute should be None even if an exception is raised')
+        self.assertIsNone(importer.document, 'Document should be None even if an exception is raised')


References