Mon, 14 Jun 2021 23:00:10 -0500
Port Pidgin to the new PurpleConversationManager API
Testing Done:
Joined and chat and sent a message as well as a im.
Reviewed at https://reviews.imfreedom.org/r/750/
--- a/pidgin/gtkblist.c Mon Jun 14 22:18:20 2021 -0500 +++ b/pidgin/gtkblist.c Mon Jun 14 23:00:10 2021 -0500 @@ -354,20 +354,24 @@ static PurpleConversation * find_conversation_with_buddy(PurpleBuddy *buddy) { + PurpleConversationManager *manager; PidginBlistNode *ui = g_object_get_data(G_OBJECT(buddy), UI_DATA); if(ui) { return ui->conv.conv; } - return PURPLE_CONVERSATION(purple_conversations_find_im_with_account( - purple_buddy_get_name(buddy), purple_buddy_get_account(buddy))); + manager = purple_conversation_manager_get_default(); + return purple_conversation_manager_find_im(manager, + purple_buddy_get_account(buddy), + purple_buddy_get_name(buddy)); } static void gtk_blist_join_chat(PurpleChat *chat) { PurpleAccount *account; PurpleConversation *conv; + PurpleConversationManager *manager; PurpleProtocol *protocol; GHashTable *components; const char *name; @@ -378,20 +382,21 @@ components = purple_chat_get_components(chat); - if(protocol) { + if(PURPLE_IS_PROTOCOL_CHAT(protocol)) { chat_name = purple_protocol_chat_get_name(PURPLE_PROTOCOL_CHAT(protocol), components); } - if (chat_name) + if(chat_name != NULL) { name = chat_name; - else + } else { name = purple_chat_get_name(chat); - - conv = PURPLE_CONVERSATION(purple_conversations_find_chat_with_account(name, - account)); - - if (conv != NULL) { + } + + manager = purple_conversation_manager_get_default(); + conv = purple_conversation_manager_find(manager, account, name); + + if(PURPLE_IS_CONVERSATION(conv)) { pidgin_conv_attach_to_conversation(conv); purple_conversation_present(conv); } @@ -3275,7 +3280,9 @@ conv = PURPLE_CHAT_CONVERSATION(bnode->conv.conv); } else { PurpleConversation *chat_conv; + PurpleConversationManager *manager; char *chat_name; + if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, CHAT, get_name)) { chat_name = purple_protocol_chat_get_name(PURPLE_PROTOCOL_CHAT(protocol), purple_chat_get_components(chat)); @@ -3283,8 +3290,9 @@ chat_name = g_strdup(purple_chat_get_name(chat)); } - chat_conv = purple_conversations_find_chat_with_account(chat_name, - account); + manager = purple_conversation_manager_get_default(); + chat_conv = purple_conversation_manager_find_chat(manager, account, + chat_name); g_free(chat_name); if(PURPLE_IS_CHAT_CONVERSATION(chat_conv)) { @@ -6005,6 +6013,8 @@ if (resp == GTK_RESPONSE_OK) { + PurpleConversationManager *manager; + who = gtk_entry_get_text(GTK_ENTRY(data->entry)); grp = pidgin_text_combo_box_entry_get_text(data->combo); whoalias = gtk_entry_get_text(GTK_ENTRY(data->entry_for_alias)); @@ -6059,11 +6069,14 @@ * Or something. --Mark */ - im = purple_conversations_find_im_with_account(who, data->rq_data.account); - if (im != NULL) { + manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, data->rq_data.account, + who); + if(PURPLE_IS_IM_CONVERSATION(im)) { icon = purple_im_conversation_get_icon(PURPLE_IM_CONVERSATION(im)); - if (icon != NULL) + if(icon != NULL) { purple_buddy_icon_update(icon); + } } }
--- a/pidgin/gtkconv.c Mon Jun 14 22:18:20 2021 -0500 +++ b/pidgin/gtkconv.c Mon Jun 14 23:00:10 2021 -0500 @@ -1732,8 +1732,17 @@ gboolean hidden_only, guint max_count) { - return pidgin_conversations_get_unseen(purple_conversations_get_all(), - min_state, hidden_only, max_count); + PurpleConversationManager *manager; + GList *list, *ret = NULL; + + manager = purple_conversation_manager_get_default(); + list = purple_conversation_manager_get_all(manager); + + ret = pidgin_conversations_get_unseen(list, min_state, hidden_only, + max_count); + g_list_free(list); + + return ret; } static void @@ -3215,9 +3224,15 @@ for (bn = purple_blist_node_get_first_child(cn); bn; bn = purple_blist_node_get_sibling_next(bn)) { PurpleBuddy *b = PURPLE_BUDDY(bn); PurpleConversation *im; - if ((im = purple_conversations_find_im_with_account(purple_buddy_get_name(b), purple_buddy_get_account(b)))) { - if (PIDGIN_CONVERSATION(im)) - return PIDGIN_CONVERSATION(im); + PurpleConversationManager *manager; + + manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, + purple_buddy_get_account(b), + purple_buddy_get_name(b)); + + if(PIDGIN_CONVERSATION(im)) { + return PIDGIN_CONVERSATION(im); } } @@ -4280,22 +4295,31 @@ close_on_tabs_pref_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data) { - GList *l; + GList *list; PurpleConversation *conv; + PurpleConversationManager *manager; PidginConversation *gtkconv; - for (l = purple_conversations_get_all(); l != NULL; l = l->next) { - conv = (PurpleConversation *)l->data; - - if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) + manager = purple_conversation_manager_get_default(); + list = purple_conversation_manager_get_all(manager); + while(list != NULL) { + conv = PURPLE_CONVERSATION(list->data); + + if(!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) { + list = g_list_delete_link(list, list); + continue; + } gtkconv = PIDGIN_CONVERSATION(conv); - if (value) + if(value) { gtk_widget_show(gtkconv->close); - else + } else { gtk_widget_hide(gtkconv->close); + } + + list = g_list_delete_link(list, list); } } @@ -4322,18 +4346,23 @@ show_formatting_toolbar_pref_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data) { - GList *l; + GList *list; PurpleConversation *conv; + PurpleConversationManager *manager; PidginConversation *gtkconv; PidginConvWindow *win; gboolean visible = (gboolean)GPOINTER_TO_INT(value); - for (l = purple_conversations_get_all(); l != NULL; l = l->next) - { - conv = (PurpleConversation *)l->data; - - if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) + manager = purple_conversation_manager_get_default(); + list = purple_conversation_manager_get_all(manager); + while(list != NULL) { + conv = PURPLE_CONVERSATION(list->data); + + if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) { + list = g_list_delete_link(list, list); + continue; + } gtkconv = PIDGIN_CONVERSATION(conv); win = gtkconv->win; @@ -4344,6 +4373,8 @@ ); talkatu_editor_set_toolbar_visible(TALKATU_EDITOR(gtkconv->editor), visible); + + list = g_list_delete_link(list, list); } } @@ -4426,9 +4457,15 @@ { PurpleBuddy *buddy = (PurpleBuddy*)node; PurpleConversation *im; - im = purple_conversations_find_im_with_account(purple_buddy_get_name(buddy), purple_buddy_get_account(buddy)); - if (im) + PurpleConversationManager *manager; + + manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, + purple_buddy_get_account(buddy), + purple_buddy_get_name(buddy)); + if(PURPLE_IS_IM_CONVERSATION(im)) { return PIDGIN_CONVERSATION(im); + } } return NULL; } @@ -4436,11 +4473,14 @@ static void account_signed_off_cb(PurpleConnection *gc, gpointer event) { - GList *iter; - - for (iter = purple_conversations_get_all(); iter; iter = iter->next) - { - PurpleConversation *conv = iter->data; + PurpleConversationManager *manager; + GList *list; + + manager = purple_conversation_manager_get_default(); + list = purple_conversation_manager_get_all(manager); + + while(list != NULL) { + PurpleConversation *conv = PURPLE_CONVERSATION(list->data); /* This seems fine in theory, but we also need to cover the * case of this account matching one of the other buddies in @@ -4466,15 +4506,21 @@ if (chat == NULL && comps != NULL) g_hash_table_destroy(comps); } + + list = g_list_delete_link(list, list); } } static void account_signing_off(PurpleConnection *gc) { - GList *list = purple_conversations_get_all(); + PurpleConversationManager *manager; + GList *list; PurpleAccount *account = purple_connection_get_account(gc); + manager = purple_conversation_manager_get_default(); + list = purple_conversation_manager_get_all(manager); + /* We are about to sign off. See which chats we are currently in, and mark * them for rejoin on reconnect. */ while(list != NULL) { @@ -4534,20 +4580,31 @@ update_buddy_idle_changed(PurpleBuddy *buddy, gboolean old, gboolean newidle) { PurpleConversation *im; - - im = purple_conversations_find_im_with_account(purple_buddy_get_name(buddy), purple_buddy_get_account(buddy)); - if (im) + PurpleConversationManager *manager; + + manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, + purple_buddy_get_account(buddy), + purple_buddy_get_name(buddy)); + if(PURPLE_IS_IM_CONVERSATION(im)) { pidgin_conv_update_fields(im, PIDGIN_CONV_TAB_ICON); + } } static void update_buddy_icon(PurpleBuddy *buddy) { PurpleConversation *im; - - im = purple_conversations_find_im_with_account(purple_buddy_get_name(buddy), purple_buddy_get_account(buddy)); - if (im) + PurpleConversationManager *manager; + + manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, + purple_buddy_get_account(buddy), + purple_buddy_get_name(buddy)); + + if(PURPLE_IS_IM_CONVERSATION(im)) { pidgin_conv_update_fields(im, PIDGIN_CONV_BUDDY_ICON); + } } static void @@ -4580,15 +4637,19 @@ update_buddy_typing(PurpleAccount *account, const char *who) { PurpleConversation *conv; + PurpleConversationManager *manager; PidginConversation *gtkconv; - conv = PURPLE_CONVERSATION(purple_conversations_find_im_with_account(who, account)); - if (!conv) + manager = purple_conversation_manager_get_default(); + conv = purple_conversation_manager_find_im(manager, account, who); + if(!PURPLE_IS_CONVERSATION(conv)) { return; + } gtkconv = PIDGIN_CONVERSATION(conv); - if (gtkconv && gtkconv->active_conv == conv) + if(gtkconv && gtkconv->active_conv == conv) { pidgin_conv_update_fields(conv, PIDGIN_CONV_COLORIZE_TITLE); + } } static void @@ -4724,10 +4785,17 @@ GDateTime *dt = NULL; if (PURPLE_IS_IM_CONVERSATION(conv)) { + PurpleConversationManager *manager; GList *convs; + list = g_list_copy(list); - for (convs = purple_conversations_get_all(); convs; convs = convs->next) { + manager = purple_conversation_manager_get_default(); + convs = purple_conversation_manager_get_all(manager); + + while(convs != NULL) { if(!PURPLE_IS_IM_CONVERSATION(convs->data)) { + convs = g_list_delete_link(convs, convs); + continue; } if (convs->data != conv && @@ -4735,6 +4803,8 @@ pidgin_conv_attach(convs->data); list = g_list_concat(list, g_list_copy(purple_conversation_get_message_history(convs->data))); } + + convs = g_list_delete_link(convs, convs); } list = g_list_sort(list, (GCompareFunc)message_compare); gtkconv->attach_current = list;
--- a/pidgin/gtkdialogs.c Mon Jun 14 22:18:20 2021 -0500 +++ b/pidgin/gtkdialogs.c Mon Jun 14 23:00:10 2021 -0500 @@ -322,14 +322,17 @@ pidgin_dialogs_im_with_user(PurpleAccount *account, const char *username) { PurpleConversation *im; + PurpleConversationManager *manager; g_return_if_fail(account != NULL); g_return_if_fail(username != NULL); - im = purple_conversations_find_im_with_account(username, account); + manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, account, username); - if (im == NULL) + if(!PURPLE_IS_IM_CONVERSATION(im)) { im = purple_im_conversation_new(account, username); + } pidgin_conv_attach_to_conversation(im); purple_conversation_present(im);
--- a/pidgin/gtkmedia.c Mon Jun 14 22:18:20 2021 -0500 +++ b/pidgin/gtkmedia.c Mon Jun 14 23:00:10 2021 -0500 @@ -511,32 +511,46 @@ static void pidgin_media_emit_message(PidginMedia *gtkmedia, const char *msg) { - PurpleAccount *account = purple_media_get_account( - gtkmedia->priv->media); - PurpleConversation *conv = purple_conversations_find_with_account( - gtkmedia->priv->screenname, account); - if (conv != NULL) + PurpleConversation *conv; + PurpleConversationManager *manager; + PurpleAccount *account; + + account = purple_media_get_account(gtkmedia->priv->media); + manager = purple_conversation_manager_get_default(); + conv = purple_conversation_manager_find(manager, account, + gtkmedia->priv->screenname); + + if(PURPLE_IS_CONVERSATION(conv)) { purple_conversation_write_system_message(conv, msg, 0); + } + g_object_unref(account); } static void -pidgin_media_error_cb(PidginMedia *media, const char *error, PidginMedia *gtkmedia) +pidgin_media_error_cb(PidginMedia *media, const gchar *error, + PidginMedia *gtkmedia) { - PurpleAccount *account = purple_media_get_account( - gtkmedia->priv->media); - PurpleConversation *conv = purple_conversations_find_with_account( - gtkmedia->priv->screenname, account); - if (conv != NULL) { - purple_conversation_write_system_message( - conv, error, PURPLE_MESSAGE_ERROR); + PurpleConversation *conv; + PurpleConversationManager *manager; + PurpleAccount *account; + + account = purple_media_get_account(gtkmedia->priv->media); + manager = purple_conversation_manager_get_default(); + conv = purple_conversation_manager_find(manager, account, + gtkmedia->priv->screenname); + + if(PURPLE_IS_CONVERSATION(conv)) { + purple_conversation_write_system_message(conv, error, + PURPLE_MESSAGE_ERROR); } else { purple_notify_error(NULL, NULL, _("Media error"), error, - purple_request_cpar_from_conversation(conv)); + purple_request_cpar_from_conversation(conv)); } gtk_statusbar_push(GTK_STATUSBAR(gtkmedia->priv->statusbar), - 0, error); + 0, error); + g_object_unref(account); }
--- a/pidgin/pidgincommands.c Mon Jun 14 22:18:20 2021 -0500 +++ b/pidgin/pidgincommands.c Mon Jun 14 23:00:10 2021 -0500 @@ -137,9 +137,19 @@ clearall_command_cb(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data) { - GList *l; - for (l = purple_conversations_get_all(); l != NULL; l = l->next) - purple_conversation_clear_message_history(PURPLE_CONVERSATION(l->data)); + PurpleConversationManager *manager; + GList *list; + + manager = purple_conversation_manager_get_default(); + list = purple_conversation_manager_get_all(manager); + + while(list != NULL) { + PurpleConversation *conv = PURPLE_CONVERSATION(list->data); + + purple_conversation_clear_message_history(conv); + + list = g_list_delete_link(list, list); + } return PURPLE_CMD_RET_OK; }
--- a/pidgin/plugins/gestures/gestures.c Mon Jun 14 22:18:20 2021 -0500 +++ b/pidgin/plugins/gestures/gestures.c Mon Jun 14 23:00:10 2021 -0500 @@ -243,7 +243,8 @@ gestures_load(GPluginPlugin *plugin, GError **error) { PurpleConversation *conv; - GList *l; + PurpleConversationManager *manager; + GList *list; purple_prefs_add_none("/plugins/gtk"); purple_prefs_add_none("/plugins/gtk/X11"); @@ -255,13 +256,20 @@ gstroke_set_draw_strokes(purple_prefs_get_bool( "/plugins/gtk/X11/gestures/visual")); - for (l = purple_conversations_get_all(); l != NULL; l = l->next) { - conv = (PurpleConversation *)l->data; + manager = purple_conversation_manager_get_default(); + list = purple_conversation_manager_get_all(manager); + while(list != NULL) { + conv = PURPLE_CONVERSATION(list->data); - if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) + if(!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) { + list = g_list_delete_link(list, list); + continue; + } attach_signals(conv); + + list = g_list_delete_link(list, list); } purple_signal_connect(purple_conversations_get_handle(), @@ -275,19 +283,28 @@ gestures_unload(GPluginPlugin *plugin, GError **error) { PurpleConversation *conv; + PurpleConversationManager *manager; PidginConversation *gtkconv; - GList *l; + GList *list; + + manager = purple_conversation_manager_get_default(); + list = purple_conversation_manager_get_all(manager); - for (l = purple_conversations_get_all(); l != NULL; l = l->next) { - conv = (PurpleConversation *)l->data; + while(list != NULL) { + conv = PURPLE_CONVERSATION(list->data); - if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) + if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) { + list = g_list_delete_link(list, list); + continue; + } gtkconv = PIDGIN_CONVERSATION(conv); gstroke_cleanup(gtkconv->history); gstroke_disable(gtkconv->history); + + list = g_list_delete_link(list, list); } return TRUE;