forked from openlp/openlp
Ignore Libre/OpenOffice exceptions if we are closing it.
This commit is contained in:
parent
5940a77b20
commit
8b1c81f00a
@ -38,6 +38,7 @@ if is_win():
|
|||||||
else:
|
else:
|
||||||
import uno
|
import uno
|
||||||
from com.sun.star.connection import NoConnectException
|
from com.sun.star.connection import NoConnectException
|
||||||
|
from com.sun.star.beans import PropertyValue
|
||||||
try:
|
try:
|
||||||
from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH
|
from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH
|
||||||
except ImportError:
|
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
|
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.document = None
|
||||||
self.process_started = False
|
self.process_started = False
|
||||||
|
|
||||||
@ -151,6 +152,7 @@ class OpenOfficeImport(SongImport):
|
|||||||
else:
|
else:
|
||||||
url = uno.systemPathToFileUrl(file_path)
|
url = uno.systemPathToFileUrl(file_path)
|
||||||
properties = []
|
properties = []
|
||||||
|
properties.append(self.create_property('Hidden', True))
|
||||||
properties = tuple(properties)
|
properties = tuple(properties)
|
||||||
try:
|
try:
|
||||||
self.document = self.desktop.loadComponentFromURL(url, '_blank', 0, properties)
|
self.document = self.desktop.loadComponentFromURL(url, '_blank', 0, properties)
|
||||||
@ -163,11 +165,27 @@ class OpenOfficeImport(SongImport):
|
|||||||
log.exception("open_ooo_file failed: %s", url)
|
log.exception("open_ooo_file failed: %s", url)
|
||||||
return
|
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):
|
def close_ooo_file(self):
|
||||||
"""
|
"""
|
||||||
Close file.
|
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
|
self.document = None
|
||||||
|
|
||||||
def close_ooo(self):
|
def close_ooo(self):
|
||||||
@ -175,7 +193,10 @@ class OpenOfficeImport(SongImport):
|
|||||||
Close OOo. But only if we started it and not on windows
|
Close OOo. But only if we started it and not on windows
|
||||||
"""
|
"""
|
||||||
if self.process_started:
|
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):
|
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