--- a/libpurple/blistnode.c Sun Jul 07 01:10:50 2013 +0530 +++ b/libpurple/blistnode.c Sun Jul 07 02:26:57 2013 +0530 @@ -30,11 +30,20 @@ /** Private data of a buddy list node */ struct _PurpleBListNodePrivate { - GHashTable *settings; /**< per-node settings */ - gboolean dont_save; /**< node should not be saved with the buddy - list */ + GHashTable *settings; /**< per-node settings */ + gboolean dont_save; /**< node should not be saved with the buddy list */ }; +/* GObject Property enums */ +enum +{ + PROP_0, + PROP_DONT_SAVE, + PROP_LAST +}; + +static GObjectClass *parent_class; + /**************************************************************************/ /* Buddy list node API */ /**************************************************************************/ @@ -89,62 +98,6 @@ node->ui_data = ui_data; } -/* TODO GObjectify */ -static void -purple_blist_node_destroy(PurpleBListNode *node) -{ - PurpleBListUiOps *ui_ops; - PurpleBListNode *child, *next_child; - - ui_ops = purple_blist_get_ui_ops(); - child = node->child; - while (child) { - next_child = child->next; - purple_blist_node_destroy(child); - child = next_child; - } - - /* Allow the UI to free data */ - node->parent = NULL; - node->child = NULL; - node->next = NULL; - node->prev = NULL; - if (ui_ops && ui_ops->remove) - ui_ops->remove(purplebuddylist, node); - - if (PURPLE_IS_BUDDY(node)) - purple_buddy_destroy((PurpleBuddy*)node); - else if (PURPLE_IS_CHAT(node)) - purple_chat_destroy((PurpleChat*)node); - else if (PURPLE_IS_CONTACT(node)) - purple_contact_destroy((PurpleContact*)node); - else if (PURPLE_IS_GROUP(node)) - purple_group_destroy((PurpleGroup*)node); -} - -static void -purple_blist_node_setting_free(gpointer data) -{ - PurpleValue *value; - - value = (PurpleValue *)data; - - purple_value_destroy(value); -} - -static void purple_blist_node_initialize_settings(PurpleBListNode *node) -{ - PurpleBListNodePrivate *priv = PURPLE_BLIST_NODE_GET_PRIVATE(node); - - g_return_if_fail(priv != NULL); - - if (priv->settings) - return; - - priv->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, - (GDestroyNotify)purple_blist_node_setting_free); -} - void purple_blist_node_remove_setting(PurpleBListNode *node, const char *key) { PurpleBListUiOps *ops; @@ -197,7 +150,7 @@ void purple_blist_node_set_bool(PurpleBListNode* node, const char *key, gboolean data) { - PurpleValue *value; + GValue *value; PurpleBListUiOps *ops; PurpleBListNodePrivate *priv = PURPLE_BLIST_NODE_GET_PRIVATE(node); @@ -205,8 +158,9 @@ g_return_if_fail(priv->settings != NULL); g_return_if_fail(key != NULL); - value = purple_value_new(PURPLE_TYPE_BOOLEAN); - purple_value_set_boolean(value, data); + value = g_new0(GValue, 1); + g_value_init(value, G_TYPE_BOOLEAN); + g_value_set_boolean(value, data); g_hash_table_replace(priv->settings, g_strdup(key), value); @@ -218,7 +172,7 @@ gboolean purple_blist_node_get_bool(PurpleBListNode* node, const char *key) { - PurpleValue *value; + GValue *value; PurpleBListNodePrivate *priv = PURPLE_BLIST_NODE_GET_PRIVATE(node); g_return_val_if_fail(priv != NULL, FALSE); @@ -230,15 +184,15 @@ if (value == NULL) return FALSE; - g_return_val_if_fail(purple_value_get_type(value) == PURPLE_TYPE_BOOLEAN, FALSE); + g_return_val_if_fail(G_VALUE_HOLDS_BOOLEAN(value), FALSE); - return purple_value_get_boolean(value); + return g_value_get_boolean(value); } void purple_blist_node_set_int(PurpleBListNode* node, const char *key, int data) { - PurpleValue *value; + GValue *value; PurpleBListUiOps *ops; PurpleBListNodePrivate *priv = PURPLE_BLIST_NODE_GET_PRIVATE(node); @@ -246,8 +200,9 @@ g_return_if_fail(priv->settings != NULL); g_return_if_fail(key != NULL); - value = purple_value_new(PURPLE_TYPE_INT); - purple_value_set_int(value, data); + value = g_new0(GValue, 1); + g_value_init(value, G_TYPE_INT); + g_value_set_int(value, data); g_hash_table_replace(priv->settings, g_strdup(key), value); @@ -259,7 +214,7 @@ int purple_blist_node_get_int(PurpleBListNode* node, const char *key) { - PurpleValue *value; + GValue *value; PurpleBListNodePrivate *priv = PURPLE_BLIST_NODE_GET_PRIVATE(node); g_return_val_if_fail(priv != NULL, 0); @@ -271,15 +226,15 @@ if (value == NULL) return 0; - g_return_val_if_fail(purple_value_get_type(value) == PURPLE_TYPE_INT, 0); + g_return_val_if_fail(G_VALUE_HOLDS_INT(value), 0); - return purple_value_get_int(value); + return g_value_get_int(value); } void purple_blist_node_set_string(PurpleBListNode* node, const char *key, const char *data) { - PurpleValue *value; + GValue *value; PurpleBListUiOps *ops; PurpleBListNodePrivate *priv = PURPLE_BLIST_NODE_GET_PRIVATE(node); @@ -287,8 +242,9 @@ g_return_if_fail(priv->settings != NULL); g_return_if_fail(key != NULL); - value = purple_value_new(PURPLE_TYPE_STRING); - purple_value_set_string(value, data); + value = g_new0(GValue, 1); + g_value_init(value, G_TYPE_STRING); + g_value_set_int(value, data); g_hash_table_replace(priv->settings, g_strdup(key), value); @@ -300,7 +256,7 @@ const char * purple_blist_node_get_string(PurpleBListNode* node, const char *key) { - PurpleValue *value; + GValue *value; PurpleBListNodePrivate *priv = PURPLE_BLIST_NODE_GET_PRIVATE(node); g_return_val_if_fail(priv != NULL, NULL); @@ -312,9 +268,9 @@ if (value == NULL) return NULL; - g_return_val_if_fail(purple_value_get_type(value) == PURPLE_TYPE_STRING, NULL); + g_return_val_if_fail(G_VALUE_HOLDS_STRING(value), NULL); - return purple_value_get_string(value); + return g_value_get_string(value); } GList * @@ -324,8 +280,127 @@ g_return_val_if_fail(n != NULL, NULL); - purple_signal_emit(purple_blist_get_handle(), - "blist-node-extended-menu", + purple_signal_emit(purple_blist_get_handle(), "blist-node-extended-menu", n, &menu); return menu; } + +static void +purple_blist_node_setting_free(gpointer data) +{ + GValue *value = (GValue *)data; + + g_value_unset(value); + g_free(value); +} + +/**************************************************************************/ +/* GObject code +/**************************************************************************/ + +/* GObject Property names */ +#define PROP_DONT_SAVE_S "dont-save" + +/* Set method for GObject properties */ +static void +purple_blist_node_set_property(GObject *obj, guint param_id, const GValue *value, + GParamSpec *pspec) +{ + PurpleBListNode *node = PURPLE_BLIST_NODE(obj); + + switch (param_id) { + case PROP_DONT_SAVE: + purple_blist_node_set_dont_save(node, g_value_get_boolean(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +/* Get method for GObject properties */ +static void +purple_blist_node_get_property(GObject *obj, guint param_id, GValue *value, + GParamSpec *pspec) +{ + PurpleBListNode *node = PURPLE_BLIST_NODE(obj); + + switch (param_id) { + case PROP_DONT_SAVE: + g_value_set_boolean(value, purple_blist_node_get_dont_save(node)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +/* GObject initialization function */ +static void +purple_blist_node_init(GTypeInstance *instance, gpointer klass) +{ + PurpleBListNodePrivate *priv = PURPLE_BLIST_NODE_GET_PRIVATE(instance); + + priv->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, + (GDestroyNotify)purple_blist_node_setting_free); +} + +/* GObject finalize function */ +static void +purple_blist_node_finalize(GObject *object) +{ + PurpleBListNode *priv = PURPLE_BLIST_NODE_GET_PRIVATE(object); + + g_hash_table_destroy(priv->settings); + + parent_class->finalize(object); +} + +/* Class initializer function */ +static void +purple_blist_node_class_init(PurpleBListNodeClass *klass) +{ + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + + parent_class = g_type_class_peek_parent(klass); + + obj_class->finalize = purple_blist_node_finalize; + + /* Setup properties */ + obj_class->get_property = purple_blist_node_get_property; + obj_class->set_property = purple_blist_node_set_property; + + g_object_class_install_property(obj_class, PROP_DONT_SAVE, + g_param_spec_boolean(PROP_DONT_SAVE_S, _("Do not save"), + _("Whether node should not be saved with the buddy list."), + FALSE, G_PARAM_READWRITE) + ); + + g_type_class_add_private(klass, sizeof(PurpleBListNodePrivate)); +} + +GType +purple_blist_node_get_type(void) +{ + static GType type = 0; + + if(type == 0) { + static const GTypeInfo info = { + sizeof(PurpleBListNodeClass), + NULL, + NULL, + (GClassInitFunc)purple_blist_node_class_init, + NULL, + NULL, + sizeof(PurpleBListNode), + 0, + (GInstanceInitFunc)purple_blist_node_init, + NULL, + }; + + type = g_type_register_static(G_TYPE_OBJECT, "PurpleBListNode", + &info, G_TYPE_FLAG_ABSTRACT); + } + + return type; +}