[Libreoffice-commits] core.git: include/vcl vcl/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Nov 15 13:36:09 UTC 2018


 include/vcl/builder.hxx       |    3 +++
 vcl/source/app/salvtables.cxx |   37 +++++++++++++++++++++++--------------
 vcl/source/window/builder.cxx |   28 +++++++++++++++++++++-------
 3 files changed, 47 insertions(+), 21 deletions(-)

New commits:
commit fef51fad10c2f7ec7827dcf4c07277ebdfb898e8
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Nov 14 13:50:57 2018 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu Nov 15 14:35:43 2018 +0100

    don't leak userdata
    
    Change-Id: I9a9687290bf7dd9c3705baf18dd89c8b5ed72c09
    Reviewed-on: https://gerrit.libreoffice.org/63367
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx
index 203b44e96871..d795b5cdc915 100644
--- a/include/vcl/builder.hxx
+++ b/include/vcl/builder.hxx
@@ -116,6 +116,9 @@ private:
     VclBuilder(const VclBuilder&) = delete;
     VclBuilder& operator=(const VclBuilder&) = delete;
 
+    // owner for ListBox/ComboBox UserData
+    std::vector<std::unique_ptr<OUString>> m_aUserData;
+
     //If the toplevel window has any properties which need to be set on it,
     //but the toplevel is the owner of the builder, then its ctor
     //has not been completed during the building, so properties for it
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index c849343e02c7..d3d776278632 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -1752,6 +1752,8 @@ IMPL_LINK(SalInstanceEntry, CursorListener, VclWindowEvent&, rEvent, void)
 class SalInstanceTreeView : public SalInstanceContainer, public virtual weld::TreeView
 {
 private:
+    // owner for UserData
+    std::vector<std::unique_ptr<OUString>> m_aUserData;
     VclPtr<SvTreeListBox> m_xTreeView;
 
     DECL_LINK(SelectHdl, SvTreeListBox*, void);
@@ -1769,7 +1771,14 @@ public:
     virtual void insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) override
     {
         auto nInsertPos = pos == -1 ? COMBOBOX_APPEND : pos;
-        void* pUserData = pId ?  new OUString(*pId) : nullptr;
+        void* pUserData;
+        if (pId)
+        {
+            m_aUserData.emplace_back(o3tl::make_unique<OUString>(*pId));
+            pUserData = m_aUserData.back().get();
+        }
+        else
+            pUserData = nullptr;
 
         if (!pIconName && !pImageSurface)
             m_xTreeView->InsertEntry(rStr, nullptr, false, nInsertPos, pUserData);
@@ -1829,6 +1838,7 @@ public:
     virtual void clear() override
     {
         m_xTreeView->Clear();
+        m_aUserData.clear();
     }
 
     virtual int n_children() const override
@@ -2343,6 +2353,8 @@ template <class vcl_type>
 class SalInstanceComboBox : public SalInstanceContainer, public virtual weld::ComboBox
 {
 protected:
+    // owner for ListBox/ComboBox UserData
+    std::vector<std::unique_ptr<OUString>> m_aUserData;
     VclPtr<vcl_type> m_xComboBox;
 
 public:
@@ -2449,12 +2461,8 @@ public:
 
     virtual void clear() override
     {
-        for (int i = 0; i < get_count(); ++i)
-        {
-            const OUString* pId = getEntryData(i);
-            delete pId;
-        }
-        return m_xComboBox->Clear();
+        m_xComboBox->Clear();
+        m_aUserData.clear();
     }
 
     virtual void make_sorted() override
@@ -2466,11 +2474,6 @@ public:
     {
         return m_xComboBox->IsInDropDown();
     }
-
-    virtual ~SalInstanceComboBox() override
-    {
-        clear();
-    }
 };
 
 class SalInstanceComboBoxWithoutEdit : public SalInstanceComboBox<ListBox>
@@ -2506,7 +2509,10 @@ public:
         else
             nInsertedAt = m_xComboBox->InsertEntry(rStr, createImage(*pImageSurface), nInsertPos);
         if (pId)
-            m_xComboBox->SetEntryData(nInsertedAt, new OUString(*pId));
+        {
+            m_aUserData.emplace_back(o3tl::make_unique<OUString>(*pId));
+            m_xComboBox->SetEntryData(nInsertedAt, m_aUserData.back().get());
+        }
     }
 
     virtual void insert_separator(int pos) override
