--- a/libpurple/account.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/account.c Thu Jul 22 22:34:48 2021 -0500
@@ -30,6 +30,7 @@
#include "purpleaccountpresence.h"
+#include "purpleconversationmanager.h" #include "purplecredentialmanager.h"
#include "purpleprivate.h"
#include "purpleprotocolclient.h"
@@ -1051,17 +1052,22 @@
PurpleAccount *account = PURPLE_ACCOUNT(object);
PurpleAccountPrivate *priv = purple_account_get_instance_private(account);
+ PurpleConversationManager *manager = NULL; purple_debug_info("account", "Destroying account %p\n", account);
purple_signal_emit(purple_accounts_get_handle(), "account-destroying",
- for (l = purple_conversations_get_all(); l != NULL; l = l->next)
- PurpleConversation *conv = (PurpleConversation *)l->data;
- if (purple_conversation_get_account(conv) == account)
+ manager = purple_conversation_manager_get_default(); + l = purple_conversation_manager_get_all(manager); + PurpleConversation *conv = PURPLE_CONVERSATION(l->data); + if (purple_conversation_get_account(conv) == account) { purple_conversation_set_account(conv, NULL);
+ l = g_list_delete_link(l, l); purple_account_set_status_types(account, NULL);
--- a/libpurple/accounts.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/accounts.c Thu Jul 22 22:34:48 2021 -0500
@@ -27,6 +27,7 @@
+#include "purpleconversationmanager.h" #include "purplecredentialmanager.h"
#include "purpleprivate.h"
@@ -584,7 +585,8 @@
purple_accounts_delete(PurpleAccount *account)
PurpleBlistNode *gnode, *cnode, *bnode;
- PurpleCredentialManager *manager = NULL;
+ PurpleConversationManager *conv_manager = NULL; + PurpleCredentialManager *cred_manager = NULL; g_return_if_fail(account != NULL);
@@ -636,11 +638,16 @@
/* Remove any open conversation for this account */
- for (iter = purple_conversations_get_all(); iter; ) {
+ conv_manager = purple_conversation_manager_get_default(); + iter = purple_conversation_manager_get_all(conv_manager); PurpleConversation *conv = iter->data;
- if (purple_conversation_get_account(conv) == account)
+ if(purple_conversation_get_account(conv) == account) { + iter = g_list_delete_link(iter, iter); /* This will cause the deletion of an old buddy icon. */
@@ -649,8 +656,8 @@
/* This is async because we do not want the
* account being overwritten before we are done.
- manager = purple_credential_manager_get_default();
- purple_credential_manager_clear_password_async(manager, account, NULL,
+ cred_manager = purple_credential_manager_get_default(); + purple_credential_manager_clear_password_async(cred_manager, account, NULL, purple_accounts_delete_set,
--- a/libpurple/buddy.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/buddy.c Thu Jul 22 22:34:48 2021 -0500
@@ -25,6 +25,7 @@
#include "purplebuddypresence.h"
+#include "purpleconversationmanager.h" #include "purpleprotocolclient.h"
@@ -437,6 +438,7 @@
PurpleBuddyList *blist = NULL;
PurpleBuddyPrivate *priv = NULL;
PurpleConversation *im = NULL;
+ PurpleConversationManager *manager = NULL; gchar *old_alias = NULL, *new_alias = NULL;
g_return_if_fail(PURPLE_IS_BUDDY(buddy));
@@ -467,7 +469,9 @@
purple_blist_save_node(blist, PURPLE_BLIST_NODE(buddy));
purple_blist_update_node(blist, PURPLE_BLIST_NODE(buddy));
- im = purple_conversations_find_im_with_account(priv->name, priv->account);
+ manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, priv->account, if(PURPLE_IS_IM_CONVERSATION(im)) {
purple_conversation_autoset_title(im);
@@ -493,6 +497,7 @@
PurpleBuddyList *blist = NULL;
PurpleBuddyPrivate *priv = NULL;
PurpleConversation *im = NULL;
+ PurpleConversationManager *manager = NULL; gchar *old_alias = NULL, *new_alias = NULL;
g_return_if_fail(PURPLE_IS_BUDDY(buddy));
@@ -525,7 +530,9 @@
purple_blist_save_node(blist, PURPLE_BLIST_NODE(buddy));
purple_blist_update_node(blist, PURPLE_BLIST_NODE(buddy));
- im = purple_conversations_find_im_with_account(priv->name, priv->account);
+ manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, priv->account, if(PURPLE_IS_IM_CONVERSATION(im)) {
purple_conversation_autoset_title(im);
--- a/libpurple/buddyicon.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/buddyicon.c Thu Jul 22 22:34:48 2021 -0500
@@ -24,6 +24,7 @@
#include "purpleconversation.h"
+#include "purpleconversationmanager.h" #include "purpleprivate.h"
#include "purpleprotocolserver.h"
@@ -379,6 +380,7 @@
purple_buddy_icon_update(PurpleBuddyIcon *icon)
+ PurpleConversationManager *manager; PurpleBuddyIcon *icon_to_set;
@@ -440,7 +442,8 @@
buddies = g_slist_delete_link(buddies, buddies);
- 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(PURPLE_IS_IM_CONVERSATION(im)) {
purple_im_conversation_set_icon(PURPLE_IM_CONVERSATION(im),
@@ -873,6 +876,7 @@
guchar *icon_data, size_t icon_len)
+ PurpleConversationManager *manager = NULL; @@ -908,6 +912,8 @@
g_hash_table_remove(pointer_icon_cache, node);
+ manager = purple_conversation_manager_get_default(); if (PURPLE_IS_CONTACT(node)) {
for (child = purple_blist_node_get_first_child(node);
@@ -917,26 +923,31 @@
- if (!PURPLE_IS_BUDDY(child))
+ if(!PURPLE_IS_BUDDY(child)) { + buddy = PURPLE_BUDDY(child); - buddy = (PurpleBuddy *)child;
- im = purple_conversations_find_im_with_account(purple_buddy_get_name(buddy), purple_buddy_get_account(buddy));
+ im = purple_conversation_manager_find_im(manager, + purple_buddy_get_account(buddy), + purple_buddy_get_name(buddy)); + if(PURPLE_IS_IM_CONVERSATION(im)) { purple_conversation_update(im, PURPLE_CONVERSATION_UPDATE_ICON);
/* Is this call necessary anymore? Can the buddies
* themselves need updating when the custom buddy
- purple_blist_update_node(purple_blist_get_default(),
- PURPLE_BLIST_NODE(buddy));
+ purple_blist_update_node(purple_blist_get_default(), child); } else if (PURPLE_IS_CHAT(node)) {
+ PurpleAccount *account = purple_chat_get_account(PURPLE_CHAT(node)); PurpleConversation *chat = NULL;
+ const gchar *name = purple_chat_get_name(PURPLE_CHAT(node)); - chat = purple_conversations_find_chat_with_account(purple_chat_get_name((PurpleChat*)node), purple_chat_get_account((PurpleChat*)node));
+ chat = purple_conversation_manager_find_chat(manager, account, name); + if(PURPLE_IS_CHAT_CONVERSATION(chat)) { purple_conversation_update(chat, PURPLE_CONVERSATION_UPDATE_ICON);
--- a/libpurple/contact.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/contact.c Thu Jul 22 22:34:48 2021 -0500
@@ -24,6 +24,7 @@
#include "internal.h" /* TODO: this needs to die */
#include "purplebuddypresence.h"
+#include "purpleconversationmanager.h" #include "purpleprivate.h"
@@ -113,7 +114,7 @@
purple_contact_set_alias(PurpleContact *contact, const char *alias)
PurpleContactPrivate *priv = NULL;
- PurpleConversation *im;
+ PurpleConversationManager *manager = NULL; @@ -131,33 +132,37 @@
- if ((new_alias != NULL) && (*new_alias != '\0'))
+ if ((new_alias != NULL) && (*new_alias != '\0')) {
g_free(new_alias); /* could be "\0" */
- g_object_notify_by_pspec(G_OBJECT(contact),
- properties[PROP_ALIAS]);
+ g_object_notify_by_pspec(G_OBJECT(contact), properties[PROP_ALIAS]); purple_blist_save_node(purple_blist_get_default(),
PURPLE_BLIST_NODE(contact));
purple_blist_update_node(purple_blist_get_default(),
PURPLE_BLIST_NODE(contact));
+ manager = purple_conversation_manager_get_default(); for(bnode = PURPLE_BLIST_NODE(contact)->child; bnode != NULL; bnode = bnode->next)
PurpleBuddy *buddy = PURPLE_BUDDY(bnode);
+ PurpleConversation *im; - im = purple_conversations_find_im_with_account(purple_buddy_get_name(buddy),
- purple_buddy_get_account(buddy));
+ im = purple_conversation_manager_find_im(manager, + purple_buddy_get_account(buddy), + purple_buddy_get_name(buddy)); + if(PURPLE_IS_IM_CONVERSATION(im)) { purple_conversation_autoset_title(im);
purple_signal_emit(purple_blist_get_handle(), "blist-node-aliased",
--- a/libpurple/protocols.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/protocols.c Thu Jul 22 22:34:48 2021 -0500
@@ -30,6 +30,7 @@
#include "purpleaccountoption.h"
#include "purpleconversation.h"
+#include "purpleconversationmanager.h" #include "purplecredentialmanager.h"
#include "purpleprotocolattention.h"
#include "purpleprotocolmanager.h"
@@ -452,14 +453,17 @@
purple_protocol_got_attention(PurpleConnection *gc, const char *who, guint type_code)
PurpleConversation *conv = NULL;
+ PurpleConversationManager *manager = NULL; PurpleAccount *account = purple_connection_get_account(gc);
got_attention(gc, -1, who, type_code);
- purple_conversations_find_with_account(who, account);
+ manager = purple_conversation_manager_get_default(); + conv = purple_conversation_manager_find(manager, account, who); + if(PURPLE_IS_CONVERSATION(conv)) { purple_protocol_attention(conv, who, type_code, PURPLE_MESSAGE_RECV,
--- a/libpurple/purplechatconversation.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/purplechatconversation.c Thu Jul 22 22:34:48 2021 -0500
@@ -25,6 +25,7 @@
+#include "purpleconversationmanager.h" #include "purplechatconversation.h"
#include "purpleprivate.h"
@@ -341,13 +342,15 @@
purple_chat_conversation_new(PurpleAccount *account, const gchar *name) {
PurpleConversation *chat = NULL;
+ PurpleConversationManager *manager = NULL; PurpleConnection *connection = NULL;
g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
g_return_val_if_fail(name != NULL, NULL);
/* Check if this conversation already exists. */
- chat = purple_conversations_find_chat_with_account(name, account);
+ manager = purple_conversation_manager_get_default(); + chat = purple_conversation_manager_find_chat(manager, account, name); if(PURPLE_IS_CHAT_CONVERSATION(chat)) {
if(!purple_chat_conversation_has_left(PURPLE_CHAT_CONVERSATION(chat))) {
purple_debug_warning("chat-conversation", "A chat named %s "
--- a/libpurple/purpleconversation.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/purpleconversation.c Thu Jul 22 22:34:48 2021 -0500
@@ -32,6 +32,7 @@
#include "purpleconversation.h"
+#include "purpleconversationmanager.h" #include "purplemarkup.h"
#include "purpleprivate.h"
#include "purpleprotocolclient.h"
@@ -288,6 +289,7 @@
PurpleConversation *conv = PURPLE_CONVERSATION(object);
+ PurpleConversationManager *manager; PurpleConversationUiOps *ops;
G_OBJECT_CLASS(purple_conversation_parent_class)->constructed(object);
@@ -299,7 +301,8 @@
purple_conversation_set_features(conv, purple_connection_get_flags(gc));
/* add the conversation to the appropriate lists */
- purple_conversations_add(conv);
+ manager = purple_conversation_manager_get_default(); + purple_conversation_manager_register(manager, conv); /* Auto-set the title. */
purple_conversation_autoset_title(conv);
@@ -328,6 +331,7 @@
purple_conversation_finalize(GObject *object) {
PurpleConversation *conv = PURPLE_CONVERSATION(object);
+ PurpleConversationManager *manager; PurpleConversationPrivate *priv =
purple_conversation_get_instance_private(conv);
PurpleConversationUiOps *ops = purple_conversation_get_ui_ops(conv);
@@ -335,7 +339,8 @@
purple_request_close_with_handle(conv);
/* remove from conversations and im/chats lists prior to emit */
- purple_conversations_remove(conv);
+ manager = purple_conversation_manager_get_default(); + purple_conversation_manager_unregister(manager, conv); purple_signal_emit(purple_conversations_get_handle(),
"deleting-conversation", conv);
@@ -682,7 +687,10 @@
} else if(PURPLE_IS_IM_CONVERSATION(conv)) {
- if(!g_list_find(purple_conversations_get_all(), conv)) {
+ PurpleConversationManager *manager = NULL; + manager = purple_conversation_manager_get_default(); + if(!purple_conversation_manager_is_registered(manager, conv)) { @@ -852,14 +860,17 @@
PurpleConversation *conv;
+ PurpleConversationManager *manager; g_return_val_if_fail(who != NULL, FALSE);
g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), FALSE);
g_return_val_if_fail(what != NULL, FALSE);
- conv = purple_conversations_find_with_account(who, account);
- purple_conversation_write_system_message(conv, what, PURPLE_MESSAGE_ERROR);
+ manager = purple_conversation_manager_get_default(); + conv = purple_conversation_manager_find(manager, account, who); + if(PURPLE_IS_CONVERSATION(conv)) { + purple_conversation_write_system_message(conv, what, --- a/libpurple/purpleimconversation.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/purpleimconversation.c Thu Jul 22 22:34:48 2021 -0500
@@ -23,6 +23,7 @@
#include <libpurple/debug.h>
#include <libpurple/enums.h>
+#include <libpurple/purpleconversationmanager.h> #include <libpurple/purpleprivate.h>
#include <libpurple/purpleprotocolclient.h>
@@ -252,12 +253,15 @@
purple_im_conversation_new(PurpleAccount *account, const char *name)
PurpleConversation *im = NULL;
+ PurpleConversationManager *manager = NULL; g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
g_return_val_if_fail(name != NULL, NULL);
/* Check if this conversation already exists. */
- if((im = purple_conversations_find_im_with_account(name, account)) != NULL) {
+ manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, account, name); + if(PURPLE_IS_IM_CONVERSATION(im)) { --- a/libpurple/server.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/server.c Thu Jul 22 22:34:48 2021 -0500
@@ -33,6 +33,7 @@
#include "purpleconversation.h"
+#include "purpleconversationmanager.h" #include "purpleprivate.h"
#include "purpleprotocolattention.h"
#include "purpleprotocolchat.h"
@@ -123,8 +124,9 @@
int purple_serv_send_im(PurpleConnection *gc, PurpleMessage *msg)
+ PurpleAccount *account = NULL; PurpleConversation *im = NULL;
- PurpleAccount *account = NULL;
+ PurpleConversationManager *manager = NULL; PurplePresence *presence = NULL;
PurpleProtocol *protocol = NULL;
@@ -143,7 +145,8 @@
presence = purple_account_get_presence(account);
recipient = purple_message_get_recipient(msg);
- im = purple_conversations_find_im_with_account(recipient, account);
+ manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, account, recipient); /* we probably shouldn't be here if the protocol doesn't know how to send
* im's... but there was a similar check here before so I just reproduced
@@ -239,13 +242,16 @@
purple_serv_got_alias(PurpleConnection *gc, const char *who, const char *alias)
+ PurpleConversationManager *manager; account = purple_connection_get_account(gc);
buddies = purple_blist_find_buddies(account, who);
+ manager = purple_conversation_manager_get_default(); const char *server_alias;
@@ -260,7 +266,8 @@
purple_buddy_set_server_alias(b, alias);
- im = purple_conversations_find_im_with_account(purple_buddy_get_name(b), account);
+ im = purple_conversation_manager_find_im(manager, account, + purple_buddy_get_name(b)); if (im != NULL && alias != NULL && !purple_strequal(alias, who))
char *escaped = g_markup_escape_text(who, -1);
@@ -439,11 +446,15 @@
void purple_serv_chat_invite(PurpleConnection *gc, int id, const char *message, const char *name)
+ PurpleAccount *account; + PurpleConversation *chat; + PurpleConversationManager *manager; PurpleProtocol *protocol = NULL;
- PurpleConversation *chat;
- chat = purple_conversations_find_chat(gc, id);
+ account = purple_connection_get_account(gc); + manager = purple_conversation_manager_get_default(); + chat = purple_conversation_manager_find_chat_by_id(manager, account, id); @@ -503,6 +514,7 @@
+ PurpleConversationManager *manager; @@ -510,7 +522,7 @@
g_return_if_fail(msg != NULL);
- account = purple_connection_get_account(gc);
+ account = purple_connection_get_account(gc); purple_debug_error("server",
@@ -531,11 +543,13 @@
+ manager = purple_conversation_manager_get_default(); * We should update the conversation window buttons and menu,
- im = purple_conversations_find_im_with_account(who, purple_connection_get_account(gc));
+ im = purple_conversation_manager_find_im(manager, account, who); * Make copies of the message and the sender in case plugins want
@@ -546,7 +560,7 @@
plugin_return = GPOINTER_TO_INT(
purple_signal_emit_return_1(purple_conversations_get_handle(),
- "receiving-im-msg", purple_connection_get_account(gc),
+ "receiving-im-msg", account, &angel, &buffy, im, &flags));
if (!buffy || !angel || plugin_return) {
@@ -558,15 +572,17 @@
- purple_signal_emit(purple_conversations_get_handle(), "received-im-msg", purple_connection_get_account(gc),
- name, message, im, flags);
+ purple_signal_emit(purple_conversations_get_handle(), "received-im-msg", + account, name, message, im, flags); /* search for conversation again in case it was created by received-im-msg handler */
- im = purple_conversations_find_im_with_account(name, purple_connection_get_account(gc));
+ im = purple_conversation_manager_find_im(manager, account, name);
im = purple_im_conversation_new(account, name);
pmsg = purple_message_new_incoming(name, message, flags, mtime);
purple_conversation_write_message(im, pmsg);
@@ -655,11 +671,18 @@
-void purple_serv_got_typing(PurpleConnection *gc, const char *name, int timeout,
- PurpleIMTypingState state) {
+purple_serv_got_typing(PurpleConnection *gc, const char *name, int timeout, + PurpleIMTypingState state) + PurpleAccount *account; PurpleConversation *conv;
+ PurpleConversationManager *manager; - conv = purple_conversations_find_im_with_account(name, purple_connection_get_account(gc));
+ account = purple_connection_get_account(gc); + manager = purple_conversation_manager_get_default(); + conv = purple_conversation_manager_find_im(manager, account, name); if(PURPLE_IS_IM_CONVERSATION(conv)) {
PurpleIMConversation *im = PURPLE_IM_CONVERSATION(conv);
@@ -673,30 +696,35 @@
purple_signal_emit(purple_conversations_get_handle(),
- "buddy-typing", purple_connection_get_account(gc), name);
+ "buddy-typing", account, name); purple_signal_emit(purple_conversations_get_handle(),
- "buddy-typed", purple_connection_get_account(gc), name);
+ "buddy-typed", account, name); case PURPLE_IM_NOT_TYPING:
purple_signal_emit(purple_conversations_get_handle(),
- "buddy-typing-stopped", purple_connection_get_account(gc), name);
+ "buddy-typing-stopped", account, name); -void purple_serv_got_typing_stopped(PurpleConnection *gc, const char *name) {
+purple_serv_got_typing_stopped(PurpleConnection *gc, const char *name) { + PurpleAccount *account; + PurpleConversation *conv; + PurpleConversationManager *manager; - PurpleConversation *conv;
+ account = purple_connection_get_account(gc); - conv = purple_conversations_find_im_with_account(name, purple_connection_get_account(gc));
+ manager = purple_conversation_manager_get_default(); + conv = purple_conversation_manager_find_im(manager, account, name); PurpleIMConversation *im = PURPLE_IM_CONVERSATION(conv);
- if (purple_im_conversation_get_typing_state(im) == PURPLE_IM_NOT_TYPING)
+ if(purple_im_conversation_get_typing_state(im) == PURPLE_IM_NOT_TYPING) { purple_im_conversation_stop_typing_timeout(im);
purple_im_conversation_set_typing_state(im, PURPLE_IM_NOT_TYPING);
@@ -704,7 +732,7 @@
purple_signal_emit(purple_conversations_get_handle(),
- "buddy-typing-stopped", purple_connection_get_account(gc), name);
+ "buddy-typing-stopped", account, name); --- a/libpurple/xfer.c Thu Jul 22 22:33:54 2021 -0500
+++ b/libpurple/xfer.c Thu Jul 22 22:34:48 2021 -0500
@@ -36,6 +36,7 @@
+#include "purpleconversationmanager.h" @@ -212,6 +213,7 @@
const char *message, gboolean is_error, gboolean print_thumbnail)
PurpleConversation *im = NULL;
+ PurpleConversationManager *manager = NULL; PurpleMessageFlags flags = PURPLE_MESSAGE_SYSTEM;
gconstpointer thumbnail_data;
@@ -220,11 +222,13 @@
thumbnail_data = purple_xfer_get_thumbnail(xfer, &size);
- im = purple_conversations_find_im_with_account(priv->who,
- purple_xfer_get_account(xfer));
+ manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, + purple_xfer_get_account(xfer), + if(PURPLE_IS_IM_CONVERSATION(im)) { escaped = g_markup_escape_text(message, -1);
@@ -956,11 +960,11 @@
+ PurpleConversationManager *manager; purple_xfer_set_status(xfer, PURPLE_XFER_STATUS_DONE);
- if (purple_xfer_get_filename(xfer) != NULL)
+ if(purple_xfer_get_filename(xfer) != NULL) { char *filename = g_markup_escape_text(purple_xfer_get_filename(xfer), -1);
if (purple_xfer_get_local_filename(xfer)
&& purple_xfer_get_xfer_type(xfer) == PURPLE_XFER_TYPE_RECEIVE)
@@ -974,16 +978,15 @@
msg = g_strdup_printf(_("Transfer of file %s complete"),
msg = g_strdup(_("File transfer complete"));
- im = purple_conversations_find_im_with_account(priv->who,
- purple_xfer_get_account(xfer));
- purple_conversation_write_system_message(
+ manager = purple_conversation_manager_get_default(); + im = purple_conversation_manager_find_im(manager, priv->account, + if(PURPLE_IS_IM_CONVERSATION(im)) { + purple_conversation_write_system_message(im, msg, 0);