libpurple/blistnode.c

branch
soc.2013.gobjectification
changeset 34712
caeb3904c991
parent 34709
3484aac07f02
child 34713
e4fc06261814
--- 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;
+}

mercurial