[evolution] message_list_get_selected: Give the returned array a free func.



commit f642e03d4967c80aaad45475475752264c95de5c
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sat Jun 15 08:19:27 2013 -0400

    message_list_get_selected: Give the returned array a free func.
    
    The returned UID array now has a built-in "free" function for its
    elements and should be released by callers with g_ptr_array_unref()
    rather than em_utils_uids_free() or some equivalent.

 libemail-engine/mail-ops.c                         |    8 ++--
 mail/e-mail-folder-pane.c                          |    4 --
 mail/e-mail-reader-utils.c                         |   27 +++---------
 mail/e-mail-reader.c                               |   43 +++++--------------
 mail/em-utils.c                                    |    7 ---
 mail/message-list.c                                |   36 +++++++++++-----
 modules/mail/e-mail-shell-view-actions.c           |    8 ++--
 modules/mail/e-mail-shell-view-private.c           |    2 +-
 plugins/mail-to-task/mail-to-task.c                |    8 ++--
 .../mailing-list-actions/mailing-list-actions.c    |    2 +-
 plugins/templates/templates.c                      |    2 +-
 11 files changed, 58 insertions(+), 89 deletions(-)
---
diff --git a/libemail-engine/mail-ops.c b/libemail-engine/mail-ops.c
index 2eb0dae..64ef065 100644
--- a/libemail-engine/mail-ops.c
+++ b/libemail-engine/mail-ops.c
@@ -177,7 +177,7 @@ em_filter_folder_element_free (struct _filter_mail_msg *m)
                g_object_unref (m->source_folder);
 
        if (m->source_uids)
-               em_utils_uids_free (m->source_uids);
+               g_ptr_array_unref (m->source_uids);
 
        if (m->destination)
                g_object_unref (m->destination);
@@ -206,7 +206,7 @@ mail_filter_folder (EMailSession *session,
        m = mail_msg_new (&em_filter_folder_element_info);
        m->session = g_object_ref (session);
        m->source_folder = g_object_ref (source_folder);
-       m->source_uids = uids;
+       m->source_uids = g_ptr_array_ref (uids);
        m->cache = NULL;
        m->delete = FALSE;
 
@@ -1149,7 +1149,7 @@ transfer_messages_free (struct _transfer_msg *m)
        g_object_unref (m->session);
        g_object_unref (m->source);
        g_free (m->dest_uri);
-       em_utils_uids_free (m->uids);
+       g_ptr_array_unref (m->uids);
 }
 
 static MailMsgInfo transfer_messages_info = {
@@ -1180,7 +1180,7 @@ mail_transfer_messages (EMailSession *session,
        m = mail_msg_new (&transfer_messages_info);
        m->session = g_object_ref (session);
        m->source = g_object_ref (source);
-       m->uids = uids;
+       m->uids = g_ptr_array_ref (uids);
        m->delete = delete_from_source;
        m->dest_uri = g_strdup (dest_uri);
        m->dest_flags = dest_flags;
diff --git a/mail/e-mail-folder-pane.c b/mail/e-mail-folder-pane.c
index 5da74e4..5c1ef76 100644
--- a/mail/e-mail-folder-pane.c
+++ b/mail/e-mail-folder-pane.c
@@ -88,10 +88,6 @@ mail_paned_view_open_selected_mail (EMailPanedView *view)
        shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend));
        registry = e_shell_get_registry (shell);
 
-       /* XXX Either e_mail_reader_get_selected_uids()
-        *     or MessageList should do this itself. */
-       g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
-
        if (!em_utils_ask_open_many (window, uids->len))
                goto exit;
 
diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c
index 2cd9f96..b50a06b 100644
--- a/mail/e-mail-reader-utils.c
+++ b/mail/e-mail-reader-utils.c
@@ -764,7 +764,7 @@ e_mail_reader_mark_selected (EMailReader *reader,
                        camel_folder_set_message_flags (
                                folder, uids->pdata[ii], mask, set);
 
-               em_utils_uids_free (uids);
+               g_ptr_array_unref (uids);
 
                camel_folder_thaw (folder);
 
@@ -829,12 +829,11 @@ e_mail_reader_open_selected (EMailReader *reader)
                em_utils_folder_is_outbox (registry, folder) ||
                em_utils_folder_is_templates (registry, folder)) {
 
-               /* FIXME This is leaking the UID array.  Give
-                *       the array a "free func" and unref it. */
                e_mail_reader_edit_messages (reader, folder, uids, TRUE, TRUE);
-               g_clear_object (&folder);
 
-               return uids->len;
+               ii = uids->len;
+
+               goto exit;
        }
 
        views = g_ptr_array_new ();
