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

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Wed Apr 28 11:19:57 UTC 2021


 sw/inc/authfld.hxx                |    3 ++-
 sw/source/core/fields/authfld.cxx |   12 ++++++------
 sw/source/core/fields/fldbas.cxx  |    2 ++
 sw/source/uibase/utlui/initui.cxx |   19 +++++++++++++++++++
 4 files changed, 29 insertions(+), 7 deletions(-)

New commits:
commit b73c6c8e53cf944848cdb3a79371703de99a8710
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Wed Apr 28 09:50:54 2021 +0200
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Wed Apr 28 13:19:10 2021 +0200

    sw bibliography: fix warning when de-selecting a biblio entry field
    
    De-selecting a biblio entry field resulted in this warning:
    
    warn:sw.core:3311:3311:sw/source/core/fields/authfld.cxx:104: SwAuthorityFieldType::RemoveField: pEntry is not my field
    
    But this was even an assert before commit
    64ffabbdb2725e93de997171708bb31c33c93a55 (sw bibliography, refer to a
    page: make the biblio field clickable, 2021-03-12).
    
    It seems the root of the problem was:
    
    - SwAuthorityFieldType has a list of SwAuthEntry instances that its
      SwAuthorityFields may have
    - when the field is selected, we copy the selection to a clipboard
      document, using SwFEShell::Copy()
    - this calls SwAuthorityFieldType::AppendField() to register the
      SwAuthEntry, but that registers a copy instead
    - SwAuthorityFieldType::RemoveField() then asserted that the original
      SwAuthEntry is part of SwAuthorityFieldType's list, but it was not
    
    Fix the problem by returning a reference to the copied SwAuthEntry in
    SwAuthorityFieldType::AppendField(), that fixes the warning and then we
    can turn this back to an assert, to detect problems where an
    unregistered SwAuthEntry would be de-registered.
    
    In practice this caused a problem in the Insert Bibliography Entry
    dialog: bibliography source = document content case uses
    SwAuthorityFieldType::GetAllEntryIdentifiers() to provide a list of
    sources, and this way sources were not removed from that list when
    deleting biblio entry fields.
    
    Change-Id: Iea4fa44302aaac0daa122bbf227888d1dbb06597
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114765
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
    Tested-by: Jenkins

diff --git a/sw/inc/authfld.hxx b/sw/inc/authfld.hxx
index 681f95eddc31..fcf4f128361d 100644
--- a/sw/inc/authfld.hxx
+++ b/sw/inc/authfld.hxx
@@ -99,7 +99,7 @@ public:
 
     bool                ChangeEntryContent(const SwAuthEntry* pNewEntry);
     // import interface
-    sal_uInt16          AppendField(const SwAuthEntry& rInsert);
+    SwAuthEntry*        AppendField(const SwAuthEntry& rInsert);
 
     sal_uInt16          GetSequencePos(const SwAuthEntry* pAuthEntry, SwRootFrame const* pLayout);
     std::unique_ptr<SwTOXInternational> CreateTOXInternational() const;
@@ -139,6 +139,7 @@ public:
 
     const OUString& GetSortAlgorithm() const {return m_sSortAlgorithm;}
     void            SetSortAlgorithm(const OUString& rSet) {m_sSortAlgorithm = rSet;}
+    void dumpAsXml(xmlTextWriterPtr pWriter) const override;
 
 };
 
diff --git a/sw/source/core/fields/authfld.cxx b/sw/source/core/fields/authfld.cxx
index 934f06f1243b..7a2dea545ab9 100644
--- a/sw/source/core/fields/authfld.cxx
+++ b/sw/source/core/fields/authfld.cxx
@@ -101,7 +101,7 @@ void SwAuthorityFieldType::RemoveField(const SwAuthEntry* pEntry)
             return;
         }
     }
-    SAL_WARN("sw.core", "SwAuthorityFieldType::RemoveField: pEntry is not my field");
+    assert(false && "SwAuthorityFieldType::RemoveField: pEntry was not added previously");
 }
 
 SwAuthEntry* SwAuthorityFieldType::AddField(const OUString& rFieldContents)
