diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-02-04 09:29:00 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-02-04 10:02:36 +0100 |
commit | c0870b2a15cde89d9f64803828bbfbf458eed918 (patch) | |
tree | 978dc4ed397a1ec2f5b69d73b7d62588bfa80dff /xmlsecurity | |
parent | accessibility: fix rest of doxygen errors (diff) | |
download | core-c0870b2a15cde89d9f64803828bbfbf458eed918.tar.gz core-c0870b2a15cde89d9f64803828bbfbf458eed918.zip |
xmlsecurity: fix crash on closing DigitalSignaturesDialog without ...
... a signature stream. ODF has a signature stream, OOXML has a
signature storage instead.
Code tries to export all signatures on closing the dialog, but OOXML at
the moment has only an importer; so just fail gracefully in case we only
have a storage, not a stream.
With this, closing the dialog no longer results in a crash for OOXML
documents.
Change-Id: I3e6580ddb20ec31fb0c5a4abe1fab3d8046d0ee5
Diffstat (limited to 'xmlsecurity')
-rw-r--r-- | xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx index ea2430b8d7df..212dbe766883 100644 --- a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx +++ b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx @@ -393,25 +393,30 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, OKButtonHdl, Button*, void) // Export all other signatures... SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream( embed::ElementModes::WRITE|embed::ElementModes::TRUNCATE, false ); - uno::Reference< io::XOutputStream > xOutputStream( - aStreamHelper.xSignatureStream, uno::UNO_QUERY ); - uno::Reference< com::sun::star::xml::sax::XWriter> xSaxWriter = - maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream ); - uno::Reference< xml::sax::XDocumentHandler> xDocumentHandler(xSaxWriter, UNO_QUERY_THROW); - size_t nInfos = maCurrentSignatureInformations.size(); - for( size_t n = 0 ; n < nInfos ; ++n ) - XMLSignatureHelper::ExportSignature( - xDocumentHandler, maCurrentSignatureInformations[ n ] ); - - XMLSignatureHelper::CloseDocumentHandler( xDocumentHandler); - - // If stream was not provided, we are responsible for committing it.... - if ( !mxSignatureStream.is() ) + if (aStreamHelper.xSignatureStream.is()) { - uno::Reference< embed::XTransactedObject > xTrans( - aStreamHelper.xSignatureStorage, uno::UNO_QUERY ); - xTrans->commit(); + // ODF + uno::Reference< io::XOutputStream > xOutputStream( + aStreamHelper.xSignatureStream, uno::UNO_QUERY ); + uno::Reference< com::sun::star::xml::sax::XWriter> xSaxWriter = + maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream ); + + uno::Reference< xml::sax::XDocumentHandler> xDocumentHandler(xSaxWriter, UNO_QUERY_THROW); + size_t nInfos = maCurrentSignatureInformations.size(); + for( size_t n = 0 ; n < nInfos ; ++n ) + XMLSignatureHelper::ExportSignature( + xDocumentHandler, maCurrentSignatureInformations[ n ] ); + + XMLSignatureHelper::CloseDocumentHandler( xDocumentHandler); + + // If stream was not provided, we are responsible for committing it.... + if ( !mxSignatureStream.is() ) + { + uno::Reference< embed::XTransactedObject > xTrans( + aStreamHelper.xSignatureStorage, uno::UNO_QUERY ); + xTrans->commit(); + } } EndDialog(RET_OK); @@ -828,10 +833,13 @@ SignatureStreamHelper DigitalSignaturesDialog::ImplOpenSignatureStream( if (nStreamOpenMode & css::embed::ElementModes::TRUNCATE) { - css::uno::Reference < css::io::XTruncate > xTruncate( - aHelper.xSignatureStream, UNO_QUERY_THROW); - DBG_ASSERT( xTruncate.is(), "ImplOpenSignatureStream - Stream does not support xTruncate!" ); - xTruncate->truncate(); + if (aHelper.xSignatureStream.is()) + { + css::uno::Reference < css::io::XTruncate > xTruncate( + aHelper.xSignatureStream, UNO_QUERY_THROW); + DBG_ASSERT( xTruncate.is(), "ImplOpenSignatureStream - Stream does not support xTruncate!" ); + xTruncate->truncate(); + } } else if ( bTempStream || mxSignatureStream.is()) { |