@@ -906,7 +905,7 @@ e_mail_reader_open_selected (EMailReader *reader)
 
 exit:
        g_clear_object (&folder);
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 
        return ii;
 }
@@ -1121,10 +1120,6 @@ e_mail_reader_remove_attachments (EMailReader *reader)
        uids = e_mail_reader_get_selected_uids (reader);
        g_return_if_fail (uids != NULL);
 
-       /* XXX Either e_mail_reader_get_selected_uids()
-        *     or MessageList should do this itself. */
-       g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
-
        /* Remove attachments asynchronously. */
 
        activity = e_mail_reader_new_activity (reader);
@@ -1264,10 +1259,6 @@ e_mail_reader_remove_duplicates (EMailReader *reader)
        uids = e_mail_reader_get_selected_uids (reader);
        g_return_if_fail (uids != NULL);
 
-       /* XXX Either e_mail_reader_get_selected_uids()
-        *     or MessageList should do this itself. */
-       g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
-
        /* Find duplicate messages asynchronously. */
 
        activity = e_mail_reader_new_activity (reader);
@@ -2042,10 +2033,6 @@ e_mail_reader_save_messages (EMailReader *reader)
 
        message_uid = g_ptr_array_index (uids, 0);
 
-       /* XXX Either e_mail_reader_get_selected_uids()
-        *     or MessageList should do this itself. */
-       g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
-
        title = ngettext ("Save Message", "Save Messages", uids->len);
 
        /* Suggest as a filename the subject of the first message. */
@@ -2246,7 +2233,7 @@ e_mail_reader_create_filter_from_selected (EMailReader *reader,
 
        g_object_unref (activity);
 
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 
        g_object_unref (folder);
 }
@@ -2363,7 +2350,7 @@ e_mail_reader_create_vfolder_from_selected (EMailReader *reader,
 
        g_object_unref (activity);
 
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 }
 
 static void
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 598be3a..449879a 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -203,7 +203,7 @@ action_mail_add_sender_cb (GtkAction *action,
 exit:
        if (info != NULL)
                camel_folder_free_message_info (folder, info);
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 
        g_clear_object (&folder);
 }
@@ -435,6 +435,7 @@ action_mail_check_for_junk_cb (GtkAction *action,
                E_FILTER_SOURCE_JUNKTEST, FALSE);
 
        g_clear_object (&folder);
+       g_ptr_array_unref (uids);
 }
 
 static void
@@ -487,20 +488,16 @@ action_mail_copy_cb (GtkAction *action,
        g_free (default_xfer_messages_uri);
        default_xfer_messages_uri = g_strdup (uri);
 
-       if (uri != NULL) {
+       if (uri != NULL)
                mail_transfer_messages (
                        session, folder, uids,
                        FALSE, uri, 0, NULL, NULL);
-               uids = NULL;
-       }
 
 exit:
-       if (uids != NULL)
-               em_utils_uids_free (uids);
-
        gtk_widget_destroy (dialog);
 
        g_clear_object (&folder);
+       g_ptr_array_unref (uids);
 }
 
 static void
@@ -568,6 +565,7 @@ action_mail_filters_apply_cb (GtkAction *action,
                E_FILTER_SOURCE_DEMAND, FALSE);
 
        g_clear_object (&folder);
+       g_ptr_array_unref (uids);
 }
 
 static void
@@ -610,6 +608,7 @@ action_mail_flag_clear_cb (GtkAction *action,
        e_mail_display_reload (display);
 
        g_clear_object (&folder);
+       g_ptr_array_unref (uids);
 }
 
 static void
@@ -631,6 +630,7 @@ action_mail_flag_completed_cb (GtkAction *action,
        e_mail_display_reload (display);
 
        g_clear_object (&folder);
+       g_ptr_array_unref (uids);
 }
 
 static void
