Add an id property to PurpleBuddy

Thu, 17 Mar 2022 23:25:33 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 17 Mar 2022 23:25:33 -0500
changeset 41302
d7d40a5d9533
parent 41301
ba4c2adc76b4
child 41303
c4c79576ef12

Add an id property to PurpleBuddy

Testing Done:
Compile only

Reviewed at https://reviews.imfreedom.org/r/1354/

libpurple/buddy.c file | annotate | diff | comparison | revisions
libpurple/buddy.h file | annotate | diff | comparison | revisions
--- a/libpurple/buddy.c	Thu Mar 17 23:24:27 2022 -0500
+++ b/libpurple/buddy.c	Thu Mar 17 23:25:33 2022 -0500
@@ -30,6 +30,7 @@
 #include "util.h"
 
 typedef struct {
+	gchar *id;
 	gchar *name;
 	gchar *local_alias;
 	gchar *server_alias;
@@ -45,6 +46,7 @@
 
 enum {
 	PROP_0,
+	PROP_ID,
 	PROP_NAME,
 	PROP_LOCAL_ALIAS,
 	PROP_SERVER_ALIAS,
@@ -63,6 +65,16 @@
  * Helpers
  *****************************************************************************/
 static void
+purple_buddy_set_id(PurpleBuddy *buddy, const gchar *id) {
+	PurpleBuddyPrivate *priv = purple_buddy_get_instance_private(buddy);
+
+	g_free(priv->id);
+	priv->id = g_strdup(id);
+
+	g_object_notify_by_pspec(G_OBJECT(buddy), properties[PROP_ID]);
+}
+
+static void
 purple_buddy_set_account(PurpleBuddy *buddy, PurpleAccount *account) {
 	PurpleBuddyPrivate *priv = purple_buddy_get_instance_private(buddy);
 
@@ -81,6 +93,9 @@
 	PurpleBuddy *buddy = PURPLE_BUDDY(obj);
 
 	switch (param_id) {
+		case PROP_ID:
+			purple_buddy_set_id(buddy, g_value_get_string(value));
+			break;
 		case PROP_NAME:
 			purple_buddy_set_name(buddy, g_value_get_string(value));
 			break;
@@ -113,6 +128,9 @@
 	PurpleBuddy *buddy = PURPLE_BUDDY(obj);
 
 	switch (param_id) {
+		case PROP_ID:
+			g_value_set_string(value, purple_buddy_get_id(buddy));
+			break;
 		case PROP_NAME:
 			g_value_set_string(value, purple_buddy_get_name(buddy));
 			break;
@@ -151,6 +169,14 @@
 
 	G_OBJECT_CLASS(purple_buddy_parent_class)->constructed(object);
 
+	if(priv->id == NULL) {
+		gchar *id = g_uuid_string_random();
+
+		purple_buddy_set_id(buddy, id);
+
+		g_free(id);
+	}
+
 	priv->presence = PURPLE_PRESENCE(purple_buddy_presence_new(buddy));
 	purple_presence_set_status_active(priv->presence, "offline", TRUE);
 
@@ -184,6 +210,7 @@
 		                                  buddy);
 	}
 
+	g_free(priv->id);
 	g_free(priv->name);
 	g_free(priv->local_alias);
 	g_free(priv->server_alias);
@@ -200,6 +227,22 @@
 	obj_class->get_property = purple_buddy_get_property;
 	obj_class->set_property = purple_buddy_set_property;
 
+	/**
+	 * PurpleBuddy::id:
+	 *
+	 * A globally unique identifier for this specific buddy.
+	 *
+	 * If an id is not passed during instantiation a uuid4 string is set as the
+	 * id.
+	 *
+	 * Since: 3.0.0
+	 */
+	properties[PROP_ID] = g_param_spec_string(
+		"id", "id",
+		"The globally unique identifier of the buddy.",
+		NULL,
+		G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
 	properties[PROP_NAME] = g_param_spec_string(
 		"name", "Name",
 		"The name of the buddy.",
@@ -261,6 +304,17 @@
 		NULL);
 }
 
+const gchar *
+purple_buddy_get_id(PurpleBuddy *buddy) {
+	PurpleBuddyPrivate *priv = NULL;
+
+	g_return_val_if_fail(PURPLE_IS_BUDDY(buddy), NULL);
+
+	priv = purple_buddy_get_instance_private(buddy);
+
+	return priv->id;
+}
+
 void
 purple_buddy_set_icon(PurpleBuddy *buddy, PurpleBuddyIcon *icon) {
 	PurpleBuddyPrivate *priv = NULL;
--- a/libpurple/buddy.h	Thu Mar 17 23:24:27 2022 -0500
+++ b/libpurple/buddy.h	Thu Mar 17 23:25:33 2022 -0500
@@ -121,6 +121,18 @@
 PurpleBuddy *purple_buddy_new(PurpleAccount *account, const char *name, const char *alias);
 
 /**
+ * purple_buddy_get_id:
+ * @buddy: The buddy.
+ *
+ * Gets the globally unique identifier of the buddy.
+ *
+ * Returns: The id of @buddy.
+ *
+ * Since: 3.0.0
+ */
+const gchar *purple_buddy_get_id(PurpleBuddy *buddy);
+
+/**
  * purple_buddy_set_icon:
  * @buddy: The buddy.
  * @icon:  The buddy icon.

mercurial