forked from openlp/openlp
Ignore Libre/OpenOffice exceptions if we are closing it.
Move call to XInitThreads for linux-vlc setup to module-load. Fixes bug 1473632. bzr-revno: 2547
This commit is contained in:
commit
50b2400521
@ -84,7 +84,6 @@ def get_vlc():
|
||||
pass
|
||||
else:
|
||||
raise
|
||||
|
||||
if is_vlc_available:
|
||||
try:
|
||||
VERSION = vlc.libvlc_get_version().decode('UTF-8')
|
||||
@ -95,21 +94,24 @@ def get_vlc():
|
||||
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.
|
||||
|
@ -38,6 +38,7 @@ if is_win():
|
||||
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 @@ class OpenOfficeImport(SongImport):
|
||||
"""
|
||||
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 @@ class OpenOfficeImport(SongImport):
|
||||
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 @@ class OpenOfficeImport(SongImport):
|
||||
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 @@ class OpenOfficeImport(SongImport):
|
||||
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):
|
||||
"""
|
||||
|
74
tests/functional/openlp_plugins/songs/test_openoffice.py
Normal file
74
tests/functional/openlp_plugins/songs/test_openoffice.py
Normal file
@ -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')
|
Loading…
Reference in New Issue
Block a user