diff options
author | Gary Kramlich <grim@reaperworld.com> | 2022-03-17 23:25:33 -0500 |
---|---|---|
committer | Gary Kramlich <grim@reaperworld.com> | 2022-03-17 23:25:33 -0500 |
commit | 41f8f39e94dc77179bd56e2310d3986c9295807f (patch) | |
tree | 91853e3c1e4b461c09548dec0d9c9b62aceeadd2 /libpurple/buddy.c | |
parent | 0ca4cbc3d69d5a10897a52988afe37b34a30dc0f (diff) | |
download | pidgin-41f8f39e94dc77179bd56e2310d3986c9295807f.tar.gz |
Add an id property to PurpleBuddy
Testing Done:
Compile only
Reviewed at https://reviews.imfreedom.org/r/1354/
Diffstat (limited to 'libpurple/buddy.c')
-rw-r--r-- | libpurple/buddy.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/libpurple/buddy.c b/libpurple/buddy.c index ceeac43595..417614e08c 100644 --- a/libpurple/buddy.c +++ b/libpurple/buddy.c @@ -30,6 +30,7 @@ #include "util.h" typedef struct { + gchar *id; gchar *name; gchar *local_alias; gchar *server_alias; @@ -45,6 +46,7 @@ typedef struct { enum { PROP_0, + PROP_ID, PROP_NAME, PROP_LOCAL_ALIAS, PROP_SERVER_ALIAS, @@ -63,6 +65,16 @@ G_DEFINE_TYPE_WITH_PRIVATE(PurpleBuddy, purple_buddy, PURPLE_TYPE_BLIST_NODE) * 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 @@ purple_buddy_set_property(GObject *obj, guint param_id, const GValue *value, 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 @@ purple_buddy_get_property(GObject *obj, guint param_id, GValue *value, 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 @@ purple_buddy_constructed(GObject *object) { 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 @@ purple_buddy_finalize(GObject *object) { buddy); } + g_free(priv->id); g_free(priv->name); g_free(priv->local_alias); g_free(priv->server_alias); @@ -200,6 +227,22 @@ static void purple_buddy_class_init(PurpleBuddyClass *klass) { 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 @@ purple_buddy_new(PurpleAccount *account, const gchar *name, const gchar *alias) 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; |