gnucash unstable: Multiple changes pushed

Geert Janssens gjanssens at code.gnucash.org
Sat Mar 31 11:20:08 EDT 2018


Updated	 via  https://github.com/Gnucash/gnucash/commit/d6a5cc9f (commit)
	 via  https://github.com/Gnucash/gnucash/commit/255d7194 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/f0c03a78 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/6c43c3af (commit)
	from  https://github.com/Gnucash/gnucash/commit/f910d931 (commit)



commit d6a5cc9febf2bd516640a0257b233235dfd4fd35
Merge: f910d93 255d719
Author: Geert Janssens <geert at kobaltwit.be>
Date:   Sat Mar 31 17:09:45 2018 +0200

    Merge branch 'imap-editor-fix' of https://github.com/Bob-IT/gnucash into unstable


commit 255d7194d82b02041d22358198e54297954bdf06
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Thu Mar 29 17:57:24 2018 +0100

    Fix the gtests for the changes made to ImapInfo structure

diff --git a/libgnucash/engine/test/gtest-import-map.cpp b/libgnucash/engine/test/gtest-import-map.cpp
index 4f6c7cd..f2e4509 100644
--- a/libgnucash/engine/test/gtest-import-map.cpp
+++ b/libgnucash/engine/test/gtest-import-map.cpp
@@ -386,9 +386,8 @@ TEST_F (ImapBayesTest, get_bayes_info)
     EXPECT_EQ (info->source_account, t_bank_account);
     EXPECT_EQ (info->map_account, t_expense_account1);
     auto acct1_guid = guid_to_string (xaccAccountGetGUID(t_expense_account1)); //Food
-    EXPECT_STREQ (info->full_category, (std::string {IMAP_FRAME_BAYES} + "/one/two/three/" + acct1_guid).c_str ());
+    EXPECT_STREQ (info->head, (std::string {IMAP_FRAME_BAYES} + "/one/two/three/" + acct1_guid).c_str ());
     EXPECT_STREQ (info->match_string, "one/two/three");
-    EXPECT_STREQ (info->category_head, (std::string {IMAP_FRAME_BAYES} + "/one/two/three").c_str ());
     EXPECT_STREQ (info->count, "1");
 }
 

commit f0c03a7885eb183d4f9657d9e110d2928a0d3131
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Thu Mar 29 17:43:59 2018 +0100

    Speed up loading of the Imap Editor Treeview
    
    Drop the model before loading the treeview and then create a new filter
    model and add that back to the treeview after populating the model.

diff --git a/gnucash/gnome/dialog-imap-editor.c b/gnucash/gnome/dialog-imap-editor.c
index 15eb364..10456e7 100644
--- a/gnucash/gnome/dialog-imap-editor.c
+++ b/gnucash/gnome/dialog-imap-editor.c
@@ -602,6 +602,10 @@ get_account_info (ImapDialog *imap_dialog)
 
     model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(filter));
 
+    // Disconnect the filter model from the treeview
+    g_object_ref (G_OBJECT(model));
+    gtk_tree_view_set_model (GTK_TREE_VIEW(imap_dialog->view), NULL);
+
     // Clear the tree store
     gtk_tree_store_clear (GTK_TREE_STORE(model));
 
@@ -629,6 +633,14 @@ get_account_info (ImapDialog *imap_dialog)
         show_filter_option (imap_dialog, FALSE);
         get_account_info_online (accts, model);
     }
+    // create a new filter model and reconnect to treeview
+    filter = gtk_tree_model_filter_new (GTK_TREE_MODEL(model), NULL);
+    gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER(filter), FILTER);
+    g_object_unref (G_OBJECT(model));
+
+    gtk_tree_view_set_model (GTK_TREE_VIEW(imap_dialog->view), filter);
+    g_object_unref (G_OBJECT(filter));
+
     // if there are any entries, show first row
     show_first_row (imap_dialog);
 