@@ -2609,7 +2615,10 @@ public:
         else
             nInsertedAt = m_xComboBox->InsertEntryWithImage(rStr, createImage(*pImageSurface), nInsertPos);
         if (pId)
-            m_xComboBox->SetEntryData(nInsertedAt, new OUString(*pId));
+        {
+            m_aUserData.emplace_back(o3tl::make_unique<OUString>(*pId));
+            m_xComboBox->SetEntryData(nInsertedAt, m_aUserData.back().get());
+        }
     }
 
     virtual void insert_separator(int pos) override
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 179bf1b21859..2406b7a56cc8 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -3323,7 +3323,9 @@ void VclBuilder::insertMenuObject(PopupMenu *pParent, PopupMenu *pSubMenu, const
 
 /// Insert items to a ComboBox or a ListBox.
 /// They have no common ancestor that would have 'InsertEntry()', so use a template.
-template<typename T> static bool insertItems(vcl::Window *pWindow, VclBuilder::stringmap &rMap, const std::vector<ComboBoxTextItem> &rItems)
+template<typename T> static bool insertItems(vcl::Window *pWindow, VclBuilder::stringmap &rMap,
+                                             std::vector<std::unique_ptr<OUString>>& rUserData,
+                                             const std::vector<ComboBoxTextItem> &rItems)
 {
     T *pContainer = dynamic_cast<T*>(pWindow);
     if (!pContainer)
@@ -3334,7 +3336,10 @@ template<typename T> static bool insertItems(vcl::Window *pWindow, VclBuilder::s
     {
         sal_Int32 nPos = pContainer->InsertEntry(item.m_sItem);
         if (!item.m_sId.isEmpty())
-            pContainer->SetEntryData(nPos, new OUString(OUString::fromUtf8(item.m_sId)));
+        {
+            rUserData.emplace_back(o3tl::make_unique<OUString>(OUString::fromUtf8(item.m_sId)));
+            pContainer->SetEntryData(nPos, rUserData.back().get());
+        }
     }
     if (nActiveId < rItems.size())
         pContainer->SelectEntryPos(nActiveId);
@@ -3487,8 +3492,8 @@ VclPtr<vcl::Window> VclBuilder::handleObject(vcl::Window *pParent, xmlreader::Xm
     if (!aItems.empty())
     {
         // try to fill-in the items
-        if (!insertItems<ComboBox>(pCurrentChild, aProperties, aItems))
-            insertItems<ListBox>(pCurrentChild, aProperties, aItems);
+        if (!insertItems<ComboBox>(pCurrentChild, aProperties, m_aUserData, aItems))
+            insertItems<ListBox>(pCurrentChild, aProperties, m_aUserData, aItems);
     }
 
     return pCurrentChild;
@@ -3980,7 +3985,10 @@ void VclBuilder::mungeModel(ComboBox &rTarget, const ListStore &rStore, sal_uInt
             else
             {
                 if (!rRow[1].isEmpty())
-                    rTarget.SetEntryData(nEntry, new OUString(rRow[1]));
+                {
+                    m_aUserData.emplace_back(o3tl::make_unique<OUString>(rRow[1]));
+                    rTarget.SetEntryData(nEntry, m_aUserData.back().get());
+                }
             }
         }
     }
@@ -4004,7 +4012,10 @@ void VclBuilder::mungeModel(ListBox &rTarget, const ListStore &rStore, sal_uInt1
             else
             {
                 if (!rRow[1].isEmpty())
-                    rTarget.SetEntryData(nEntry, new OUString(rRow[1]));
+                {
+                    m_aUserData.emplace_back(o3tl::make_unique<OUString>(rRow[1]));
+                    rTarget.SetEntryData(nEntry, m_aUserData.back().get());
+                }
             }
         }
     }
@@ -4028,7 +4039,10 @@ void VclBuilder::mungeModel(SvTreeListBox &rTarget, const ListStore &rStore, sal
             else
             {
                 if (!rRow[1].isEmpty())
-                    pEntry->SetUserData(new OUString(rRow[1]));
+                {
+                    m_aUserData.emplace_back(o3tl::make_unique<OUString>(rRow[1]));
+                    pEntry->SetUserData(m_aUserData.back().get());
+                }
             }
         }
     }


More information about the Libreoffice-commits mailing list