[Libreoffice-commits] core.git: 2 commits - sw/source

Michael Stahl mstahl at redhat.com
Fri Jul 7 13:52:18 UTC 2017


 sw/source/core/crsr/annotationmark.cxx |   37 +++++++++++----------------------
 sw/source/core/doc/docbm.cxx           |   12 ++--------
 sw/source/core/txtnode/atrfld.cxx      |   12 +---------
 sw/source/core/unocore/unoportenum.cxx |   15 +++++--------
 sw/source/filter/basflt/fltshell.cxx   |   27 +++++++++++++++++++++++-
 5 files changed, 50 insertions(+), 53 deletions(-)

New commits:
commit 31c54fa7bb03768b425ae019096e0a0e26e9c736
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Jul 7 13:26:50 2017 +0200

    sw: convert SwTextAnnotationField OSL_ENSUREs to assert() and simplify
    
    Change-Id: Ica69cd4527f36edd7480d897a28ff814ecbe97a9

diff --git a/sw/source/core/crsr/annotationmark.cxx b/sw/source/core/crsr/annotationmark.cxx
index bca5e903c72a..a73c1715bb36 100644
--- a/sw/source/core/crsr/annotationmark.cxx
+++ b/sw/source/core/crsr/annotationmark.cxx
@@ -52,26 +52,19 @@ namespace sw { namespace mark
     void AnnotationMark::InitDoc(SwDoc* const io_pDoc)
     {
         SwTextNode *pTextNode = GetMarkEnd().nNode.GetNode().GetTextNode();
-
-        SwTextField* pTextField = pTextNode ?
-            pTextNode->GetFieldTextAttrAt(
-            GetMarkEnd().nContent.GetIndex()-1, true ) : nullptr;
-        OSL_ENSURE( pTextField != nullptr, "<AnnotationMark::InitDoc(..)> - missing text attribute for annotation field!" );
-        if ( pTextField != nullptr )
+        assert(pTextNode);
+        SwTextField *const pTextField = pTextNode->GetFieldTextAttrAt(
+            GetMarkEnd().nContent.GetIndex()-1, true);
+        assert(pTextField != nullptr);
+        const SwPostItField* pPostItField = dynamic_cast< const SwPostItField* >(pTextField->GetFormatField().GetField());
+        assert(pPostItField != nullptr);
+        // use the annotation mark's name as the annotation name, if
+        // - the annotation field has an empty annotation name or
+        // - the annotation mark's name differs (on mark creation a name clash had been detected)
+        if ( pPostItField->GetName().isEmpty()
+            || pPostItField->GetName() != GetName() )
         {
-            const SwPostItField* pPostItField = dynamic_cast< const SwPostItField* >(pTextField->GetFormatField().GetField());
-            OSL_ENSURE( pPostItField != nullptr, "<AnnotationMark::InitDoc(..)> - annotation field missing!" );
-            if ( pPostItField != nullptr )
-            {
-                // use the annotation mark's name as the annotation name, if
-                // - the annotation field has an empty annotation name or
-                // - the annotation mark's name differs (on mark creation a name clash had been detected)
-                if ( pPostItField->GetName().isEmpty()
-                    || pPostItField->GetName() != GetName() )
-                {
-                    const_cast<SwPostItField*>(pPostItField)->SetName( GetName() );
-                }
-            }
+            const_cast<SwPostItField*>(pPostItField)->SetName( GetName() );
         }
 
         if (io_pDoc->GetIDocumentUndoRedo().DoesUndo())
@@ -84,11 +77,7 @@ namespace sw { namespace mark
     const SwFormatField* AnnotationMark::GetAnnotationFormatField() const
     {
         SwDoc* pDoc = GetMarkPos().GetDoc();
-        if ( pDoc == nullptr )
-        {
-            OSL_ENSURE( false, "<AnnotationMark::GetAnnotationFormatField()> - missing document at annotation mark" );
-            return nullptr;
-        }
+        assert(pDoc != nullptr);
 
         SwFormatField* pAnnotationFormatField = nullptr;
 
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index 7ea1692dd559..68030bbb2955 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -918,15 +918,9 @@ namespace sw { namespace mark
             case IDocumentMarkAccess::MarkType::ANNOTATIONMARK:
                 {
                     IDocumentMarkAccess::iterator_t ppAnnotationMark = lcl_FindMark(m_vAnnotationMarks, *ppMark);
-                    if ( ppAnnotationMark != m_vAnnotationMarks.end() )
-                    {
-                        m_vAnnotationMarks.erase(ppAnnotationMark);
-                    }
-                    else
-                    {
-                        assert(false &&
-                            "<MarkManager::deleteMark(..)> - Annotation Mark not found in Annotation Mark container.");
-                    }
+                    assert(ppAnnotationMark != m_vAnnotationMarks.end() &&
+                        "<MarkManager::deleteMark(..)> - Annotation Mark not found in Annotation Mark container.");
+                    m_vAnnotationMarks.erase(ppAnnotationMark);
                 }
                 break;
 
diff --git a/sw/source/core/txtnode/atrfld.cxx b/sw/source/core/txtnode/atrfld.cxx
index de3817eeece9..4beca6d098c6 100644
--- a/sw/source/core/txtnode/atrfld.cxx
+++ b/sw/source/core/txtnode/atrfld.cxx
@@ -618,18 +618,10 @@ SwTextAnnotationField::~SwTextAnnotationField()
 ::sw::mark::IMark* SwTextAnnotationField::GetAnnotationMark() const
 {
     const SwPostItField* pPostItField = dynamic_cast<const SwPostItField*>(GetFormatField().GetField());
-    OSL_ENSURE( pPostItField != nullptr, "<SwTextAnnotationField::GetAnnotationMark()> - field missing" );
-    if ( pPostItField == nullptr )
-    {
-        return nullptr;
-    }
+    assert(pPostItField != nullptr);
 
     SwDoc* pDoc = static_cast<const SwPostItFieldType*>(pPostItField->GetTyp())->GetDoc();
-    OSL_ENSURE( pDoc != nullptr, "<SwTextAnnotationField::GetAnnotationMark()> - missing document" );
-    if ( pDoc == nullptr )
-    {
-        return nullptr;
-    }
+    assert(pDoc != nullptr);
 
     IDocumentMarkAccess* pMarksAccess = pDoc->getIDocumentMarkAccess();
     IDocumentMarkAccess::const_iterator_t pMark = pMarksAccess->findAnnotationMark( pPostItField->GetName() );
diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx
index 3e8828c51319..fa2d6d0173a7 100644
--- a/sw/source/core/unocore/unoportenum.cxx
+++ b/sw/source/core/unocore/unoportenum.cxx
@@ -297,15 +297,12 @@ namespace
             if ( rStartPos.nNode == nOwnNode )
             {
                 const SwFormatField* pAnnotationFormatField = pAnnotationMark->GetAnnotationFormatField();
-                OSL_ENSURE( pAnnotationFormatField != nullptr, "<lcl_FillAnnotationStartArray(..)> - annotation fmt fld instance missing!" );
-                if ( pAnnotationFormatField != nullptr )
-                {
-                    rAnnotationStartArr.insert(
-                        std::make_shared<SwAnnotationStartPortion_Impl>(
-                                SwXTextField::CreateXTextField(&rDoc,
-                                    pAnnotationFormatField),
-                                rStartPos));
-                }
+                assert(pAnnotationFormatField != nullptr);
+                rAnnotationStartArr.insert(
+                    std::make_shared<SwAnnotationStartPortion_Impl>(
+                            SwXTextField::CreateXTextField(&rDoc,
+                                pAnnotationFormatField),
+                            rStartPos));
             }
         }
     }
commit 7b4f14e481846b90b124f2ff2b4ac0a6fc79f77b
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Jul 7 15:42:41 2017 +0200

    sw: WW8 import: avoid inserting annotation mark without SwPostItField
    
    SwFltControlStack::SetAttrInDoc() will insert a RES_FLTR_ANNOTATIONMARK
    without checking that there is actually a SwPostItField at that
    position, which triggers the assertion "<AnnotationMark::InitDoc(..)> -
    annotation field missing!" in AnnotationMark::InitDoc().
    
    This happens when loading "crash-7.doc" which has a different kind of
    field - a SwPageNameField - at that position.
    
    In the WW8 filter, the SwPostItField is inserted in Read_And(),
    the AnnotationMark in Read_AtnBook(), which look quite orthogonal.
    
    Since it doesn't look like a valid document model to have the
    AnnotationMark without its field, avoid inserting it in the filter.
    
    Change-Id: I960d346601522b1a4d8644e538cde174763e99ff

diff --git a/sw/source/filter/basflt/fltshell.cxx b/sw/source/filter/basflt/fltshell.cxx
index cb0991bf426c..79fcaaa67314 100644
--- a/sw/source/filter/basflt/fltshell.cxx
+++ b/sw/source/filter/basflt/fltshell.cxx
@@ -57,6 +57,8 @@
 #include <ndtxt.hxx>
 #include <frmatr.hxx>
 #include <fldbas.hxx>
+#include <docufld.hxx>
+#include <txtfld.hxx>
 #include <charatr.hxx>
 #include <swtable.hxx>
 #include <tox.hxx>
@@ -632,7 +634,30 @@ void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos,
     case RES_FLTR_ANNOTATIONMARK:
         {
             if (MakeBookRegionOrPoint(rEntry, pDoc, aRegion, true))
-                pDoc->getIDocumentMarkAccess()->makeAnnotationMark(aRegion, OUString());
+            {
+                SwTextNode const*const pTextNode(
+                        aRegion.End()->nNode.GetNode().GetTextNode());
+                assert(pTextNode);
+                SwTextField const*const pField(pTextNode->GetFieldTextAttrAt(
+                        aRegion.End()->nContent.GetIndex() - 1, true));
+                if (pField)
+                {
+                    SwPostItField const*const pPostIt(
+                        dynamic_cast<SwPostItField const*>(pField->GetFormatField().GetField()));
+                    if (pPostIt)
+                    {
+                        pDoc->getIDocumentMarkAccess()->makeAnnotationMark(aRegion, OUString());
+                    }
+                    else
+                    {
+                        SAL_WARN("sw", "RES_FLTR_ANNOTATIONMARK: unexpected field");
+                    }
+                }
+                else
+                {
+                    SAL_WARN("sw", "RES_FLTR_ANNOTATIONMARK: missing field");
+                }
+            }
             else
                 SAL_WARN("sw", "failed to make book region or point");
         }


More information about the Libreoffice-commits mailing list