@@ -167,18 +167,18 @@ bool SwAuthorityFieldType::ChangeEntryContent(const SwAuthEntry* pNewEntry)
     return false;
 }
 
-/// appends a new entry (if new) and returns the array position
-sal_uInt16  SwAuthorityFieldType::AppendField( const SwAuthEntry& rInsert )
+/// appends a new entry (if new) and returns the copied entry
+SwAuthEntry* SwAuthorityFieldType::AppendField( const SwAuthEntry& rInsert )
 {
     for( SwAuthDataArr::size_type nRet = 0; nRet < m_DataArr.size(); ++nRet )
     {
         if( *m_DataArr[ nRet ] == rInsert )
-            return nRet;
+            return m_DataArr[ nRet ].get();
     }
 
     //if it is a new Entry - insert
     m_DataArr.push_back(new SwAuthEntry(rInsert));
-    return m_DataArr.size()-1;
+    return m_DataArr.back().get();
 }
 
 std::unique_ptr<SwTOXInternational> SwAuthorityFieldType::CreateTOXInternational() const
@@ -770,7 +770,7 @@ SwFieldType* SwAuthorityField::ChgTyp( SwFieldType* pFieldTyp )
     if( pSrcTyp != pDstTyp )
     {
         const SwAuthEntry* pSrcEntry = m_xAuthEntry.get();
-        pDstTyp->AppendField( *pSrcEntry );
+        m_xAuthEntry = pDstTyp->AppendField( *pSrcEntry );
         pSrcTyp->RemoveField( pSrcEntry );
         SwField::ChgTyp( pFieldTyp );
     }
diff --git a/sw/source/core/fields/fldbas.cxx b/sw/source/core/fields/fldbas.cxx
index 2d824ac52c28..cf3a41460ba3 100644
--- a/sw/source/core/fields/fldbas.cxx
+++ b/sw/source/core/fields/fldbas.cxx
@@ -163,6 +163,8 @@ void SwFieldType::dumpAsXml(xmlTextWriterPtr pWriter) const
     if(!vFields.size())
         return;
     (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwFieldType"));
+    (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this);
+    (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("symbol"), "%s", BAD_CAST(typeid(*this).name()));
     for(const auto pFormatField: vFields)
         pFormatField->dumpAsXml(pWriter);
     (void)xmlTextWriterEndElement(pWriter);
diff --git a/sw/source/uibase/utlui/initui.cxx b/sw/source/uibase/utlui/initui.cxx
index f9567ec4ab45..a690b7cfe9df 100644
--- a/sw/source/uibase/utlui/initui.cxx
+++ b/sw/source/uibase/utlui/initui.cxx
@@ -17,6 +17,8 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <libxml/xmlwriter.h>
+
 #include <unotools/localedatawrapper.hxx>
 #include <viewsh.hxx>
 #include <initui.hxx>
@@ -286,4 +288,21 @@ OUString const & SwAuthorityFieldType::GetAuthTypeName(ToxAuthorityType eType)
     return (*pAuthFieldTypeList)[static_cast< sal_uInt16 >(eType)];
 }
 
+void SwAuthorityFieldType::dumpAsXml(xmlTextWriterPtr pWriter) const
+{
+    (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwAuthorityFieldType"));
+    SwFieldType::dumpAsXml(pWriter);
+
+    (void)xmlTextWriterStartElement(pWriter, BAD_CAST("DataArr"));
+    for (const auto& xAuthEntry : m_DataArr)
+    {
+        (void)xmlTextWriterStartElement(pWriter, BAD_CAST("AuthEntry"));
+        (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", xAuthEntry.get());
+        (void)xmlTextWriterEndElement(pWriter);
+    }
+    (void)xmlTextWriterEndElement(pWriter);
+
+    (void)xmlTextWriterEndElement(pWriter);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list