diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-04-03 10:49:37 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-04-03 12:39:54 +0200 |
commit | 7bf522852570b562757818ae0cef379e2408bc7b (patch) | |
tree | cc1210096f7a2cc657d963eeed83f61a702f930f /package | |
parent | 1511c73aa415c22dd890f2a8a3bc6d25dd646f8d (diff) |
loplugin:flatten in package
Change-Id: I4d81c7c1d241e51565d7cbc6549ac586136f0c86
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91616
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'package')
-rw-r--r-- | package/source/manifest/ManifestImport.cxx | 252 | ||||
-rw-r--r-- | package/source/xstor/owriteablestream.cxx | 316 | ||||
-rw-r--r-- | package/source/xstor/xstorage.cxx | 534 | ||||
-rw-r--r-- | package/source/zipapi/XUnbufferedStream.cxx | 34 | ||||
-rw-r--r-- | package/source/zipapi/ZipOutputEntry.cxx | 44 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackage.cxx | 876 |
6 files changed, 1029 insertions, 1027 deletions
diff --git a/package/source/manifest/ManifestImport.cxx b/package/source/manifest/ManifestImport.cxx index 0841c7be402c..952309ca82ec 100644 --- a/package/source/manifest/ManifestImport.cxx +++ b/package/source/manifest/ManifestImport.cxx @@ -215,94 +215,97 @@ void ManifestImport::doEncryptionData(StringHashMap &rConvertedAttribs) // to import the initialisation vector, salt and iteration count used nDerivedKeySize = 0; OUString aString = rConvertedAttribs[gsChecksumTypeAttribute]; - if ( !bIgnoreEncryptData ) { - if ( aString == gsSHA1_1k_Name || aString == gsSHA1_1k_URL ) { - aSequence[PKG_MNFST_DIGESTALG].Name = gsDigestAlgProperty; - aSequence[PKG_MNFST_DIGESTALG].Value <<= xml::crypto::DigestID::SHA1_1K; - } else if ( aString == gsSHA256_1k_URL ) { - aSequence[PKG_MNFST_DIGESTALG].Name = gsDigestAlgProperty; - aSequence[PKG_MNFST_DIGESTALG].Value <<= xml::crypto::DigestID::SHA256_1K; - } else - bIgnoreEncryptData = true; + if ( bIgnoreEncryptData ) + return; - if ( !bIgnoreEncryptData ) { - aString = rConvertedAttribs[gsChecksumAttribute]; - uno::Sequence < sal_Int8 > aDecodeBuffer; - ::comphelper::Base64::decode(aDecodeBuffer, aString); - aSequence[PKG_MNFST_DIGEST].Name = gsDigestProperty; - aSequence[PKG_MNFST_DIGEST].Value <<= aDecodeBuffer; - } + if ( aString == gsSHA1_1k_Name || aString == gsSHA1_1k_URL ) { + aSequence[PKG_MNFST_DIGESTALG].Name = gsDigestAlgProperty; + aSequence[PKG_MNFST_DIGESTALG].Value <<= xml::crypto::DigestID::SHA1_1K; + } else if ( aString == gsSHA256_1k_URL ) { + aSequence[PKG_MNFST_DIGESTALG].Name = gsDigestAlgProperty; + aSequence[PKG_MNFST_DIGESTALG].Value <<= xml::crypto::DigestID::SHA256_1K; + } else + bIgnoreEncryptData = true; + + if ( !bIgnoreEncryptData ) { + aString = rConvertedAttribs[gsChecksumAttribute]; + uno::Sequence < sal_Int8 > aDecodeBuffer; + ::comphelper::Base64::decode(aDecodeBuffer, aString); + aSequence[PKG_MNFST_DIGEST].Name = gsDigestProperty; + aSequence[PKG_MNFST_DIGEST].Value <<= aDecodeBuffer; } } void ManifestImport::doAlgorithm(StringHashMap &rConvertedAttribs) { - if ( !bIgnoreEncryptData ) { - OUString aString = rConvertedAttribs[gsAlgorithmNameAttribute]; - if ( aString == gsBlowfish_Name || aString == gsBlowfish_URL ) { - aSequence[PKG_MNFST_ENCALG].Name = gsEncryptionAlgProperty; - aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::BLOWFISH_CFB_8; - } else if ( aString == gsAES256_URL ) { - aSequence[PKG_MNFST_ENCALG].Name = gsEncryptionAlgProperty; - aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING; - OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 32, "Unexpected derived key length!" ); - nDerivedKeySize = 32; - } else if ( aString == gsAES192_URL ) { - aSequence[PKG_MNFST_ENCALG].Name = gsEncryptionAlgProperty; - aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING; - OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 24, "Unexpected derived key length!" ); - nDerivedKeySize = 24; - } else if ( aString == gsAES128_URL ) { - aSequence[PKG_MNFST_ENCALG].Name = gsEncryptionAlgProperty; - aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING; - OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 16, "Unexpected derived key length!" ); - nDerivedKeySize = 16; - } else - bIgnoreEncryptData = true; + if ( bIgnoreEncryptData ) + return; - if ( !bIgnoreEncryptData ) { - aString = rConvertedAttribs[gsInitialisationVectorAttribute]; - uno::Sequence < sal_Int8 > aDecodeBuffer; - ::comphelper::Base64::decode(aDecodeBuffer, aString); - aSequence[PKG_MNFST_INIVECTOR].Name = gsInitialisationVectorProperty; - aSequence[PKG_MNFST_INIVECTOR].Value <<= aDecodeBuffer; - } + OUString aString = rConvertedAttribs[gsAlgorithmNameAttribute]; + if ( aString == gsBlowfish_Name || aString == gsBlowfish_URL ) { + aSequence[PKG_MNFST_ENCALG].Name = gsEncryptionAlgProperty; + aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::BLOWFISH_CFB_8; + } else if ( aString == gsAES256_URL ) { + aSequence[PKG_MNFST_ENCALG].Name = gsEncryptionAlgProperty; + aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING; + OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 32, "Unexpected derived key length!" ); + nDerivedKeySize = 32; + } else if ( aString == gsAES192_URL ) { + aSequence[PKG_MNFST_ENCALG].Name = gsEncryptionAlgProperty; + aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING; + OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 24, "Unexpected derived key length!" ); + nDerivedKeySize = 24; + } else if ( aString == gsAES128_URL ) { + aSequence[PKG_MNFST_ENCALG].Name = gsEncryptionAlgProperty; + aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING; + OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 16, "Unexpected derived key length!" ); + nDerivedKeySize = 16; + } else + bIgnoreEncryptData = true; + + if ( !bIgnoreEncryptData ) { + aString = rConvertedAttribs[gsInitialisationVectorAttribute]; + uno::Sequence < sal_Int8 > aDecodeBuffer; + ::comphelper::Base64::decode(aDecodeBuffer, aString); + aSequence[PKG_MNFST_INIVECTOR].Name = gsInitialisationVectorProperty; + aSequence[PKG_MNFST_INIVECTOR].Value <<= aDecodeBuffer; } } void ManifestImport::doKeyDerivation(StringHashMap &rConvertedAttribs) { - if ( !bIgnoreEncryptData ) { - OUString aString = rConvertedAttribs[gsKeyDerivationNameAttribute]; - if ( aString == gsPBKDF2_Name || aString == gsPBKDF2_URL ) { - aString = rConvertedAttribs[gsSaltAttribute]; - uno::Sequence < sal_Int8 > aDecodeBuffer; - ::comphelper::Base64::decode(aDecodeBuffer, aString); - aSequence[PKG_MNFST_SALT].Name = gsSaltProperty; - aSequence[PKG_MNFST_SALT].Value <<= aDecodeBuffer; - - aString = rConvertedAttribs[gsIterationCountAttribute]; - aSequence[PKG_MNFST_ITERATION].Name = gsIterationCountProperty; - aSequence[PKG_MNFST_ITERATION].Value <<= aString.toInt32(); - - aString = rConvertedAttribs[gsKeySizeAttribute]; - if ( aString.getLength() ) { - sal_Int32 nKey = aString.toInt32(); - OSL_ENSURE( !nDerivedKeySize || nKey == nDerivedKeySize , "Provided derived key length differs from the expected one!" ); - nDerivedKeySize = nKey; - } else if ( !nDerivedKeySize ) - nDerivedKeySize = 16; - else if ( nDerivedKeySize != 16 ) - OSL_ENSURE( false, "Default derived key length differs from the expected one!" ); - - aSequence[PKG_MNFST_DERKEYSIZE].Name = gsDerivedKeySizeProperty; - aSequence[PKG_MNFST_DERKEYSIZE].Value <<= nDerivedKeySize; - } else if ( bPgpEncryption ) { - if ( aString != "PGP" ) - bIgnoreEncryptData = true; - } else + if ( bIgnoreEncryptData ) + return; + + OUString aString = rConvertedAttribs[gsKeyDerivationNameAttribute]; + if ( aString == gsPBKDF2_Name || aString == gsPBKDF2_URL ) { + aString = rConvertedAttribs[gsSaltAttribute]; + uno::Sequence < sal_Int8 > aDecodeBuffer; + ::comphelper::Base64::decode(aDecodeBuffer, aString); + aSequence[PKG_MNFST_SALT].Name = gsSaltProperty; + aSequence[PKG_MNFST_SALT].Value <<= aDecodeBuffer; + + aString = rConvertedAttribs[gsIterationCountAttribute]; + aSequence[PKG_MNFST_ITERATION].Name = gsIterationCountProperty; + aSequence[PKG_MNFST_ITERATION].Value <<= aString.toInt32(); + + aString = rConvertedAttribs[gsKeySizeAttribute]; + if ( aString.getLength() ) { + sal_Int32 nKey = aString.toInt32(); + OSL_ENSURE( !nDerivedKeySize || nKey == nDerivedKeySize , "Provided derived key length differs from the expected one!" ); + nDerivedKeySize = nKey; + } else if ( !nDerivedKeySize ) + nDerivedKeySize = 16; + else if ( nDerivedKeySize != 16 ) + OSL_ENSURE( false, "Default derived key length differs from the expected one!" ); + + aSequence[PKG_MNFST_DERKEYSIZE].Name = gsDerivedKeySizeProperty; + aSequence[PKG_MNFST_DERKEYSIZE].Value <<= nDerivedKeySize; + } else if ( bPgpEncryption ) { + if ( aString != "PGP" ) bIgnoreEncryptData = true; - } + } else + bIgnoreEncryptData = true; } void ManifestImport::doStartKeyAlg(StringHashMap &rConvertedAttribs) @@ -449,62 +452,61 @@ void SAL_CALL ManifestImport::endElement( const OUString& aName ) assert(nLevel >= 1); OUString aConvertedName = ConvertName( aName ); - if ( !aStack.empty() && aStack.rbegin()->m_aConvertedName == aConvertedName ) { - if ( aConvertedName == gsFileEntryElement && aStack.back().m_bValid ) { - // root folder gets KeyInfo entry if any, for PGP encryption - if (!bIgnoreEncryptData && !aKeys.empty() && aSequence[PKG_MNFST_FULLPATH].Value.get<OUString>() == "/" ) - { - aSequence[PKG_SIZE_NOENCR_MNFST].Name = "KeyInfo"; - aSequence[PKG_SIZE_NOENCR_MNFST].Value <<= comphelper::containerToSequence(aKeys); - } - aSequence.erase(std::remove_if(aSequence.begin(), aSequence.end(), - isEmpty), aSequence.end()); + if ( !(!aStack.empty() && aStack.rbegin()->m_aConvertedName == aConvertedName) ) return; + + if ( aConvertedName == gsFileEntryElement && aStack.back().m_bValid ) { + // root folder gets KeyInfo entry if any, for PGP encryption + if (!bIgnoreEncryptData && !aKeys.empty() && aSequence[PKG_MNFST_FULLPATH].Value.get<OUString>() == "/" ) + { + aSequence[PKG_SIZE_NOENCR_MNFST].Name = "KeyInfo"; + aSequence[PKG_SIZE_NOENCR_MNFST].Value <<= comphelper::containerToSequence(aKeys); + } + aSequence.erase(std::remove_if(aSequence.begin(), aSequence.end(), + isEmpty), aSequence.end()); - bIgnoreEncryptData = false; - rManVector.push_back ( comphelper::containerToSequence(aSequence) ); + bIgnoreEncryptData = false; + rManVector.push_back ( comphelper::containerToSequence(aSequence) ); - aSequence.clear(); - } - else if ( (aConvertedName == gsEncryptedKeyElement - || aConvertedName == gsEncryptedKeyElement13) - && aStack.back().m_bValid ) { - if ( !bIgnoreEncryptData ) - { - aKeys.push_back( comphelper::containerToSequence(aKeyInfoSequence) ); - bPgpEncryption = true; - } - aKeyInfoSequence.clear(); + aSequence.clear(); + } + else if ( (aConvertedName == gsEncryptedKeyElement + || aConvertedName == gsEncryptedKeyElement13) + && aStack.back().m_bValid ) { + if ( !bIgnoreEncryptData ) + { + aKeys.push_back( comphelper::containerToSequence(aKeyInfoSequence) ); + bPgpEncryption = true; } + aKeyInfoSequence.clear(); + } - // end element handling for elements with cdata - switch (nLevel) { - case 5: { - if (aConvertedName == gsCipherValueElement) //loext:CipherValue - doEncryptedCipherValue(); - else if (aConvertedName == gsCipherValueElement13) //manifest:CipherValue - doEncryptedCipherValue(); - else if (aConvertedName == gsPgpKeyIDElement13) //manifest:PGPKeyID - doEncryptedKeyId(); - else if (aConvertedName == gsPGPKeyPacketElement13) //manifest:PGPKeyPacket - doEncryptedKeyPacket(); - else - aStack.back().m_bValid = false; - break; - } - case 6: { - if (aConvertedName == gsPgpKeyIDElement) //loext:PGPKeyID - doEncryptedKeyId(); - else if (aConvertedName == gsPGPKeyPacketElement) //loext:PGPKeyPacket - doEncryptedKeyPacket(); - else - aStack.back().m_bValid = false; - break; - } + // end element handling for elements with cdata + switch (nLevel) { + case 5: { + if (aConvertedName == gsCipherValueElement) //loext:CipherValue + doEncryptedCipherValue(); + else if (aConvertedName == gsCipherValueElement13) //manifest:CipherValue + doEncryptedCipherValue(); + else if (aConvertedName == gsPgpKeyIDElement13) //manifest:PGPKeyID + doEncryptedKeyId(); + else if (aConvertedName == gsPGPKeyPacketElement13) //manifest:PGPKeyPacket + doEncryptedKeyPacket(); + else + aStack.back().m_bValid = false; + break; + } + case 6: { + if (aConvertedName == gsPgpKeyIDElement) //loext:PGPKeyID + doEncryptedKeyId(); + else if (aConvertedName == gsPGPKeyPacketElement) //loext:PGPKeyPacket + doEncryptedKeyPacket(); + else + aStack.back().m_bValid = false; + break; } - - aStack.pop_back(); - return; } + + aStack.pop_back(); } void SAL_CALL ManifestImport::characters( const OUString& aChars ) diff --git a/package/source/xstor/owriteablestream.cxx b/package/source/xstor/owriteablestream.cxx index e01108b59d91..ac97214b7a1e 100644 --- a/package/source/xstor/owriteablestream.cxx +++ b/package/source/xstor/owriteablestream.cxx @@ -306,29 +306,29 @@ OWriteStream_Impl::~OWriteStream_Impl() void OWriteStream_Impl::CleanCacheStream() { - if ( m_xCacheStream.is() ) - { - try - { - uno::Reference< io::XInputStream > xInputCache = m_xCacheStream->getInputStream(); - if ( xInputCache.is() ) - xInputCache->closeInput(); - } - catch( const uno::Exception& ) - {} + if ( !m_xCacheStream.is() ) + return; - try - { - uno::Reference< io::XOutputStream > xOutputCache = m_xCacheStream->getOutputStream(); - if ( xOutputCache.is() ) - xOutputCache->closeOutput(); - } - catch( const uno::Exception& ) - {} + try + { + uno::Reference< io::XInputStream > xInputCache = m_xCacheStream->getInputStream(); + if ( xInputCache.is() ) + xInputCache->closeInput(); + } + catch( const uno::Exception& ) + {} - m_xCacheStream.clear(); - m_xCacheSeek.clear(); + try + { + uno::Reference< io::XOutputStream > xOutputCache = m_xCacheStream->getOutputStream(); + if ( xOutputCache.is() ) + xOutputCache->closeOutput(); } + catch( const uno::Exception& ) + {} + + m_xCacheStream.clear(); + m_xCacheSeek.clear(); } void OWriteStream_Impl::InsertIntoPackageFolder( const OUString& aName, @@ -475,19 +475,19 @@ void OWriteStream_Impl::DisposeWrappers() } m_pParent = nullptr; - if ( !m_aInputStreamsVector.empty() ) + if ( m_aInputStreamsVector.empty() ) + return; + + for ( auto& pStream : m_aInputStreamsVector ) { - for ( auto& pStream : m_aInputStreamsVector ) + if ( pStream ) { - if ( pStream ) - { - pStream->InternalDispose(); - pStream = nullptr; - } + pStream->InternalDispose(); + pStream = nullptr; } - - m_aInputStreamsVector.clear(); } + + m_aInputStreamsVector.clear(); } OUString const & OWriteStream_Impl::GetFilledTempFileIfNo( const uno::Reference< io::XInputStream >& xStream ) @@ -897,25 +897,25 @@ void OWriteStream_Impl::Revert() m_bHasCachedEncryptionData = false; m_aEncryptionData.clear(); - if ( m_nStorageType == embed::StorageFormats::OFOPXML ) + if ( m_nStorageType != embed::StorageFormats::OFOPXML ) + return; + + // currently the relations storage is changed only on commit + m_xNewRelInfoStream.clear(); + m_aNewRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >(); + if ( m_xOrigRelInfoStream.is() ) { - // currently the relations storage is changed only on commit - m_xNewRelInfoStream.clear(); - m_aNewRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >(); - if ( m_xOrigRelInfoStream.is() ) - { - // the original stream is still here, that means that it was not parsed - m_aOrigRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >(); - m_nRelInfoStatus = RELINFO_NO_INIT; - } + // the original stream is still here, that means that it was not parsed + m_aOrigRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >(); + m_nRelInfoStatus = RELINFO_NO_INIT; + } + else + { + // the original stream was already parsed + if ( !m_bOrigRelInfoBroken ) + m_nRelInfoStatus = RELINFO_READ; else - { - // the original stream was already parsed - if ( !m_bOrigRelInfoBroken ) - m_nRelInfoStatus = RELINFO_READ; - else - m_nRelInfoStatus = RELINFO_BROKEN; - } + m_nRelInfoStatus = RELINFO_BROKEN; } } @@ -1501,95 +1501,95 @@ void OWriteStream_Impl::CommitStreamRelInfo( const uno::Reference< embed::XStora // at this point of time the old stream must be already cleaned OSL_ENSURE( m_nStorageType == embed::StorageFormats::OFOPXML, "The method should be used only with OFOPXML format!" ); - if ( m_nStorageType == embed::StorageFormats::OFOPXML ) - { - OSL_ENSURE( !aOrigStreamName.isEmpty() && !aNewStreamName.isEmpty() && xRelStorage.is(), - "Wrong relation persistence information is provided!" ); - - if ( !xRelStorage.is() || aOrigStreamName.isEmpty() || aNewStreamName.isEmpty() ) - throw uno::RuntimeException(); - - if ( m_nRelInfoStatus == RELINFO_BROKEN || m_nRelInfoStatus == RELINFO_CHANGED_BROKEN ) - throw io::IOException(); // TODO: + if ( m_nStorageType != embed::StorageFormats::OFOPXML ) + return; - OUString aOrigRelStreamName = aOrigStreamName + ".rels"; - OUString aNewRelStreamName = aNewStreamName + ".rels"; + OSL_ENSURE( !aOrigStreamName.isEmpty() && !aNewStreamName.isEmpty() && xRelStorage.is(), + "Wrong relation persistence information is provided!" ); - bool bRenamed = aOrigRelStreamName != aNewRelStreamName; - if ( m_nRelInfoStatus == RELINFO_CHANGED - || m_nRelInfoStatus == RELINFO_CHANGED_STREAM_READ - || m_nRelInfoStatus == RELINFO_CHANGED_STREAM ) - { - if ( bRenamed && xRelStorage->hasByName( aOrigRelStreamName ) ) - xRelStorage->removeElement( aOrigRelStreamName ); - - if ( m_nRelInfoStatus == RELINFO_CHANGED ) - { - if ( m_aNewRelInfo.hasElements() ) - { - uno::Reference< io::XStream > xRelsStream = - xRelStorage->openStreamElement( aNewRelStreamName, - embed::ElementModes::TRUNCATE | embed::ElementModes::READWRITE ); + if ( !xRelStorage.is() || aOrigStreamName.isEmpty() || aNewStreamName.isEmpty() ) + throw uno::RuntimeException(); - uno::Reference< io::XOutputStream > xOutStream = xRelsStream->getOutputStream(); - if ( !xOutStream.is() ) - throw uno::RuntimeException(); + if ( m_nRelInfoStatus == RELINFO_BROKEN || m_nRelInfoStatus == RELINFO_CHANGED_BROKEN ) + throw io::IOException(); // TODO: - ::comphelper::OFOPXMLHelper::WriteRelationsInfoSequence( xOutStream, m_aNewRelInfo, m_xContext ); + OUString aOrigRelStreamName = aOrigStreamName + ".rels"; + OUString aNewRelStreamName = aNewStreamName + ".rels"; - // set the mediatype - uno::Reference< beans::XPropertySet > xPropSet( xRelsStream, uno::UNO_QUERY_THROW ); - xPropSet->setPropertyValue( - "MediaType", - uno::makeAny( OUString("application/vnd.openxmlformats-package.relationships+xml" ) ) ); + bool bRenamed = aOrigRelStreamName != aNewRelStreamName; + if ( m_nRelInfoStatus == RELINFO_CHANGED + || m_nRelInfoStatus == RELINFO_CHANGED_STREAM_READ + || m_nRelInfoStatus == RELINFO_CHANGED_STREAM ) + { + if ( bRenamed && xRelStorage->hasByName( aOrigRelStreamName ) ) + xRelStorage->removeElement( aOrigRelStreamName ); - m_nRelInfoStatus = RELINFO_READ; - } - } - else if ( m_nRelInfoStatus == RELINFO_CHANGED_STREAM_READ - || m_nRelInfoStatus == RELINFO_CHANGED_STREAM ) + if ( m_nRelInfoStatus == RELINFO_CHANGED ) + { + if ( m_aNewRelInfo.hasElements() ) { uno::Reference< io::XStream > xRelsStream = xRelStorage->openStreamElement( aNewRelStreamName, - embed::ElementModes::TRUNCATE | embed::ElementModes::READWRITE ); + embed::ElementModes::TRUNCATE | embed::ElementModes::READWRITE ); - uno::Reference< io::XOutputStream > xOutputStream = xRelsStream->getOutputStream(); - if ( !xOutputStream.is() ) + uno::Reference< io::XOutputStream > xOutStream = xRelsStream->getOutputStream(); + if ( !xOutStream.is() ) throw uno::RuntimeException(); - uno::Reference< io::XSeekable > xSeek( m_xNewRelInfoStream, uno::UNO_QUERY_THROW ); - xSeek->seek( 0 ); - ::comphelper::OStorageHelper::CopyInputToOutput( m_xNewRelInfoStream, xOutputStream ); - xSeek->seek( 0 ); + ::comphelper::OFOPXMLHelper::WriteRelationsInfoSequence( xOutStream, m_aNewRelInfo, m_xContext ); // set the mediatype uno::Reference< beans::XPropertySet > xPropSet( xRelsStream, uno::UNO_QUERY_THROW ); - xPropSet->setPropertyValue("MediaType", + xPropSet->setPropertyValue( + "MediaType", uno::makeAny( OUString("application/vnd.openxmlformats-package.relationships+xml" ) ) ); - if ( m_nRelInfoStatus == RELINFO_CHANGED_STREAM ) - m_nRelInfoStatus = RELINFO_NO_INIT; - else - { - // the information is already parsed and the stream is stored, no need in temporary stream any more - m_xNewRelInfoStream.clear(); - m_nRelInfoStatus = RELINFO_READ; - } + m_nRelInfoStatus = RELINFO_READ; } - - // the original stream makes no sense after this step - m_xOrigRelInfoStream = m_xNewRelInfoStream; - m_aOrigRelInfo = m_aNewRelInfo; - m_bOrigRelInfoBroken = false; - m_aNewRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >(); - m_xNewRelInfoStream.clear(); } - else + else if ( m_nRelInfoStatus == RELINFO_CHANGED_STREAM_READ + || m_nRelInfoStatus == RELINFO_CHANGED_STREAM ) { - // the stream is not changed but it might be renamed - if ( bRenamed && xRelStorage->hasByName( aOrigRelStreamName ) ) - xRelStorage->renameElement( aOrigRelStreamName, aNewRelStreamName ); + uno::Reference< io::XStream > xRelsStream = + xRelStorage->openStreamElement( aNewRelStreamName, + embed::ElementModes::TRUNCATE | embed::ElementModes::READWRITE ); + + uno::Reference< io::XOutputStream > xOutputStream = xRelsStream->getOutputStream(); + if ( !xOutputStream.is() ) + throw uno::RuntimeException(); + + uno::Reference< io::XSeekable > xSeek( m_xNewRelInfoStream, uno::UNO_QUERY_THROW ); + xSeek->seek( 0 ); + ::comphelper::OStorageHelper::CopyInputToOutput( m_xNewRelInfoStream, xOutputStream ); + xSeek->seek( 0 ); + + // set the mediatype + uno::Reference< beans::XPropertySet > xPropSet( xRelsStream, uno::UNO_QUERY_THROW ); + xPropSet->setPropertyValue("MediaType", + uno::makeAny( OUString("application/vnd.openxmlformats-package.relationships+xml" ) ) ); + + if ( m_nRelInfoStatus == RELINFO_CHANGED_STREAM ) + m_nRelInfoStatus = RELINFO_NO_INIT; + else + { + // the information is already parsed and the stream is stored, no need in temporary stream any more + m_xNewRelInfoStream.clear(); + m_nRelInfoStatus = RELINFO_READ; + } } + + // the original stream makes no sense after this step + m_xOrigRelInfoStream = m_xNewRelInfoStream; + m_aOrigRelInfo = m_aNewRelInfo; + m_bOrigRelInfoBroken = false; + m_aNewRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >(); + m_xNewRelInfoStream.clear(); + } + else + { + // the stream is not changed but it might be renamed + if ( bRenamed && xRelStorage->hasByName( aOrigRelStreamName ) ) + xRelStorage->renameElement( aOrigRelStreamName, aNewRelStreamName ); } } @@ -1673,20 +1673,20 @@ void OWriteStream::CheckInitOnDemand() throw lang::DisposedException(); } - if ( m_bInitOnDemand ) + if ( !m_bInitOnDemand ) + return; + + SAL_INFO( "package.xstor", "package (mv76033) OWriteStream::CheckInitOnDemand, initializing" ); + uno::Reference< io::XStream > xStream = m_pImpl->GetTempFileAsStream(); + if ( xStream.is() ) { - SAL_INFO( "package.xstor", "package (mv76033) OWriteStream::CheckInitOnDemand, initializing" ); - uno::Reference< io::XStream > xStream = m_pImpl->GetTempFileAsStream(); - if ( xStream.is() ) - { - m_xInStream.set( xStream->getInputStream(), uno::UNO_SET_THROW ); - m_xOutStream.set( xStream->getOutputStream(), uno::UNO_SET_THROW ); - m_xSeekable.set( xStream, uno::UNO_QUERY_THROW ); - m_xSeekable->seek( m_nInitPosition ); + m_xInStream.set( xStream->getInputStream(), uno::UNO_SET_THROW ); + m_xOutStream.set( xStream->getOutputStream(), uno::UNO_SET_THROW ); + m_xSeekable.set( xStream, uno::UNO_QUERY_THROW ); + m_xSeekable->seek( m_nInitPosition ); - m_nInitPosition = 0; - m_bInitOnDemand = false; - } + m_nInitPosition = 0; + m_bInitOnDemand = false; } } @@ -2178,18 +2178,18 @@ void OWriteStream::CloseOutput_Impl() m_xOutStream->closeOutput(); m_xOutStream.clear(); - if ( !m_bInitOnDemand ) - { - // after the stream is disposed it can be committed - // so transport correct size property - if ( !m_xSeekable.is() ) - throw uno::RuntimeException(); + if ( m_bInitOnDemand ) + return; - for ( auto& rProp : m_pImpl->m_aProps ) - { - if ( rProp.Name == "Size" ) - rProp.Value <<= m_xSeekable->getLength(); - } + // after the stream is disposed it can be committed + // so transport correct size property + if ( !m_xSeekable.is() ) + throw uno::RuntimeException(); + + for ( auto& rProp : m_pImpl->m_aProps ) + { + if ( rProp.Name == "Size" ) + rProp.Value <<= m_xSeekable->getLength(); } } @@ -3021,29 +3021,29 @@ void OWriteStream::BroadcastTransaction( sal_Int8 nMessage ) ::cppu::OInterfaceContainerHelper* pContainer = m_pData->m_aListenersContainer.getContainer( cppu::UnoType<embed::XTransactionListener>::get()); - if ( pContainer ) + if ( !pContainer ) + return; + + ::cppu::OInterfaceIteratorHelper pIterator( *pContainer ); + while ( pIterator.hasMoreElements( ) ) { - ::cppu::OInterfaceIteratorHelper pIterator( *pContainer ); - while ( pIterator.hasMoreElements( ) ) - { - OSL_ENSURE( nMessage >= 1 && nMessage <= 4, "Wrong internal notification code is used!" ); + OSL_ENSURE( nMessage >= 1 && nMessage <= 4, "Wrong internal notification code is used!" ); - switch( nMessage ) - { - case STOR_MESS_PRECOMMIT: - static_cast<embed::XTransactionListener*>( pIterator.next( ) )->preCommit( aSource ); - break; - case STOR_MESS_COMMITTED: - static_cast<embed::XTransactionListener*>( pIterator.next( ) )->commited( aSource ); - break; - case STOR_MESS_PREREVERT: - static_cast<embed::XTransactionListener*>( pIterator.next( ) )->preRevert( aSource ); - break; - case STOR_MESS_REVERTED: - static_cast< embed::XTransactionListener*>( pIterator.next( ) )->reverted( aSource ); - break; - } - } + switch( nMessage ) + { + case STOR_MESS_PRECOMMIT: + static_cast<embed::XTransactionListener*>( pIterator.next( ) )->preCommit( aSource ); + break; + case STOR_MESS_COMMITTED: + static_cast<embed::XTransactionListener*>( pIterator.next( ) )->commited( aSource ); + break; + case STOR_MESS_PREREVERT: + static_cast<embed::XTransactionListener*>( pIterator.next( ) )->preRevert( aSource ); + break; + case STOR_MESS_REVERTED: + static_cast< embed::XTransactionListener*>( pIterator.next( ) )->reverted( aSource ); + break; + } } } void SAL_CALL OWriteStream::commit() diff --git a/package/source/xstor/xstorage.cxx b/package/source/xstor/xstorage.cxx index f5afff414feb..507f8b8ef257 100644 --- a/package/source/xstor/xstorage.cxx +++ b/package/source/xstor/xstorage.cxx @@ -496,24 +496,24 @@ bool OStorage_Impl::HasChildren() void OStorage_Impl::GetStorageProperties() { - if ( m_nStorageType == embed::StorageFormats::PACKAGE ) - { - uno::Reference< beans::XPropertySet > xProps( m_xPackageFolder, uno::UNO_QUERY_THROW ); + if ( m_nStorageType != embed::StorageFormats::PACKAGE ) + return; - if ( !m_bControlMediaType ) - { - uno::Reference< beans::XPropertySet > xPackageProps( m_xPackage, uno::UNO_QUERY_THROW ); - xPackageProps->getPropertyValue( MEDIATYPE_FALLBACK_USED_PROPERTY ) >>= m_bMTFallbackUsed; + uno::Reference< beans::XPropertySet > xProps( m_xPackageFolder, uno::UNO_QUERY_THROW ); - xProps->getPropertyValue( "MediaType" ) >>= m_aMediaType; - m_bControlMediaType = true; - } + if ( !m_bControlMediaType ) + { + uno::Reference< beans::XPropertySet > xPackageProps( m_xPackage, uno::UNO_QUERY_THROW ); + xPackageProps->getPropertyValue( MEDIATYPE_FALLBACK_USED_PROPERTY ) >>= m_bMTFallbackUsed; - if ( !m_bControlVersion ) - { - xProps->getPropertyValue( "Version" ) >>= m_aVersion; - m_bControlVersion = true; - } + xProps->getPropertyValue( "MediaType" ) >>= m_aMediaType; + m_bControlMediaType = true; + } + + if ( !m_bControlVersion ) + { + xProps->getPropertyValue( "Version" ) >>= m_aVersion; + m_bControlVersion = true; } // the properties of OFOPXML will be handled directly @@ -1477,20 +1477,20 @@ void OStorage_Impl::OpenSubStream( SotElement_Impl* pElement ) ::osl::MutexGuard aGuard( m_xMutex->GetMutex() ); - if (!pElement->m_xStream) - { - SAL_WARN_IF( pElement->m_bIsInserted, "package.xstor", "Inserted element must be created already!" ); + if (pElement->m_xStream) + return; - uno::Reference< lang::XUnoTunnel > xTunnel; - m_xPackageFolder->getByName( pElement->m_aOriginalName ) >>= xTunnel; - if ( !xTunnel.is() ) - throw container::NoSuchElementException( THROW_WHERE ); + SAL_WARN_IF( pElement->m_bIsInserted, "package.xstor", "Inserted element must be created already!" ); - uno::Reference< packages::XDataSinkEncrSupport > xPackageSubStream( xTunnel, uno::UNO_QUERY_THROW ); + uno::Reference< lang::XUnoTunnel > xTunnel; + m_xPackageFolder->getByName( pElement->m_aOriginalName ) >>= xTunnel; + if ( !xTunnel.is() ) + throw container::NoSuchElementException( THROW_WHERE ); - // the stream can never be inserted here, because inserted stream element holds the stream till commit or destruction - pElement->m_xStream.reset(new OWriteStream_Impl(this, xPackageSubStream, m_xPackage, m_xContext, false, m_nStorageType, false, GetRelInfoStreamForName(pElement->m_aOriginalName))); - } + uno::Reference< packages::XDataSinkEncrSupport > xPackageSubStream( xTunnel, uno::UNO_QUERY_THROW ); + + // the stream can never be inserted here, because inserted stream element holds the stream till commit or destruction + pElement->m_xStream.reset(new OWriteStream_Impl(this, xPackageSubStream, m_xPackage, m_xContext, false, m_nStorageType, false, GetRelInfoStreamForName(pElement->m_aOriginalName))); } uno::Sequence< OUString > OStorage_Impl::GetElementNames() @@ -1603,25 +1603,25 @@ void OStorage_Impl::CreateRelStorage() if ( m_nStorageType != embed::StorageFormats::OFOPXML ) return; - if ( !m_xRelStorage.is() ) + if ( m_xRelStorage.is() ) + return; + + if ( !m_pRelStorElement ) { - if ( !m_pRelStorElement ) - { - m_pRelStorElement = new SotElement_Impl( "_rels", true, true ); - m_pRelStorElement->m_xStorage = CreateNewStorageImpl(embed::ElementModes::WRITE); - if (m_pRelStorElement->m_xStorage) - m_pRelStorElement->m_xStorage->m_pParent = nullptr; // the relation storage is completely controlled by parent - } + m_pRelStorElement = new SotElement_Impl( "_rels", true, true ); + m_pRelStorElement->m_xStorage = CreateNewStorageImpl(embed::ElementModes::WRITE); + if (m_pRelStorElement->m_xStorage) + m_pRelStorElement->m_xStorage->m_pParent = nullptr; // the relation storage is completely controlled by parent + } - if (!m_pRelStorElement->m_xStorage) - OpenSubStorage( m_pRelStorElement, embed::ElementModes::WRITE ); + if (!m_pRelStorElement->m_xStorage) + OpenSubStorage( m_pRelStorElement, embed::ElementModes::WRITE ); - if (!m_pRelStorElement->m_xStorage) - throw uno::RuntimeException( THROW_WHERE ); + if (!m_pRelStorElement->m_xStorage) + throw uno::RuntimeException( THROW_WHERE ); - OStorage* pResultStorage = new OStorage(m_pRelStorElement->m_xStorage.get(), false); - m_xRelStorage.set( static_cast<embed::XStorage*>(pResultStorage) ); - } + OStorage* pResultStorage = new OStorage(m_pRelStorElement->m_xStorage.get(), false); + m_xRelStorage.set( static_cast<embed::XStorage*>(pResultStorage) ); } void OStorage_Impl::CommitStreamRelInfo( const OUString &rName, SotElement_Impl const * pStreamElement ) @@ -1674,92 +1674,92 @@ void OStorage_Impl::CommitRelInfo( const uno::Reference< container::XNameContain if ( !xNewPackageFolder.is() ) throw uno::RuntimeException( THROW_WHERE ); - if ( m_nStorageType == embed::StorageFormats::OFOPXML ) - { - if ( m_nRelInfoStatus == RELINFO_BROKEN || m_nRelInfoStatus == RELINFO_CHANGED_BROKEN ) - throw io::IOException( THROW_WHERE ); - - if (m_nRelInfoStatus == RELINFO_CHANGED) - { - if (m_aRelInfo.hasElements()) - { - CreateRelStorage(); - - uno::Reference<io::XStream> xRelsStream = m_xRelStorage->openStreamElement( - ".rels", embed::ElementModes::TRUNCATE | embed::ElementModes::READWRITE); - - uno::Reference<io::XOutputStream> xOutStream = xRelsStream->getOutputStream(); - if (!xOutStream.is()) - throw uno::RuntimeException(THROW_WHERE); - - ::comphelper::OFOPXMLHelper::WriteRelationsInfoSequence(xOutStream, m_aRelInfo, - m_xContext); + if ( m_nStorageType != embed::StorageFormats::OFOPXML ) + return; - // set the mediatype - uno::Reference<beans::XPropertySet> xPropSet(xRelsStream, uno::UNO_QUERY_THROW); - xPropSet->setPropertyValue( - "MediaType", uno::makeAny(OUString( - "application/vnd.openxmlformats-package.relationships+xml"))); + if ( m_nRelInfoStatus == RELINFO_BROKEN || m_nRelInfoStatus == RELINFO_CHANGED_BROKEN ) + throw io::IOException( THROW_WHERE ); - m_nRelInfoStatus = RELINFO_READ; - } - else if (m_xRelStorage.is()) - RemoveStreamRelInfo(OUString()); // remove own rel info - } - else if (m_nRelInfoStatus == RELINFO_CHANGED_STREAM_READ - || m_nRelInfoStatus == RELINFO_CHANGED_STREAM) + if (m_nRelInfoStatus == RELINFO_CHANGED) + { + if (m_aRelInfo.hasElements()) { CreateRelStorage(); uno::Reference<io::XStream> xRelsStream = m_xRelStorage->openStreamElement( ".rels", embed::ElementModes::TRUNCATE | embed::ElementModes::READWRITE); - uno::Reference<io::XOutputStream> xOutputStream = xRelsStream->getOutputStream(); - if (!xOutputStream.is()) + uno::Reference<io::XOutputStream> xOutStream = xRelsStream->getOutputStream(); + if (!xOutStream.is()) throw uno::RuntimeException(THROW_WHERE); - uno::Reference<io::XSeekable> xSeek(m_xNewRelInfoStream, uno::UNO_QUERY_THROW); - xSeek->seek(0); - ::comphelper::OStorageHelper::CopyInputToOutput(m_xNewRelInfoStream, xOutputStream); + ::comphelper::OFOPXMLHelper::WriteRelationsInfoSequence(xOutStream, m_aRelInfo, + m_xContext); // set the mediatype uno::Reference<beans::XPropertySet> xPropSet(xRelsStream, uno::UNO_QUERY_THROW); xPropSet->setPropertyValue( - "MediaType", - uno::makeAny(OUString("application/vnd.openxmlformats-package.relationships+xml"))); + "MediaType", uno::makeAny(OUString( + "application/vnd.openxmlformats-package.relationships+xml"))); - m_xNewRelInfoStream.clear(); - if (m_nRelInfoStatus == RELINFO_CHANGED_STREAM) - { - m_aRelInfo = uno::Sequence<uno::Sequence<beans::StringPair>>(); - m_nRelInfoStatus = RELINFO_NO_INIT; - } - else - m_nRelInfoStatus = RELINFO_READ; + m_nRelInfoStatus = RELINFO_READ; } + else if (m_xRelStorage.is()) + RemoveStreamRelInfo(OUString()); // remove own rel info + } + else if (m_nRelInfoStatus == RELINFO_CHANGED_STREAM_READ + || m_nRelInfoStatus == RELINFO_CHANGED_STREAM) + { + CreateRelStorage(); - if ( m_xRelStorage.is() ) - { - if ( m_xRelStorage->hasElements() ) - { - uno::Reference< embed::XTransactedObject > xTrans( m_xRelStorage, uno::UNO_QUERY_THROW ); - xTrans->commit(); - } + uno::Reference<io::XStream> xRelsStream = m_xRelStorage->openStreamElement( + ".rels", embed::ElementModes::TRUNCATE | embed::ElementModes::READWRITE); - if ( xNewPackageFolder.is() && xNewPackageFolder->hasByName( aRelsStorName ) ) - xNewPackageFolder->removeByName( aRelsStorName ); + uno::Reference<io::XOutputStream> xOutputStream = xRelsStream->getOutputStream(); + if (!xOutputStream.is()) + throw uno::RuntimeException(THROW_WHERE); - if ( !m_xRelStorage->hasElements() ) - { - // the empty relations storage should not be created - delete m_pRelStorElement; - m_pRelStorElement = nullptr; - m_xRelStorage.clear(); - } - else if ( m_pRelStorElement && m_pRelStorElement->m_xStorage && xNewPackageFolder.is() ) - m_pRelStorElement->m_xStorage->InsertIntoPackageFolder( aRelsStorName, xNewPackageFolder ); + uno::Reference<io::XSeekable> xSeek(m_xNewRelInfoStream, uno::UNO_QUERY_THROW); + xSeek->seek(0); + ::comphelper::OStorageHelper::CopyInputToOutput(m_xNewRelInfoStream, xOutputStream); + + // set the mediatype + uno::Reference<beans::XPropertySet> xPropSet(xRelsStream, uno::UNO_QUERY_THROW); + xPropSet->setPropertyValue( + "MediaType", + uno::makeAny(OUString("application/vnd.openxmlformats-package.relationships+xml"))); + + m_xNewRelInfoStream.clear(); + if (m_nRelInfoStatus == RELINFO_CHANGED_STREAM) + { + m_aRelInfo = uno::Sequence<uno::Sequence<beans::StringPair>>(); + m_nRelInfoStatus = RELINFO_NO_INIT; } + else + m_nRelInfoStatus = RELINFO_READ; + } + + if ( !m_xRelStorage.is() ) + return; + + if ( m_xRelStorage->hasElements() ) + { + uno::Reference< embed::XTransactedObject > xTrans( m_xRelStorage, uno::UNO_QUERY_THROW ); + xTrans->commit(); + } + + if ( xNewPackageFolder.is() && xNewPackageFolder->hasByName( aRelsStorName ) ) + xNewPackageFolder->removeByName( aRelsStorName ); + + if ( !m_xRelStorage->hasElements() ) + { + // the empty relations storage should not be created + delete m_pRelStorElement; + m_pRelStorElement = nullptr; + m_xRelStorage.clear(); } + else if ( m_pRelStorElement && m_pRelStorElement->m_xStorage && xNewPackageFolder.is() ) + m_pRelStorElement->m_xStorage->InsertIntoPackageFolder( aRelsStorName, xNewPackageFolder ); } // OStorage implementation @@ -1963,29 +1963,29 @@ void OStorage::BroadcastTransaction( sal_Int8 nMessage ) ::cppu::OInterfaceContainerHelper* pContainer = m_pData->m_aListenersContainer.getContainer( cppu::UnoType<embed::XTransactionListener>::get()); - if ( pContainer ) + if ( !pContainer ) + return; + + ::cppu::OInterfaceIteratorHelper pIterator( *pContainer ); + while ( pIterator.hasMoreElements( ) ) { - ::cppu::OInterfaceIteratorHelper pIterator( *pContainer ); - while ( pIterator.hasMoreElements( ) ) - { - OSL_ENSURE( nMessage >= 1 && nMessage <= 4, "Wrong internal notification code is used!" ); + OSL_ENSURE( nMessage >= 1 && nMessage <= 4, "Wrong internal notification code is used!" ); - switch( nMessage ) - { - case STOR_MESS_PRECOMMIT: - static_cast<embed::XTransactionListener*>( pIterator.next( ) )->preCommit( aSource ); - break; - case STOR_MESS_COMMITTED: - static_cast<embed::XTransactionListener*>( pIterator.next( ) )->commited( aSource ); - break; - case STOR_MESS_PREREVERT: - static_cast<embed::XTransactionListener*>( pIterator.next( ) )->preRevert( aSource ); - break; - case STOR_MESS_REVERTED: - static_cast<embed::XTransactionListener*>( pIterator.next( ) )->reverted( aSource ); - break; - } - } + switch( nMessage ) + { + case STOR_MESS_PRECOMMIT: + static_cast<embed::XTransactionListener*>( pIterator.next( ) )->preCommit( aSource ); + break; + case STOR_MESS_COMMITTED: + static_cast<embed::XTransactionListener*>( pIterator.next( ) )->commited( aSource ); + break; + case STOR_MESS_PREREVERT: + static_cast<embed::XTransactionListener*>( pIterator.next( ) )->preRevert( aSource ); + break; + case STOR_MESS_REVERTED: + static_cast<embed::XTransactionListener*>( pIterator.next( ) )->reverted( aSource ); + break; + } } } @@ -4039,48 +4039,48 @@ void SAL_CALL OStorage::removeEncryption() throw uno::RuntimeException( THROW_WHERE ); // the interface must be visible only for package storage SAL_WARN_IF( !m_pData->m_bIsRoot, "package.xstor", "removeEncryption() method is not available for nonroot storages!" ); - if ( m_pData->m_bIsRoot ) + if ( !m_pData->m_bIsRoot ) + return; + + try { + m_pImpl->ReadContents(); + } + catch ( const uno::RuntimeException& ) { - try { - m_pImpl->ReadContents(); - } - catch ( const uno::RuntimeException& ) - { - TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:"); - throw; - } - catch ( const uno::Exception& ) - { - uno::Any aCaught( ::cppu::getCaughtException() ); - SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); + TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:"); + throw; + } + catch ( const uno::Exception& ) + { + uno::Any aCaught( ::cppu::getCaughtException() ); + SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); - throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", - static_cast< OWeakObject* >( this ), - aCaught ); - } + throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", + static_cast< OWeakObject* >( this ), + aCaught ); + } - // TODO: check if the password is valid - // update all streams that was encrypted with old password + // TODO: check if the password is valid + // update all streams that was encrypted with old password - uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW ); - try - { - xPackPropSet->setPropertyValue( STORAGE_ENCRYPTION_KEYS_PROPERTY, - uno::makeAny( uno::Sequence< beans::NamedValue >() ) ); + uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW ); + try + { + xPackPropSet->setPropertyValue( STORAGE_ENCRYPTION_KEYS_PROPERTY, + uno::makeAny( uno::Sequence< beans::NamedValue >() ) ); - m_pImpl->m_bHasCommonEncryptionData = false; - m_pImpl->m_aCommonEncryptionData.clear(); - } - catch( const uno::RuntimeException& ) - { - TOOLS_WARN_EXCEPTION( "package.xstor", "The call must not fail, it is pretty simple!" ); - throw; - } - catch( const uno::Exception& ) - { - TOOLS_WARN_EXCEPTION( "package.xstor", "The call must not fail, it is pretty simple!" ); - throw io::IOException( THROW_WHERE ); - } + m_pImpl->m_bHasCommonEncryptionData = false; + m_pImpl->m_aCommonEncryptionData.clear(); + } + catch( const uno::RuntimeException& ) + { + TOOLS_WARN_EXCEPTION( "package.xstor", "The call must not fail, it is pretty simple!" ); + throw; + } + catch( const uno::Exception& ) + { + TOOLS_WARN_EXCEPTION( "package.xstor", "The call must not fail, it is pretty simple!" ); + throw io::IOException( THROW_WHERE ); } } @@ -4103,42 +4103,42 @@ void SAL_CALL OStorage::setEncryptionData( const uno::Sequence< beans::NamedValu throw uno::RuntimeException( THROW_WHERE "Unexpected empty encryption data!" ); SAL_WARN_IF( !m_pData->m_bIsRoot, "package.xstor", "setEncryptionData() method is not available for nonroot storages!" ); - if ( m_pData->m_bIsRoot ) + if ( !m_pData->m_bIsRoot ) + return; + + try { + m_pImpl->ReadContents(); + } + catch ( const uno::RuntimeException& ) { - try { - m_pImpl->ReadContents(); - } - catch ( const uno::RuntimeException& ) - { - TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:"); - throw; - } - catch ( const uno::Exception& ) - { - uno::Any aCaught( ::cppu::getCaughtException() ); - SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); + TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:"); + throw; + } + catch ( const uno::Exception& ) + { + uno::Any aCaught( ::cppu::getCaughtException() ); + SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); - throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", - static_cast< OWeakObject* >( this ), - aCaught ); - } + throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", + static_cast< OWeakObject* >( this ), + aCaught ); + } - uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW ); - try - { - ::comphelper::SequenceAsHashMap aEncryptionMap( aEncryptionData ); - xPackPropSet->setPropertyValue( STORAGE_ENCRYPTION_KEYS_PROPERTY, - uno::makeAny( aEncryptionMap.getAsConstNamedValueList() ) ); + uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW ); + try + { + ::comphelper::SequenceAsHashMap aEncryptionMap( aEncryptionData ); + xPackPropSet->setPropertyValue( STORAGE_ENCRYPTION_KEYS_PROPERTY, + uno::makeAny( aEncryptionMap.getAsConstNamedValueList() ) ); - m_pImpl->m_bHasCommonEncryptionData = true; - m_pImpl->m_aCommonEncryptionData = aEncryptionMap; - } - catch( const uno::Exception& ) - { - TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:" ); + m_pImpl->m_bHasCommonEncryptionData = true; + m_pImpl->m_aCommonEncryptionData = aEncryptionMap; + } + catch( const uno::Exception& ) + { + TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:" ); - throw io::IOException( THROW_WHERE ); - } + throw io::IOException( THROW_WHERE ); } } @@ -4168,46 +4168,46 @@ void SAL_CALL OStorage::setEncryptionAlgorithms( const uno::Sequence< beans::Nam throw uno::RuntimeException( THROW_WHERE "Unexpected empty encryption algorithms list!" ); SAL_WARN_IF( !m_pData->m_bIsRoot, "package.xstor", "setEncryptionAlgorithms() method is not available for nonroot storages!" ); - if ( m_pData->m_bIsRoot ) + if ( !m_pData->m_bIsRoot ) + return; + + try { + m_pImpl->ReadContents(); + } + catch ( const uno::RuntimeException& ) { - try { - m_pImpl->ReadContents(); - } - catch ( const uno::RuntimeException& ) - { - TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:"); - throw; - } - catch ( const uno::Exception& ) - { - uno::Any aCaught( ::cppu::getCaughtException() ); - SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); + TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:"); + throw; + } + catch ( const uno::Exception& ) + { + uno::Any aCaught( ::cppu::getCaughtException() ); + SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); - throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", - static_cast< OWeakObject* >( this ), - aCaught ); - } + throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", + static_cast< OWeakObject* >( this ), + aCaught ); + } - uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW ); - try - { - xPackPropSet->setPropertyValue( ENCRYPTION_ALGORITHMS_PROPERTY, - uno::makeAny( aAlgorithms ) ); - } - catch ( const uno::RuntimeException& ) - { - TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:"); - throw; - } - catch( const uno::Exception& ) - { - uno::Any aCaught( ::cppu::getCaughtException() ); - SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); + uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW ); + try + { + xPackPropSet->setPropertyValue( ENCRYPTION_ALGORITHMS_PROPERTY, + uno::makeAny( aAlgorithms ) ); + } + catch ( const uno::RuntimeException& ) + { + TOOLS_INFO_EXCEPTION("package.xstor", "Rethrow:"); + throw; + } + catch( const uno::Exception& ) + { + uno::Any aCaught( ::cppu::getCaughtException() ); + SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); - throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", - static_cast< OWeakObject* >( this ), - aCaught ); - } + throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", + static_cast< OWeakObject* >( this ), + aCaught ); } } @@ -4228,46 +4228,46 @@ void SAL_CALL OStorage::setGpgProperties( const uno::Sequence< uno::Sequence< be throw uno::RuntimeException( THROW_WHERE "Unexpected empty encryption algorithms list!" ); SAL_WARN_IF( !m_pData->m_bIsRoot, "package.xstor", "setGpgProperties() method is not available for nonroot storages!" ); - if ( m_pData->m_bIsRoot ) + if ( !m_pData->m_bIsRoot ) + return; + + try { + m_pImpl->ReadContents(); + } + catch ( const uno::RuntimeException& aRuntimeException ) { - try { - m_pImpl->ReadContents(); - } - catch ( const uno::RuntimeException& aRuntimeException ) - { - SAL_INFO("package.xstor", "Rethrow: " << aRuntimeException.Message); - throw; - } - catch ( const uno::Exception& ) - { - uno::Any aCaught( ::cppu::getCaughtException() ); - SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); + SAL_INFO("package.xstor", "Rethrow: " << aRuntimeException.Message); + throw; + } + catch ( const uno::Exception& ) + { + uno::Any aCaught( ::cppu::getCaughtException() ); + SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); - throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", - static_cast< OWeakObject* >( this ), - aCaught ); - } + throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", + static_cast< OWeakObject* >( this ), + aCaught ); + } - uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW ); - try - { - xPackPropSet->setPropertyValue( ENCRYPTION_GPG_PROPERTIES, - uno::makeAny( aProps ) ); - } - catch ( const uno::RuntimeException& aRuntimeException ) - { - SAL_INFO("package.xstor", "Rethrow: " << aRuntimeException.Message); - throw; - } - catch( const uno::Exception& ) - { - uno::Any aCaught( ::cppu::getCaughtException() ); - SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); + uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW ); + try + { + xPackPropSet->setPropertyValue( ENCRYPTION_GPG_PROPERTIES, + uno::makeAny( aProps ) ); + } + catch ( const uno::RuntimeException& aRuntimeException ) + { + SAL_INFO("package.xstor", "Rethrow: " << aRuntimeException.Message); + throw; + } + catch( const uno::Exception& ) + { + uno::Any aCaught( ::cppu::getCaughtException() ); + SAL_INFO("package.xstor", "Rethrow: " << exceptionToString(aCaught)); - throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", - static_cast< OWeakObject* >( this ), - aCaught ); - } + throw lang::WrappedTargetRuntimeException( THROW_WHERE "Can not open package!", + static_cast< OWeakObject* >( this ), + aCaught ); } } diff --git a/package/source/zipapi/XUnbufferedStream.cxx b/package/source/zipapi/XUnbufferedStream.cxx index a6e9c2d8b783..4539829f20f0 100644 --- a/package/source/zipapi/XUnbufferedStream.cxx +++ b/package/source/zipapi/XUnbufferedStream.cxx @@ -92,23 +92,23 @@ XUnbufferedStream::XUnbufferedStream( mnBlockSize = ( rData->m_nEncAlg == xml::crypto::CipherID::AES_CBC_W3C_PADDING ? 16 : 1 ); } - if ( bHaveEncryptData && mbWrappedRaw && bIsEncrypted ) - { - // if we have the data needed to decrypt it, but didn't want it decrypted (or - // we couldn't decrypt it due to wrong password), then we prepend this - // data to the stream - - // Make a buffer big enough to hold both the header and the data itself - maHeader.realloc ( n_ConstHeaderSize + - rData->m_aInitVector.getLength() + - rData->m_aSalt.getLength() + - rData->m_aDigest.getLength() + - aMediaType.getLength() * sizeof( sal_Unicode ) ); - sal_Int8 * pHeader = maHeader.getArray(); - ZipFile::StaticFillHeader( rData, rEntry.nSize, aMediaType, pHeader ); - mnHeaderToRead = static_cast < sal_Int16 > ( maHeader.getLength() ); - mnZipSize += mnHeaderToRead; - } + if ( !(bHaveEncryptData && mbWrappedRaw && bIsEncrypted) ) + return; + + // if we have the data needed to decrypt it, but didn't want it decrypted (or + // we couldn't decrypt it due to wrong password), then we prepend this + // data to the stream + + // Make a buffer big enough to hold both the header and the data itself + maHeader.realloc ( n_ConstHeaderSize + + rData->m_aInitVector.getLength() + + rData->m_aSalt.getLength() + + rData->m_aDigest.getLength() + + aMediaType.getLength() * sizeof( sal_Unicode ) ); + sal_Int8 * pHeader = maHeader.getArray(); + ZipFile::StaticFillHeader( rData, rEntry.nSize, aMediaType, pHeader ); + mnHeaderToRead = static_cast < sal_Int16 > ( maHeader.getLength() ); + mnZipSize += mnHeaderToRead; } // allows to read package raw stream diff --git a/package/source/zipapi/ZipOutputEntry.cxx b/package/source/zipapi/ZipOutputEntry.cxx index f08e687c43a4..c63dc1691136 100644 --- a/package/source/zipapi/ZipOutputEntry.cxx +++ b/package/source/zipapi/ZipOutputEntry.cxx @@ -99,20 +99,20 @@ void ZipOutputEntryBase::closeEntry() deflaterReset(); m_aCRC.reset(); - if (m_bEncryptCurrentEntry) - { - m_xCipherContext.clear(); + if (!m_bEncryptCurrentEntry) + return; - uno::Sequence< sal_Int8 > aDigestSeq; - if ( m_xDigestContext.is() ) - { - aDigestSeq = m_xDigestContext->finalizeDigestAndDispose(); - m_xDigestContext.clear(); - } + m_xCipherContext.clear(); - if ( m_pCurrentStream ) - m_pCurrentStream->setDigest( aDigestSeq ); + uno::Sequence< sal_Int8 > aDigestSeq; + if ( m_xDigestContext.is() ) + { + aDigestSeq = m_xDigestContext->finalizeDigestAndDispose(); + m_xDigestContext.clear(); } + + if ( m_pCurrentStream ) + m_pCurrentStream->setDigest( aDigestSeq ); } void ZipOutputEntryBase::processDeflated( const uno::Sequence< sal_Int8 >& deflateBuffer, sal_Int32 nLength ) @@ -148,19 +148,19 @@ void ZipOutputEntryBase::processDeflated( const uno::Sequence< sal_Int8 >& defla } } - if ( isDeflaterFinished() && m_bEncryptCurrentEntry && m_xDigestContext.is() && m_xCipherContext.is() ) + if ( !(isDeflaterFinished() && m_bEncryptCurrentEntry && m_xDigestContext.is() && m_xCipherContext.is()) ) + return; + + // FIXME64: sequence not 64bit safe. + uno::Sequence< sal_Int8 > aEncryptionBuffer = m_xCipherContext->finalizeCipherContextAndDispose(); + if ( aEncryptionBuffer.hasElements() ) { - // FIXME64: sequence not 64bit safe. - uno::Sequence< sal_Int8 > aEncryptionBuffer = m_xCipherContext->finalizeCipherContextAndDispose(); - if ( aEncryptionBuffer.hasElements() ) - { - m_xOutStream->writeBytes( aEncryptionBuffer ); + m_xOutStream->writeBytes( aEncryptionBuffer ); - // the sizes as well as checksum for encrypted streams are calculated here - m_pCurrentEntry->nCompressedSize += aEncryptionBuffer.getLength(); - m_pCurrentEntry->nSize = m_pCurrentEntry->nCompressedSize; - m_aCRC.update( aEncryptionBuffer ); - } + // the sizes as well as checksum for encrypted streams are calculated here + m_pCurrentEntry->nCompressedSize += aEncryptionBuffer.getLength(); + m_pCurrentEntry->nSize = m_pCurrentEntry->nCompressedSize; + m_aCRC.update( aEncryptionBuffer ); } } diff --git a/package/source/zippackage/ZipPackage.cxx b/package/source/zippackage/ZipPackage.cxx index 9f5d9f632cf7..c483b53c968a 100644 --- a/package/source/zippackage/ZipPackage.cxx +++ b/package/source/zippackage/ZipPackage.cxx @@ -169,352 +169,352 @@ bool ZipPackage::isLocalFile() const void ZipPackage::parseManifest() { - if ( m_nFormat == embed::StorageFormats::PACKAGE ) + if ( m_nFormat != embed::StorageFormats::PACKAGE ) + return; + + bool bManifestParsed = false; + const OUString sMeta ("META-INF"); + if ( m_xRootFolder->hasByName( sMeta ) ) { - bool bManifestParsed = false; - const OUString sMeta ("META-INF"); - if ( m_xRootFolder->hasByName( sMeta ) ) - { - const OUString sManifest ("manifest.xml"); + const OUString sManifest ("manifest.xml"); - try { - uno::Reference< XUnoTunnel > xTunnel; - Any aAny = m_xRootFolder->getByName( sMeta ); + try { + uno::Reference< XUnoTunnel > xTunnel; + Any aAny = m_xRootFolder->getByName( sMeta ); + aAny >>= xTunnel; + uno::Reference< XNameContainer > xMetaInfFolder( xTunnel, UNO_QUERY ); + if ( xMetaInfFolder.is() && xMetaInfFolder->hasByName( sManifest ) ) + { + aAny = xMetaInfFolder->getByName( sManifest ); aAny >>= xTunnel; - uno::Reference< XNameContainer > xMetaInfFolder( xTunnel, UNO_QUERY ); - if ( xMetaInfFolder.is() && xMetaInfFolder->hasByName( sManifest ) ) + uno::Reference < XActiveDataSink > xSink ( xTunnel, UNO_QUERY ); + if ( xSink.is() ) { - aAny = xMetaInfFolder->getByName( sManifest ); - aAny >>= xTunnel; - uno::Reference < XActiveDataSink > xSink ( xTunnel, UNO_QUERY ); - if ( xSink.is() ) + uno::Reference < XManifestReader > xReader = ManifestReader::create( m_xContext ); + + const OUString sPropFullPath ("FullPath"); + const OUString sPropVersion ("Version"); + const OUString sPropMediaType ("MediaType"); + const OUString sPropInitialisationVector ("InitialisationVector"); + const OUString sPropSalt ("Salt"); + const OUString sPropIterationCount ("IterationCount"); + const OUString sPropSize ("Size"); + const OUString sPropDigest ("Digest"); + const OUString sPropDerivedKeySize ("DerivedKeySize"); + const OUString sPropDigestAlgorithm ("DigestAlgorithm"); + const OUString sPropEncryptionAlgorithm ("EncryptionAlgorithm"); + const OUString sPropStartKeyAlgorithm ("StartKeyAlgorithm"); + const OUString sKeyInfo ("KeyInfo"); + + const uno::Sequence < uno::Sequence < PropertyValue > > aManifestSequence = xReader->readManifestSequence ( xSink->getInputStream() ); + ZipPackageStream *pStream = nullptr; + ZipPackageFolder *pFolder = nullptr; + const Any *pKeyInfo = nullptr; + + for ( const uno::Sequence<PropertyValue>& rSequence : aManifestSequence ) { - uno::Reference < XManifestReader > xReader = ManifestReader::create( m_xContext ); - - const OUString sPropFullPath ("FullPath"); - const OUString sPropVersion ("Version"); - const OUString sPropMediaType ("MediaType"); - const OUString sPropInitialisationVector ("InitialisationVector"); - const OUString sPropSalt ("Salt"); - const OUString sPropIterationCount ("IterationCount"); - const OUString sPropSize ("Size"); - const OUString sPropDigest ("Digest"); - const OUString sPropDerivedKeySize ("DerivedKeySize"); - const OUString sPropDigestAlgorithm ("DigestAlgorithm"); - const OUString sPropEncryptionAlgorithm ("EncryptionAlgorithm"); - const OUString sPropStartKeyAlgorithm ("StartKeyAlgorithm"); - const OUString sKeyInfo ("KeyInfo"); - - const uno::Sequence < uno::Sequence < PropertyValue > > aManifestSequence = xReader->readManifestSequence ( xSink->getInputStream() ); - ZipPackageStream *pStream = nullptr; - ZipPackageFolder *pFolder = nullptr; - const Any *pKeyInfo = nullptr; - - for ( const uno::Sequence<PropertyValue>& rSequence : aManifestSequence ) + OUString sPath, sMediaType, sVersion; + const Any *pSalt = nullptr, *pVector = nullptr, *pCount = nullptr, *pSize = nullptr, *pDigest = nullptr, *pDigestAlg = nullptr, *pEncryptionAlg = nullptr, *pStartKeyAlg = nullptr, *pDerivedKeySize = nullptr; + for ( const PropertyValue& rValue : rSequence ) { - OUString sPath, sMediaType, sVersion; - const Any *pSalt = nullptr, *pVector = nullptr, *pCount = nullptr, *pSize = nullptr, *pDigest = nullptr, *pDigestAlg = nullptr, *pEncryptionAlg = nullptr, *pStartKeyAlg = nullptr, *pDerivedKeySize = nullptr; - for ( const PropertyValue& rValue : rSequence ) + if ( rValue.Name == sPropFullPath ) + rValue.Value >>= sPath; + else if ( rValue.Name == sPropVersion ) + rValue.Value >>= sVersion; + else if ( rValue.Name == sPropMediaType ) + rValue.Value >>= sMediaType; + else if ( rValue.Name == sPropSalt ) + pSalt = &( rValue.Value ); + else if ( rValue.Name == sPropInitialisationVector ) + pVector = &( rValue.Value ); + else if ( rValue.Name == sPropIterationCount ) + pCount = &( rValue.Value ); + else if ( rValue.Name == sPropSize ) + pSize = &( rValue.Value ); + else if ( rValue.Name == sPropDigest ) + pDigest = &( rValue.Value ); + else if ( rValue.Name == sPropDigestAlgorithm ) + pDigestAlg = &( rValue.Value ); + else if ( rValue.Name == sPropEncryptionAlgorithm ) + pEncryptionAlg = &( rValue.Value ); + else if ( rValue.Name == sPropStartKeyAlgorithm ) + pStartKeyAlg = &( rValue.Value ); + else if ( rValue.Name == sPropDerivedKeySize ) + pDerivedKeySize = &( rValue.Value ); + else if ( rValue.Name == sKeyInfo ) + pKeyInfo = &( rValue.Value ); + } + + if ( !sPath.isEmpty() && hasByHierarchicalName ( sPath ) ) + { + aAny = getByHierarchicalName( sPath ); + uno::Reference < XUnoTunnel > xUnoTunnel; + aAny >>= xUnoTunnel; + sal_Int64 nTest=0; + if ( (nTest = xUnoTunnel->getSomething( ZipPackageFolder::getUnoTunnelId() )) != 0 ) { - if ( rValue.Name == sPropFullPath ) - rValue.Value >>= sPath; - else if ( rValue.Name == sPropVersion ) - rValue.Value >>= sVersion; - else if ( rValue.Name == sPropMediaType ) - rValue.Value >>= sMediaType; - else if ( rValue.Name == sPropSalt ) - pSalt = &( rValue.Value ); - else if ( rValue.Name == sPropInitialisationVector ) - pVector = &( rValue.Value ); - else if ( rValue.Name == sPropIterationCount ) - pCount = &( rValue.Value ); - else if ( rValue.Name == sPropSize ) - pSize = &( rValue.Value ); - else if ( rValue.Name == sPropDigest ) - pDigest = &( rValue.Value ); - else if ( rValue.Name == sPropDigestAlgorithm ) - pDigestAlg = &( rValue.Value ); - else if ( rValue.Name == sPropEncryptionAlgorithm ) - pEncryptionAlg = &( rValue.Value ); - else if ( rValue.Name == sPropStartKeyAlgorithm ) - pStartKeyAlg = &( rValue.Value ); - else if ( rValue.Name == sPropDerivedKeySize ) - pDerivedKeySize = &( rValue.Value ); - else if ( rValue.Name == sKeyInfo ) - pKeyInfo = &( rValue.Value ); + pFolder = reinterpret_cast < ZipPackageFolder* > ( nTest ); + pFolder->SetMediaType ( sMediaType ); + pFolder->SetVersion ( sVersion ); } - - if ( !sPath.isEmpty() && hasByHierarchicalName ( sPath ) ) + else { - aAny = getByHierarchicalName( sPath ); - uno::Reference < XUnoTunnel > xUnoTunnel; - aAny >>= xUnoTunnel; - sal_Int64 nTest=0; - if ( (nTest = xUnoTunnel->getSomething( ZipPackageFolder::getUnoTunnelId() )) != 0 ) - { - pFolder = reinterpret_cast < ZipPackageFolder* > ( nTest ); - pFolder->SetMediaType ( sMediaType ); - pFolder->SetVersion ( sVersion ); - } - else - { - pStream = reinterpret_cast < ZipPackageStream* > ( xUnoTunnel->getSomething( ZipPackageStream::getUnoTunnelId() )); - pStream->SetMediaType ( sMediaType ); - pStream->SetFromManifest( true ); + pStream = reinterpret_cast < ZipPackageStream* > ( xUnoTunnel->getSomething( ZipPackageStream::getUnoTunnelId() )); + pStream->SetMediaType ( sMediaType ); + pStream->SetFromManifest( true ); - if ( pKeyInfo && pVector && pSize && pDigest && pDigestAlg && pEncryptionAlg ) - { - uno::Sequence < sal_Int8 > aSequence; - sal_Int64 nSize = 0; - sal_Int32 nDigestAlg = 0, nEncryptionAlg = 0; + if ( pKeyInfo && pVector && pSize && pDigest && pDigestAlg && pEncryptionAlg ) + { + uno::Sequence < sal_Int8 > aSequence; + sal_Int64 nSize = 0; + sal_Int32 nDigestAlg = 0, nEncryptionAlg = 0; - pStream->SetToBeEncrypted ( true ); + pStream->SetToBeEncrypted ( true ); - *pVector >>= aSequence; - pStream->setInitialisationVector ( aSequence ); + *pVector >>= aSequence; + pStream->setInitialisationVector ( aSequence ); - *pSize >>= nSize; - pStream->setSize ( nSize ); + *pSize >>= nSize; + pStream->setSize ( nSize ); - *pDigest >>= aSequence; - pStream->setDigest ( aSequence ); + *pDigest >>= aSequence; + pStream->setDigest ( aSequence ); - *pDigestAlg >>= nDigestAlg; - pStream->SetImportedChecksumAlgorithm( nDigestAlg ); + *pDigestAlg >>= nDigestAlg; + pStream->SetImportedChecksumAlgorithm( nDigestAlg ); - *pEncryptionAlg >>= nEncryptionAlg; - pStream->SetImportedEncryptionAlgorithm( nEncryptionAlg ); + *pEncryptionAlg >>= nEncryptionAlg; + pStream->SetImportedEncryptionAlgorithm( nEncryptionAlg ); - *pKeyInfo >>= m_aGpgProps; + *pKeyInfo >>= m_aGpgProps; - pStream->SetToBeCompressed ( true ); - pStream->SetToBeEncrypted ( true ); - pStream->SetIsEncrypted ( true ); - pStream->setIterationCount(0); + pStream->SetToBeCompressed ( true ); + pStream->SetToBeEncrypted ( true ); + pStream->SetIsEncrypted ( true ); + pStream->setIterationCount(0); - // clamp to default SHA256 start key magic value, - // c.f. ZipPackageStream::GetEncryptionKey() - // trying to get key value from properties - const sal_Int32 nStartKeyAlg = xml::crypto::DigestID::SHA256; - pStream->SetImportedStartKeyAlgorithm( nStartKeyAlg ); + // clamp to default SHA256 start key magic value, + // c.f. ZipPackageStream::GetEncryptionKey() + // trying to get key value from properties + const sal_Int32 nStartKeyAlg = xml::crypto::DigestID::SHA256; + pStream->SetImportedStartKeyAlgorithm( nStartKeyAlg ); - if ( !m_bHasEncryptedEntries && pStream->getName() == "content.xml" ) - { - m_bHasEncryptedEntries = true; - m_nChecksumDigestID = nDigestAlg; - m_nCommonEncryptionID = nEncryptionAlg; - m_nStartKeyGenerationID = nStartKeyAlg; - } - } - else if ( pSalt && pVector && pCount && pSize && pDigest && pDigestAlg && pEncryptionAlg ) + if ( !m_bHasEncryptedEntries && pStream->getName() == "content.xml" ) { - uno::Sequence < sal_Int8 > aSequence; - sal_Int64 nSize = 0; - sal_Int32 nCount = 0, nDigestAlg = 0, nEncryptionAlg = 0; - sal_Int32 nDerivedKeySize = 16, nStartKeyAlg = xml::crypto::DigestID::SHA1; + m_bHasEncryptedEntries = true; + m_nChecksumDigestID = nDigestAlg; + m_nCommonEncryptionID = nEncryptionAlg; + m_nStartKeyGenerationID = nStartKeyAlg; + } + } + else if ( pSalt && pVector && pCount && pSize && pDigest && pDigestAlg && pEncryptionAlg ) + { + uno::Sequence < sal_Int8 > aSequence; + sal_Int64 nSize = 0; + sal_Int32 nCount = 0, nDigestAlg = 0, nEncryptionAlg = 0; + sal_Int32 nDerivedKeySize = 16, nStartKeyAlg = xml::crypto::DigestID::SHA1; - pStream->SetToBeEncrypted ( true ); + pStream->SetToBeEncrypted ( true ); - *pSalt >>= aSequence; - pStream->setSalt ( aSequence ); + *pSalt >>= aSequence; + pStream->setSalt ( aSequence ); - *pVector >>= aSequence; - pStream->setInitialisationVector ( aSequence ); + *pVector >>= aSequence; + pStream->setInitialisationVector ( aSequence ); - *pCount >>= nCount; - pStream->setIterationCount ( nCount ); + *pCount >>= nCount; + pStream->setIterationCount ( nCount ); - *pSize >>= nSize; - pStream->setSize ( nSize ); + *pSize >>= nSize; + pStream->setSize ( nSize ); - *pDigest >>= aSequence; - pStream->setDigest ( aSequence ); + *pDigest >>= aSequence; + pStream->setDigest ( aSequence ); - *pDigestAlg >>= nDigestAlg; - pStream->SetImportedChecksumAlgorithm( nDigestAlg ); + *pDigestAlg >>= nDigestAlg; + pStream->SetImportedChecksumAlgorithm( nDigestAlg ); - *pEncryptionAlg >>= nEncryptionAlg; - pStream->SetImportedEncryptionAlgorithm( nEncryptionAlg ); + *pEncryptionAlg >>= nEncryptionAlg; + pStream->SetImportedEncryptionAlgorithm( nEncryptionAlg ); - if ( pDerivedKeySize ) - *pDerivedKeySize >>= nDerivedKeySize; - pStream->SetImportedDerivedKeySize( nDerivedKeySize ); + if ( pDerivedKeySize ) + *pDerivedKeySize >>= nDerivedKeySize; + pStream->SetImportedDerivedKeySize( nDerivedKeySize ); - if ( pStartKeyAlg ) - *pStartKeyAlg >>= nStartKeyAlg; - pStream->SetImportedStartKeyAlgorithm( nStartKeyAlg ); + if ( pStartKeyAlg ) + *pStartKeyAlg >>= nStartKeyAlg; + pStream->SetImportedStartKeyAlgorithm( nStartKeyAlg ); - pStream->SetToBeCompressed ( true ); - pStream->SetToBeEncrypted ( true ); - pStream->SetIsEncrypted ( true ); - if ( !m_bHasEncryptedEntries && pStream->getName() == "content.xml" ) - { - m_bHasEncryptedEntries = true; - m_nStartKeyGenerationID = nStartKeyAlg; - m_nChecksumDigestID = nDigestAlg; - m_nCommonEncryptionID = nEncryptionAlg; - } + pStream->SetToBeCompressed ( true ); + pStream->SetToBeEncrypted ( true ); + pStream->SetIsEncrypted ( true ); + if ( !m_bHasEncryptedEntries && pStream->getName() == "content.xml" ) + { + m_bHasEncryptedEntries = true; + m_nStartKeyGenerationID = nStartKeyAlg; + m_nChecksumDigestID = nDigestAlg; + m_nCommonEncryptionID = nEncryptionAlg; } - else - m_bHasNonEncryptedEntries = true; } + else + m_bHasNonEncryptedEntries = true; } } - - bManifestParsed = true; } - // now hide the manifest.xml file from user - xMetaInfFolder->removeByName( sManifest ); + bManifestParsed = true; } - } - catch( Exception& ) - { - if ( !m_bForceRecovery ) - throw; + + // now hide the manifest.xml file from user + xMetaInfFolder->removeByName( sManifest ); } } + catch( Exception& ) + { + if ( !m_bForceRecovery ) + throw; + } + } - if ( !bManifestParsed && !m_bForceRecovery ) - throw ZipIOException( - THROW_WHERE "Could not parse manifest.xml" ); + if ( !bManifestParsed && !m_bForceRecovery ) + throw ZipIOException( + THROW_WHERE "Could not parse manifest.xml" ); - const OUString sMimetype ("mimetype"); - if ( m_xRootFolder->hasByName( sMimetype ) ) + const OUString sMimetype ("mimetype"); + if ( m_xRootFolder->hasByName( sMimetype ) ) + { + // get mediatype from the "mimetype" stream + OUString aPackageMediatype; + uno::Reference< lang::XUnoTunnel > xMimeTypeTunnel; + m_xRootFolder->getByName( sMimetype ) >>= xMimeTypeTunnel; + uno::Reference < io::XActiveDataSink > xMimeSink( xMimeTypeTunnel, UNO_QUERY ); + if ( xMimeSink.is() ) { - // get mediatype from the "mimetype" stream - OUString aPackageMediatype; - uno::Reference< lang::XUnoTunnel > xMimeTypeTunnel; - m_xRootFolder->getByName( sMimetype ) >>= xMimeTypeTunnel; - uno::Reference < io::XActiveDataSink > xMimeSink( xMimeTypeTunnel, UNO_QUERY ); - if ( xMimeSink.is() ) + uno::Reference< io::XInputStream > xMimeInStream = xMimeSink->getInputStream(); + if ( xMimeInStream.is() ) { - uno::Reference< io::XInputStream > xMimeInStream = xMimeSink->getInputStream(); - if ( xMimeInStream.is() ) - { - // Mediatypes longer than 1024 symbols should not appear here - uno::Sequence< sal_Int8 > aData( 1024 ); - sal_Int32 nRead = xMimeInStream->readBytes( aData, 1024 ); - if ( nRead > aData.getLength() ) - nRead = aData.getLength(); - - if ( nRead ) - aPackageMediatype = OUString( reinterpret_cast<char const *>(aData.getConstArray()), nRead, RTL_TEXTENCODING_ASCII_US ); - } + // Mediatypes longer than 1024 symbols should not appear here + uno::Sequence< sal_Int8 > aData( 1024 ); + sal_Int32 nRead = xMimeInStream->readBytes( aData, 1024 ); + if ( nRead > aData.getLength() ) + nRead = aData.getLength(); + + if ( nRead ) + aPackageMediatype = OUString( reinterpret_cast<char const *>(aData.getConstArray()), nRead, RTL_TEXTENCODING_ASCII_US ); } + } - if ( !bManifestParsed ) - { - // the manifest.xml could not be successfully parsed, this is an inconsistent package - if ( aPackageMediatype.startsWith("application/vnd.") ) - { - // accept only types that look similar to own mediatypes - m_xRootFolder->SetMediaType( aPackageMediatype ); - m_bMediaTypeFallbackUsed = true; - } - } - else if ( !m_bForceRecovery ) + if ( !bManifestParsed ) + { + // the manifest.xml could not be successfully parsed, this is an inconsistent package + if ( aPackageMediatype.startsWith("application/vnd.") ) { - // the mimetype stream should contain the information from manifest.xml - if ( m_xRootFolder->GetMediaType() != aPackageMediatype ) - throw ZipIOException( - THROW_WHERE - "mimetype conflicts with manifest.xml, \"" - + m_xRootFolder->GetMediaType() + "\" vs. \"" - + aPackageMediatype + "\"" ); + // accept only types that look similar to own mediatypes + m_xRootFolder->SetMediaType( aPackageMediatype ); + m_bMediaTypeFallbackUsed = true; } - - m_xRootFolder->removeByName( sMimetype ); } - - m_bInconsistent = m_xRootFolder->LookForUnexpectedODF12Streams( OUString() ); - - bool bODF12AndNewer = ( m_xRootFolder->GetVersion().compareTo( ODFVER_012_TEXT ) >= 0 ); - if ( !m_bForceRecovery && bODF12AndNewer ) + else if ( !m_bForceRecovery ) { - if ( m_bInconsistent ) - { - // this is an ODF1.2 document that contains streams not referred in the manifest.xml; - // in case of ODF1.2 documents without version in manifest.xml the property IsInconsistent - // should be checked later + // the mimetype stream should contain the information from manifest.xml + if ( m_xRootFolder->GetMediaType() != aPackageMediatype ) throw ZipIOException( - THROW_WHERE "there are streams not referred in manifest.xml" ); - } - // all the streams should be encrypted with the same StartKey in ODF1.2 - // TODO/LATER: in future the exception should be thrown - // throw ZipIOException( THROW_WHERE "More than one Start Key Generation algorithm is specified!" ); + THROW_WHERE + "mimetype conflicts with manifest.xml, \"" + + m_xRootFolder->GetMediaType() + "\" vs. \"" + + aPackageMediatype + "\"" ); } - // in case it is a correct ODF1.2 document, the version must be set - // and the META-INF folder is reserved for package format - if ( bODF12AndNewer ) - m_xRootFolder->removeByName( sMeta ); + m_xRootFolder->removeByName( sMimetype ); } + + m_bInconsistent = m_xRootFolder->LookForUnexpectedODF12Streams( OUString() ); + + bool bODF12AndNewer = ( m_xRootFolder->GetVersion().compareTo( ODFVER_012_TEXT ) >= 0 ); + if ( !m_bForceRecovery && bODF12AndNewer ) + { + if ( m_bInconsistent ) + { + // this is an ODF1.2 document that contains streams not referred in the manifest.xml; + // in case of ODF1.2 documents without version in manifest.xml the property IsInconsistent + // should be checked later + throw ZipIOException( + THROW_WHERE "there are streams not referred in manifest.xml" ); + } + // all the streams should be encrypted with the same StartKey in ODF1.2 + // TODO/LATER: in future the exception should be thrown + // throw ZipIOException( THROW_WHERE "More than one Start Key Generation algorithm is specified!" ); + } + + // in case it is a correct ODF1.2 document, the version must be set + // and the META-INF folder is reserved for package format + if ( bODF12AndNewer ) + m_xRootFolder->removeByName( sMeta ); } void ZipPackage::parseContentType() { - if ( m_nFormat == embed::StorageFormats::OFOPXML ) - { - const OUString aContentTypes("[Content_Types].xml"); - try { - // the content type must exist in OFOPXML format! - if ( !m_xRootFolder->hasByName( aContentTypes ) ) - throw io::IOException(THROW_WHERE "Wrong format!" ); + if ( m_nFormat != embed::StorageFormats::OFOPXML ) + return; - uno::Reference< lang::XUnoTunnel > xTunnel; - uno::Any aAny = m_xRootFolder->getByName( aContentTypes ); - aAny >>= xTunnel; - uno::Reference < io::XActiveDataSink > xSink( xTunnel, UNO_QUERY ); - if ( xSink.is() ) + const OUString aContentTypes("[Content_Types].xml"); + try { + // the content type must exist in OFOPXML format! + if ( !m_xRootFolder->hasByName( aContentTypes ) ) + throw io::IOException(THROW_WHERE "Wrong format!" ); + + uno::Reference< lang::XUnoTunnel > xTunnel; + uno::Any aAny = m_xRootFolder->getByName( aContentTypes ); + aAny >>= xTunnel; + uno::Reference < io::XActiveDataSink > xSink( xTunnel, UNO_QUERY ); + if ( xSink.is() ) + { + uno::Reference< io::XInputStream > xInStream = xSink->getInputStream(); + if ( xInStream.is() ) { - uno::Reference< io::XInputStream > xInStream = xSink->getInputStream(); - if ( xInStream.is() ) - { - // here aContentTypeInfo[0] - Defaults, and aContentTypeInfo[1] - Overrides - const uno::Sequence< uno::Sequence< beans::StringPair > > aContentTypeInfo = - ::comphelper::OFOPXMLHelper::ReadContentTypeSequence( xInStream, m_xContext ); + // here aContentTypeInfo[0] - Defaults, and aContentTypeInfo[1] - Overrides + const uno::Sequence< uno::Sequence< beans::StringPair > > aContentTypeInfo = + ::comphelper::OFOPXMLHelper::ReadContentTypeSequence( xInStream, m_xContext ); - if ( aContentTypeInfo.getLength() != 2 ) - throw io::IOException(THROW_WHERE ); + if ( aContentTypeInfo.getLength() != 2 ) + throw io::IOException(THROW_WHERE ); - // set the implicit types first - for ( const auto& rPair : aContentTypeInfo[0] ) - m_xRootFolder->setChildStreamsTypeByExtension( rPair ); + // set the implicit types first + for ( const auto& rPair : aContentTypeInfo[0] ) + m_xRootFolder->setChildStreamsTypeByExtension( rPair ); - // now set the explicit types - for ( const auto& rPair : aContentTypeInfo[1] ) - { - OUString aPath; - if ( rPair.First.toChar() == '/' ) - aPath = rPair.First.copy( 1 ); - else - aPath = rPair.First; + // now set the explicit types + for ( const auto& rPair : aContentTypeInfo[1] ) + { + OUString aPath; + if ( rPair.First.toChar() == '/' ) + aPath = rPair.First.copy( 1 ); + else + aPath = rPair.First; - if ( !aPath.isEmpty() && hasByHierarchicalName( aPath ) ) + if ( !aPath.isEmpty() && hasByHierarchicalName( aPath ) ) + { + uno::Any aIterAny = getByHierarchicalName( aPath ); + uno::Reference < lang::XUnoTunnel > xIterTunnel; + aIterAny >>= xIterTunnel; + sal_Int64 nTest = xIterTunnel->getSomething( ZipPackageStream::getUnoTunnelId() ); + if ( nTest != 0 ) { - uno::Any aIterAny = getByHierarchicalName( aPath ); - uno::Reference < lang::XUnoTunnel > xIterTunnel; - aIterAny >>= xIterTunnel; - sal_Int64 nTest = xIterTunnel->getSomething( ZipPackageStream::getUnoTunnelId() ); - if ( nTest != 0 ) - { - // this is a package stream, in OFOPXML format only streams can have mediatype - ZipPackageStream *pStream = reinterpret_cast < ZipPackageStream* > ( nTest ); - pStream->SetMediaType( rPair.Second ); - } + // this is a package stream, in OFOPXML format only streams can have mediatype + ZipPackageStream *pStream = reinterpret_cast < ZipPackageStream* > ( nTest ); + pStream->SetMediaType( rPair.Second ); } } } } - - m_xRootFolder->removeByName( aContentTypes ); - } - catch( uno::Exception& ) - { - if ( !m_bForceRecovery ) - throw; } + + m_xRootFolder->removeByName( aContentTypes ); + } + catch( uno::Exception& ) + { + if ( !m_bForceRecovery ) + throw; } } @@ -601,205 +601,205 @@ void SAL_CALL ZipPackage::initialize( const uno::Sequence< Any >& aArguments ) { beans::NamedValue aNamedValue; - if ( aArguments.hasElements() ) - { - bool bHaveZipFile = true; + if ( !aArguments.hasElements() ) + return; + + bool bHaveZipFile = true; - for( const auto& rArgument : aArguments ) + for( const auto& rArgument : aArguments ) + { + OUString aParamUrl; + if ( rArgument >>= aParamUrl ) { - OUString aParamUrl; - if ( rArgument >>= aParamUrl ) + m_eMode = e_IMode_URL; + try { - m_eMode = e_IMode_URL; - try + sal_Int32 nParam = aParamUrl.indexOf( '?' ); + if ( nParam >= 0 ) { - sal_Int32 nParam = aParamUrl.indexOf( '?' ); - if ( nParam >= 0 ) - { - m_aURL = aParamUrl.copy( 0, nParam ); - OUString aParam = aParamUrl.copy( nParam + 1 ); + m_aURL = aParamUrl.copy( 0, nParam ); + OUString aParam = aParamUrl.copy( nParam + 1 ); - sal_Int32 nIndex = 0; - do + sal_Int32 nIndex = 0; + do + { + OUString aCommand = aParam.getToken( 0, '&', nIndex ); + if ( aCommand == "repairpackage" ) { - OUString aCommand = aParam.getToken( 0, '&', nIndex ); - if ( aCommand == "repairpackage" ) - { - m_bForceRecovery = true; - break; - } - else if ( aCommand == "purezip" ) - { - m_nFormat = embed::StorageFormats::ZIP; - m_xRootFolder->setPackageFormat_Impl( m_nFormat ); - break; - } - else if ( aCommand == "ofopxml" ) - { - m_nFormat = embed::StorageFormats::OFOPXML; - m_xRootFolder->setPackageFormat_Impl( m_nFormat ); - break; - } + m_bForceRecovery = true; + break; + } + else if ( aCommand == "purezip" ) + { + m_nFormat = embed::StorageFormats::ZIP; + m_xRootFolder->setPackageFormat_Impl( m_nFormat ); + break; + } + else if ( aCommand == "ofopxml" ) + { + m_nFormat = embed::StorageFormats::OFOPXML; + m_xRootFolder->setPackageFormat_Impl( m_nFormat ); + break; } - while ( nIndex >= 0 ); - } - else - m_aURL = aParamUrl; - - Content aContent( - m_aURL, uno::Reference< XCommandEnvironment >(), - m_xContext ); - Any aAny = aContent.getPropertyValue("Size"); - sal_uInt64 aSize = 0; - // kind of optimization: treat empty files as nonexistent files - // and write to such files directly. Note that "Size" property is optional. - bool bHasSizeProperty = aAny >>= aSize; - if( !bHasSizeProperty || aSize ) - { - uno::Reference < XActiveDataSink > xSink = new ZipPackageSink; - if ( aContent.openStream ( xSink ) ) - m_xContentStream = xSink->getInputStream(); } - else - bHaveZipFile = false; + while ( nIndex >= 0 ); } - catch ( css::uno::Exception& ) + else + m_aURL = aParamUrl; + + Content aContent( + m_aURL, uno::Reference< XCommandEnvironment >(), + m_xContext ); + Any aAny = aContent.getPropertyValue("Size"); + sal_uInt64 aSize = 0; + // kind of optimization: treat empty files as nonexistent files + // and write to such files directly. Note that "Size" property is optional. + bool bHasSizeProperty = aAny >>= aSize; + if( !bHasSizeProperty || aSize ) { - // Exception derived from uno::Exception thrown. This probably - // means the file doesn't exist...we'll create it at - // commitChanges time - bHaveZipFile = false; + uno::Reference < XActiveDataSink > xSink = new ZipPackageSink; + if ( aContent.openStream ( xSink ) ) + m_xContentStream = xSink->getInputStream(); } + else + bHaveZipFile = false; } - else if ( rArgument >>= m_xStream ) + catch ( css::uno::Exception& ) { - // a writable stream can implement both XStream & XInputStream - m_eMode = e_IMode_XStream; - m_xContentStream = m_xStream->getInputStream(); + // Exception derived from uno::Exception thrown. This probably + // means the file doesn't exist...we'll create it at + // commitChanges time + bHaveZipFile = false; } - else if ( rArgument >>= m_xContentStream ) + } + else if ( rArgument >>= m_xStream ) + { + // a writable stream can implement both XStream & XInputStream + m_eMode = e_IMode_XStream; + m_xContentStream = m_xStream->getInputStream(); + } + else if ( rArgument >>= m_xContentStream ) + { + m_eMode = e_IMode_XInputStream; + } + else if ( rArgument >>= aNamedValue ) + { + if ( aNamedValue.Name == "RepairPackage" ) + aNamedValue.Value >>= m_bForceRecovery; + else if ( aNamedValue.Name == "PackageFormat" ) { - m_eMode = e_IMode_XInputStream; + // setting this argument to true means Package format + // setting it to false means plain Zip format + + bool bPackFormat = true; + aNamedValue.Value >>= bPackFormat; + if ( !bPackFormat ) + m_nFormat = embed::StorageFormats::ZIP; + + m_xRootFolder->setPackageFormat_Impl( m_nFormat ); } - else if ( rArgument >>= aNamedValue ) + else if ( aNamedValue.Name == "StorageFormat" ) { - if ( aNamedValue.Name == "RepairPackage" ) - aNamedValue.Value >>= m_bForceRecovery; - else if ( aNamedValue.Name == "PackageFormat" ) + OUString aFormatName; + sal_Int32 nFormatID = 0; + if ( aNamedValue.Value >>= aFormatName ) { - // setting this argument to true means Package format - // setting it to false means plain Zip format - - bool bPackFormat = true; - aNamedValue.Value >>= bPackFormat; - if ( !bPackFormat ) + if ( aFormatName == PACKAGE_STORAGE_FORMAT_STRING ) + m_nFormat = embed::StorageFormats::PACKAGE; + else if ( aFormatName == ZIP_STORAGE_FORMAT_STRING ) m_nFormat = embed::StorageFormats::ZIP; - - m_xRootFolder->setPackageFormat_Impl( m_nFormat ); - } - else if ( aNamedValue.Name == "StorageFormat" ) - { - OUString aFormatName; - sal_Int32 nFormatID = 0; - if ( aNamedValue.Value >>= aFormatName ) - { - if ( aFormatName == PACKAGE_STORAGE_FORMAT_STRING ) - m_nFormat = embed::StorageFormats::PACKAGE; - else if ( aFormatName == ZIP_STORAGE_FORMAT_STRING ) - m_nFormat = embed::StorageFormats::ZIP; - else if ( aFormatName == OFOPXML_STORAGE_FORMAT_STRING ) - m_nFormat = embed::StorageFormats::OFOPXML; - else - throw lang::IllegalArgumentException(THROW_WHERE, uno::Reference< uno::XInterface >(), 1 ); - } - else if ( aNamedValue.Value >>= nFormatID ) - { - if (nFormatID != embed::StorageFormats::PACKAGE - && nFormatID != embed::StorageFormats::ZIP - && nFormatID != embed::StorageFormats::OFOPXML) - throw lang::IllegalArgumentException(THROW_WHERE, uno::Reference< uno::XInterface >(), 1 ); - - m_nFormat = nFormatID; - } + else if ( aFormatName == OFOPXML_STORAGE_FORMAT_STRING ) + m_nFormat = embed::StorageFormats::OFOPXML; else throw lang::IllegalArgumentException(THROW_WHERE, uno::Reference< uno::XInterface >(), 1 ); - - m_xRootFolder->setPackageFormat_Impl( m_nFormat ); } - else if ( aNamedValue.Name == "AllowRemoveOnInsert" ) + else if ( aNamedValue.Value >>= nFormatID ) { - aNamedValue.Value >>= m_bAllowRemoveOnInsert; - m_xRootFolder->setRemoveOnInsertMode_Impl( m_bAllowRemoveOnInsert ); + if (nFormatID != embed::StorageFormats::PACKAGE + && nFormatID != embed::StorageFormats::ZIP + && nFormatID != embed::StorageFormats::OFOPXML) + throw lang::IllegalArgumentException(THROW_WHERE, uno::Reference< uno::XInterface >(), 1 ); + + m_nFormat = nFormatID; } - else if (aNamedValue.Name == "NoFileSync") - aNamedValue.Value >>= m_bDisableFileSync; + else + throw lang::IllegalArgumentException(THROW_WHERE, uno::Reference< uno::XInterface >(), 1 ); - // for now the progress handler is not used, probably it will never be - // if ( aNamedValue.Name == "ProgressHandler" ) + m_xRootFolder->setPackageFormat_Impl( m_nFormat ); } - else + else if ( aNamedValue.Name == "AllowRemoveOnInsert" ) { - // The URL is not acceptable - throw css::uno::Exception (THROW_WHERE "Bad arguments.", - static_cast < ::cppu::OWeakObject * > ( this ) ); + aNamedValue.Value >>= m_bAllowRemoveOnInsert; + m_xRootFolder->setRemoveOnInsertMode_Impl( m_bAllowRemoveOnInsert ); } + else if (aNamedValue.Name == "NoFileSync") + aNamedValue.Value >>= m_bDisableFileSync; + + // for now the progress handler is not used, probably it will never be + // if ( aNamedValue.Name == "ProgressHandler" ) + } + else + { + // The URL is not acceptable + throw css::uno::Exception (THROW_WHERE "Bad arguments.", + static_cast < ::cppu::OWeakObject * > ( this ) ); } + } - try + try + { + if ( m_xContentStream.is() ) { - if ( m_xContentStream.is() ) - { - // the stream must be seekable, if it is not it will be wrapped - m_xContentStream = ::comphelper::OSeekableInputWrapper::CheckSeekableCanWrap( m_xContentStream, m_xContext ); - m_xContentSeek.set( m_xContentStream, UNO_QUERY_THROW ); - if ( !m_xContentSeek->getLength() ) - bHaveZipFile = false; - } - else + // the stream must be seekable, if it is not it will be wrapped + m_xContentStream = ::comphelper::OSeekableInputWrapper::CheckSeekableCanWrap( m_xContentStream, m_xContext ); + m_xContentSeek.set( m_xContentStream, UNO_QUERY_THROW ); + if ( !m_xContentSeek->getLength() ) bHaveZipFile = false; } - catch ( css::uno::Exception& ) - { - // Exception derived from uno::Exception thrown. This probably - // means the file doesn't exist...we'll create it at - // commitChanges time + else bHaveZipFile = false; - } - if ( bHaveZipFile ) - { - bool bBadZipFile = false; - OUString message; - try - { - m_pZipFile = std::make_unique<ZipFile>(m_aMutexHolder, m_xContentStream, m_xContext, true, m_bForceRecovery); - getZipFileContents(); - } - catch ( IOException & e ) - { - bBadZipFile = true; - message = "IOException: " + e.Message; - } - catch ( ZipException & e ) - { - bBadZipFile = true; - message = "ZipException: " + e.Message; - } - catch ( Exception & ) - { - m_pZipFile.reset(); - throw; - } + } + catch ( css::uno::Exception& ) + { + // Exception derived from uno::Exception thrown. This probably + // means the file doesn't exist...we'll create it at + // commitChanges time + bHaveZipFile = false; + } + if ( !bHaveZipFile ) + return; - if ( bBadZipFile ) - { - // clean up the memory, and tell the UCB about the error - m_pZipFile.reset(); + bool bBadZipFile = false; + OUString message; + try + { + m_pZipFile = std::make_unique<ZipFile>(m_aMutexHolder, m_xContentStream, m_xContext, true, m_bForceRecovery); + getZipFileContents(); + } + catch ( IOException & e ) + { + bBadZipFile = true; + message = "IOException: " + e.Message; + } + catch ( ZipException & e ) + { + bBadZipFile = true; + message = "ZipException: " + e.Message; + } + catch ( Exception & ) + { + m_pZipFile.reset(); + throw; + } - throw css::packages::zip::ZipIOException ( - THROW_WHERE "Bad Zip File, " + message, - static_cast < ::cppu::OWeakObject * > ( this ) ); - } - } + if ( bBadZipFile ) + { + // clean up the memory, and tell the UCB about the error + m_pZipFile.reset(); + + throw css::packages::zip::ZipIOException ( + THROW_WHERE "Bad Zip File, " + message, + static_cast < ::cppu::OWeakObject * > ( this ) ); } } |