sfx2/source/doc/doctempl.cxx | 111 +++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 61 deletions(-)
New commits: commit 74d0fe2b2186d9802798f07cbf4ad71865f4e081 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Fri Dec 6 16:08:22 2024 +0000 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Sun Dec 15 16:35:04 2024 +0100 cid#1607171 Data race condition and cid#1606809 Data race condition Change-Id: I27919537a022f8375b0be2df0549ae9878ef0a2e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178488 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> diff --git a/sfx2/source/doc/doctempl.cxx b/sfx2/source/doc/doctempl.cxx index ce2a9e5214e1..20f7dbd29af1 100644 --- a/sfx2/source/doc/doctempl.cxx +++ b/sfx2/source/doc/doctempl.cxx @@ -98,8 +98,6 @@ namespace { class DocTempl_EntryData_Impl { - RegionData_Impl* mpParent; - // the following member must be SfxObjectShellLock since it controls that SfxObjectShell lifetime by design // and users of this class expect it to be so. SfxObjectShellLock mxObjShell; @@ -109,12 +107,11 @@ class DocTempl_EntryData_Impl OUString maTargetURL; public: - DocTempl_EntryData_Impl( RegionData_Impl* pParent, - const OUString& rTitle ); + DocTempl_EntryData_Impl(const OUString& rTitle); const OUString& GetTitle() const { return maTitle; } - const OUString& GetTargetURL(); - const OUString& GetHierarchyURL(); + const OUString& GetTargetURL(const INetURLObject& rRootURL); + const OUString& GetHierarchyURL(const INetURLObject& rRootURL); void SetTitle( const OUString& rTitle ) { maTitle = rTitle; } void SetTargetURL( const OUString& rURL ) { maTargetURL = rURL; } @@ -133,7 +130,6 @@ namespace { class RegionData_Impl { - const SfxDocTemplate_Impl* mpParent; std::vector<std::unique_ptr<DocTempl_EntryData_Impl>> maEntries; OUString maTitle; OUString maOwnURL; @@ -143,8 +139,7 @@ private: bool& rFound ) const; public: - RegionData_Impl( const SfxDocTemplate_Impl* pParent, - OUString aTitle ); + RegionData_Impl(OUString aTitle); void SetHierarchyURL( const OUString& rURL) { maOwnURL = rURL; } @@ -152,15 +147,16 @@ public: DocTempl_EntryData_Impl* GetEntry( std::u16string_view rName ) const; const OUString& GetTitle() const { return maTitle; } - const OUString& GetHierarchyURL(); + const OUString& GetHierarchyURL(const INetURLObject& rRootURL); size_t GetCount() const; void SetTitle( const OUString& rTitle ) { maTitle = rTitle; } - void AddEntry( const OUString& rTitle, - const OUString& rTargetURL, - const size_t *pPos ); + void AddEntry(const INetURLObject& rRootURL, + const OUString& rTitle, + const OUString& rTargetURL, + const size_t *pPos); void DeleteEntry( size_t nIndex ); int Compare( RegionData_Impl const * pCompareWith ) const; @@ -173,7 +169,7 @@ class SfxDocTemplate_Impl : public SvRefBase uno::Reference< XPersist > mxInfo; uno::Reference< XDocumentTemplates > mxTemplates; - std::mutex maMutex; + mutable std::mutex maMutex; OUString maRootURL; OUString maStandardGroup; std::vector<std::unique_ptr<RegionData_Impl>> maRegions; @@ -213,9 +209,18 @@ public: bool GetTitleFromURL( const OUString& rURL, OUString& aTitle ); bool InsertRegion( std::unique_ptr<RegionData_Impl> pData, size_t nPos ); - INetURLObject GetRootURL() const { return INetURLObject(maRootURL); } - const uno::Reference< XDocumentTemplates >& getDocTemplates() const { return mxTemplates; } + INetURLObject GetRootURL() const + { + std::unique_lock aGuard(maMutex); + return INetURLObject(maRootURL); + } + + uno::Reference<XDocumentTemplates> getDocTemplates() const + { + std::unique_lock aGuard(maMutex); + return mxTemplates; + } }; namespace { @@ -418,13 +423,12 @@ OUString SfxDocumentTemplates::GetPath { DocTempl_EntryData_Impl *pEntry = pRegion->GetEntry( nIdx ); if ( pEntry ) - return pEntry->GetTargetURL(); + return pEntry->GetTargetURL(pImp->GetRootURL()); } return OUString(); } - OUString SfxDocumentTemplates::GetTemplateTargetURLFromComponent( std::u16string_view aGroupName, std::u16string_view aTitle ) { @@ -616,7 +620,7 @@ bool SfxDocumentTemplates::CopyOrMove if ( xTemplates->addTemplate( pTargetRgn->GetTitle(), aTitle, - pSource->GetTargetURL() ) ) + pSource->GetTargetURL(pImp->GetRootURL()) ) ) { const OUString aNewTargetURL = GetTemplateTargetURLFromComponent( pTargetRgn->GetTitle(), aTitle ); if ( aNewTargetURL.isEmpty() ) @@ -642,7 +646,7 @@ bool SfxDocumentTemplates::CopyOrMove // todo: fix SfxDocumentTemplates to handle size_t instead of sal_uInt16 size_t temp_nTargetIdx = nTargetIdx; - pTargetRgn->AddEntry( aTitle, aNewTargetURL, &temp_nTargetIdx ); + pTargetRgn->AddEntry(pImp->GetRootURL(), aTitle, aNewTargetURL, &temp_nTargetIdx); return true; } @@ -653,7 +657,6 @@ bool SfxDocumentTemplates::CopyOrMove return false; } - bool SfxDocumentTemplates::Move ( sal_uInt16 nTargetRegion, // Target Region Index @@ -766,7 +769,7 @@ bool SfxDocumentTemplates::CopyTo TransferInfo aTransferInfo; aTransferInfo.MoveData = false; - aTransferInfo.SourceURL = pSource->GetTargetURL(); + aTransferInfo.SourceURL = pSource->GetTargetURL(pImp->GetRootURL()); aTransferInfo.NewTitle = aTitle; aTransferInfo.NameClash = NameClash::RENAME; @@ -881,7 +884,7 @@ bool SfxDocumentTemplates::CopyFrom if( bTemplateAdded ) { - INetURLObject aTemplObj( pTargetRgn->GetHierarchyURL() ); + INetURLObject aTemplObj(pTargetRgn->GetHierarchyURL(pImp->GetRootURL())); aTemplObj.insertName( aTitle, false, INetURLObject::LAST_SEGMENT, INetURLObject::EncodeMechanism::All ); @@ -902,7 +905,7 @@ bool SfxDocumentTemplates::CopyFrom // todo: fix SfxDocumentTemplates to handle size_t instead of sal_uInt16 size_t temp_nIdx = nIdx; - pTargetRgn->AddEntry( aTitle, aTemplName, &temp_nIdx ); + pTargetRgn->AddEntry(pImp->GetRootURL(), aTitle, aTemplName, &temp_nIdx); rName = aTitle; return true; } @@ -1016,10 +1019,8 @@ bool SfxDocumentTemplates::InsertDir uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates(); - if ( xTemplates->addGroup( rText ) ) - { - return pImp->InsertRegion( std::make_unique<RegionData_Impl>( pImp.get(), rText ), nRegion ); - } + if (xTemplates->addGroup(rText)) + return pImp->InsertRegion(std::make_unique<RegionData_Impl>(rText), nRegion); return false; } @@ -1037,7 +1038,7 @@ bool SfxDocumentTemplates::InsertTemplate(sal_uInt16 nSourceRegion, sal_uInt16 n return false; size_t pos = nIdx; - pRegion->AddEntry( rName, rPath, &pos ); + pRegion->AddEntry(pImp->GetRootURL(), rName, rPath, &pos); return true; } @@ -1140,7 +1141,7 @@ bool SfxDocumentTemplates::GetFull if ( pEntry ) { - rPath = pEntry->GetTargetURL(); + rPath = pEntry->GetTargetURL(pImp->GetRootURL()); break; } } @@ -1195,7 +1196,7 @@ bool SfxDocumentTemplates::GetLogicNames for ( sal_uInt16 j=0; j<nChildCount; ++j ) { DocTempl_EntryData_Impl *pEntry = pData->GetEntry( j ); - if ( pEntry && pEntry->GetTargetURL() == aPath ) + if ( pEntry && pEntry->GetTargetURL(pImp->GetRootURL()) == aPath ) { rRegion = pData->GetTitle(); rName = pEntry->GetTitle(); @@ -1249,25 +1250,21 @@ void SfxDocumentTemplates::ReInitFromComponent() pImp->ReInitFromComponent(); } -DocTempl_EntryData_Impl::DocTempl_EntryData_Impl( RegionData_Impl* pParent, - const OUString& rTitle ) +DocTempl_EntryData_Impl::DocTempl_EntryData_Impl(const OUString& rTitle) + : maTitle(SfxDocumentTemplates::ConvertResourceString(rTitle)) { - mpParent = pParent; - maTitle = SfxDocumentTemplates::ConvertResourceString(rTitle); } - int DocTempl_EntryData_Impl::Compare( std::u16string_view rTitle ) const { return maTitle.compareTo( rTitle ); } - -const OUString& DocTempl_EntryData_Impl::GetHierarchyURL() +const OUString& DocTempl_EntryData_Impl::GetHierarchyURL(const INetURLObject& rRootURL) { if ( maOwnURL.isEmpty() ) { - INetURLObject aTemplateObj( mpParent->GetHierarchyURL() ); + INetURLObject aTemplateObj(rRootURL); aTemplateObj.insertName( GetTitle(), false, INetURLObject::LAST_SEGMENT, @@ -1280,15 +1277,14 @@ const OUString& DocTempl_EntryData_Impl::GetHierarchyURL() return maOwnURL; } - -const OUString& DocTempl_EntryData_Impl::GetTargetURL() +const OUString& DocTempl_EntryData_Impl::GetTargetURL(const INetURLObject& rRootURL) { if ( maTargetURL.isEmpty() ) { uno::Reference< XCommandEnvironment > aCmdEnv; Content aRegion; - if ( Content::create( GetHierarchyURL(), aCmdEnv, comphelper::getProcessComponentContext(), aRegion ) ) + if ( Content::create( GetHierarchyURL(rRootURL), aCmdEnv, comphelper::getProcessComponentContext(), aRegion ) ) { getTextProperty_Impl( aRegion, TARGET_URL, maTargetURL ); } @@ -1301,10 +1297,8 @@ const OUString& DocTempl_EntryData_Impl::GetTargetURL() return maTargetURL; } - -RegionData_Impl::RegionData_Impl( const SfxDocTemplate_Impl* pParent, - OUString aTitle ) - : mpParent(pParent), maTitle(std::move(aTitle)) +RegionData_Impl::RegionData_Impl(OUString aTitle) + : maTitle(std::move(aTitle)) { } @@ -1328,12 +1322,12 @@ size_t RegionData_Impl::GetEntryPos( std::u16string_view rTitle, bool& rFound ) return nCount; } - -void RegionData_Impl::AddEntry( const OUString& rTitle, - const OUString& rTargetURL, - const size_t *pPos ) +void RegionData_Impl::AddEntry(const INetURLObject& rRootURL, + const OUString& rTitle, + const OUString& rTargetURL, + const size_t *pPos) { - INetURLObject aLinkObj( GetHierarchyURL() ); + INetURLObject aLinkObj( GetHierarchyURL(rRootURL) ); aLinkObj.insertName( rTitle, false, INetURLObject::LAST_SEGMENT, INetURLObject::EncodeMechanism::All ); @@ -1348,8 +1342,7 @@ void RegionData_Impl::AddEntry( const OUString& rTitle, if ( pPos ) nPos = *pPos; - auto pEntry = std::make_unique<DocTempl_EntryData_Impl>( - this, rTitle ); + auto pEntry = std::make_unique<DocTempl_EntryData_Impl>(rTitle); pEntry->SetTargetURL( rTargetURL ); pEntry->SetHierarchyURL( aLinkURL ); if ( nPos < maEntries.size() ) { @@ -1361,18 +1354,16 @@ void RegionData_Impl::AddEntry( const OUString& rTitle, maEntries.push_back( std::move(pEntry) ); } - size_t RegionData_Impl::GetCount() const { return maEntries.size(); } - -const OUString& RegionData_Impl::GetHierarchyURL() +const OUString& RegionData_Impl::GetHierarchyURL(const INetURLObject& rRootURL) { if ( maOwnURL.isEmpty() ) { - INetURLObject aRegionObj( mpParent->GetRootURL() ); + INetURLObject aRegionObj(rRootURL); aRegionObj.insertName( GetTitle(), false, INetURLObject::LAST_SEGMENT, @@ -1385,7 +1376,6 @@ const OUString& RegionData_Impl::GetHierarchyURL() return maOwnURL; } - DocTempl_EntryData_Impl* RegionData_Impl::GetEntry( std::u16string_view rName ) const { bool bFound = false; @@ -1480,7 +1470,7 @@ void SfxDocTemplate_Impl::AddRegion( std::unique_lock<std::mutex>& /*rGuard*/, const OUString& rTitle, Content& rContent ) { - auto pRegion = std::make_unique<RegionData_Impl>( this, rTitle ); + auto pRegion = std::make_unique<RegionData_Impl>(rTitle); auto pRegionTmp = pRegion.get(); if ( ! InsertRegion( std::move(pRegion), size_t(-1) ) ) @@ -1506,13 +1496,12 @@ void SfxDocTemplate_Impl::AddRegion( std::unique_lock<std::mutex>& /*rGuard*/, { while ( xResultSet->next() ) { - pRegionTmp->AddEntry( xRow->getString( 1 ), xRow->getString( 2 ), nullptr ); + pRegionTmp->AddEntry(INetURLObject(maRootURL), xRow->getString( 1 ), xRow->getString( 2 ), nullptr); } } catch ( Exception& ) {} } - void SfxDocTemplate_Impl::CreateFromHierarchy( std::unique_lock<std::mutex>& rGuard, Content &rTemplRoot ) { uno::Reference< XResultSet > xResultSet;