qulogic/pidgin

Parents fd8cdc9d991d
Children c7da646df6e6
Updated purple_conversation_remove_member to take a PurpleContactInfo

All of the purple_conversation_*_member methods took a PurpleContactInfo except
for remove which this addresses. This makes the API more consistent and easier
to use as the protocols will generally have a PurpleContactInfo but not a
PurpleConversationMember when doing member management. That additional lookup
caused us to have to iterate the list twice where now it's only one.

Testing Done:
Ran the unit tests

Reviewed at https://reviews.imfreedom.org/r/2844/
--- a/libpurple/purpleconversation.c Fri Dec 01 03:46:44 2023 -0600
+++ b/libpurple/purpleconversation.c Mon Dec 04 00:24:04 2023 -0600
@@ -134,10 +134,10 @@
/* Remove the account from the conversation if it's a member. */
if(PURPLE_IS_ACCOUNT(priv->account)) {
- member = purple_conversation_find_member(conv,
- PURPLE_CONTACT_INFO(priv->account));
if(PURPLE_IS_CONVERSATION_MEMBER(member)) {
- purple_conversation_remove_member(conv, member, FALSE, NULL);
+ purple_conversation_remove_member(conv,
+ PURPLE_CONTACT_INFO(priv->account),
+ FALSE, NULL);
}
}
@@ -1916,32 +1916,29 @@
gboolean
purple_conversation_remove_member(PurpleConversation *conversation,
- PurpleConversationMember *member,
- gboolean announce, const char *message)
+ PurpleContactInfo *info, gboolean announce,
+ const char *message)
{
+ PurpleConversationMember *member = NULL;
PurpleConversationPrivate *priv = NULL;
guint position = 0;
g_return_val_if_fail(PURPLE_IS_CONVERSATION(conversation), FALSE);
- g_return_val_if_fail(PURPLE_IS_CONVERSATION_MEMBER(member), FALSE);
+ g_return_val_if_fail(PURPLE_IS_CONTACT_INFO(info), FALSE);
- priv = purple_conversation_get_instance_private(conversation);
-
- if(!g_list_store_find(priv->members, member, &position)) {
+ if(!purple_conversation_has_member(conversation, info, &position)) {
return FALSE;
}
- /* We need to ref member to make sure it stays around long enough for us
- * to emit the signal.
- */
- g_object_ref(member);
+ priv = purple_conversation_get_instance_private(conversation);
+ member = g_list_model_get_item(G_LIST_MODEL(priv->members), position);
g_list_store_remove(priv->members, position);
g_signal_emit(conversation, signals[SIG_MEMBER_REMOVED], 0, member,
announce, message);
- g_object_unref(member);
+ g_clear_object(&member);
return TRUE;
}
--- a/libpurple/purpleconversation.h Fri Dec 01 03:46:44 2023 -0600
+++ b/libpurple/purpleconversation.h Mon Dec 04 00:24:04 2023 -0600
@@ -870,12 +870,12 @@
/**
* purple_conversation_remove_member:
* @conversation: The instance.
- * @member: The [class@Purple.ConversationMember] to remove.
+ * @info: The [class@Purple.ContactInfo] of the person leaving.
* @announce: Whether or not this removal should be announced.
* @message: (nullable): An optional message for the announcement.
*
- * Attempts to remove @member from the collection of members in @conversation.
- * If found, @member is removed and the
+ * Attempts to remove @info from the collection of members in @conversation.
+ * If found, @info is removed and the
* [signal@Purple.Conversation::member-removed] signal is emitted with
* @announce and @message as parameters.
*
@@ -888,7 +888,7 @@
* Since: 3.0.0
*/
PURPLE_AVAILABLE_IN_3_0
-gboolean purple_conversation_remove_member(PurpleConversation *conversation, PurpleConversationMember *member, gboolean announce, const char *message);
+gboolean purple_conversation_remove_member(PurpleConversation *conversation, PurpleContactInfo *info, gboolean announce, const char *message);
/**
* purple_conversation_get_messages:
--- a/libpurple/tests/test_conversation.c Fri Dec 01 03:46:44 2023 -0600
+++ b/libpurple/tests/test_conversation.c Mon Dec 04 00:24:04 2023 -0600
@@ -237,6 +237,7 @@
test_purple_conversation_members_add_remove(void) {
PurpleAccount *account = NULL;
PurpleContactInfo *info = NULL;
+ PurpleContactInfo *member_info = NULL;
PurpleConversation *conversation = NULL;
PurpleConversationManager *conversation_manager = NULL;
PurpleConversationMember *member = NULL;
@@ -292,8 +293,9 @@
g_assert_true(member1 == member);
/* Now remove the member and verify the signal was called. */
- removed = purple_conversation_remove_member(conversation, member, TRUE,
- "announcement message");
+ member_info = purple_conversation_member_get_contact_info(member);
+ removed = purple_conversation_remove_member(conversation, member_info,
+ TRUE, "announcement message");
g_assert_true(removed);
g_assert_cmpint(removed_called, ==, 1);
@@ -303,8 +305,9 @@
/* Try to remove the member again and verify that nothing was removed and
* that the signal wasn't emitted.
*/
- removed = purple_conversation_remove_member(conversation, member, TRUE,
- "announcement message");
+ member_info = purple_conversation_member_get_contact_info(member);
+ removed = purple_conversation_remove_member(conversation, member_info,
+ TRUE, "announcement message");
g_assert_false(removed);
g_assert_cmpint(removed_called, ==, 1);