Simplify Sequence iterations in package

Use range-based loops, STL and comphelper functions

Change-Id: Ibd836b9b2df2f30b42f2d7a621188d78f5b53196
Reviewed-on: https://gerrit.libreoffice.org/77246
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-by: Arkadiy Illarionov <qarkai@gmail.com>
diff --git a/package/source/manifest/ManifestExport.cxx b/package/source/manifest/ManifestExport.cxx
index f8c2d03..4b4d57c 100644
--- a/package/source/manifest/ManifestExport.cxx
+++ b/package/source/manifest/ManifestExport.cxx
@@ -111,33 +111,30 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > con
    const OUString  sPGP_Name            ( PGP_NAME );

    ::comphelper::AttributeList * pRootAttrList = new ::comphelper::AttributeList;
    const uno::Sequence < beans::PropertyValue > *pSequence = rManList.getConstArray();
    const sal_uInt32 nManLength = rManList.getLength();

    // find the mediatype of the document if any
    OUString aDocMediaType;
    OUString aDocVersion;
    sal_Int32 nRootFolderPropIndex=-1;
    for (sal_uInt32 nInd = 0; nInd < nManLength ; nInd++ )
    const uno::Sequence<beans::PropertyValue>* pRootFolderPropSeq = nullptr;
    for (const uno::Sequence < beans::PropertyValue >& rSequence : rManList)
    {
        OUString aMediaType;
        OUString aPath;
        OUString aVersion;

        const beans::PropertyValue *pValue = pSequence[nInd].getConstArray();
        for (sal_uInt32 j = 0, nNum = pSequence[nInd].getLength(); j < nNum; j++, pValue++)
        for (const beans::PropertyValue& rValue : rSequence)
        {
            if (pValue->Name == sMediaTypeProperty )
            if (rValue.Name == sMediaTypeProperty )
            {
                pValue->Value >>= aMediaType;
                rValue.Value >>= aMediaType;
            }
            else if (pValue->Name == sFullPathProperty )
            else if (rValue.Name == sFullPathProperty )
            {
                pValue->Value >>= aPath;
                rValue.Value >>= aPath;
            }
            else if (pValue->Name == sVersionProperty )
            else if (rValue.Name == sVersionProperty )
            {
                pValue->Value >>= aVersion;
                rValue.Value >>= aVersion;
            }

            if ( !aPath.isEmpty() && !aMediaType.isEmpty() && !aVersion.isEmpty() )
@@ -148,7 +145,7 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > con
        {
            aDocMediaType = aMediaType;
            aDocVersion = aVersion;
            nRootFolderPropIndex = nInd;
            pRootFolderPropSeq = &rSequence;
            break;
        }
    }
@@ -217,15 +214,13 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > con
    xHandler->startElement( sManifestElement, xRootAttrList );

    const uno::Any *pKeyInfoProperty = nullptr;
    if ( nRootFolderPropIndex >= 0 )
    if ( pRootFolderPropSeq )
    {
        // do we have package-wide encryption info?
        const beans::PropertyValue *pValue =
            pSequence[nRootFolderPropIndex].getConstArray();
        for (sal_uInt32 j = 0, nNum = pSequence[nRootFolderPropIndex].getLength(); j < nNum; j++, pValue++)
        for (const beans::PropertyValue& rValue : *pRootFolderPropSeq)
        {
            if (pValue->Name == sKeyInfo )
                pKeyInfoProperty = &pValue->Value;
            if (rValue.Name == sKeyInfo )
                pKeyInfoProperty = &rValue.Value;
        }

        if ( pKeyInfoProperty )
@@ -242,22 +237,19 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > con

            uno::Sequence< uno::Sequence < beans::NamedValue > > aKeyInfoSequence;
            *pKeyInfoProperty >>= aKeyInfoSequence;
            const uno::Sequence < beans::NamedValue > *pKeyInfoSequence = aKeyInfoSequence.getConstArray();
            const sal_uInt32 nKeyInfoLength = aKeyInfoSequence.getLength();
            for (sal_uInt32 nInd = 0; nInd < nKeyInfoLength ; nInd++ )
            for (const uno::Sequence<beans::NamedValue>& rKeyInfoSequence : std::as_const(aKeyInfoSequence))
            {
                uno::Sequence < sal_Int8 > aPgpKeyID;
                uno::Sequence < sal_Int8 > aPgpKeyPacket;
                uno::Sequence < sal_Int8 > aCipherValue;
                const beans::NamedValue *pNValue = pKeyInfoSequence[nInd].getConstArray();
                for (sal_uInt32 j = 0, nNum = pKeyInfoSequence[nInd].getLength(); j < nNum; j++, pNValue++)
                for (const beans::NamedValue& rNValue : rKeyInfoSequence)
                {
                    if (pNValue->Name == sPgpKeyIDProperty )
                        pNValue->Value >>= aPgpKeyID;
                    else if (pNValue->Name == sPgpKeyPacketProperty )
                        pNValue->Value >>= aPgpKeyPacket;
                    else if (pNValue->Name == sCipherValueProperty )
                        pNValue->Value >>= aCipherValue;
                    if (rNValue.Name == sPgpKeyIDProperty )
                        rNValue.Value >>= aPgpKeyID;
                    else if (rNValue.Name == sPgpKeyPacketProperty )
                        rNValue.Value >>= aPgpKeyPacket;
                    else if (rNValue.Name == sCipherValueProperty )
                        rNValue.Value >>= aCipherValue;
                }

                if (aPgpKeyID.hasElements() && aCipherValue.hasElements() )
@@ -326,55 +318,54 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > con
    }

    // now write individual file entries
    for (sal_uInt32 i = 0 ; i < nManLength ; i++)
    for (const uno::Sequence<beans::PropertyValue>& rSequence : rManList)
    {
        ::comphelper::AttributeList *pAttrList = new ::comphelper::AttributeList;
        const beans::PropertyValue *pValue = pSequence[i].getConstArray();
        OUString aString;
        const uno::Any *pVector = nullptr, *pSalt = nullptr, *pIterationCount = nullptr, *pDigest = nullptr, *pDigestAlg = nullptr, *pEncryptAlg = nullptr, *pStartKeyAlg = nullptr, *pDerivedKeySize = nullptr;
        for (sal_uInt32 j = 0, nNum = pSequence[i].getLength(); j < nNum; j++, pValue++)
        for (const beans::PropertyValue& rValue : rSequence)
        {
            if (pValue->Name == sMediaTypeProperty )
            if (rValue.Name == sMediaTypeProperty )
            {
                pValue->Value >>= aString;
                rValue.Value >>= aString;
                pAttrList->AddAttribute ( sMediaTypeAttribute, sCdataAttribute, aString );
            }
            else if (pValue->Name == sVersionProperty )
            else if (rValue.Name == sVersionProperty )
            {
                pValue->Value >>= aString;
                rValue.Value >>= aString;
                // the version is stored only if it is not empty
                if ( bAcceptNonemptyVersion && !aString.isEmpty() )
                    pAttrList->AddAttribute ( sVersionAttribute, sCdataAttribute, aString );
            }
            else if (pValue->Name == sFullPathProperty )
            else if (rValue.Name == sFullPathProperty )
            {
                pValue->Value >>= aString;
                rValue.Value >>= aString;
                pAttrList->AddAttribute ( sFullPathAttribute, sCdataAttribute, aString );
            }
            else if (pValue->Name == sSizeProperty )
            else if (rValue.Name == sSizeProperty )
            {
                sal_Int64 nSize = 0;
                pValue->Value >>= nSize;
                rValue.Value >>= nSize;
                OUStringBuffer aBuffer;
                aBuffer.append ( nSize );
                pAttrList->AddAttribute ( sSizeAttribute, sCdataAttribute, aBuffer.makeStringAndClear() );
            }
            else if (pValue->Name == sInitialisationVectorProperty )
                pVector = &pValue->Value;
            else if (pValue->Name == sSaltProperty )
                pSalt = &pValue->Value;
            else if (pValue->Name == sIterationCountProperty )
                pIterationCount = &pValue->Value;
            else if (pValue->Name == sDigestProperty )
                pDigest = &pValue->Value;
            else if (pValue->Name == sDigestAlgProperty )
                pDigestAlg = &pValue->Value;
            else if (pValue->Name == sEncryptionAlgProperty )
                pEncryptAlg = &pValue->Value;
            else if (pValue->Name == sStartKeyAlgProperty )
                pStartKeyAlg = &pValue->Value;
            else if (pValue->Name == sDerivedKeySizeProperty )
                pDerivedKeySize = &pValue->Value;
            else if (rValue.Name == sInitialisationVectorProperty )
                pVector = &rValue.Value;
            else if (rValue.Name == sSaltProperty )
                pSalt = &rValue.Value;
            else if (rValue.Name == sIterationCountProperty )
                pIterationCount = &rValue.Value;
            else if (rValue.Name == sDigestProperty )
                pDigest = &rValue.Value;
            else if (rValue.Name == sDigestAlgProperty )
                pDigestAlg = &rValue.Value;
            else if (rValue.Name == sEncryptionAlgProperty )
                pEncryptAlg = &rValue.Value;
            else if (rValue.Name == sStartKeyAlgProperty )
                pStartKeyAlg = &rValue.Value;
            else if (rValue.Name == sDerivedKeySizeProperty )
                pDerivedKeySize = &rValue.Value;
        }

        xHandler->ignorableWhitespace ( sWhiteSpace );
diff --git a/package/source/xstor/ocompinstream.cxx b/package/source/xstor/ocompinstream.cxx
index 52565b7..ac4e3f1 100644
--- a/package/source/xstor/ocompinstream.cxx
+++ b/package/source/xstor/ocompinstream.cxx
@@ -21,6 +21,7 @@
#include <com/sun/star/embed/StorageFormats.hpp>
#include <com/sun/star/io/IOException.hpp>
#include <com/sun/star/lang/DisposedException.hpp>
#include <comphelper/sequence.hxx>
#include <cppuhelper/queryinterface.hxx>
#include <osl/diagnose.h>
#include <sal/log.hxx>
@@ -285,6 +286,17 @@ sal_Bool SAL_CALL OInputCompStream::hasByID(  const OUString& sID )
    return false;
}

namespace
{

const beans::StringPair* lcl_findPairByName(const uno::Sequence<beans::StringPair>& rSeq, const OUString& rName)
{
    return std::find_if(rSeq.begin(), rSeq.end(),
        [&rName](const beans::StringPair& rPair) { return rPair.First == rName; });
}

}

OUString SAL_CALL OInputCompStream::getTargetByID(  const OUString& sID  )
{
    ::osl::MutexGuard aGuard( m_xMutex->GetMutex() );
@@ -298,10 +310,10 @@ OUString SAL_CALL OInputCompStream::getTargetByID(  const OUString& sID  )
    if ( m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException();

    uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
        if ( aSeq[nInd].First == "Target" )
            return aSeq[nInd].Second;
    const uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    auto pRel = lcl_findPairByName(aSeq, "Target");
    if (pRel != aSeq.end())
        return pRel->Second;

    return OUString();
}
@@ -319,10 +331,10 @@ OUString SAL_CALL OInputCompStream::getTypeByID(  const OUString& sID  )
    if ( m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException();

    uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
        if ( aSeq[nInd].First == "Type" )
            return aSeq[nInd].Second;
    const uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    auto pRel = lcl_findPairByName(aSeq, "Type");
    if (pRel != aSeq.end())
        return pRel->Second;

    return OUString();
}
@@ -341,15 +353,13 @@ uno::Sequence< beans::StringPair > SAL_CALL OInputCompStream::getRelationshipByI
        throw uno::RuntimeException();

    // TODO/LATER: in future the unification of the ID could be checked
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == "Id" )
            {
                if ( aSeq[nInd1][nInd2].Second == sID )
                    return aSeq[nInd1];
                break;
            }
    const uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    const beans::StringPair aIDRel("Id", sID);
    auto pRel = std::find_if(aSeq.begin(), aSeq.end(),
        [&aIDRel](const uno::Sequence<beans::StringPair>& rRel){
            return std::find(rRel.begin(), rRel.end(), aIDRel) != rRel.end(); });
    if (pRel != aSeq.end())
        return *pRel;

    throw container::NoSuchElementException();
}
@@ -367,24 +377,17 @@ uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OInputCompStream::g
    if ( m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException();

    uno::Sequence< uno::Sequence< beans::StringPair > > aResult;
    sal_Int32 nEntriesNum = 0;

    // TODO/LATER: in future the unification of the ID could be checked
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == "Type" )
            {
                if ( aSeq[nInd1][nInd2].Second == sType )
                {
                    aResult.realloc( nEntriesNum );
                    aResult[nEntriesNum-1] = aSeq[nInd1];
                }
                break;
            }
    const uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    const beans::StringPair aTypeRel("Type", sType);
    std::vector< uno::Sequence<beans::StringPair> > aResult;
    aResult.reserve(aSeq.getLength());

    return aResult;
    std::copy_if(aSeq.begin(), aSeq.end(), std::back_inserter(aResult),
        [&aTypeRel](const uno::Sequence<beans::StringPair>& rRel) {
            return std::find(rRel.begin(), rRel.end(), aTypeRel) != rRel.end(); });

    return comphelper::containerToSequence(aResult);
}

uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OInputCompStream::getAllRelationships()
@@ -401,15 +404,14 @@ uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OInputCompStream::g
        throw uno::RuntimeException();

    // TODO/LATER: in future the information could be taken directly from m_pImpl when possible
    uno::Sequence< uno::Sequence< beans::StringPair > > aResult;
    for ( sal_Int32 aInd = 0; aInd < m_aProperties.getLength(); aInd++ )
        if ( m_aProperties[aInd].Name == "RelationsInfo" )
        {
            if ( m_aProperties[aInd].Value >>= aResult )
                return aResult;

            break;
        }
    auto pProp = std::find_if(std::cbegin(m_aProperties), std::cend(m_aProperties),
        [](const beans::PropertyValue& rProp) { return rProp.Name == "RelationsInfo"; });
    if (pProp != std::cend(m_aProperties))
    {
        uno::Sequence< uno::Sequence< beans::StringPair > > aResult;
        if (pProp->Value >>= aResult)
            return aResult;
    }

    throw io::IOException(); // the relations info could not be read
}
@@ -503,13 +505,9 @@ void SAL_CALL OInputCompStream::setPropertyValue( const OUString& aPropertyName,
    }

    // all the provided properties are accessible
    for ( sal_Int32 aInd = 0; aInd < m_aProperties.getLength(); aInd++ )
    {
        if ( m_aProperties[aInd].Name == aPropertyName )
        {
            throw beans::PropertyVetoException(); // TODO
        }
    }
    if (std::any_of(std::cbegin(m_aProperties), std::cend(m_aProperties),
            [&aPropertyName](const beans::PropertyValue& rProp) { return rProp.Name == aPropertyName; }))
        throw beans::PropertyVetoException(); // TODO

    throw beans::UnknownPropertyException(); // TODO
}
@@ -534,13 +532,10 @@ uno::Any SAL_CALL OInputCompStream::getPropertyValue( const OUString& aProp )
        throw beans::UnknownPropertyException(); // TODO

    // all the provided properties are accessible
    for ( sal_Int32 aInd = 0; aInd < m_aProperties.getLength(); aInd++ )
    {
        if ( m_aProperties[aInd].Name == aPropertyName )
        {
            return m_aProperties[aInd].Value;
        }
    }
    auto pProp = std::find_if(std::cbegin(m_aProperties), std::cend(m_aProperties),
        [&aPropertyName](const beans::PropertyValue& rProp) { return rProp.Name == aPropertyName; });
    if (pProp != std::cend(m_aProperties))
        return pProp->Value;

    throw beans::UnknownPropertyException(); // TODO
}
diff --git a/package/source/xstor/owriteablestream.cxx b/package/source/xstor/owriteablestream.cxx
index 1c9332e..27a3d4d 100644
--- a/package/source/xstor/owriteablestream.cxx
+++ b/package/source/xstor/owriteablestream.cxx
@@ -45,6 +45,7 @@
#include <comphelper/storagehelper.hxx>
#include <comphelper/ofopxmlhelper.hxx>
#include <comphelper/refcountedmutex.hxx>
#include <comphelper/sequence.hxx>

#include <rtl/digest.h>
#include <rtl/instance.hxx>
@@ -92,10 +93,9 @@ bool PackageEncryptionDatasEqual( const ::comphelper::SequenceAsHashMap& aHash1,
        bResult = ( ( aIter->second >>= aKey1 ) && aKey1.hasElements() );
        if ( bResult )
        {
            uno::Sequence< sal_Int8 > aKey2 = aHash2.getUnpackedValueOrDefault( aIter->first, uno::Sequence< sal_Int8 >() );
            bResult = ( aKey1.getLength() == aKey2.getLength() );
            for ( sal_Int32 nInd = 0; bResult && nInd < aKey1.getLength(); nInd++ )
                bResult = ( aKey1[nInd] == aKey2[nInd] );
            const uno::Sequence< sal_Int8 > aKey2 = aHash2.getUnpackedValueOrDefault( aIter->first, uno::Sequence< sal_Int8 >() );
            bResult = aKey1.getLength() == aKey2.getLength()
                && std::equal(std::cbegin(aKey1), std::cend(aKey1), aKey2.begin(), aKey2.end());
        }
    }

