openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #27150
[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