commit 6c43c3afe016ee55a5ff44793967d9b52aac6fe6
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Thu Mar 29 17:32:57 2018 +0100

    Fix Imap Editor to reflect the changes in kvp paths
    
    There were several problems that broke the Imap Editor that have been
    fixed due to kvp changes. The import-map-bayes entries were being added
    to the tree view based on the number token entries squared. Retrieving
    import-map entries resulted in an empty list and also deleting entries
    from the tree view failed.

diff --git a/gnucash/gnome/dialog-imap-editor.c b/gnucash/gnome/dialog-imap-editor.c
index 2553906..15eb364 100644
--- a/gnucash/gnome/dialog-imap-editor.c
+++ b/gnucash/gnome/dialog-imap-editor.c
@@ -46,7 +46,7 @@
 
 /** Enumeration for the tree-store */
 enum GncImapColumn {SOURCE_FULL_ACC, SOURCE_ACCOUNT, BASED_ON, MATCH_STRING,
-                     MAP_FULL_ACC, MAP_ACCOUNT, FULL_CATEGORY, COUNT, FILTER};
+                     MAP_FULL_ACC, MAP_ACCOUNT, HEAD, CATEGORY, COUNT, FILTER};
 
 typedef enum
 {
@@ -139,39 +139,27 @@ are_you_sure (ImapDialog *imap_dialog)
 }
 
 static void
-delete_info_bayes (Account *source_account, gchar *match_string, gint depth)
+delete_info_bayes (Account *source_account, gchar *head, gint depth)
 {
-    gchar *full_category;
-
-    full_category = g_strdup_printf (IMAP_FRAME_BAYES "/%s", match_string);
-    gnc_account_delete_map_entry (source_account, full_category, TRUE);
-
-    full_category = g_strdup_printf (IMAP_FRAME_BAYES);
-    if (depth == 1) // top level, delete all below
-        gnc_account_delete_map_entry (source_account, full_category, FALSE);
+    if (depth != 1) // below top level
+        gnc_account_delete_map_entry (source_account, head, NULL, NULL, FALSE);
     else
-        gnc_account_delete_map_entry (source_account, full_category, TRUE);
+        gnc_account_delete_all_bayes_maps (source_account);
 }
 
 static void
-delete_info_nbayes (Account *source_account, gint depth)
+delete_info_nbayes (Account *source_account, gchar *head,
+                    gchar *category, gchar *match_string, gint depth)
 {
-    gchar *full_category;
-
-    full_category = g_strdup_printf (IMAP_FRAME "/%s", IMAP_FRAME_DESC);
-    gnc_account_delete_map_entry (source_account, full_category, TRUE);
-
-    full_category = g_strdup_printf (IMAP_FRAME "/%s", IMAP_FRAME_MEMO);
-    gnc_account_delete_map_entry (source_account, full_category, TRUE);
-
-    full_category = g_strdup_printf (IMAP_FRAME "/%s", IMAP_FRAME_CSV);
-    gnc_account_delete_map_entry (source_account, full_category, TRUE);
-
-    full_category = g_strdup_printf (IMAP_FRAME);
-    if (depth == 1) // top level, delete all below
-        gnc_account_delete_map_entry (source_account, full_category, FALSE);
+    if (depth != 1) // below top level
+    {
+        gnc_account_delete_map_entry (source_account, head, category, match_string, FALSE);
+        gnc_account_delete_map_entry (source_account, head, category, NULL, TRUE);
+    }
     else
-        gnc_account_delete_map_entry (source_account, full_category, TRUE);
+        gnc_account_delete_map_entry (source_account, head, category, NULL, FALSE);
+
+    gnc_account_delete_map_entry (source_account, head, NULL, NULL, TRUE);
 }
 
 static void
