--- a/libpurple/account.c Tue Mar 02 22:50:02 2021 -0600
+++ b/libpurple/account.c Tue Mar 02 23:06:11 2021 -0600
@@ -33,6 +33,7 @@
#include "purplecredentialmanager.h"
#include "purpleprivate.h"
#include "purpleprotocolclient.h"
+#include "purpleprotocolmanager.h" #include "purpleprotocolserver.h"
@@ -2057,6 +2058,19 @@
return priv->protocol_id;
+purple_account_get_protocol(PurpleAccount *account) { + PurpleAccountPrivate *priv = NULL; + PurpleProtocolManager *manager = NULL; + g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL); + priv = purple_account_get_instance_private(account); + manager = purple_protocol_manager_get_default(); + return purple_protocol_manager_find(manager, priv->protocol_id); purple_account_get_protocol_name(PurpleAccount *account)
--- a/pidgin/gtkaccount.c Tue Mar 02 22:50:02 2021 -0600
+++ b/pidgin/gtkaccount.c Tue Mar 02 23:06:11 2021 -0600
@@ -2146,7 +2146,7 @@
if ((pixbuf != NULL) && purple_account_is_disconnected(account))
gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE);
- protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+ protocol = purple_account_get_protocol(account); icon_spec = purple_protocol_get_icon_spec(protocol);
@@ -2599,11 +2599,7 @@
authorize_reason_cb(struct auth_request *ar)
- const char *protocol_id;
- PurpleProtocol *protocol = NULL;
- protocol_id = purple_account_get_protocol_id(ar->account);
- protocol = purple_protocols_find(protocol_id);
+ PurpleProtocol *protocol = purple_account_get_protocol(ar->account); if (protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_AUTHORIZATION_GRANTED_MESSAGE)) {
/* Duplicate information because ar is freed by closing minidialog */
@@ -2642,11 +2638,7 @@
deny_reason_cb(struct auth_request *ar)
- const char *protocol_id;
- PurpleProtocol *protocol = NULL;
- protocol_id = purple_account_get_protocol_id(ar->account);
- protocol = purple_protocols_find(protocol_id);
+ PurpleProtocol *protocol = purple_account_get_protocol(ar->account); if (protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_AUTHORIZATION_DENIED_MESSAGE)) {
/* Duplicate information because ar is freed by closing minidialog */
--- a/pidgin/gtkblist.c Tue Mar 02 22:50:02 2021 -0600
+++ b/pidgin/gtkblist.c Tue Mar 02 23:06:11 2021 -0600
@@ -375,7 +375,7 @@
account = purple_chat_get_account(chat);
- protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+ protocol = purple_account_get_protocol(account); components = purple_chat_get_components(chat);
@@ -732,7 +732,7 @@
PurpleProtocol *protocol = NULL;
account = purple_chat_get_account(c);
- protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+ protocol = purple_account_get_protocol(account); name = purple_protocol_chat_get_name(PURPLE_PROTOCOL_CHAT(protocol),
purple_chat_get_components(c));
@@ -898,8 +898,7 @@
PidginAddBuddyData *data = user_data;
- protocol = purple_protocols_find(purple_account_get_protocol_id(
- data->rq_data.account));
+ protocol = purple_account_get_protocol(data->rq_data.account); text = gtk_entry_get_text(GTK_ENTRY(entry));
gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window),
@@ -1981,16 +1980,18 @@
/* Double middle click gets info */
} else if ((event->button == GDK_BUTTON_MIDDLE) && (event->type == GDK_2BUTTON_PRESS) &&
((PURPLE_IS_CONTACT(node)) || (PURPLE_IS_BUDDY(node)))) {
+ PurpleAccount *account; if(PURPLE_IS_CONTACT(node))
b = purple_contact_get_priority_buddy((PurpleContact*)node);
- protocol = purple_protocols_find(purple_account_get_protocol_id(purple_buddy_get_account(b)));
+ account = purple_buddy_get_account(b); + protocol = purple_account_get_protocol(account); if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, get_info))
- pidgin_retrieve_user_info(purple_account_get_connection(purple_buddy_get_account(b)), purple_buddy_get_name(b));
+ pidgin_retrieve_user_info(purple_account_get_connection(account), purple_buddy_get_name(b)); @@ -3261,6 +3262,7 @@
if (PURPLE_IS_CHAT(node))
+ PurpleAccount *account; @@ -3270,12 +3272,13 @@
PidginBlistNode *bnode = g_object_get_data(G_OBJECT(node), UI_DATA);
chat = (PurpleChat *)node;
- protocol = purple_protocols_find(purple_account_get_protocol_id(purple_chat_get_account(chat)));
+ account = purple_chat_get_account(chat); + protocol = purple_account_get_protocol(account); connections = purple_connections_get_all();
if (connections && connections->next)
- tmp = g_markup_escape_text(purple_account_get_username(purple_chat_get_account(chat)), -1);
+ tmp = g_markup_escape_text(purple_account_get_username(account), -1); g_string_append_printf(str, _("<b>Account:</b> %s"), tmp);
@@ -3292,7 +3295,7 @@
conv = purple_conversations_find_chat_with_account(chat_name,
- purple_chat_get_account(chat));
@@ -3310,7 +3313,7 @@
cur = purple_protocol_chat_info(PURPLE_PROTOCOL_CHAT(protocol),
- purple_account_get_connection(purple_chat_get_account(chat)));
+ purple_account_get_connection(account)); @@ -3340,6 +3343,7 @@
/* NOTE: THIS FUNCTION IS NO LONGER CALLED FOR CONTACTS.
* It is only called by create_tip_for_node(), and create_tip_for_node() is never called for a contact.
+ PurpleAccount *account; PurplePresence *presence;
@@ -3360,7 +3364,8 @@
c = purple_buddy_get_contact(b);
- protocol = purple_protocols_find(purple_account_get_protocol_id(purple_buddy_get_account(b)));
+ account = purple_buddy_get_account(b); + protocol = purple_account_get_protocol(account); presence = purple_buddy_get_presence(b);
user_info = purple_notify_user_info_new();
@@ -3370,7 +3375,7 @@
if (full && connections && connections->next)
purple_notify_user_info_add_pair_plaintext(user_info, _("Account"),
- purple_account_get_username(purple_buddy_get_account(b)));
+ purple_account_get_username(account)); @@ -3476,9 +3481,7 @@
purple_notify_user_info_add_pair_plaintext(user_info, _("Status"), _("Offline"));
- if (purple_account_is_connected(purple_buddy_get_account(b)) &&
+ if (purple_account_is_connected(account) && protocol) { /* Additional text from the protocol */
purple_protocol_client_tooltip_text(PURPLE_PROTOCOL_CLIENT(protocol), b, user_info, full);
@@ -3565,6 +3568,7 @@
pidgin_blist_get_emblem(PurpleBlistNode *node)
+ PurpleAccount *account; PurpleBuddy *buddy = NULL;
PidginBlistNode *gtknode = g_object_get_data(G_OBJECT(node), UI_DATA);
PurpleProtocol *protocol;
@@ -3602,7 +3606,8 @@
g_return_val_if_fail(buddy != NULL, NULL);
- if (!purple_account_privacy_check(purple_buddy_get_account(buddy), purple_buddy_get_name(buddy))) {
+ account = purple_buddy_get_account(buddy); + if (!purple_account_privacy_check(account, purple_buddy_get_name(buddy))) { path = g_build_filename(PURPLE_DATADIR, "pidgin", "icons",
"hicolor", "16x16", "emblems", "emblem-blocked.png",
@@ -3644,7 +3649,7 @@
return _pidgin_blist_get_cached_emblem(path);
- protocol = purple_protocols_find(purple_account_get_protocol_id(purple_buddy_get_account(buddy)));
+ protocol = purple_account_get_protocol(account); @@ -3712,7 +3717,7 @@
account = purple_chat_get_account(chat);
- protocol = purple_protocols_find(purple_account_get_protocol_id(account));
+ protocol = purple_account_get_protocol(account); @@ -3824,12 +3829,13 @@
/* Name is all that is needed */
if (!aliased || biglist) {
+ PurpleAccount *account = purple_buddy_get_account(b); - protocol = purple_protocols_find(purple_account_get_protocol_id(purple_buddy_get_account(b)));
+ protocol = purple_account_get_protocol(account); if (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, CLIENT, status_text) &&
- purple_account_get_connection(purple_buddy_get_account(b))) {
+ purple_account_get_connection(account)) { char *tmp = purple_protocol_client_status_text(PURPLE_PROTOCOL_CLIENT(protocol), b);
--- a/pidgin/gtkconv.c Tue Mar 02 22:50:02 2021 -0600
+++ b/pidgin/gtkconv.c Tue Mar 02 23:06:11 2021 -0600
@@ -2496,8 +2496,7 @@
if ((chat == NULL) && (gtkconv->history != NULL)) {
PurpleAccount *account = purple_conversation_get_account(conv);
- PurpleProtocol *protocol =
- purple_protocols_find(purple_account_get_protocol_id(account));
+ PurpleProtocol *protocol = purple_account_get_protocol(account); if (purple_account_get_connection(account) != NULL &&
PURPLE_PROTOCOL_IMPLEMENTS(protocol, CHAT, info_defaults)) {
components = purple_protocol_chat_info_defaults(PURPLE_PROTOCOL_CHAT(protocol), purple_account_get_connection(account),
--- a/pidgin/pidginapplication.c Tue Mar 02 22:50:02 2021 -0600
+++ b/pidgin/pidginapplication.c Tue Mar 02 23:06:11 2021 -0600
@@ -391,12 +391,10 @@
pidgin_application_signed_on_cb(PurpleAccount *account, gpointer data) {
PidginApplication *application = PIDGIN_APPLICATION(data);
PurpleProtocol *protocol = NULL;
- const gchar *protocol_id = NULL;
gboolean should_enable_chat = FALSE, should_enable_room_list = FALSE;
- protocol_id = purple_account_get_protocol_id(account);
- protocol = purple_protocols_find(protocol_id);
+ protocol = purple_account_get_protocol(account); /* We assume that the current state is correct, so we don't bother changing
* state unless the newly connected account implements the chat interface,