Port Pidgin to the new PurpleConversationManager API

Mon, 14 Jun 2021 23:00:10 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 14 Jun 2021 23:00:10 -0500
changeset 40952
53fa03701534
parent 40951
c83bf354d142
child 40954
0d2cd3af6983

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/

pidgin/gtkblist.c file | annotate | diff | comparison | revisions
pidgin/gtkconv.c file | annotate | diff | comparison | revisions
pidgin/gtkdialogs.c file | annotate | diff | comparison | revisions
pidgin/gtkmedia.c file | annotate | diff | comparison | revisions
pidgin/pidgincommands.c file | annotate | diff | comparison | revisions
pidgin/plugins/gestures/gestures.c file | annotate | diff | comparison | revisions
--- 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;

mercurial