sw/inc/doc.hxx | 7 ++++--- sw/source/core/doc/docnew.cxx | 17 +++++++++-------- sw/source/core/doc/doctxm.cxx | 14 +++++--------- sw/source/uibase/dbui/dbmgr.cxx | 12 ++++++------ 4 files changed, 24 insertions(+), 26 deletions(-)
New commits: commit 26d34f319ba48216785f7fdbf9e6bfdaf2dc6ad2 Author: Michael Stahl <mst...@redhat.com> Date: Thu Jan 25 15:49:34 2018 +0100 sw: fix some bug in SwTOXBaseSection::UpdatePageNum() Looking at UpdatePageNum_ it's fairly obvious that the 2 vectors aNums and aDescs have to be in sync, but aNums is cleared after each iteration while aDescs is not. Change-Id: I41d8a8df5c4c3ae51aa5ea89c21b01651af5651c diff --git a/sw/source/core/doc/doctxm.cxx b/sw/source/core/doc/doctxm.cxx index 3202362cbbf2..aa2bee2db1ad 100644 --- a/sw/source/core/doc/doctxm.cxx +++ b/sw/source/core/doc/doctxm.cxx @@ -1548,8 +1548,6 @@ void SwTOXBaseSection::UpdatePageNum() for( SwTOXSortTabBases::size_type nCnt = 0; nCnt < aSortArr.size(); ++nCnt ) { // Loop over all SourceNodes - std::vector<sal_uInt16> aNums; // the PageNumber - std::vector<SwPageDesc*> aDescs; // The PageDescriptors matching the PageNumbers // process run in lines SwTOXSortTabBases::size_type nRange = 0; @@ -1572,6 +1570,8 @@ void SwTOXBaseSection::UpdatePageNum() for(SwTOXSortTabBases::size_type nRunInEntry = nCnt; nRunInEntry < nCnt + nRange; ++nRunInEntry) { + std::vector<sal_uInt16> aNums; // the PageNumber + std::vector<SwPageDesc*> aDescs; // The PageDescriptors matching the PageNumbers std::vector<sal_uInt16> aMainNums; // contains page numbers of main entries SwTOXSortTabBase* pSortBase = aSortArr[nRunInEntry]; size_t nSize = pSortBase->aTOXSources.size(); @@ -1630,7 +1630,6 @@ void SwTOXBaseSection::UpdatePageNum() UpdatePageNum_( const_cast<SwTextNode*>(pTextNd), aNums, aDescs, &aMainNums, aIntl ); } - aNums.clear(); } } // Delete the mapping array after setting the right PageNumber commit 38af1bb52d3833da7919e61e650fb9ec1bdaf4f7 Author: Michael Stahl <mst...@redhat.com> Date: Thu Jan 25 15:44:34 2018 +0100 sw: de-pointerise local variable in SwTOXBaseSection::UpdatePageNum() Change-Id: I24fcde19ae94cc5a278da6d88e72ce6a57a64951 diff --git a/sw/source/core/doc/doctxm.cxx b/sw/source/core/doc/doctxm.cxx index e19316445785..3202362cbbf2 100644 --- a/sw/source/core/doc/doctxm.cxx +++ b/sw/source/core/doc/doctxm.cxx @@ -1550,7 +1550,6 @@ void SwTOXBaseSection::UpdatePageNum() // Loop over all SourceNodes std::vector<sal_uInt16> aNums; // the PageNumber std::vector<SwPageDesc*> aDescs; // The PageDescriptors matching the PageNumbers - std::vector<sal_uInt16> *pMainNums = nullptr; // contains page numbers of main entries // process run in lines SwTOXSortTabBases::size_type nRange = 0; @@ -1573,6 +1572,7 @@ void SwTOXBaseSection::UpdatePageNum() for(SwTOXSortTabBases::size_type nRunInEntry = nCnt; nRunInEntry < nCnt + nRange; ++nRunInEntry) { + std::vector<sal_uInt16> aMainNums; // contains page numbers of main entries SwTOXSortTabBase* pSortBase = aSortArr[nRunInEntry]; size_t nSize = pSortBase->aTOXSources.size(); for (size_t j = 0; j < nSize; ++j) @@ -1616,9 +1616,7 @@ void SwTOXBaseSection::UpdatePageNum() if(TOX_SORT_INDEX == pSortBase->GetType() && rTOXSource.bMainEntry) { - if(!pMainNums) - pMainNums = new std::vector<sal_uInt16>; - pMainNums->push_back(nPage); + aMainNums.push_back(nPage); } } } @@ -1629,10 +1627,9 @@ void SwTOXBaseSection::UpdatePageNum() const SwTextNode* pTextNd = pBase->pTOXNd->GetTextNode(); OSL_ENSURE( pTextNd, "no TextNode, wrong TOC" ); - UpdatePageNum_( const_cast<SwTextNode*>(pTextNd), aNums, aDescs, pMainNums, + UpdatePageNum_( const_cast<SwTextNode*>(pTextNd), aNums, aDescs, &aMainNums, aIntl ); } - DELETEZ(pMainNums); aNums.clear(); } } commit 7dbe76266cb4250701aaee043933ccb21e5f6564 Author: Michael Stahl <mst...@redhat.com> Date: Thu Jan 25 15:43:19 2018 +0100 sw: convert SwDoc::mpDBManager to unique_ptr Very odd things are happening in dbmgr.cxx to override this member, so add a 2nd member that points to the DBManager that is actually used. Change-Id: If5d4ea1e4951a0406fddcb71302c53ee7b37a34e diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index 726471e1dea6..aa7ee77406cf 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -283,7 +283,8 @@ class SW_DLLPUBLIC SwDoc final SwTOXTypes *mpTOXTypes; //< Tables/indices SwDefTOXBase_Impl * mpDefTOXBases; //< defaults of SwTOXBase's - SwDBManager *mpDBManager; //< Pointer to the DBManager for evaluation of DB-fields. + std::unique_ptr<SwDBManager> m_pOwnDBManager; //< own DBManager + SwDBManager * m_pDBManager; //< DBManager for evaluation of DB-fields. SwNumRule *mpOutlineRule; SwFootnoteInfo *mpFootnoteInfo; @@ -688,8 +689,8 @@ public: bool IsInVerticalText( const SwPosition& rPos ) const; // Database and DB-Manager - void SetDBManager( SwDBManager* pNewMgr ) { mpDBManager = pNewMgr; } - SwDBManager* GetDBManager() const { return mpDBManager; } + void SetDBManager( SwDBManager* pNewMgr ) { m_pDBManager = pNewMgr; } + SwDBManager* GetDBManager() const { return m_pDBManager; } void ChangeDBFields( const std::vector<OUString>& rOldNames, const OUString& rNewName ); void SetInitDBFields(bool b); diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx index 598ba687070b..e71260ac584e 100644 --- a/sw/source/core/doc/docnew.cxx +++ b/sw/source/core/doc/docnew.cxx @@ -346,7 +346,8 @@ SwDoc::SwDoc() #if HAVE_FEATURE_DBCONNECTIVITY // Create DBManager - mpDBManager = new SwDBManager(this); + m_pOwnDBManager.reset(new SwDBManager(this)); + m_pDBManager = m_pOwnDBManager.get(); #endif // create TOXTypes @@ -534,22 +535,22 @@ SwDoc::~SwDoc() #if HAVE_FEATURE_DBCONNECTIVITY // On load, SwDBManager::setEmbeddedName() may register a data source. // If we have an embedded one, then sDataSource points to the registered name, so revoke it here. - if (!mpDBManager->getEmbeddedName().isEmpty() && !maDBData.sDataSource.isEmpty()) + if (!m_pOwnDBManager->getEmbeddedName().isEmpty() && !maDBData.sDataSource.isEmpty()) { // Remove the revoke listener here first, so that we don't remove the data source from the document. - mpDBManager->releaseRevokeListener(); + m_pOwnDBManager->releaseRevokeListener(); SwDBManager::RevokeDataSource(maDBData.sDataSource); - SwDBManager::RevokeDataSource(mpDBManager->getEmbeddedName()); + SwDBManager::RevokeDataSource(m_pOwnDBManager->getEmbeddedName()); } - else if (!mpDBManager->getEmbeddedName().isEmpty()) + else if (!m_pOwnDBManager->getEmbeddedName().isEmpty()) { // Remove the revoke listener here first, so that we don't remove the data source from the document. - mpDBManager->releaseRevokeListener(); + m_pOwnDBManager->releaseRevokeListener(); // Remove connections which was committed but not used. - mpDBManager->RevokeNotUsedConnections(); + m_pOwnDBManager->RevokeNotUsedConnections(); } - DELETEZ( mpDBManager ); + m_pOwnDBManager.reset(); #endif // All Flys need to be destroyed before the Drawing Model, diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 6067bd834ac2..5d9ccaf0fa13 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -171,7 +171,7 @@ enum class WorkingDocType { SOURCE, TARGET, COPY }; static SfxObjectShell* lcl_CreateWorkingDocument( const WorkingDocType aType, const SwWrtShell &rSourceWrtShell, const vcl::Window *pSourceWindow, - SwDBManager** const pDBManager, + SwDBManager** const ppDBManager, SwView** const pView, SwWrtShell** const pWrtShell, SwDoc** const pDoc ); static bool lcl_getCountFromResultSet( sal_Int32& rCount, const SwDSParam* pParam ) @@ -962,7 +962,7 @@ static SfxObjectShell* lcl_CreateWorkingDocument( // optional input const vcl::Window *pSourceWindow, // optional in and output to swap the DB manager - SwDBManager** const pDBManager, + SwDBManager** const ppDBManager, // optional output SwView** const pView, SwWrtShell** const pWrtShell, SwDoc** const pDoc ) { @@ -987,17 +987,17 @@ static SfxObjectShell* lcl_CreateWorkingDocument( if( aType == WorkingDocType::TARGET ) { - assert( !pDBManager ); + assert( !ppDBManager ); pWorkDoc->SetInMailMerge( true ); pWorkWrtShell->SetLabelDoc( false ); } else { // We have to swap the DBmanager of the new doc, so we also need input - assert( pDBManager && *pDBManager ); + assert(ppDBManager && *ppDBManager); SwDBManager *pWorkDBManager = pWorkDoc->GetDBManager(); - pWorkDoc->SetDBManager( *pDBManager ); - *pDBManager = pWorkDBManager; + pWorkDoc->SetDBManager( *ppDBManager ); + *ppDBManager = pWorkDBManager; if( aType == WorkingDocType::SOURCE ) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits