--- a/libpurple/conversationtypes.c Tue Mar 18 13:11:04 2014 +0100
+++ b/libpurple/conversationtypes.c Tue Mar 18 13:45:52 2014 +0100
@@ -48,8 +48,6 @@
struct _PurpleChatConversationPrivate
- GList *in_room; /* The users in the room.
- Deprecated: Will be removed in 3.0.0 TODO */
GList *ignored; /* Ignored users. */
char *who; /* The person who set the topic. */
char *topic; /* The topic. */
@@ -617,7 +615,7 @@
g_return_val_if_fail(priv != NULL, NULL);
+ return g_hash_table_get_values(priv->users); @@ -925,9 +923,9 @@
chatuser = purple_chat_user_new(chat, user, alias, flag);
- priv->in_room = g_list_prepend(priv->in_room, chatuser);
g_hash_table_replace(priv->users,
- g_strdup(purple_chat_user_get_name(chatuser)), chatuser);
+ g_strdup(purple_chat_user_get_name(chatuser)), cbuddies = g_list_prepend(cbuddies, chatuser);
@@ -1024,20 +1022,16 @@
flags = purple_chat_user_get_flags(purple_chat_conversation_find_user(chat, old_user));
cb = purple_chat_user_new(chat, new_user, new_alias, flags);
- priv->in_room = g_list_prepend(priv->in_room, cb);
g_hash_table_replace(priv->users,
- g_strdup(purple_chat_user_get_name(cb)), cb);
+ g_strdup(purple_chat_user_get_name(cb)), cb); if (ops != NULL && ops->chat_rename_user != NULL)
ops->chat_rename_user(chat, old_user, new_user, new_alias);
cb = purple_chat_conversation_find_user(chat, old_user);
- priv->in_room = g_list_remove(priv->in_room, cb);
g_hash_table_remove(priv->users, purple_chat_user_get_name(cb));
if (purple_chat_conversation_is_ignored_user(chat, old_user)) {
purple_chat_conversation_unignore(chat, old_user);
@@ -1131,9 +1125,8 @@
cb = purple_chat_conversation_find_user(chat, user);
- priv->in_room = g_list_remove(priv->in_room, cb);
- g_hash_table_remove(priv->users, purple_chat_user_get_name(cb));
+ g_hash_table_remove(priv->users, + purple_chat_user_get_name(cb)); /* NOTE: Don't remove them from ignored in case they re-enter. */
@@ -1180,43 +1173,34 @@
purple_chat_conversation_clear_users(PurpleChatConversation *chat)
PurpleConversationUiOps *ops;
PurpleChatConversationPrivate *priv = PURPLE_CHAT_CONVERSATION_GET_PRIVATE(chat);
g_return_if_fail(priv != NULL);
- ops = purple_conversation_get_ui_ops(PURPLE_CONVERSATION(chat));
+ ops = purple_conversation_get_ui_ops(PURPLE_CONVERSATION(chat)); if (ops != NULL && ops->chat_remove_users != NULL) {
- for (l = users; l; l = l->next) {
- PurpleChatUser *cb = l->data;
- names = g_list_prepend(names,
- (gchar *) purple_chat_user_get_name(cb));
+ g_hash_table_iter_init(&it, priv->users); + while (g_hash_table_iter_next(&it, (gpointer*)&name, NULL)) + names = g_list_prepend(names, name); ops->chat_remove_users(chat, names);
- for (l = users; l; l = l->next)
- PurpleChatUser *cb = l->data;
- const char *name = purple_chat_user_get_name(cb);
+ g_hash_table_iter_init(&it, priv->users); + while (g_hash_table_iter_next(&it, (gpointer*)&name, NULL)) { purple_signal_emit(purple_conversations_get_handle(),
"chat-user-leaving", chat, name, NULL);
purple_signal_emit(purple_conversations_get_handle(),
"chat-user-left", chat, name, NULL);
g_hash_table_remove_all(priv->users);
void purple_chat_conversation_set_nick(PurpleChatConversation *chat, const char *nick) {
@@ -1443,7 +1427,7 @@
priv->users = g_hash_table_new_full(_purple_conversation_user_hash,
- _purple_conversation_user_equal, g_free, NULL);
+ _purple_conversation_user_equal, g_free, g_object_unref); /* Called when done constructing */
@@ -1477,11 +1461,7 @@
PurpleChatConversationPrivate *priv =
PURPLE_CHAT_CONVERSATION_GET_PRIVATE(object);
- g_list_foreach(priv->in_room, (GFunc)g_object_unref, NULL);
- g_list_free(priv->in_room);
+ g_hash_table_remove_all(priv->users); G_OBJECT_CLASS(parent_class)->dispose(object);
--- a/libpurple/conversationtypes.h Tue Mar 18 13:11:04 2014 +0100
+++ b/libpurple/conversationtypes.h Tue Mar 18 13:45:52 2014 +0100
@@ -380,7 +380,8 @@
* Returns a list of users in the chat room. The members of the list
* are PurpleChatUser objects.
- * Returns: (transfer none): The list of users.
+ * Returns: (transfer container): The list of users. Use g_list_free() when done GList *purple_chat_conversation_get_users(const PurpleChatConversation *chat);
--- a/libpurple/plugins/perl/common/Conversation.xs Tue Mar 18 13:11:04 2014 +0100
+++ b/libpurple/plugins/perl/common/Conversation.xs Tue Mar 18 13:45:52 2014 +0100
@@ -331,11 +331,13 @@
purple_chat_conversation_get_users(chat)
Purple::ChatConversation chat
- for (l = purple_chat_conversation_get_users(chat); l != NULL; l = l->next) {
+ users = purple_chat_conversation_get_users(chat); + for (l = users; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::ListEntry")));
purple_chat_conversation_ignore(chat, name)
--- a/libpurple/protocols/yahoo/yahoochat.c Tue Mar 18 13:11:04 2014 +0100
+++ b/libpurple/protocols/yahoo/yahoochat.c Tue Mar 18 13:45:52 2014 +0100
@@ -905,23 +905,24 @@
YahooData *yd = purple_connection_get_protocol_data(gc);
struct yahoo_packet *pkt;
msg2 = yahoo_string_encode(gc, msg, FALSE);
- members = purple_chat_conversation_get_users(c);
pkt = yahoo_packet_new(YAHOO_SERVICE_CONFADDINVITE, YAHOO_STATUS_AVAILABLE, yd->session_id);
yahoo_packet_hash(pkt, "sssss", 1, dn, 51, buddy, 57, room, 58, msg?msg2:"", 13, "0");
- for(; members; members = members->next) {
- const char *name = purple_chat_user_get_name(members->data);
+ members = purple_chat_conversation_get_users(c); + for(it = members; it; it = it->next) { + const char *name = purple_chat_user_get_name(it->data); yahoo_packet_hash(pkt, "ss", 52, name, 53, name);
yahoo_packet_send_and_free(pkt, yd);
@@ -1095,9 +1096,13 @@
if (id != YAHOO_CHAT_ID) {
- yahoo_conf_leave(yd, purple_conversation_get_name(PURPLE_CONVERSATION(c)),
- purple_connection_get_display_name(gc), purple_chat_conversation_get_users(c));
- yd->confs = g_slist_remove(yd->confs, c);
+ users = purple_chat_conversation_get_users(c); + purple_conversation_get_name(PURPLE_CONVERSATION(c)), + purple_connection_get_display_name(gc), users); + yd->confs = g_slist_remove(yd->confs, c); yahoo_chat_leave(gc, purple_conversation_get_name(PURPLE_CONVERSATION(c)),
purple_connection_get_display_name(gc), TRUE);
@@ -1121,9 +1126,13 @@
if (id != YAHOO_CHAT_ID) {
- ret = yahoo_conf_send(gc, purple_connection_get_display_name(gc),
- purple_conversation_get_name(PURPLE_CONVERSATION(c)),
- purple_chat_conversation_get_users(c), what);
+ users = purple_chat_conversation_get_users(c); + ret = yahoo_conf_send(gc, + purple_connection_get_display_name(gc), + purple_conversation_get_name(PURPLE_CONVERSATION(c)), ret = yahoo_chat_send(gc, purple_connection_get_display_name(gc),
purple_conversation_get_name(PURPLE_CONVERSATION(c)), what, flags);
--- a/pidgin/gtkconv.c Tue Mar 18 13:11:04 2014 +0100
+++ b/pidgin/gtkconv.c Tue Mar 18 13:45:52 2014 +0100
@@ -4551,16 +4551,18 @@
} else if (PURPLE_IS_CHAT_CONVERSATION(conv)) {
- GList *l = purple_chat_conversation_get_users(PURPLE_CHAT_CONVERSATION(conv));
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(PIDGIN_CONVERSATION(conv)->u.chat->list));
- for (; l != NULL; l = l->next) {
+ users = purple_chat_conversation_get_users(PURPLE_CHAT_CONVERSATION(conv)); + for (l = users; l != NULL; l = l->next) { tab_complete_process_item(&most_matched, entered, entered_chars, &partial,
&matches, purple_chat_user_get_name((PurpleChatUser *)l->data));
if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter))
@@ -8726,9 +8728,12 @@
if (PURPLE_IS_CHAT_CONVERSATION(conv)) {
PurpleChatConversation *chat = PURPLE_CHAT_CONVERSATION(conv);
pidgin_conv_update_fields(conv, PIDGIN_CONV_TOPIC);
- pidgin_conv_chat_add_users(chat, purple_chat_conversation_get_users(chat), TRUE);
+ users = purple_chat_conversation_get_users(chat); + pidgin_conv_chat_add_users(chat, users, TRUE);