Updated purple_conversation_remove_member to take a PurpleContactInfo

Mon, 04 Dec 2023 00:24:04 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 04 Dec 2023 00:24:04 -0600
changeset 42535
179f226b72f7
parent 42534
fd8cdc9d991d
child 42536
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/

libpurple/purpleconversation.c file | annotate | diff | comparison | revisions
libpurple/purpleconversation.h file | annotate | diff | comparison | revisions
libpurple/tests/test_conversation.c file | annotate | diff | comparison | revisions
--- 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);
 

mercurial