@@ -646,6 +646,7 @@ action_mail_flag_for_followup_cb (GtkAction *action,
        em_utils_flag_for_followup (reader, folder, uids);
 
        g_clear_object (&folder);
+       g_ptr_array_unref (uids);
 }
 
 static void
@@ -659,10 +660,6 @@ action_mail_forward_cb (GtkAction *action,
        uids = e_mail_reader_get_selected_uids (reader);
        g_return_if_fail (uids != NULL);
 
-       /* XXX Either e_mail_reader_get_selected_uids()
-        *     or MessageList should do this itself. */
-       g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
-
        if (em_utils_ask_open_many (window, uids->len)) {
                CamelFolder *folder;
 
@@ -689,10 +686,6 @@ action_mail_forward_attached_cb (GtkAction *action,
        uids = e_mail_reader_get_selected_uids (reader);
        g_return_if_fail (uids != NULL);
 
-       /* XXX Either e_mail_reader_get_selected_uids()
-        *     or MessageList should do this itself. */
-       g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
-
        if (em_utils_ask_open_many (window, uids->len)) {
                CamelFolder *folder;
 
@@ -719,10 +712,6 @@ action_mail_forward_inline_cb (GtkAction *action,
        uids = e_mail_reader_get_selected_uids (reader);
        g_return_if_fail (uids != NULL);
 
-       /* XXX Either e_mail_reader_get_selected_uids()
-        *     or MessageList should do this itself. */
-       g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
-
        if (em_utils_ask_open_many (window, uids->len)) {
                CamelFolder *folder;
 
@@ -749,10 +738,6 @@ action_mail_forward_quoted_cb (GtkAction *action,
        uids = e_mail_reader_get_selected_uids (reader);
        g_return_if_fail (uids != NULL);
 
-       /* XXX Either e_mail_reader_get_selected_uids()
-        *     or MessageList should do this itself. */
-       g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
-
        if (em_utils_ask_open_many (window, uids->len)) {
                CamelFolder *folder;
 
@@ -915,10 +900,6 @@ action_mail_message_edit_cb (GtkAction *action,
        shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend));
        registry = e_shell_get_registry (shell);
 
-       /* XXX Either e_mail_reader_get_selected_uids()
-        *     or MessageList should do this itself. */
-       g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
-
        folder = e_mail_reader_ref_folder (reader);
        replace = em_utils_folder_is_drafts (registry, folder);
        e_mail_reader_edit_messages (reader, folder, uids, replace, replace);
@@ -1016,7 +997,7 @@ action_mail_move_cb (GtkAction *action,
 
 exit:
        if (uids != NULL)
-               em_utils_uids_free (uids);
+               g_ptr_array_unref (uids);
 
        gtk_widget_destroy (dialog);
 
@@ -1829,7 +1810,7 @@ action_mail_show_source_cb (GtkAction *action,
 
        g_object_unref (activity);
 
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 
        g_clear_object (&folder);
 }
@@ -1864,7 +1845,7 @@ action_mail_toggle_important_cb (GtkAction *action,
        camel_folder_thaw (folder);
 
        g_clear_object (&folder);
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 }
 
 static void
@@ -4263,7 +4244,7 @@ e_mail_reader_check_state (EMailReader *reader)
                state |= E_MAIL_READER_FOLDER_IS_JUNK;
 
        g_clear_object (&folder);
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 
        return state;
 }
diff --git a/mail/em-utils.c b/mail/em-utils.c
index 103ed62..16a0d67 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -431,9 +431,6 @@ em_utils_flag_for_followup (EMailReader *reader,
        e_mail_display_reload (display);
 
 exit:
-       /* XXX We shouldn't be freeing this. */
-       em_utils_uids_free (uids);
-
        gtk_widget_destroy (GTK_WIDGET (editor));
 }
 
@@ -470,8 +467,6 @@ em_utils_flag_for_followup_clear (GtkWindow *parent,
        }
 
        camel_folder_thaw (folder);
-
-       em_utils_uids_free (uids);
 }
 
 /**
@@ -514,8 +509,6 @@ em_utils_flag_for_followup_completed (GtkWindow *parent,
        camel_folder_thaw (folder);
 
        g_free (now);
-
-       em_utils_uids_free (uids);
 }
 
 /* This kind of sucks, because for various reasons most callers need to run
diff --git a/mail/message-list.c b/mail/message-list.c
index 7657cc1..b0fd942 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -550,14 +550,12 @@ static void
 clear_selection (MessageList *message_list,
                  struct _MLSelection *selection)
 {
-       if (selection->uids) {
-               em_utils_uids_free (selection->uids);
+       if (selection->uids != NULL) {
+               g_ptr_array_unref (selection->uids);
                selection->uids = NULL;
        }
-       if (selection->folder) {
-               g_object_unref (selection->folder);
-               selection->folder = NULL;
-       }
+
+       g_clear_object (&selection->folder);
 }
 
 static ETreePath
@@ -1052,18 +1050,20 @@ message_list_copy (MessageList *message_list,
                        g_object_unref (folder);
                }
 
-               p->clipboard.uids = uids;
+               p->clipboard.uids = g_ptr_array_ref (uids);
                p->clipboard.folder = message_list_ref_folder (message_list);
+
                gtk_selection_owner_set (
                        p->invisible,
                        GDK_SELECTION_CLIPBOARD,
                        gtk_get_current_event_time ());
        } else {
-               em_utils_uids_free (uids);
                gtk_selection_owner_set (
                        NULL, GDK_SELECTION_CLIPBOARD,
                        gtk_get_current_event_time ());
        }
+
+       g_ptr_array_unref (uids);
 }
 
 void
@@ -2328,7 +2328,7 @@ ml_tree_drag_data_get (ETree *tree,
        }
 
        g_clear_object (&folder);
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 }
 
 /* TODO: merge this with the folder tree stuff via empopup targets */
@@ -3533,7 +3533,9 @@ build_tree (MessageList *message_list,
                saveuid = find_next_selectable (message_list);
 
                selected = message_list_get_selected (message_list);
+
                e_tree_memory_freeze (E_TREE_MEMORY (etm));
+
                clear_tree (message_list, FALSE);
 
                build_subtree (
@@ -3552,7 +3554,8 @@ build_tree (MessageList *message_list,
                e_tree_memory_freeze (E_TREE_MEMORY (etm));
 
                message_list_set_selected (message_list, selected);
-               em_utils_uids_free (selected);
+
+               g_ptr_array_unref (selected);
 
                /* Show the cursor unless we're responding to a
                 * "folder-changed" signal from our CamelFolder. */
@@ -3841,16 +3844,22 @@ build_flat (MessageList *message_list,
                saveuid = find_next_selectable (message_list);
 
        selected = message_list_get_selected (message_list);
+
        e_tree_memory_freeze (E_TREE_MEMORY (etm));
+
        clear_tree (message_list, FALSE);
+
        for (i = 0; i < summary->len; i++) {
                CamelMessageInfo *info = summary->pdata[i];
 
                ml_uid_nodemap_insert (message_list, info, NULL, -1);
        }
+
        e_tree_memory_thaw (E_TREE_MEMORY (etm));
+
        message_list_set_selected (message_list, selected);
-       em_utils_uids_free (selected);
+
+       g_ptr_array_unref (selected);
 
        if (saveuid) {
                ETreePath node;
@@ -4343,6 +4352,7 @@ on_selection_changed_cmd (ETree *tree,
        /* not sure if we could just ignore this for the cursor, i think sometimes you
         * only get a selection changed when you should also get a cursor activated? */
        uids = message_list_get_selected (message_list);
+
        if (uids->len == 1)
                newuid = g_ptr_array_index (uids, 0);
        else if ((cursor = e_tree_get_cursor (tree)))
@@ -4368,7 +4378,7 @@ on_selection_changed_cmd (ETree *tree,
 
        message_list->last_sel_single = uids->len == 1;
 
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 }
 
 static gint
@@ -4496,6 +4506,8 @@ message_list_get_selected (MessageList *message_list)
                g_ptr_array_new ()
        };
 
+       g_ptr_array_set_free_func (data.uids, (GDestroyNotify) g_free);
+
        e_tree_selected_path_foreach (
                E_TREE (message_list), ml_getselected_cb, &data);
 
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index 4056a7b..c8bec96 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -1007,7 +1007,7 @@ action_mail_label_cb (GtkToggleAction *action,
        camel_folder_thaw (folder);
 
        g_clear_object (&folder);
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 }
 
 static void
@@ -1080,7 +1080,7 @@ action_mail_label_new_cb (GtkAction *action,
                        folder, uids->pdata[ii], label_tag, TRUE);
 
        g_clear_object (&folder);
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 
        g_free (label_tag);
 
@@ -1143,7 +1143,7 @@ action_mail_label_none_cb (GtkAction *action,
        }
 
        g_clear_object (&folder);
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 }
 
 static void
@@ -2390,7 +2390,7 @@ e_mail_shell_view_update_popup_labels (EMailShellView *mail_shell_view)
                ii++;
        }
 
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 }
 
 void
diff --git a/modules/mail/e-mail-shell-view-private.c b/modules/mail/e-mail-shell-view-private.c
index 1697177..61cfd8b 100644
--- a/modules/mail/e-mail-shell-view-private.c
+++ b/modules/mail/e-mail-shell-view-private.c
@@ -1086,7 +1086,7 @@ e_mail_shell_view_update_sidebar (EMailShellView *mail_shell_view)
                        num_visible), num_visible);
        }
 
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 
        uid = camel_service_get_uid (CAMEL_SERVICE (parent_store));
        store_is_local = (g_strcmp0 (uid, E_MAIL_SESSION_LOCAL_UID) == 0);
diff --git a/plugins/mail-to-task/mail-to-task.c b/plugins/mail-to-task/mail-to-task.c
index 12ff5b0..be27242 100644
--- a/plugins/mail-to-task/mail-to-task.c
+++ b/plugins/mail-to-task/mail-to-task.c
@@ -1035,7 +1035,7 @@ do_mail_to_event (AsyncData *data)
        /* free memory */
        if (client != NULL)
                g_object_unref (client);
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
        g_object_unref (folder);
 
        g_object_unref (data->source);
@@ -1127,7 +1127,7 @@ mail_to_event (ECalClientSourceType source_type,
                g_free (question);
 
                if (response == GTK_RESPONSE_NO) {
-                       em_utils_uids_free (uids);
+                       g_ptr_array_unref (uids);
                        return;
                }
        }
@@ -1195,7 +1195,6 @@ mail_to_event (ECalClientSourceType source_type,
        } else if (!source) {
                e_notice (NULL, GTK_MESSAGE_ERROR, _("No writable calendar is available."));
 
-               em_utils_uids_free (uids);
                if (error)
                        g_error_free (error);
                goto exit;
@@ -1212,7 +1211,7 @@ mail_to_event (ECalClientSourceType source_type,
                data->source = g_object_ref (source);
                data->source_type = source_type;
                data->folder = e_mail_reader_ref_folder (reader);
-               data->uids = uids;
+               data->uids = g_ptr_array_ref (uids);
                data->with_attendees = with_attendees;
 
                if (uids->len == 1)
@@ -1232,6 +1231,7 @@ mail_to_event (ECalClientSourceType source_type,
 
 exit:
        g_object_unref (default_source);
+       g_ptr_array_unref (uids);
 }
 
 static void
diff --git a/plugins/mailing-list-actions/mailing-list-actions.c 
b/plugins/mailing-list-actions/mailing-list-actions.c
index efbe222..e390e9d 100644
--- a/plugins/mailing-list-actions/mailing-list-actions.c
+++ b/plugins/mailing-list-actions/mailing-list-actions.c
@@ -316,7 +316,7 @@ emla_list_action (EMailReader *reader,
 
        g_clear_object (&folder);
 
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 }
 
 static void
diff --git a/plugins/templates/templates.c b/plugins/templates/templates.c
index d83e1fb..95d0060 100644
--- a/plugins/templates/templates.c
+++ b/plugins/templates/templates.c
@@ -1040,7 +1040,7 @@ action_reply_with_template_cb (GtkAction *action,
 
        g_clear_object (&folder);
 
-       em_utils_uids_free (uids);
+       g_ptr_array_unref (uids);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]