@@ -142,14 +142,8 @@ uno::Any GetEncryptionKeyProperty_Impl( const uno::Reference< beans::XPropertySe

bool SequencesEqual( const uno::Sequence< sal_Int8 >& aSequence1, const uno::Sequence< sal_Int8 >& aSequence2 )
{
    if ( aSequence1.getLength() != aSequence2.getLength() )
        return false;

    for ( sal_Int32 nInd = 0; nInd < aSequence1.getLength(); nInd++ )
        if ( aSequence1[nInd] != aSequence2[nInd] )
            return false;

    return true;
    return aSequence1.getLength() == aSequence2.getLength()
        && std::equal(aSequence1.begin(), aSequence1.end(), aSequence2.begin(), aSequence2.end());
}

bool SequencesEqual( const uno::Sequence< beans::NamedValue >& aSequence1, const uno::Sequence< beans::NamedValue >& aSequence2 )
@@ -157,35 +151,35 @@ bool SequencesEqual( const uno::Sequence< beans::NamedValue >& aSequence1, const
    if ( aSequence1.getLength() != aSequence2.getLength() )
        return false;

    for ( sal_Int32 nInd = 0; nInd < aSequence1.getLength(); nInd++ )
    for ( const auto& rProp1 : aSequence1 )
    {
        bool bHasMember = false;
        uno::Sequence< sal_Int8 > aMember1;
        sal_Int32 nMember1 = 0;
        if ( aSequence1[nInd].Value >>= aMember1 )
        if ( rProp1.Value >>= aMember1 )
        {
            for ( sal_Int32 nInd2 = 0; nInd2 < aSequence2.getLength(); nInd2++ )
            for ( const auto& rProp2 : aSequence2 )
            {
                if ( aSequence1[nInd].Name == aSequence2[nInd2].Name )
                if ( rProp1.Name == rProp2.Name )
                {
                    bHasMember = true;

                    uno::Sequence< sal_Int8 > aMember2;
                    if ( !( aSequence2[nInd2].Value >>= aMember2 ) || !SequencesEqual( aMember1, aMember2 ) )
                    if ( !( rProp2.Value >>= aMember2 ) || !SequencesEqual( aMember1, aMember2 ) )
                        return false;
                }
            }
        }
        else if ( aSequence1[nInd].Value >>= nMember1 )
        else if ( rProp1.Value >>= nMember1 )
        {
            for ( sal_Int32 nInd2 = 0; nInd2 < aSequence2.getLength(); nInd2++ )
            for ( const auto& rProp2 : aSequence2 )
            {
                if ( aSequence1[nInd].Name == aSequence2[nInd2].Name )
                if ( rProp1.Name == rProp2.Name )
                {
                    bHasMember = true;

                    sal_Int32 nMember2 = 0;
                    if ( !( aSequence2[nInd2].Value >>= nMember2 ) || nMember1 != nMember2 )
                    if ( !( rProp2.Value >>= nMember2 ) || nMember1 != nMember2 )
                        return false;
                }
            }
@@ -253,6 +247,12 @@ uno::Reference< io::XStream > CreateMemoryStream( const uno::Reference< uno::XCo
        uno::UNO_QUERY_THROW);
}

const beans::StringPair* lcl_findPairByName(const uno::Sequence<beans::StringPair>& rSeq, const OUString& rName)
{
    return std::find_if(rSeq.begin(), rSeq.end(),
        [&rName](const beans::StringPair& rPair) { return rPair.First == rName; });
}

} // anonymous namespace

OWriteStream_Impl::OWriteStream_Impl( OStorage_Impl* pParent,
@@ -371,11 +371,11 @@ bool OWriteStream_Impl::IsEncrypted()
    }

    bool bToBeEncr = false;
    for ( sal_Int32 nInd = 0; nInd < m_aProps.getLength(); nInd++ )
    for ( const auto& rProp : std::as_const(m_aProps) )
    {
        if ( m_aProps[nInd].Name == "Encrypted" )
        if ( rProp.Name == "Encrypted" )
        {
            if ( !( m_aProps[nInd].Value >>= bToBeEncr ) )
            if ( !( rProp.Value >>= bToBeEncr ) )
            {
                SAL_WARN( "package.xstor", "The property has wrong type!" );
            }
@@ -421,10 +421,10 @@ void OWriteStream_Impl::SetDecrypted()
    m_bHasCachedEncryptionData = false;
    m_aEncryptionData.clear();

    for ( sal_Int32 nInd = 0; nInd < m_aProps.getLength(); nInd++ )
    for ( auto& rProp : m_aProps )
    {
        if ( m_aProps[nInd].Name == "Encrypted" )
            m_aProps[nInd].Value <<= false;
        if ( rProp.Name == "Encrypted" )
            rProp.Value <<= false;
    }
}

@@ -444,10 +444,10 @@ void OWriteStream_Impl::SetEncrypted( const ::comphelper::SequenceAsHashMap& aEn
    m_bHasDataToFlush = true;

    // introduce encryption info
    for ( sal_Int32 nInd = 0; nInd < m_aProps.getLength(); nInd++ )
    for ( auto& rProp : m_aProps )
    {
        if ( m_aProps[nInd].Name == "Encrypted" )
            m_aProps[nInd].Value <<= true;
        if ( rProp.Name == "Encrypted" )
            rProp.Value <<= true;
    }

    m_bUseCommonEncryption = false; // very important to set it to false
@@ -714,29 +714,29 @@ void OWriteStream_Impl::InsertStreamDirectly( const uno::Reference< io::XInputSt
    bool bCompressed = false;
    OUString aComprPropName( "Compressed" );
    OUString aMedTypePropName( "MediaType" );
    for ( sal_Int32 nInd = 0; nInd < aProps.getLength(); nInd++ )
    for ( const auto& rProp : aProps )
    {
        if ( aProps[nInd].Name == aComprPropName )
        if ( rProp.Name == aComprPropName )
        {
            bCompressedIsSet = true;
            aProps[nInd].Value >>= bCompressed;
            rProp.Value >>= bCompressed;
        }
        else if ( ( m_nStorageType == embed::StorageFormats::OFOPXML || m_nStorageType == embed::StorageFormats::PACKAGE )
               && aProps[nInd].Name == aMedTypePropName )
               && rProp.Name == aMedTypePropName )
        {
            xPropertySet->setPropertyValue( aProps[nInd].Name, aProps[nInd].Value );
            xPropertySet->setPropertyValue( rProp.Name, rProp.Value );
        }
        else if ( m_nStorageType == embed::StorageFormats::PACKAGE && aProps[nInd].Name == "UseCommonStoragePasswordEncryption" )
            aProps[nInd].Value >>= m_bUseCommonEncryption;
        else if ( m_nStorageType == embed::StorageFormats::PACKAGE && rProp.Name == "UseCommonStoragePasswordEncryption" )
            rProp.Value >>= m_bUseCommonEncryption;
        else
            throw lang::IllegalArgumentException();

        // if there are cached properties update them
        if ( aProps[nInd].Name == aMedTypePropName || aProps[nInd].Name == aComprPropName )
            for ( sal_Int32 nMemInd = 0; nMemInd < m_aProps.getLength(); nMemInd++ )
        if ( rProp.Name == aMedTypePropName || rProp.Name == aComprPropName )
            for ( auto& rMemProp : m_aProps )
            {
                if ( aProps[nInd].Name == m_aProps[nMemInd].Name )
                    m_aProps[nMemInd].Value = aProps[nInd].Value;
                if ( rProp.Name == rMemProp.Name )
                    rMemProp.Value = rProp.Value;
            }
    }

@@ -823,18 +823,18 @@ void OWriteStream_Impl::Commit()
    // copy properties to the package stream
    uno::Reference< beans::XPropertySet > xPropertySet( xNewPackageStream, uno::UNO_QUERY_THROW );

    for ( sal_Int32 nInd = 0; nInd < m_aProps.getLength(); nInd++ )
    for ( auto& rProp : m_aProps )
    {
        if ( m_aProps[nInd].Name == "Size" )
        if ( rProp.Name == "Size" )
        {
            if ( m_pAntiImpl && !m_bHasInsertedStreamOptimization && m_pAntiImpl->m_xSeekable.is() )
            {
                m_aProps[nInd].Value <<= m_pAntiImpl->m_xSeekable->getLength();
                xPropertySet->setPropertyValue( m_aProps[nInd].Name, m_aProps[nInd].Value );
                rProp.Value <<= m_pAntiImpl->m_xSeekable->getLength();
                xPropertySet->setPropertyValue( rProp.Name, rProp.Value );
            }
        }
        else
            xPropertySet->setPropertyValue( m_aProps[nInd].Name, m_aProps[nInd].Value );
            xPropertySet->setPropertyValue( rProp.Name, rProp.Value );
    }

    if ( m_bUseCommonEncryption )
@@ -1051,10 +1051,10 @@ uno::Sequence< beans::PropertyValue > OWriteStream_Impl::ReadPackageStreamProper
    // TODO: may be also raw stream should be marked

    uno::Reference< beans::XPropertySet > xPropSet( m_xPackageStream, uno::UNO_QUERY_THROW );
    for ( sal_Int32 nInd = 0; nInd < aResult.getLength(); nInd++ )
    for ( auto& rProp : aResult )
    {
        try {
            aResult[nInd].Value = xPropSet->getPropertyValue( aResult[nInd].Name );
            rProp.Value = xPropSet->getPropertyValue( rProp.Name );
        }
        catch( const uno::Exception& )
        {
@@ -2186,10 +2186,10 @@ void OWriteStream::CloseOutput_Impl()
        if ( !m_xSeekable.is() )
            throw uno::RuntimeException();

        for ( sal_Int32 nInd = 0; nInd < m_pImpl->m_aProps.getLength(); nInd++ )
        for ( auto& rProp : m_pImpl->m_aProps )
        {
            if ( m_pImpl->m_aProps[nInd].Name == "Size" )
                m_pImpl->m_aProps[nInd].Value <<= m_xSeekable->getLength();
            if ( rProp.Name == "Size" )
                rProp.Value <<= m_xSeekable->getLength();
        }
    }
}
@@ -2511,10 +2511,10 @@ OUString SAL_CALL OWriteStream::getTargetByID(  const OUString& sID  )
    if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException();

    uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
        if ( aSeq[nInd].First == "Target" )
            return aSeq[nInd].Second;
    const uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    auto pRel = lcl_findPairByName(aSeq, "Target");
    if (pRel != aSeq.end())
        return pRel->Second;

    return OUString();
}
@@ -2532,10 +2532,10 @@ OUString SAL_CALL OWriteStream::getTypeByID(  const OUString& sID  )
    if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException();

    uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
        if ( aSeq[nInd].First == "Type" )
            return aSeq[nInd].Second;
    const uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    auto pRel = lcl_findPairByName(aSeq, "Type");
    if (pRel != aSeq.end())
        return pRel->Second;

    return OUString();
}
@@ -2554,15 +2554,13 @@ uno::Sequence< beans::StringPair > SAL_CALL OWriteStream::getRelationshipByID(  
        throw uno::RuntimeException();

    // TODO/LATER: in future the unification of the ID could be checked
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == "Id" )
            {
                if ( aSeq[nInd1][nInd2].Second == sID )
                    return aSeq[nInd1];
                break;
            }
    const uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    const beans::StringPair aIDRel("Id", sID);
    auto pRel = std::find_if(aSeq.begin(), aSeq.end(),
        [&aIDRel](const uno::Sequence<beans::StringPair>& rRel) {
            return std::find(rRel.begin(), rRel.end(), aIDRel) != rRel.end(); });
    if (pRel != aSeq.end())
        return *pRel;

    throw container::NoSuchElementException();
}
@@ -2580,24 +2578,17 @@ uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OWriteStream::getRe
    if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException();

    uno::Sequence< uno::Sequence< beans::StringPair > > aResult;
    sal_Int32 nEntriesNum = 0;

    // TODO/LATER: in future the unification of the ID could be checked
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == "Type" )
            {
                if ( aSeq[nInd1][nInd2].Second == sType )
                {
                    aResult.realloc( nEntriesNum );
                    aResult[nEntriesNum-1] = aSeq[nInd1];
                }
                break;
            }
    const uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    const beans::StringPair aTypeRel("Type", sType);
    std::vector< uno::Sequence<beans::StringPair> > aResult;
    aResult.reserve(aSeq.getLength());

    return aResult;
    std::copy_if(aSeq.begin(), aSeq.end(), std::back_inserter(aResult),
        [&aTypeRel](const uno::Sequence<beans::StringPair>& rRel) {
            return std::find(rRel.begin(), rRel.end(), aTypeRel) != rRel.end(); });

    return comphelper::containerToSequence(aResult);
}

uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OWriteStream::getAllRelationships()
@@ -2629,21 +2620,18 @@ void SAL_CALL OWriteStream::insertRelationshipByID(  const OUString& sID, const 
    if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException();

    OUString aIDTag( "Id" );
    const beans::StringPair aIDRel("Id", sID);

    sal_Int32 nIDInd = -1;

    // TODO/LATER: in future the unification of the ID could be checked
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == aIDTag )
            {
                if ( aSeq[nInd1][nInd2].Second == sID )
                    nIDInd = nInd1;

                break;
            }
    for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
    {
        const auto& rRel = aSeq[nInd];
        if (std::find(rRel.begin(), rRel.end(), aIDRel) != rRel.end())
            nIDInd = nInd;
    }

    if ( nIDInd != -1 && !bReplace )
        throw container::ElementExistException(); // TODO
@@ -2654,20 +2642,14 @@ void SAL_CALL OWriteStream::insertRelationshipByID(  const OUString& sID, const 
        aSeq.realloc( nIDInd + 1 );
    }

    aSeq[nIDInd].realloc( aEntry.getLength() + 1 );
    std::vector<beans::StringPair> aResult;
    aResult.reserve(aEntry.getLength() + 1);

    aSeq[nIDInd][0].First = aIDTag;
    aSeq[nIDInd][0].Second = sID;
    sal_Int32 nIndTarget = 1;
    for ( sal_Int32 nIndOrig = 0;
          nIndOrig < aEntry.getLength();
          nIndOrig++ )
    {
        if ( aEntry[nIndOrig].First != aIDTag )
            aSeq[nIDInd][nIndTarget++] = aEntry[nIndOrig];
    }
    aResult.push_back(aIDRel);
    std::copy_if(aEntry.begin(), aEntry.end(), std::back_inserter(aResult),
        [](const beans::StringPair& rRel) { return rRel.First != "Id"; });

    aSeq[nIDInd].realloc( nIndTarget );
    aSeq[nIDInd] = comphelper::containerToSequence(aResult);

    m_pImpl->m_aNewRelInfo = aSeq;
    m_pImpl->m_xNewRelInfoStream.clear();
@@ -2688,26 +2670,22 @@ void SAL_CALL OWriteStream::removeRelationshipByID(  const OUString& sID  )
        throw uno::RuntimeException();

    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == "Id" )
            {
                if ( aSeq[nInd1][nInd2].Second == sID )
                {
                    sal_Int32 nLength = aSeq.getLength();
                    aSeq[nInd1] = aSeq[nLength-1];
                    aSeq.realloc( nLength - 1 );
    const beans::StringPair aIDRel("Id", sID);
    auto pRel = std::find_if(std::cbegin(aSeq), std::cend(aSeq),
        [&aIDRel](const uno::Sequence< beans::StringPair >& rRel) {
            return std::find(rRel.begin(), rRel.end(), aIDRel) != rRel.end(); });
    if (pRel != std::cend(aSeq))
    {
        auto nInd = static_cast<sal_Int32>(std::distance(std::cbegin(aSeq), pRel));
        comphelper::removeElementAt(aSeq, nInd);

                    m_pImpl->m_aNewRelInfo = aSeq;
                    m_pImpl->m_xNewRelInfoStream.clear();
                    m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;
        m_pImpl->m_aNewRelInfo = aSeq;
        m_pImpl->m_xNewRelInfoStream.clear();
        m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;

                    // TODO/LATER: in future the unification of the ID could be checked
                    return;
                }

                break;
            }
        // TODO/LATER: in future the unification of the ID could be checked
        return;
    }

    throw container::NoSuchElementException();
}
@@ -2726,67 +2704,41 @@ void SAL_CALL OWriteStream::insertRelationships(  const uno::Sequence< uno::Sequ
        throw uno::RuntimeException();

    OUString aIDTag( "Id" );
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    uno::Sequence< uno::Sequence< beans::StringPair > > aResultSeq( aSeq.getLength() + aEntries.getLength() );
    sal_Int32 nResultInd = 0;
    const uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    std::vector< uno::Sequence<beans::StringPair> > aResultVec;
    aResultVec.reserve(aSeq.getLength() + aEntries.getLength());

    for ( sal_Int32 nIndTarget1 = 0; nIndTarget1 < aSeq.getLength(); nIndTarget1++ )
        for ( sal_Int32 nIndTarget2 = 0; nIndTarget2 < aSeq[nIndTarget1].getLength(); nIndTarget2++ )
            if ( aSeq[nIndTarget1][nIndTarget2].First == aIDTag )
            {
                sal_Int32 nIndSourceSame = -1;
    std::copy_if(aSeq.begin(), aSeq.end(), std::back_inserter(aResultVec),
        [&aIDTag, &aEntries, bReplace](const uno::Sequence<beans::StringPair>& rTargetRel) {
            auto pTargetPair = lcl_findPairByName(rTargetRel, aIDTag);
            if (pTargetPair == rTargetRel.end())
                return false;

                for ( sal_Int32 nIndSource1 = 0; nIndSource1 < aEntries.getLength(); nIndSource1++ )
                    for ( sal_Int32 nIndSource2 = 0; nIndSource2 < aEntries[nIndSource1].getLength(); nIndSource2++ )
                    {
                        if ( aEntries[nIndSource1][nIndSource2].First == aIDTag )
                        {
                            if ( aEntries[nIndSource1][nIndSource2].Second == aSeq[nIndTarget1][nIndTarget2].Second )
                            {
                                if ( !bReplace )
                                    throw container::ElementExistException();
            bool bIsSourceSame = std::any_of(aEntries.begin(), aEntries.end(),
                [&pTargetPair](const uno::Sequence<beans::StringPair>& rSourceEntry) {
                    return std::find(rSourceEntry.begin(), rSourceEntry.end(), *pTargetPair) != rSourceEntry.end(); });

                                nIndSourceSame = nIndSource1;
                            }
            if ( bIsSourceSame && !bReplace )
                throw container::ElementExistException();

                            break;
                        }
                    }
            // if no such element in the provided sequence
            return !bIsSourceSame;
        });

                if ( nIndSourceSame == -1 )
                {
                    // no such element in the provided sequence
                    aResultSeq[nResultInd++] = aSeq[nIndTarget1];
                }

                break;
            }

    for ( sal_Int32 nIndSource1 = 0; nIndSource1 < aEntries.getLength(); nIndSource1++ )
    {
        aResultSeq[nResultInd].realloc( aEntries[nIndSource1].getLength() );
        bool bHasID = false;
        sal_Int32 nResInd2 = 1;

        for ( sal_Int32 nIndSource2 = 0; nIndSource2 < aEntries[nIndSource1].getLength(); nIndSource2++ )
            if ( aEntries[nIndSource1][nIndSource2].First == aIDTag )
            {
                aResultSeq[nResultInd][0] = aEntries[nIndSource1][nIndSource2];
                bHasID = true;
            }
            else if ( nResInd2 < aResultSeq[nResultInd].getLength() )
                aResultSeq[nResultInd][nResInd2++] = aEntries[nIndSource1][nIndSource2];
            else
    std::transform(aEntries.begin(), aEntries.end(), std::back_inserter(aResultVec),
        [&aIDTag](const uno::Sequence<beans::StringPair>& rEntry) -> uno::Sequence<beans::StringPair> {
            auto pPair = lcl_findPairByName(rEntry, aIDTag);
            if (pPair == rEntry.end())
                throw io::IOException(); // TODO: illegal relation ( no ID )

        if ( !bHasID )
            throw io::IOException(); // TODO: illegal relations
            auto aResult = comphelper::sequenceToContainer<std::vector<beans::StringPair>>(rEntry);
            auto nIDInd = std::distance(rEntry.begin(), pPair);
            std::rotate(aResult.begin(), std::next(aResult.begin(), nIDInd), std::next(aResult.begin(), nIDInd + 1));

        nResultInd++;
    }
            return comphelper::containerToSequence(aResult);
        });

    aResultSeq.realloc( nResultInd );
    m_pImpl->m_aNewRelInfo = aResultSeq;
    m_pImpl->m_aNewRelInfo = comphelper::containerToSequence(aResultVec);
    m_pImpl->m_xNewRelInfoStream.clear();
    m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;
}
@@ -2843,22 +2795,22 @@ void SAL_CALL OWriteStream::setPropertyValue( const OUString& aPropertyName, con
                bCompressedValueFromType = false;
        }

        for ( sal_Int32 nInd = 0; nInd < m_pImpl->m_aProps.getLength(); nInd++ )
        for ( auto& rProp : m_pImpl->m_aProps )
        {
            if ( aPropertyName == m_pImpl->m_aProps[nInd].Name )
                m_pImpl->m_aProps[nInd].Value = aValue;
            else if ( !m_pImpl->m_bCompressedSetExplicit && aCompressedString == m_pImpl->m_aProps[nInd].Name )
                m_pImpl->m_aProps[nInd].Value <<= bCompressedValueFromType;
            if ( aPropertyName == rProp.Name )
                rProp.Value = aValue;
            else if ( !m_pImpl->m_bCompressedSetExplicit && aCompressedString == rProp.Name )
                rProp.Value <<= bCompressedValueFromType;
        }
    }
    else if ( aPropertyName == aCompressedString )
    {
        // if the "Compressed" property is not set explicitly, the MediaType can change the default value
        m_pImpl->m_bCompressedSetExplicit = true;
        for ( sal_Int32 nInd = 0; nInd < m_pImpl->m_aProps.getLength(); nInd++ )
        for ( auto& rProp : m_pImpl->m_aProps )
        {
            if ( aPropertyName == m_pImpl->m_aProps[nInd].Name )
                m_pImpl->m_aProps[nInd].Value = aValue;
            if ( aPropertyName == rProp.Name )
                rProp.Value = aValue;
        }
    }
    else if ( m_pData->m_nStorageType == embed::StorageFormats::PACKAGE
@@ -2886,10 +2838,10 @@ void SAL_CALL OWriteStream::setPropertyValue( const OUString& aPropertyName, con
    }
    else if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML && aPropertyName == aMediaTypeString )
    {
        for ( sal_Int32 nInd = 0; nInd < m_pImpl->m_aProps.getLength(); nInd++ )
        for ( auto& rProp : m_pImpl->m_aProps )
        {
            if ( aPropertyName == m_pImpl->m_aProps[nInd].Name )
                m_pImpl->m_aProps[nInd].Value = aValue;
            if ( aPropertyName == rProp.Name )
                rProp.Value = aValue;
        }
    }
    else if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML && aPropertyName == "RelationsInfoStream" )
@@ -2960,11 +2912,10 @@ uno::Any SAL_CALL OWriteStream::getPropertyValue( const OUString& aProp )
    {
        m_pImpl->GetStreamProperties();

        for ( sal_Int32 nInd = 0; nInd < m_pImpl->m_aProps.getLength(); nInd++ )
        {
            if ( aPropertyName == m_pImpl->m_aProps[nInd].Name )
                return m_pImpl->m_aProps[nInd].Value;
        }
        auto pProp = std::find_if(std::cbegin(m_pImpl->m_aProps), std::cend(m_pImpl->m_aProps),
            [&aPropertyName](const css::beans::PropertyValue& rProp){ return aPropertyName == rProp.Name; });
        if (pProp != std::cend(m_pImpl->m_aProps))
            return pProp->Value;
    }
    else if ( m_pData->m_nStorageType == embed::StorageFormats::PACKAGE
            && aPropertyName == "UseCommonStoragePasswordEncryption" )
diff --git a/package/source/xstor/xfactory.cxx b/package/source/xstor/xfactory.cxx
index 2b28fdc..dcb8dd2 100644
--- a/package/source/xstor/xfactory.cxx
+++ b/package/source/xstor/xfactory.cxx
@@ -182,22 +182,23 @@ uno::Reference< uno::XInterface > SAL_CALL OStorageFactory::createInstanceWithAr
                aPropsToSet[0].Value <<= aURL;
            }

            for ( sal_Int32 nInd = 0, nNumArgs = 1; nInd < aDescr.getLength(); nInd++ )
            sal_Int32 nNumArgs = 1;
            for ( const auto& rProp : std::as_const(aDescr) )
            {
                if ( aDescr[nInd].Name == "InteractionHandler"
                  || aDescr[nInd].Name == "Password"
                  || aDescr[nInd].Name == "RepairPackage"
                  || aDescr[nInd].Name == "StatusIndicator" )
                if ( rProp.Name == "InteractionHandler"
                  || rProp.Name == "Password"
                  || rProp.Name == "RepairPackage"
                  || rProp.Name == "StatusIndicator" )
                {
                    aPropsToSet.realloc( ++nNumArgs );
                    aPropsToSet[nNumArgs-1].Name = aDescr[nInd].Name;
                    aPropsToSet[nNumArgs-1].Value = aDescr[nInd].Value;
                    aPropsToSet[nNumArgs-1].Name = rProp.Name;
                    aPropsToSet[nNumArgs-1].Value = rProp.Value;
                }
                else if ( aDescr[nInd].Name == "StorageFormat" )
                else if ( rProp.Name == "StorageFormat" )
                {
                    OUString aFormatName;
                    sal_Int32 nFormatID = 0;
                    if ( aDescr[nInd].Value >>= aFormatName )
                    if ( rProp.Value >>= aFormatName )
                    {
                        if ( aFormatName == PACKAGE_STORAGE_FORMAT_STRING )
                            nStorageType = embed::StorageFormats::PACKAGE;
@@ -208,7 +209,7 @@ uno::Reference< uno::XInterface > SAL_CALL OStorageFactory::createInstanceWithAr
                        else
                            throw lang::IllegalArgumentException( THROW_WHERE, uno::Reference< uno::XInterface >(), 1 );
                    }
                    else if ( aDescr[nInd].Value >>= nFormatID )
                    else if ( rProp.Value >>= nFormatID )
                    {
                        if ( nFormatID != embed::StorageFormats::PACKAGE
                          && nFormatID != embed::StorageFormats::ZIP
@@ -220,12 +221,12 @@ uno::Reference< uno::XInterface > SAL_CALL OStorageFactory::createInstanceWithAr
                    else
                        throw lang::IllegalArgumentException( THROW_WHERE, uno::Reference< uno::XInterface >(), 1 );
                }
                else if (aDescr[nInd].Name == "NoFileSync")
                else if (rProp.Name == "NoFileSync")
                {
                    // Forward NoFileSync to the storage.
                    aPropsToSet.realloc(++nNumArgs);
                    aPropsToSet[nNumArgs - 1].Name = aDescr[nInd].Name;
                    aPropsToSet[nNumArgs - 1].Value = aDescr[nInd].Value;
                    aPropsToSet[nNumArgs - 1].Name = rProp.Name;
                    aPropsToSet[nNumArgs - 1].Value = rProp.Value;
                }
                else
                    OSL_FAIL( "Unacceptable property, will be ignored!" );
diff --git a/package/source/xstor/xstorage.cxx b/package/source/xstor/xstorage.cxx
index 16ae4a9..f879273 100644
--- a/package/source/xstor/xstorage.cxx
+++ b/package/source/xstor/xstorage.cxx
@@ -141,8 +141,8 @@ void OStorage_Impl::completeStorageStreamCopy_Impl(
            aPropNames[1] = "MediaType";
        }

        for ( int ind = 0; ind < aPropNames.getLength(); ind++ )
            xDestProps->setPropertyValue( aPropNames[ind], xSourceProps->getPropertyValue( aPropNames[ind] ) );
        for ( const auto& rPropName : std::as_const(aPropNames) )
            xDestProps->setPropertyValue( rPropName, xSourceProps->getPropertyValue( rPropName ) );
}

static uno::Reference< io::XInputStream > GetSeekableTempCopy( const uno::Reference< io::XInputStream >& xInStream,
@@ -340,9 +340,9 @@ OStorage_Impl::~OStorage_Impl()
    m_xPackage.clear();

    OUString aPropertyName = "URL";
    for ( sal_Int32 aInd = 0; aInd < m_xProperties.getLength(); ++aInd )
    for ( const auto& rProp : std::as_const(m_xProperties) )
    {
        if ( m_xProperties[aInd].Name == aPropertyName )
        if ( rProp.Name == aPropertyName )
        {
            // the storage is URL based so all the streams are opened by factory and should be closed
            try
@@ -429,19 +429,18 @@ void OStorage_Impl::OpenOwnPackage()
                                                    uno::makeAny( false ) );

            sal_Int32 nArgNum = 2;
            for ( sal_Int32 aInd = 0; aInd < m_xProperties.getLength(); aInd++ )
            for ( const auto& rProp : std::as_const(m_xProperties) )
            {
                if ( m_xProperties[aInd].Name == "RepairPackage"
                  || m_xProperties[aInd].Name == "ProgressHandler"
                  || m_xProperties[aInd].Name == "NoFileSync" )
                if ( rProp.Name == "RepairPackage"
                  || rProp.Name == "ProgressHandler"
                  || rProp.Name == "NoFileSync" )
                {
                    // Forward these to the package.
                    beans::NamedValue aNamedValue( m_xProperties[aInd].Name,
                                                    m_xProperties[aInd].Value );
                    beans::NamedValue aNamedValue( rProp.Name, rProp.Value );
                    aArguments.realloc( ++nArgNum );
                    aArguments[nArgNum-1] <<= aNamedValue;
                }
                else if ( m_xProperties[aInd].Name == "Password" )
                else if ( rProp.Name == "Password" )
                {
                    // TODO: implement password setting for documents
                    // the password entry must be removed after setting
@@ -771,15 +770,15 @@ void OStorage_Impl::CopyStorageElement( SotElement_Impl* pElement,
            {
                // fill in the properties for the stream
                uno::Sequence< beans::PropertyValue > aStrProps(0);
                uno::Sequence< beans::PropertyValue > aSrcPkgProps = pElement->m_xStream->GetStreamProperties();
                const uno::Sequence< beans::PropertyValue > aSrcPkgProps = pElement->m_xStream->GetStreamProperties();
                sal_Int32 nNum = 0;
                for ( int ind = 0; ind < aSrcPkgProps.getLength(); ind++ )
                for ( const auto& rSrcPkgProp : aSrcPkgProps )
                {
                    if ( aSrcPkgProps[ind].Name == "MediaType" || aSrcPkgProps[ind].Name == "Compressed" )
                    if ( rSrcPkgProp.Name == "MediaType" || rSrcPkgProp.Name == "Compressed" )
                    {
                        aStrProps.realloc( ++nNum );
                        aStrProps[nNum-1].Name = aSrcPkgProps[ind].Name;
                        aStrProps[nNum-1].Value = aSrcPkgProps[ind].Value;
                        aStrProps[nNum-1].Name = rSrcPkgProp.Name;
                        aStrProps[nNum-1].Value = rSrcPkgProp.Value;
                    }
                }

@@ -1684,7 +1683,7 @@ void OStorage_Impl::CommitRelInfo( const uno::Reference< container::XNameContain

        if (m_nRelInfoStatus == RELINFO_CHANGED)
        {
            if (m_aRelInfo.getLength())
            if (m_aRelInfo.hasElements())
            {
                CreateRelStorage();

@@ -3152,7 +3151,7 @@ uno::Reference< io::XStream > SAL_CALL OStorage::openEncryptedStream(
    if ( ( nOpenMode & embed::ElementModes::WRITE ) && m_pData->m_bReadOnlyWrap )
        throw io::IOException( THROW_WHERE ); // TODO: access denied

    if ( !aEncryptionData.getLength() )
    if ( !aEncryptionData.hasElements() )
        throw lang::IllegalArgumentException( THROW_WHERE, uno::Reference< uno::XInterface >(), 3 );

    uno::Reference< io::XStream > xResult;
@@ -3235,7 +3234,7 @@ uno::Reference< io::XStream > SAL_CALL OStorage::cloneEncryptedStream(
        throw lang::DisposedException( THROW_WHERE );
    }

    if ( !aEncryptionData.getLength() )
    if ( !aEncryptionData.hasElements() )
        throw lang::IllegalArgumentException( THROW_WHERE, uno::Reference< uno::XInterface >(), 2 );

    try
@@ -4102,7 +4101,7 @@ void SAL_CALL OStorage::setEncryptionData( const uno::Sequence< beans::NamedValu
    if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
        throw uno::RuntimeException( THROW_WHERE ); // the interface must be visible only for package storage

    if ( !aEncryptionData.getLength() )
    if ( !aEncryptionData.hasElements() )
        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!" );
@@ -4167,7 +4166,7 @@ void SAL_CALL OStorage::setEncryptionAlgorithms( const uno::Sequence< beans::Nam
    if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
        throw uno::RuntimeException( THROW_WHERE ); // the interface must be visible only for package storage

    if ( !aAlgorithms.getLength() )
    if ( !aAlgorithms.hasElements() )
        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!" );
@@ -4227,7 +4226,7 @@ void SAL_CALL OStorage::setGpgProperties( const uno::Sequence< uno::Sequence< be
    if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
        throw uno::RuntimeException( THROW_WHERE ); // the interface must be visible only for package storage

    if ( !aProps.getLength() )
    if ( !aProps.hasElements() )
        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!" );
@@ -4501,11 +4500,10 @@ uno::Any SAL_CALL OStorage::getPropertyValue( const OUString& aPropertyName )
        if ( aPropertyName == "URL"
          || aPropertyName == "RepairPackage" )
        {
            for ( sal_Int32 aInd = 0; aInd < m_pImpl->m_xProperties.getLength(); aInd++ )
            {
                if ( m_pImpl->m_xProperties[aInd].Name == aPropertyName )
                    return m_pImpl->m_xProperties[aInd].Value;
            }
            auto pProp = std::find_if(std::cbegin(m_pImpl->m_xProperties), std::cend(m_pImpl->m_xProperties),
                [&aPropertyName](const css::beans::PropertyValue& rProp) { return rProp.Name == aPropertyName; });
            if (pProp != std::cend(m_pImpl->m_xProperties))
                return pProp->Value;

            if ( aPropertyName == "URL" )
                return uno::makeAny( OUString() );
@@ -4633,6 +4631,16 @@ sal_Bool SAL_CALL OStorage::hasByID(  const OUString& sID )
    return false;
}

namespace
{

const beans::StringPair* lcl_findPairByName(const uno::Sequence<beans::StringPair>& rSeq, const OUString& rName)
{
    return std::find_if(rSeq.begin(), rSeq.end(), [&rName](const beans::StringPair& rPair) { return rPair.First == rName; });
}

}

OUString SAL_CALL OStorage::getTargetByID(  const OUString& sID  )
{
    ::osl::MutexGuard aGuard( m_pData->m_xSharedMutex->GetMutex() );
@@ -4646,10 +4654,10 @@ OUString SAL_CALL OStorage::getTargetByID(  const OUString& sID  )
    if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException( THROW_WHERE );

    uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
        if ( aSeq[nInd].First == "Target" )
            return aSeq[nInd].Second;
    const uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    auto pRel = lcl_findPairByName(aSeq, "Target");
    if (pRel != aSeq.end())
        return pRel->Second;

    return OUString();
}
@@ -4667,10 +4675,10 @@ OUString SAL_CALL OStorage::getTypeByID(  const OUString& sID  )
    if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException( THROW_WHERE );

    uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
        if ( aSeq[nInd].First == "Type" )
            return aSeq[nInd].Second;
    const uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
    auto pRel = lcl_findPairByName(aSeq, "Type");
    if (pRel != aSeq.end())
        return pRel->Second;

    return OUString();
}
@@ -4689,15 +4697,14 @@ uno::Sequence< beans::StringPair > SAL_CALL OStorage::getRelationshipByID(  cons
        throw uno::RuntimeException( THROW_WHERE );

    // TODO/LATER: in future the unification of the ID could be checked
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == "Id" )
            {
                if ( aSeq[nInd1][nInd2].Second == sID )
                    return aSeq[nInd1];
                break;
            }
    const uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    const beans::StringPair aIDRel("Id", sID);

    auto pRel = std::find_if(aSeq.begin(), aSeq.end(),
        [&aIDRel](const uno::Sequence<beans::StringPair>& rRel) {
            return std::find(rRel.begin(), rRel.end(), aIDRel) != rRel.end(); });
    if (pRel != aSeq.end())
        return *pRel;

    throw container::NoSuchElementException( THROW_WHERE );
}
@@ -4715,25 +4722,20 @@ uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OStorage::getRelati
    if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException( THROW_WHERE );

    uno::Sequence< uno::Sequence< beans::StringPair > > aResult;
    sal_Int32 nEntriesNum = 0;

    // TODO/LATER: in future the unification of the ID could be checked
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == "Type" )
            {
                // the type is usually a URL, so the check should be case insensitive
                if ( aSeq[nInd1][nInd2].Second.equalsIgnoreAsciiCase( sType ) )
                {
                    aResult.realloc( ++nEntriesNum );
                    aResult[nEntriesNum-1] = aSeq[nInd1];
                }
                break;
            }
    const uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    std::vector< uno::Sequence< beans::StringPair > > aResult;
    aResult.reserve(aSeq.getLength());

    return aResult;
    std::copy_if(aSeq.begin(), aSeq.end(), std::back_inserter(aResult),
        [&sType](const uno::Sequence<beans::StringPair>& rRel) {
            auto pRel = lcl_findPairByName(rRel, "Type");
            return pRel != rRel.end()
                // the type is usually a URL, so the check should be case insensitive
                && pRel->Second.equalsIgnoreAsciiCase( sType );
        });

    return comphelper::containerToSequence(aResult);
}

uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OStorage::getAllRelationships()
@@ -4786,21 +4788,18 @@ void SAL_CALL OStorage::insertRelationshipByID(  const OUString& sID, const uno:
    if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
        throw uno::RuntimeException( THROW_WHERE );

    OUString aIDTag( "Id" );
    const beans::StringPair aIDRel("Id", sID);

    sal_Int32 nIDInd = -1;

    // TODO/LATER: in future the unification of the ID could be checked
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == aIDTag )
            {
                if ( aSeq[nInd1][nInd2].Second == sID )
                    nIDInd = nInd1;

                break;
            }
    for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
    {
        const auto& rRel = aSeq[nInd];
        if (std::find(rRel.begin(), rRel.end(), aIDRel) != rRel.end())
            nIDInd = nInd;
    }

    if ( nIDInd != -1 && !bReplace )
        throw container::ElementExistException( THROW_WHERE );
@@ -4811,20 +4810,14 @@ void SAL_CALL OStorage::insertRelationshipByID(  const OUString& sID, const uno:
        aSeq.realloc( nIDInd + 1 );
    }

    aSeq[nIDInd].realloc( aEntry.getLength() + 1 );
    std::vector<beans::StringPair> aResult;
    aResult.reserve(aEntry.getLength() + 1);

    aSeq[nIDInd][0].First = aIDTag;
    aSeq[nIDInd][0].Second = sID;
    sal_Int32 nIndTarget = 1;
    for ( sal_Int32 nIndOrig = 0;
          nIndOrig < aEntry.getLength();
          nIndOrig++ )
    {
        if ( aEntry[nIndOrig].First != aIDTag )
            aSeq[nIDInd][nIndTarget++] = aEntry[nIndOrig];
    }
    aResult.push_back(aIDRel);
    std::copy_if(aEntry.begin(), aEntry.end(), std::back_inserter(aResult),
        [](const beans::StringPair& rPair) { return rPair.First != "Id"; });

    aSeq[nIDInd].realloc( nIndTarget );
    aSeq[nIDInd] = comphelper::containerToSequence(aResult);

    m_pImpl->m_aRelInfo = aSeq;
    m_pImpl->m_xNewRelInfoStream.clear();
@@ -4845,26 +4838,22 @@ void SAL_CALL OStorage::removeRelationshipByID(  const OUString& sID  )
        throw uno::RuntimeException( THROW_WHERE );

    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
        for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
            if ( aSeq[nInd1][nInd2].First == "Id" )
            {
                if ( aSeq[nInd1][nInd2].Second == sID )
                {
                    sal_Int32 nLength = aSeq.getLength();
                    aSeq[nInd1] = aSeq[nLength-1];
                    aSeq.realloc( nLength - 1 );
    const beans::StringPair aIDRel("Id", sID);
    auto pRel = std::find_if(std::cbegin(aSeq), std::cend(aSeq),
        [&aIDRel](const uno::Sequence< beans::StringPair >& rRel) {
            return std::find(rRel.begin(), rRel.end(), aIDRel) != rRel.end(); });
    if (pRel != std::cend(aSeq))
    {
        auto nInd = static_cast<sal_Int32>(std::distance(std::cbegin(aSeq), pRel));
        comphelper::removeElementAt(aSeq, nInd);

                    m_pImpl->m_aRelInfo = aSeq;
                    m_pImpl->m_xNewRelInfoStream.clear();
                    m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;
        m_pImpl->m_aRelInfo = aSeq;
        m_pImpl->m_xNewRelInfoStream.clear();
        m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;

                    // TODO/LATER: in future the unification of the ID could be checked
                    return;
                }

                break;
            }
        // TODO/LATER: in future the unification of the ID could be checked
        return;
    }

    throw container::NoSuchElementException( THROW_WHERE );
}
@@ -4883,67 +4872,41 @@ void SAL_CALL OStorage::insertRelationships(  const uno::Sequence< uno::Sequence
        throw uno::RuntimeException( THROW_WHERE );

    OUString aIDTag( "Id" );
    uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    uno::Sequence< uno::Sequence< beans::StringPair > > aResultSeq( aSeq.getLength() + aEntries.getLength() );
    sal_Int32 nResultInd = 0;
    const uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
    std::vector< uno::Sequence<beans::StringPair> > aResultVec;
    aResultVec.reserve(aSeq.getLength() + aEntries.getLength());

    for ( sal_Int32 nIndTarget1 = 0; nIndTarget1 < aSeq.getLength(); nIndTarget1++ )
        for ( sal_Int32 nIndTarget2 = 0; nIndTarget2 < aSeq[nIndTarget1].getLength(); nIndTarget2++ )
            if ( aSeq[nIndTarget1][nIndTarget2].First == aIDTag )
            {
                sal_Int32 nIndSourceSame = -1;
    std::copy_if(aSeq.begin(), aSeq.end(), std::back_inserter(aResultVec),
        [&aIDTag, &aEntries, bReplace](const uno::Sequence<beans::StringPair>& rTargetRel) {
            auto pTargetPair = lcl_findPairByName(rTargetRel, aIDTag);
            if (pTargetPair == rTargetRel.end())
                return false;

                for ( sal_Int32 nIndSource1 = 0; nIndSource1 < aEntries.getLength(); nIndSource1++ )
                    for ( sal_Int32 nIndSource2 = 0; nIndSource2 < aEntries[nIndSource1].getLength(); nIndSource2++ )
                    {
                        if ( aEntries[nIndSource1][nIndSource2].First == aIDTag )
                        {
                            if ( aEntries[nIndSource1][nIndSource2].Second == aSeq[nIndTarget1][nIndTarget2].Second )
                            {
                                if ( !bReplace )
                                    throw container::ElementExistException( THROW_WHERE );
            bool bIsSourceSame = std::any_of(aEntries.begin(), aEntries.end(),
                [&pTargetPair](const uno::Sequence<beans::StringPair>& rSourceEntry) {
                    return std::find(rSourceEntry.begin(), rSourceEntry.end(), *pTargetPair) != rSourceEntry.end(); });

                                nIndSourceSame = nIndSource1;
                            }
            if ( bIsSourceSame && !bReplace )
                throw container::ElementExistException( THROW_WHERE );

                            break;
                        }
                    }
            // if no such element in the provided sequence
            return !bIsSourceSame;
        });

                if ( nIndSourceSame == -1 )
                {
                    // no such element in the provided sequence
                    aResultSeq[nResultInd++] = aSeq[nIndTarget1];
                }

                break;
            }

    for ( sal_Int32 nIndSource1 = 0; nIndSource1 < aEntries.getLength(); nIndSource1++ )
    {
        aResultSeq[nResultInd].realloc( aEntries[nIndSource1].getLength() );
        bool bHasID = false;
        sal_Int32 nResInd2 = 1;

        for ( sal_Int32 nIndSource2 = 0; nIndSource2 < aEntries[nIndSource1].getLength(); nIndSource2++ )
            if ( aEntries[nIndSource1][nIndSource2].First == aIDTag )
            {
                aResultSeq[nResultInd][0] = aEntries[nIndSource1][nIndSource2];
                bHasID = true;
            }
            else if ( nResInd2 < aResultSeq[nResultInd].getLength() )
                aResultSeq[nResultInd][nResInd2++] = aEntries[nIndSource1][nIndSource2];
            else
    std::transform(aEntries.begin(), aEntries.end(), std::back_inserter(aResultVec),
        [&aIDTag](const uno::Sequence<beans::StringPair>& rEntry) -> uno::Sequence<beans::StringPair> {
            auto pPair = lcl_findPairByName(rEntry, aIDTag);
            if (pPair == rEntry.end())
                throw io::IOException( THROW_WHERE ); // TODO: illegal relation ( no ID )

        if ( !bHasID )
            throw io::IOException( THROW_WHERE ); // TODO: illegal relations
            auto aResult = comphelper::sequenceToContainer<std::vector<beans::StringPair>>(rEntry);
            auto nIDInd = std::distance(rEntry.begin(), pPair);
            std::rotate(aResult.begin(), std::next(aResult.begin(), nIDInd), std::next(aResult.begin(), nIDInd + 1));

        nResultInd++;
    }
            return comphelper::containerToSequence(aResult);
        });

    aResultSeq.realloc( nResultInd );
    m_pImpl->m_aRelInfo = aResultSeq;
    m_pImpl->m_aRelInfo = comphelper::containerToSequence(aResultVec);
    m_pImpl->m_xNewRelInfoStream.clear();
    m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;
}
diff --git a/package/source/zippackage/ZipPackage.cxx b/package/source/zippackage/ZipPackage.cxx
index 574b7a4..4ade3f6 100644
--- a/package/source/zippackage/ZipPackage.cxx
+++ b/package/source/zippackage/ZipPackage.cxx
@@ -200,46 +200,43 @@ void ZipPackage::parseManifest()
                        const OUString sPropStartKeyAlgorithm ("StartKeyAlgorithm");
                        const OUString sKeyInfo ("KeyInfo");

                        uno::Sequence < uno::Sequence < PropertyValue > > aManifestSequence = xReader->readManifestSequence ( xSink->getInputStream() );
                        sal_Int32 nLength = aManifestSequence.getLength();
                        const uno::Sequence < PropertyValue > *pSequence = aManifestSequence.getConstArray();
                        const uno::Sequence < uno::Sequence < PropertyValue > > aManifestSequence = xReader->readManifestSequence ( xSink->getInputStream() );
                        ZipPackageStream *pStream = nullptr;
                        ZipPackageFolder *pFolder = nullptr;
                        const Any *pKeyInfo = nullptr;

                        for ( sal_Int32 i = 0; i < nLength ; i++, pSequence++ )
                        for ( const uno::Sequence<PropertyValue>& rSequence : aManifestSequence )
                        {
                            OUString sPath, sMediaType, sVersion;
                            const PropertyValue *pValue = pSequence->getConstArray();
                            const Any *pSalt = nullptr, *pVector = nullptr, *pCount = nullptr, *pSize = nullptr, *pDigest = nullptr, *pDigestAlg = nullptr, *pEncryptionAlg = nullptr, *pStartKeyAlg = nullptr, *pDerivedKeySize = nullptr;
                            for ( sal_Int32 j = 0, nNum = pSequence->getLength(); j < nNum; j++ )
                            for ( const PropertyValue& rValue : rSequence )
                            {
                                if ( pValue[j].Name == sPropFullPath )
                                    pValue[j].Value >>= sPath;
                                else if ( pValue[j].Name == sPropVersion )
                                    pValue[j].Value >>= sVersion;
                                else if ( pValue[j].Name == sPropMediaType )
                                    pValue[j].Value >>= sMediaType;
                                else if ( pValue[j].Name == sPropSalt )
                                    pSalt = &( pValue[j].Value );
                                else if ( pValue[j].Name == sPropInitialisationVector )
                                    pVector = &( pValue[j].Value );
                                else if ( pValue[j].Name == sPropIterationCount )
                                    pCount = &( pValue[j].Value );
                                else if ( pValue[j].Name == sPropSize )
                                    pSize = &( pValue[j].Value );
                                else if ( pValue[j].Name == sPropDigest )
                                    pDigest = &( pValue[j].Value );
                                else if ( pValue[j].Name == sPropDigestAlgorithm )
                                    pDigestAlg = &( pValue[j].Value );
                                else if ( pValue[j].Name == sPropEncryptionAlgorithm )
                                    pEncryptionAlg = &( pValue[j].Value );
                                else if ( pValue[j].Name == sPropStartKeyAlgorithm )
                                    pStartKeyAlg = &( pValue[j].Value );
                                else if ( pValue[j].Name == sPropDerivedKeySize )
                                    pDerivedKeySize = &( pValue[j].Value );
                                else if ( pValue[j].Name == sKeyInfo )
                                    pKeyInfo = &( pValue[j].Value );
                                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 ) )
@@ -469,26 +466,25 @@ void ZipPackage::parseContentType()
                uno::Reference< io::XInputStream > xInStream = xSink->getInputStream();
                if ( xInStream.is() )
                {
                    sal_Int32 nInd = 0;
                    // here aContentTypeInfo[0] - Defaults, and aContentTypeInfo[1] - Overrides
                    uno::Sequence< uno::Sequence< beans::StringPair > > aContentTypeInfo =
                    const uno::Sequence< uno::Sequence< beans::StringPair > > aContentTypeInfo =
                        ::comphelper::OFOPXMLHelper::ReadContentTypeSequence( xInStream, m_xContext );

                    if ( aContentTypeInfo.getLength() != 2 )
                        throw io::IOException(THROW_WHERE );

                    // set the implicit types first
                    for ( nInd = 0; nInd < aContentTypeInfo[0].getLength(); nInd++ )
                        m_xRootFolder->setChildStreamsTypeByExtension( aContentTypeInfo[0][nInd] );
                    for ( const auto& rPair : aContentTypeInfo[0] )
                        m_xRootFolder->setChildStreamsTypeByExtension( rPair );

                    // now set the explicit types
                    for ( nInd = 0; nInd < aContentTypeInfo[1].getLength(); nInd++ )
                    for ( const auto& rPair : aContentTypeInfo[1] )
                    {
                        OUString aPath;
                        if ( aContentTypeInfo[1][nInd].First.toChar() == '/' )
                            aPath = aContentTypeInfo[1][nInd].First.copy( 1 );
                        if ( rPair.First.toChar() == '/' )
                            aPath = rPair.First.copy( 1 );
                        else
                            aPath = aContentTypeInfo[1][nInd].First;
                            aPath = rPair.First;

                        if ( !aPath.isEmpty() && hasByHierarchicalName( aPath ) )
                        {
@@ -500,7 +496,7 @@ void ZipPackage::parseContentType()
                            {
                                // this is a package stream, in OFOPXML format only streams can have mediatype
                                ZipPackageStream *pStream = reinterpret_cast < ZipPackageStream* > ( nTest );
                                pStream->SetMediaType( aContentTypeInfo[1][nInd].Second );
                                pStream->SetMediaType( rPair.Second );
                            }
                        }
                    }
@@ -604,10 +600,10 @@ void SAL_CALL ZipPackage::initialize( const uno::Sequence< Any >& aArguments )
    {
        bool bHaveZipFile = true;

        for( int ind = 0; ind < aArguments.getLength(); ind++ )
        for( const auto& rArgument : aArguments )
        {
            OUString aParamUrl;
            if ( aArguments[ind] >>= aParamUrl )
            if ( rArgument >>= aParamUrl )
            {
                m_eMode = e_IMode_URL;
                try
@@ -670,17 +666,17 @@ void SAL_CALL ZipPackage::initialize( const uno::Sequence< Any >& aArguments )
                    bHaveZipFile = false;
                }
            }
            else if ( aArguments[ind] >>= m_xStream )
            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 ( aArguments[ind] >>= m_xContentStream )
            else if ( rArgument >>= m_xContentStream )
            {
                m_eMode = e_IMode_XInputStream;
            }
            else if ( aArguments[ind] >>= aNamedValue )
            else if ( rArgument >>= aNamedValue )
            {
                if ( aNamedValue.Name == "RepairPackage" )
                    aNamedValue.Value >>= m_bForceRecovery;
@@ -1642,9 +1638,9 @@ const uno::Sequence< sal_Int8 > ZipPackage::GetEncryptionKey()
        else
            throw uno::RuntimeException(THROW_WHERE "No expected key is provided!" );

        for ( sal_Int32 nInd = 0; nInd < m_aStorageEncryptionKeys.getLength(); nInd++ )
            if ( m_aStorageEncryptionKeys[nInd].Name == aNameToFind )
                m_aStorageEncryptionKeys[nInd].Value >>= aResult;
        for ( const auto& rKey : std::as_const(m_aStorageEncryptionKeys) )
            if ( rKey.Name == aNameToFind )
                rKey.Value >>= aResult;

        // empty keys are not allowed here
        // so it is not important whether there is no key, or the key is empty, it is an error
@@ -1759,11 +1755,11 @@ void SAL_CALL ZipPackage::setPropertyValue( const OUString& aPropertyName, const
        {
            bool bHasSHA256 = false;
            bool bHasSHA1 = false;
            for ( sal_Int32 nInd = 0; nInd < aKeys.getLength(); nInd++ )
            for ( const auto& rKey : std::as_const(aKeys) )
            {
                if ( aKeys[nInd].Name == PACKAGE_ENCRYPTIONDATA_SHA256UTF8 )
                if ( rKey.Name == PACKAGE_ENCRYPTIONDATA_SHA256UTF8 )
                    bHasSHA256 = true;
                if ( aKeys[nInd].Name == PACKAGE_ENCRYPTIONDATA_SHA1UTF8 )
                if ( rKey.Name == PACKAGE_ENCRYPTIONDATA_SHA1UTF8 )
                    bHasSHA1 = true;
            }

@@ -1783,30 +1779,30 @@ void SAL_CALL ZipPackage::setPropertyValue( const OUString& aPropertyName, const
            throw IllegalArgumentException(THROW_WHERE "unexpected algorithms list is provided.", uno::Reference< uno::XInterface >(), 2 );
        }

        for ( sal_Int32 nInd = 0; nInd < aAlgorithms.getLength(); nInd++ )
        for ( const auto& rAlgorithm : std::as_const(aAlgorithms) )
        {
            if ( aAlgorithms[nInd].Name == "StartKeyGenerationAlgorithm" )
            if ( rAlgorithm.Name == "StartKeyGenerationAlgorithm" )
            {
                sal_Int32 nID = 0;
                if ( !( aAlgorithms[nInd].Value >>= nID )
                if ( !( rAlgorithm.Value >>= nID )
                  || ( nID != xml::crypto::DigestID::SHA256 && nID != xml::crypto::DigestID::SHA1 ) )
                    throw IllegalArgumentException(THROW_WHERE "Unexpected start key generation algorithm is provided!", uno::Reference< uno::XInterface >(), 2 );

                m_nStartKeyGenerationID = nID;
            }
            else if ( aAlgorithms[nInd].Name == "EncryptionAlgorithm" )
            else if ( rAlgorithm.Name == "EncryptionAlgorithm" )
            {
                sal_Int32 nID = 0;
                if ( !( aAlgorithms[nInd].Value >>= nID )
                if ( !( rAlgorithm.Value >>= nID )
                  || ( nID != xml::crypto::CipherID::AES_CBC_W3C_PADDING && nID != xml::crypto::CipherID::BLOWFISH_CFB_8 ) )
                    throw IllegalArgumentException(THROW_WHERE "Unexpected start key generation algorithm is provided!", uno::Reference< uno::XInterface >(), 2 );

                m_nCommonEncryptionID = nID;
            }
            else if ( aAlgorithms[nInd].Name == "ChecksumAlgorithm" )
            else if ( rAlgorithm.Name == "ChecksumAlgorithm" )
            {
                sal_Int32 nID = 0;
                if ( !( aAlgorithms[nInd].Value >>= nID )
                if ( !( rAlgorithm.Value >>= nID )
                  || ( nID != xml::crypto::DigestID::SHA1_1K && nID != xml::crypto::DigestID::SHA256_1K ) )
                    throw IllegalArgumentException(THROW_WHERE "Unexpected start key generation algorithm is provided!", uno::Reference< uno::XInterface >(), 2 );

diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx
index dc49729..25c7050 100644
--- a/package/source/zippackage/ZipPackageStream.cxx
+++ b/package/source/zippackage/ZipPackageStream.cxx
@@ -237,9 +237,9 @@ uno::Sequence<sal_Int8> ZipPackageStream::GetEncryptionKey(Bugs const bugs)
        else
            throw uno::RuntimeException(THROW_WHERE "No expected key is provided!" );

        for ( sal_Int32 nInd = 0; nInd < m_aStorageEncryptionKeys.getLength(); nInd++ )
            if ( m_aStorageEncryptionKeys[nInd].Name == aNameToFind )
                m_aStorageEncryptionKeys[nInd].Value >>= aResult;
        for ( const auto& rKey : std::as_const(m_aStorageEncryptionKeys) )
            if ( rKey.Name == aNameToFind )
                rKey.Value >>= aResult;

        // empty keys are not allowed here
        // so it is not important whether there is no key, or the key is empty, it is an error
diff --git a/package/source/zippackage/zipfileaccess.cxx b/package/source/zippackage/zipfileaccess.cxx
index f5b0a4b..fe584de 100644
--- a/package/source/zippackage/zipfileaccess.cxx
+++ b/package/source/zippackage/zipfileaccess.cxx
@@ -214,10 +214,8 @@ void SAL_CALL OZipFileAccess::initialize( const uno::Sequence< uno::Any >& aArgu
    }
    else if (aArguments[0] >>= aArgs)
    {
        for (sal_Int32 i = 0; i < aArgs.getLength(); ++i)
        for (const beans::NamedValue& rArg : std::as_const(aArgs))
        {
            const beans::NamedValue& rArg = aArgs[i];

            if (rArg.Name == "URL")
                rArg.Value >>= aParamURL;
        }