@@ -179,13 +167,15 @@ delete_selected_row (GtkTreeModel *model, GtkTreeIter *iter, ImapDialog *imap_di
 {
     Account     *source_account = NULL;
     gchar       *full_source_account;
-    gchar       *full_category;
+    gchar       *head;
+    gchar       *category;
     gchar       *match_string;
 
     gtk_tree_model_get (model, iter, SOURCE_ACCOUNT, &source_account, SOURCE_FULL_ACC, &full_source_account,
-                                     FULL_CATEGORY, &full_category, MATCH_STRING, &match_string, -1);
+                                     HEAD, &head, CATEGORY, &category, MATCH_STRING, &match_string, -1);
 
-    PINFO("Account is '%s', Full Category is '%s', Match String is '%s'", full_source_account, full_category, match_string);
+    PINFO("Account is '%s', Head is '%s', Category is '%s', Match String is '%s'",
+           full_source_account, head, category, match_string);
 
     if (source_account != NULL)
     {
@@ -197,19 +187,23 @@ delete_selected_row (GtkTreeModel *model, GtkTreeIter *iter, ImapDialog *imap_di
         depth = gtk_tree_path_get_depth (tree_path);
         gtk_tree_path_free (tree_path);
 
-        gnc_account_delete_map_entry (source_account, full_category, FALSE);
+        if (imap_dialog->type == ONLINE)
+            gnc_account_delete_map_entry (source_account, head, NULL, NULL, FALSE);
 
         if (imap_dialog->type == BAYES)
-            delete_info_bayes (source_account, match_string, depth);
+            delete_info_bayes (source_account, head, depth);
 
         if (imap_dialog->type == NBAYES)
-            delete_info_nbayes (source_account, depth);
+            delete_info_nbayes (source_account, head, category, match_string, depth);
     }
-    else
-        g_free (full_category);
-
-    g_free (match_string);
-    g_free (full_source_account);
+    if (head)
+        g_free (head);
+    if (category)
+        g_free (category);
+    if (match_string)
+        g_free (match_string);
+    if (full_source_account)
+        g_free (full_source_account);
 }
 
 static void
@@ -239,7 +233,7 @@ gnc_imap_dialog_delete (ImapDialog *imap_dialog)
     // Walk the list
     for (row = g_list_first (list); row; row = g_list_next (row))
     {
-	if (gtk_tree_model_get_iter (model, &iter, row->data))
+        if (gtk_tree_model_get_iter (model, &iter, row->data))
             delete_selected_row (model, &iter, imap_dialog);
     }
     g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
@@ -413,14 +407,15 @@ add_to_store (GtkTreeModel *model, GtkTreeIter *iter, const gchar *text, GncImap
     else
         map_fullname = gnc_account_get_full_name (imapInfo->map_account);
 
-    PINFO("Add to Store: Source Acc '%s', Match '%s', Map Acc '%s'", fullname, imapInfo->match_string, map_fullname);
+    PINFO("Add to Store: Source Acc '%s', Head is '%s', Category is '%s', Match '%s', Map Acc '%s', Count is %s",
+          fullname, imapInfo->head, imapInfo->category, imapInfo->match_string, map_fullname, imapInfo->count);
 
     gtk_tree_store_set (GTK_TREE_STORE(model), iter,
                         SOURCE_FULL_ACC, fullname, SOURCE_ACCOUNT, imapInfo->source_account,
                         BASED_ON, text,
                         MATCH_STRING, imapInfo->match_string,
                         MAP_FULL_ACC, map_fullname, MAP_ACCOUNT, imapInfo->map_account,
-                        FULL_CATEGORY, imapInfo->full_category, COUNT, imapInfo->count,
+                        HEAD, imapInfo->head, CATEGORY, imapInfo->category, COUNT, imapInfo->count,
                         FILTER, TRUE, -1);
 
     g_free (fullname);
@@ -433,6 +428,7 @@ get_imap_info (Account *acc, const gchar *category, GtkTreeModel *model, const g
     GtkTreeIter  toplevel, child;
     GList *imap_list, *node;
     gchar *acc_name = NULL;
+    gchar *head = NULL;
 
     acc_name = gnc_account_get_full_name (acc);
     PINFO("Source Acc '%s', Based on '%s', Path Head '%s'", acc_name, text, category);
@@ -442,6 +438,11 @@ get_imap_info (Account *acc, const gchar *category, GtkTreeModel *model, const g
     else
         imap_list = gnc_account_imap_get_info (acc, category);
 
+    if (category == NULL)
+        head = IMAP_FRAME_BAYES;
+    else
+        head = IMAP_FRAME;
+
     if (g_list_length (imap_list) > 0)
     {
         PINFO("List length is %d", g_list_length (imap_list));
@@ -449,7 +450,8 @@ get_imap_info (Account *acc, const gchar *category, GtkTreeModel *model, const g
         // Add top level entry of Source full Account and Based on.
         gtk_tree_store_append (GTK_TREE_STORE(model), &toplevel, NULL);
         gtk_tree_store_set (GTK_TREE_STORE(model), &toplevel,
-                        SOURCE_ACCOUNT, acc, SOURCE_FULL_ACC, acc_name, BASED_ON, text, FILTER, TRUE, -1);
+                        SOURCE_ACCOUNT, acc, SOURCE_FULL_ACC, acc_name,
+                        HEAD, head, CATEGORY, category, BASED_ON, text, FILTER, TRUE, -1);
 
         for (node = imap_list;  node; node = g_list_next (node))
         {
@@ -460,8 +462,8 @@ get_imap_info (Account *acc, const gchar *category, GtkTreeModel *model, const g
             add_to_store (model, &child, text, imapInfo);
 
             // Free the members and structure
-            g_free (imapInfo->category_head);
-            g_free (imapInfo->full_category);
+            g_free (imapInfo->head);
+            g_free (imapInfo->category);
             g_free (imapInfo->match_string);
             g_free (imapInfo->count);
             g_free (imapInfo);
@@ -541,10 +543,10 @@ get_account_info_online (GList *accts, GtkTreeModel *model)
 
         // Save source account
         imapInfo.source_account = acc;
+        imapInfo.head = "online_id";
+        imapInfo.category = " ";
 
-        imapInfo.full_category = "online_id";
-
-        text = gnc_account_get_map_entry (acc, imapInfo.full_category);
+        text = gnc_account_get_map_entry (acc, imapInfo.head);
 
         if (text != NULL)
         {
diff --git a/gnucash/gtkbuilder/dialog-imap-editor.glade b/gnucash/gtkbuilder/dialog-imap-editor.glade
index 8e325af..d9465e0 100644
--- a/gnucash/gtkbuilder/dialog-imap-editor.glade
+++ b/gnucash/gtkbuilder/dialog-imap-editor.glade
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.20.2 -->
 <interface>
   <requires lib="gtk+" version="3.10"/>
   <object class="GtkTreeStore" id="tree-store">
@@ -16,7 +16,9 @@
       <column type="gchararray"/>
       <!-- column-name map_account -->
       <column type="gpointer"/>
-      <!-- column-name full_category -->
+      <!-- column-name head -->
+      <column type="gchararray"/>
+      <!-- column-name category -->
       <column type="gchararray"/>
       <!-- column-name count -->
       <column type="gchararray"/>
@@ -235,7 +237,7 @@
                         <property name="alignment">center</property>
                       </object>
                       <attributes>
-                        <attribute name="text">7</attribute>
+                        <attribute name="text">8</attribute>
                       </attributes>
                     </child>
                   </object>
@@ -372,5 +374,8 @@
       <action-widget response="-10">delete_button</action-widget>
       <action-widget response="-6">close_button</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
 </interface>
diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp
index e5325ab..6f63fcb 100644
--- a/libgnucash/engine/Account.cpp
+++ b/libgnucash/engine/Account.cpp
@@ -5544,7 +5544,6 @@ build_non_bayes (const char *key, const GValue *value, gpointer user_data)
         return;
     QofBook     *book;
     GncGUID     *guid = NULL;
-    gchar       *kvp_path;
     gchar       *guid_string = NULL;
     auto imapInfo = (GncImapInfo*)user_data;
     // Get the book
@@ -5553,25 +5552,20 @@ build_non_bayes (const char *key, const GValue *value, gpointer user_data)
     guid = (GncGUID*)g_value_get_boxed (value);
     guid_string = guid_to_string (guid);
 
-    PINFO("build_non_bayes: account '%s', match account guid: '%s'",
+    PINFO("build_non_bayes: match string '%s', match account guid: '%s'",
                             (char*)key, guid_string);
 
-    kvp_path = g_strconcat (imapInfo->category_head, "/", key, NULL);
-
-    PINFO("build_non_bayes: kvp_path is '%s'", kvp_path);
-
     auto imapInfo_node = static_cast <GncImapInfo*> (g_malloc(sizeof(GncImapInfo)));
 
     imapInfo_node->source_account = imapInfo->source_account;
     imapInfo_node->map_account    = xaccAccountLookup (guid, book);
-    imapInfo_node->full_category  = g_strdup (kvp_path);
+    imapInfo_node->head           = g_strdup (imapInfo->head);
     imapInfo_node->match_string   = g_strdup (key);
-    imapInfo_node->category_head  = g_strdup (imapInfo->category_head);
+    imapInfo_node->category       = g_strdup (imapInfo->category);
     imapInfo_node->count          = g_strdup (" ");
 
     imapInfo->list = g_list_append (imapInfo->list, imapInfo_node);
 
-    g_free (kvp_path);
     g_free (guid_string);
 }
 
@@ -5589,25 +5583,19 @@ parse_bayes_imap_info (std::string const & imap_bayes_entry)
 static void
 build_bayes (const char *key, KvpValue * value, GncImapInfo & imapInfo)
 {
-    auto slots = qof_instance_get_slots_prefix (QOF_INSTANCE (imapInfo.source_account), IMAP_FRAME_BAYES);
-    if (!slots.size()) return;
-    for (auto const & entry : slots)
-    {
-        auto parsed_key = parse_bayes_imap_info (entry.first);
-        auto temp_guid = gnc::GUID::from_string (std::get <2> (parsed_key));
-        GncGUID guid = temp_guid;
-        auto map_account = xaccAccountLookup (&guid, gnc_account_get_book (imapInfo.source_account));
-        std::string category_head {std::get <0> (parsed_key) + "/" + std::get <1> (parsed_key)};
-        auto imap_node = static_cast <GncImapInfo*> (g_malloc (sizeof (GncImapInfo)));
-        auto count = entry.second->get <int64_t> ();
-        imap_node->source_account = imapInfo.source_account;
-        imap_node->map_account = map_account;
-        imap_node->full_category = g_strdup (key);
-        imap_node->match_string = g_strdup (std::get <1> (parsed_key).c_str ());
-        imap_node->category_head = g_strdup (category_head.c_str ());
-        imap_node->count = g_strdup_printf ("%" G_GINT64_FORMAT, count);
-        imapInfo.list = g_list_append (imapInfo.list, imap_node);
-    };
+    auto parsed_key = parse_bayes_imap_info (key);
+    auto temp_guid = gnc::GUID::from_string (std::get <2> (parsed_key));
+    GncGUID guid = temp_guid;
+    auto map_account = xaccAccountLookup (&guid, gnc_account_get_book (imapInfo.source_account));
+    auto imap_node = static_cast <GncImapInfo*> (g_malloc (sizeof (GncImapInfo)));
+    auto count = value->get <int64_t> ();
+    imap_node->source_account = imapInfo.source_account;
+    imap_node->map_account = map_account;
+    imap_node->head = g_strdup (key);
+    imap_node->match_string = g_strdup (std::get <1> (parsed_key).c_str ());
+    imap_node->category = g_strdup(" ");
+    imap_node->count = g_strdup_printf ("%" G_GINT64_FORMAT, count);
+    imapInfo.list = g_list_append (imapInfo.list, imap_node);
 }
 
 GList *
@@ -5625,22 +5613,24 @@ GList *
 gnc_account_imap_get_info (Account *acc, const char *category)
 {
     GList *list = NULL;
-    gchar *category_head = NULL;
 
     GncImapInfo imapInfo;
 
+    std::vector<std::string> path {IMAP_FRAME};
+    if (category)
+        path.emplace_back (category);
+
     imapInfo.source_account = acc;
     imapInfo.list = list;
 
-    category_head = g_strdup_printf (IMAP_FRAME "/%s", category);
-    imapInfo.category_head = category_head;
+    imapInfo.head = g_strdup (IMAP_FRAME);
+    imapInfo.category = g_strdup (category);
 
-    if (qof_instance_has_slot (QOF_INSTANCE(acc), category_head))
-        qof_instance_foreach_slot (QOF_INSTANCE(acc), category_head,
+    if (qof_instance_has_path_slot (QOF_INSTANCE (acc), path))
+    {
+        qof_instance_foreach_slot (QOF_INSTANCE(acc), IMAP_FRAME, category,
                                    build_non_bayes, &imapInfo);
-
-    g_free (category_head);
-
+    }
     return imapInfo.list;
 }
 
@@ -5667,22 +5657,44 @@ gnc_account_get_map_entry (Account *acc, const char *full_category)
 
 
 void
-gnc_account_delete_map_entry (Account *acc, char *full_category, gboolean empty)
+gnc_account_delete_map_entry (Account *acc, char *head, char *category,
+                              char *match_string, gboolean empty)
 {
-    gchar *kvp_path = g_strdup (full_category);
-    if ((acc != NULL) && qof_instance_has_slot (QOF_INSTANCE(acc), kvp_path))
+    if (acc != NULL)
     {
-        xaccAccountBeginEdit (acc);
-        if (empty)
-            qof_instance_slot_path_delete_if_empty (QOF_INSTANCE(acc), {kvp_path});
-        else
-            qof_instance_slot_path_delete (QOF_INSTANCE(acc), {kvp_path});
-        PINFO("Account is '%s', path is '%s'", xaccAccountGetName (acc), kvp_path);
-        qof_instance_set_dirty (QOF_INSTANCE(acc));
-        xaccAccountCommitEdit (acc);
+        std::vector<std::string> path {head};
+        if (category)
+            path.emplace_back (category);
+        if (match_string)
+            path.emplace_back (match_string);
+
+        if (qof_instance_has_path_slot (QOF_INSTANCE (acc), path))
+        {
+            xaccAccountBeginEdit (acc);
+            if (empty)
+                qof_instance_slot_path_delete_if_empty (QOF_INSTANCE(acc), path);
+            else
+                qof_instance_slot_path_delete (QOF_INSTANCE(acc), path);
+            PINFO("Account is '%s', head is '%s', category is '%s', match_string is'%s'",
+                   xaccAccountGetName (acc), head, category, match_string);
+            qof_instance_set_dirty (QOF_INSTANCE(acc));
+            xaccAccountCommitEdit (acc);
+        }
+    }
+}
+
+void
+gnc_account_delete_all_bayes_maps (Account *acc)
+{
+    if (acc != NULL)
+    {
+        auto slots = qof_instance_get_slots_prefix (QOF_INSTANCE (acc), IMAP_FRAME_BAYES);
+        if (!slots.size()) return;
+        for (auto const & entry : slots)
+        {
+             qof_instance_slot_path_delete (QOF_INSTANCE (acc), {entry.first});
+        }
     }
-    g_free (kvp_path);
-    g_free (full_category);
 }
 
 /* ================================================================ */
diff --git a/libgnucash/engine/Account.h b/libgnucash/engine/Account.h
index 477d406..758543e 100644
--- a/libgnucash/engine/Account.h
+++ b/libgnucash/engine/Account.h
@@ -1423,8 +1423,8 @@ typedef struct imap_info
     Account        *source_account;
     Account        *map_account;
     GList          *list;
-    char           *category_head;
-    char           *full_category;
+    char           *head;
+    char           *category;
     char           *match_string;
     char           *count;
 }GncImapInfo;
@@ -1444,10 +1444,15 @@ GList *gnc_account_imap_get_info (Account *acc, const char *category);
  */
 gchar *gnc_account_get_map_entry (Account *acc, const char *full_category);
 
-/** Delete the entry for Account pointed to by full_category, if empty is TRUE then use
- *  delete if empty, full_category is freed
+/** Delete the entry for Account pointed to by head,category and match_string,
+ *  if empty is TRUE then use delete if empty
  */
-void gnc_account_delete_map_entry (Account *acc, char *full_category, gboolean empty);
+void gnc_account_delete_map_entry (Account *acc, char *head, char *category,
+                                   char *match_string, gboolean empty);
+
+/** Delete all bayes entries for Account
+ */
+void gnc_account_delete_all_bayes_maps (Account *acc);
 
 /** @} */
 
diff --git a/libgnucash/engine/qofinstance-p.h b/libgnucash/engine/qofinstance-p.h
index 102af1e..801663c 100644
--- a/libgnucash/engine/qofinstance-p.h
+++ b/libgnucash/engine/qofinstance-p.h
@@ -155,9 +155,9 @@ void qof_instance_kvp_merge_guids (const QofInstance *target,
 gboolean qof_instance_has_slot (const QofInstance *inst, const char *path);
 void qof_instance_slot_delete (const QofInstance *, const char * path);
 void qof_instance_slot_delete_if_empty (const QofInstance *, const char * path);
-void qof_instance_foreach_slot (const QofInstance *inst, const char *path,
-                                void(*proc)(const char*, const GValue*, void*),
-                                void* data);
+void qof_instance_foreach_slot (const QofInstance *inst, const char *head,
+                                const char *category, void(*proc)(const char*,
+                                const GValue*, void*), void* data);
 #ifdef __cplusplus
 } /* extern "C" */
 
diff --git a/libgnucash/engine/qofinstance.cpp b/libgnucash/engine/qofinstance.cpp
index cc7c46b..db5a88b 100644
--- a/libgnucash/engine/qofinstance.cpp
+++ b/libgnucash/engine/qofinstance.cpp
@@ -1359,11 +1359,14 @@ wrap_gvalue_function (const char* key, KvpValue *val, wrap_param & param)
 }
 
 void
-qof_instance_foreach_slot (const QofInstance *inst, const char* path,
-                           void (*proc)(const char*, const GValue*, void*),
-                           void* data)
+qof_instance_foreach_slot (const QofInstance *inst, const char* head, const char* category,
+                           void (*proc)(const char*, const GValue*, void*), void* data)
 {
-    auto slot = inst->kvp_data->get_slot({path});
+    std::vector<std::string> path {head};
+    if (category)
+        path.emplace_back (category);
+
+    auto slot = inst->kvp_data->get_slot(path);
     if (slot == nullptr || slot->get_type() != KvpValue::Type::FRAME)
         return;
     auto frame = slot->get<KvpFrame*>();



Summary of changes:
 gnucash/gnome/dialog-imap-editor.c          | 108 +++++++++++++++------------
 gnucash/gtkbuilder/dialog-imap-editor.glade |  11 ++-
 libgnucash/engine/Account.cpp               | 110 +++++++++++++++-------------
 libgnucash/engine/Account.h                 |  15 ++--
 libgnucash/engine/qofinstance-p.h           |   6 +-
 libgnucash/engine/qofinstance.cpp           |  11 ++-
 libgnucash/engine/test/gtest-import-map.cpp |   3 +-
 7 files changed, 151 insertions(+), 113 deletions(-)



More information about the gnucash-changes mailing list