sw/inc/IDocumentMarkAccess.hxx | 8 +++ sw/source/core/crsr/bookmrk.cxx | 7 +++ sw/source/core/doc/docbm.cxx | 51 ++++++++++++++++------- sw/source/core/inc/MarkManager.hxx | 3 - sw/source/core/inc/bookmrk.hxx | 5 +- sw/source/core/unocore/unoobj.cxx | 5 ++ writerfilter/source/dmapper/DomainMapper.cxx | 7 ++- writerfilter/source/dmapper/NumberingManager.cxx | 8 +++ 8 files changed, 75 insertions(+), 19 deletions(-)
New commits: commit 75b2f6b241046d4467a7c0c9cbf49b4533b46045 Author: Michael Stahl <mst...@redhat.com> Date: Thu Feb 28 13:27:57 2013 +0100 sw: remove CH_TXT_ATR_FORMELEMENT when CheckboxFieldmark is deleted Change-Id: I5f58b558b15f7d11b75554195e10a258d027bcfc diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx index 0cb1562..c9e572e 100644 --- a/sw/source/core/crsr/bookmrk.cxx +++ b/sw/source/core/crsr/bookmrk.cxx @@ -357,6 +357,13 @@ namespace sw { namespace mark // want this for checkboxes this->GetMarkEnd( ).nContent--; } + + void CheckboxFieldmark::ReleaseDoc(SwDoc* const pDoc) + { + lcl_RemoveFieldMarks(this, pDoc, + CH_TXT_ATR_FIELDSTART, CH_TXT_ATR_FORMELEMENT); + } + void CheckboxFieldmark::SetChecked(bool checked) { if ( IsChecked() != checked ) diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 4d06724..93c212d 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -670,18 +670,17 @@ namespace sw { namespace mark #endif } - struct LazyTextFieldmarkDeleter : public IDocumentMarkAccess::ILazyDeleter + struct LazyFieldmarkDeleter : public IDocumentMarkAccess::ILazyDeleter { - ::boost::shared_ptr<IMark> const m_pTextFieldmark; + ::boost::shared_ptr<IMark> const m_pFieldmark; SwDoc *const m_pDoc; - LazyTextFieldmarkDeleter( + LazyFieldmarkDeleter( ::boost::shared_ptr<IMark> const& pMark, SwDoc *const pDoc) - : m_pTextFieldmark(pMark), m_pDoc(pDoc) + : m_pFieldmark(pMark), m_pDoc(pDoc) { } - virtual ~LazyTextFieldmarkDeleter() + virtual ~LazyFieldmarkDeleter() { - dynamic_cast<TextFieldmark*>(m_pTextFieldmark.get()) - ->ReleaseDoc(m_pDoc); + dynamic_cast<Fieldmark *>(m_pFieldmark.get())->ReleaseDoc(m_pDoc); } }; @@ -713,12 +712,7 @@ namespace sw { namespace mark "<MarkManager::deleteMark(..)>" " - Bookmark not found."); m_vFieldmarks.erase(ppFieldmark); - sw::mark::TextFieldmark* pTextFieldmark = dynamic_cast<sw::mark::TextFieldmark*>(ppMark->get()); - if (pTextFieldmark) - { - ret.reset( - new LazyTextFieldmarkDeleter(*ppMark, m_pDoc)); - } + ret.reset(new LazyFieldmarkDeleter(*ppMark, m_pDoc)); break; } case IDocumentMarkAccess::NAVIGATOR_REMINDER: diff --git a/sw/source/core/inc/bookmrk.hxx b/sw/source/core/inc/bookmrk.hxx index bab92bb..54dc972 100644 --- a/sw/source/core/inc/bookmrk.hxx +++ b/sw/source/core/inc/bookmrk.hxx @@ -213,6 +213,8 @@ namespace sw { virtual void SetFieldHelptext(const ::rtl::OUString& aFieldHelptext) { m_aFieldHelptext = aFieldHelptext; } + virtual void ReleaseDoc(SwDoc* const) = 0; + virtual void Invalidate(); virtual rtl::OUString ToString() const; @@ -228,7 +230,7 @@ namespace sw { public: TextFieldmark(const SwPaM& rPaM); virtual void InitDoc(SwDoc* const io_pDoc); - void ReleaseDoc(SwDoc* const pDoc); + virtual void ReleaseDoc(SwDoc* const pDoc); }; class CheckboxFieldmark @@ -238,6 +240,7 @@ namespace sw { public: CheckboxFieldmark(const SwPaM& rPaM); virtual void InitDoc(SwDoc* const io_pDoc); + virtual void ReleaseDoc(SwDoc* const pDoc); bool IsChecked() const; void SetChecked(bool checked); commit 5bf6797e81d54177508d3eb370e8242e3b58a3f8 Author: Michael Stahl <mst...@redhat.com> Date: Thu Feb 28 13:14:45 2013 +0100 fdo#61016: sw::marks::MarkManager: delay deletion of text fieldmarks There is a STL assertion in deleteMarks because the ReleaseDoc call will recursively call into deleteMark again and delete marks that are in the vector vMarksToDelete up the stack. Change-Id: I9139b174f8a518a551a3ca8520396202c306abcf diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx index 9b4bbb1..21e2d0c 100644 --- a/sw/inc/IDocumentMarkAccess.hxx +++ b/sw/inc/IDocumentMarkAccess.hxx @@ -57,6 +57,11 @@ class IDocumentMarkAccess typedef container_t::const_iterator const_iterator_t; typedef container_t::const_reverse_iterator const_reverse_iterator_t; + /// To avoid recursive calls of deleteMark, the removal of dummy + /// characters of fieldmarks has to be delayed; this is the baseclass + /// that can be subclassed for that purpose. + struct ILazyDeleter { virtual ~ILazyDeleter() { } }; + /** Generates a new mark in the document for a certain selection. @param rPaM @@ -168,7 +173,8 @@ class IDocumentMarkAccess @param ppMark [in] an iterator pointing to the Mark to be deleted. */ - virtual void deleteMark(const IDocumentMarkAccess::const_iterator_t ppMark) =0; + virtual ::boost::shared_ptr<ILazyDeleter> + deleteMark(const IDocumentMarkAccess::const_iterator_t ppMark) =0; /** Deletes a mark. diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index e809b7c..4d06724 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -644,16 +644,24 @@ namespace sw { namespace mark } } - // we just remembered the iterators to delete, so we do not need to search - // for the boost::shared_ptr<> (the entry in m_vMarks) again - // reverse iteration, since erasing an entry invalidates iterators - // behind it (the iterators in vMarksToDelete are sorted) - for(vector<const_iterator_t>::reverse_iterator pppMark = vMarksToDelete.rbegin(); - pppMark != vMarksToDelete.rend(); - ++pppMark) { - deleteMark(*pppMark); - } + // fdo#61016 delay the deletion of the fieldmark characters + // to prevent that from deleting the marks on that position + // which would invalidate the iterators in vMarksToDelete + vector< ::boost::shared_ptr<ILazyDeleter> > vDelay; + vDelay.reserve(vMarksToDelete.size()); + // we just remembered the iterators to delete, so we do not need to + // search for the boost::shared_ptr<> (the entry in m_vMarks) again. + // reverse iteration, since erasing an entry invalidates iterators + // behind it (the iterators in vMarksToDelete are sorted) + for (vector<const_iterator_t>::reverse_iterator pppMark + = vMarksToDelete.rbegin(); + pppMark != vMarksToDelete.rend(); + ++pppMark) + { + vDelay.push_back(deleteMark(*pppMark)); + } + } // scope to kill vDelay if(isSortingNeeded) sortMarks(); #if 0 @@ -662,9 +670,26 @@ namespace sw { namespace mark #endif } - void MarkManager::deleteMark(const const_iterator_t ppMark) + struct LazyTextFieldmarkDeleter : public IDocumentMarkAccess::ILazyDeleter + { + ::boost::shared_ptr<IMark> const m_pTextFieldmark; + SwDoc *const m_pDoc; + LazyTextFieldmarkDeleter( + ::boost::shared_ptr<IMark> const& pMark, SwDoc *const pDoc) + : m_pTextFieldmark(pMark), m_pDoc(pDoc) + { } + virtual ~LazyTextFieldmarkDeleter() + { + dynamic_cast<TextFieldmark*>(m_pTextFieldmark.get()) + ->ReleaseDoc(m_pDoc); + } + }; + + ::boost::shared_ptr<IDocumentMarkAccess::ILazyDeleter> + MarkManager::deleteMark(const const_iterator_t ppMark) { - if(ppMark == m_vMarks.end()) return; + ::boost::shared_ptr<ILazyDeleter> ret; + if (ppMark == m_vMarks.end()) return ret; switch(IDocumentMarkAccess::GetType(**ppMark)) { @@ -690,7 +715,10 @@ namespace sw { namespace mark m_vFieldmarks.erase(ppFieldmark); sw::mark::TextFieldmark* pTextFieldmark = dynamic_cast<sw::mark::TextFieldmark*>(ppMark->get()); if (pTextFieldmark) - pTextFieldmark->ReleaseDoc(m_pDoc); + { + ret.reset( + new LazyTextFieldmarkDeleter(*ppMark, m_pDoc)); + } break; } case IDocumentMarkAccess::NAVIGATOR_REMINDER: @@ -721,6 +749,7 @@ namespace sw { namespace mark pMark_t xHoldPastErase = *aI; m_aMarkNamesSet.erase(ppMark->get()->GetName()); m_vMarks.erase(aI); + return ret; } void MarkManager::deleteMark(const IMark* const pMark) diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx index 2f17661..cf19e60 100644 --- a/sw/source/core/inc/MarkManager.hxx +++ b/sw/source/core/inc/MarkManager.hxx @@ -55,7 +55,8 @@ namespace sw { virtual void deleteMarks(const SwNodeIndex& rStt, const SwNodeIndex& rEnd, ::std::vector< ::sw::mark::SaveBookmark>* pSaveBkmk, const SwIndex* pSttIdx, const SwIndex* pEndIdx); // deleters - virtual void deleteMark(const const_iterator_t ppMark); + virtual ::boost::shared_ptr<ILazyDeleter> + deleteMark(const const_iterator_t ppMark); virtual void deleteMark(const ::sw::mark::IMark* const pMark); virtual void clearAllMarks(); commit dbb74ee9950dc706ea4fde3397a4c1d19b172fa9 Author: Michael Stahl <mst...@redhat.com> Date: Wed Feb 27 23:20:24 2013 +0100 fdo#61000: writerfilter: filter out unsupported list tab stops Change-Id: Ic9d31eba84b1d8d9cf93d8289621a65d43521a8b diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx index fa59bd2..38b1f07 100644 --- a/writerfilter/source/dmapper/NumberingManager.cxx +++ b/writerfilter/source/dmapper/NumberingManager.cxx @@ -135,7 +135,13 @@ void ListLevel::SetValue( Id nId, sal_Int32 nValue ) m_nXChFollow = nValue; break; case NS_ooxml::LN_CT_TabStop_pos: - m_nTabstop = nValue; + if (nValue < 0) + { + SAL_INFO("writerfilter", + "unsupported list tab stop position " << nValue); + } + else + m_nTabstop = nValue; break; default: OSL_FAIL( "this line should never be reached"); commit 0d4ee442f170eee4c35b9a1b1cb596f71d256b1e Author: Michael Stahl <mst...@redhat.com> Date: Wed Feb 27 22:24:36 2013 +0100 fdo#61309: writerfilter: filter out enormous numbering levels Change-Id: Iafef1c2ca2ca072bd604946fbe19b6a24e323512 diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx index 8fd8e38..f7762ab 100644 --- a/sw/source/core/unocore/unoobj.cxx +++ b/sw/source/core/unocore/unoobj.cxx @@ -535,6 +535,11 @@ throw (lang::IllegalArgumentException) sal_Int16 nLevel = 0; if (rValue >>= nLevel) { + if (nLevel < 0 || MAXLEVEL <= nLevel) + { + throw lang::IllegalArgumentException( + "invalid NumberingLevel", 0, 0); + } pTxtNd->SetAttrListLevel(nLevel); } } diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 9e2fdff..6892f82 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -1540,7 +1540,12 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType case NS_sprm::LN_PBrcp: break; // sprmPBrcp case NS_sprm::LN_PIlvl: // sprmPIlvl - //todo: Numbering level will be implemented in the near future (OOo 3.0?) + if (nIntValue < 0 || 10 <= nIntValue) // Writer can't do everything + { + SAL_INFO("writerfilter", + "unsupported numbering level " << nIntValue); + break; + } if( m_pImpl->IsStyleSheetImport() ) { //style sheets cannot have a numbering rule attached _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits