summaryrefslogtreecommitdiff
path: root/oox/source/core/xmlfilterbase.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'oox/source/core/xmlfilterbase.cxx')
-rw-r--r--oox/source/core/xmlfilterbase.cxx69
1 files changed, 69 insertions, 0 deletions
diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx
index 97b6dc2e54c6..d878ad98937c 100644
--- a/oox/source/core/xmlfilterbase.cxx
+++ b/oox/source/core/xmlfilterbase.cxx
@@ -49,6 +49,8 @@
#include <oox/core/filterdetect.hxx>
#include <comphelper/storagehelper.hxx>
+#include <oox/core/DocumentCrypt.hxx>
+
using ::com::sun::star::xml::dom::DocumentBuilder;
using ::com::sun::star::xml::dom::XDocument;
using ::com::sun::star::xml::dom::XDocumentBuilder;
@@ -645,6 +647,73 @@ Reference< XInputStream > XmlFilterBase::implGetInputStream( MediaDescriptor& rM
return aDetector.extractUnencryptedPackage( rMediaDesc );
}
+Reference<XStream> XmlFilterBase::implGetOutputStream( MediaDescriptor& rMediaDescriptor ) const
+{
+ Sequence< NamedValue > aMediaEncData;
+ aMediaEncData = rMediaDescriptor.getUnpackedValueOrDefault(
+ MediaDescriptor::PROP_ENCRYPTIONDATA(),
+ Sequence< NamedValue >() );
+
+ OUString aPassword;
+ for (int i=0; i<aMediaEncData.getLength(); i++)
+ {
+ if (aMediaEncData[i].Name == "Password")
+ {
+ Any& any = aMediaEncData[i].Value;
+ any >>= aPassword;
+ break;
+ }
+ }
+ if (aPassword.isEmpty())
+ {
+ return FilterBase::implGetOutputStream( rMediaDescriptor );
+ }
+ else // We need to encrypt the stream so create a memory stream
+ {
+ Reference< XComponentContext > xContext = getComponentContext();
+ return Reference< XStream > (
+ xContext->getServiceManager()->createInstanceWithContext("com.sun.star.comp.MemoryStream", xContext),
+ uno::UNO_QUERY_THROW );
+ }
+ return Reference<XStream>();
+}
+
+bool XmlFilterBase::implFinalizeExport( MediaDescriptor& rMediaDescriptor )
+{
+ bool bRet = true;
+
+ Sequence< NamedValue > aMediaEncData;
+ aMediaEncData = rMediaDescriptor.getUnpackedValueOrDefault(
+ MediaDescriptor::PROP_ENCRYPTIONDATA(),
+ Sequence< NamedValue >() );
+
+ OUString aPassword;
+
+ for (int i=0; i<aMediaEncData.getLength(); i++)
+ {
+ if (aMediaEncData[i].Name == "Password")
+ {
+ Any& any = aMediaEncData[i].Value;
+ any >>= aPassword;
+ break;
+ }
+ }
+
+ if (!aPassword.isEmpty())
+ {
+ commitStorage();
+
+ Reference< XStream> xDocumentStream (FilterBase::implGetOutputStream(rMediaDescriptor));
+ oox::ole::OleStorage aOleStorage( getComponentContext(), xDocumentStream, true );
+ AesEncoder encoder(getMainDocumentStream(), aOleStorage, aPassword);
+ bRet = encoder.encode();
+ if (bRet)
+ aOleStorage.commit();
+ }
+
+ return bRet;
+}
+
// private --------------------------------------------------------------------
StorageRef XmlFilterBase::implCreateStorage( const Reference< XInputStream >& rxInStream ) const