facebook: gobjectified the FbJsonValues interface facebook

Tue, 18 Aug 2015 19:58:40 -0400

author
James Geboski <jgeboski@gmail.com>
date
Tue, 18 Aug 2015 19:58:40 -0400
branch
facebook
changeset 37363
7201f07fe8f7
parent 37362
0878bc1ef872
child 37364
d8e50d403e82

facebook: gobjectified the FbJsonValues interface

libpurple/protocols/facebook/api.c file | annotate | diff | comparison | revisions
libpurple/protocols/facebook/json.c file | annotate | diff | comparison | revisions
libpurple/protocols/facebook/json.h file | annotate | diff | comparison | revisions
--- a/libpurple/protocols/facebook/api.c	Tue Aug 18 19:11:42 2015 -0400
+++ b/libpurple/protocols/facebook/api.c	Tue Aug 18 19:58:40 2015 -0400
@@ -519,7 +519,7 @@
 	fb_json_values_update(values, &err);
 
 	FB_API_ERROR_EMIT(api, err,
-		fb_json_values_free(values);
+		g_object_unref(values);
 		json_node_free(root);
 		return FALSE
 	);
@@ -550,7 +550,7 @@
 		priv->stoken = NULL;
 	}
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 
 	for (msg = NULL, i = 0; i < G_N_ELEMENTS(exprs); i++) {
 		msg = fb_json_node_get_str(root, exprs[i], NULL);
@@ -944,7 +944,7 @@
 	fb_json_values_update(values, &err);
 
 	FB_API_ERROR_EMIT(api, err,
-		fb_json_values_free(values);
+		g_object_unref(values);
 		json_node_free(root);
 		return;
 	);
@@ -954,7 +954,7 @@
 	priv->unread = fb_json_values_next_int(values, 0);
 
 	fb_api_connect_queue(api);
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
@@ -1019,7 +1019,7 @@
 	fb_json_values_update(values, &err);
 
 	FB_API_ERROR_EMIT(api, err,
-		fb_json_values_free(values);
+		g_object_unref(values);
 		json_node_free(root);
 		return;
 	);
@@ -1029,7 +1029,7 @@
 		             _("Failed to mark thread as read"));
 	}
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
@@ -1073,7 +1073,7 @@
 			}
 		}
 
-		fb_json_values_free(values);
+		g_object_unref(values);
 
 		if (G_UNLIKELY(err != NULL)) {
 			g_propagate_error(error, err);
@@ -1120,7 +1120,7 @@
 	}
 
 	g_slist_free_full(events, (GDestroyNotify) fb_api_event_free);
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 
 }
@@ -1146,7 +1146,7 @@
 	fb_json_values_update(values, &err);
 
 	FB_API_ERROR_EMIT(api, err,
-		fb_json_values_free(values);
+		g_object_unref(values);
 		json_node_free(root);
 		return;
 	);
@@ -1162,7 +1162,7 @@
 		}
 	}
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
@@ -1185,7 +1185,7 @@
 
 	if (G_UNLIKELY(err != NULL)) {
 		g_propagate_error(error, err);
-		fb_json_values_free(values);
+		g_object_unref(values);
 		return FALSE;
 	}
 
@@ -1202,11 +1202,11 @@
 
 	if (fb_http_urlcmp(body, msg->text, FALSE)) {
 		g_free(msg->text);
-		fb_json_values_free(values);
+		g_object_unref(values);
 		return FALSE;
 	}
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 	return TRUE;
 }
 
@@ -1284,7 +1284,7 @@
 		g_propagate_error(error, err);
 	}
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 	return msgs;
 }
 
@@ -1340,14 +1340,14 @@
 	fb_json_values_update(values, &err);
 
 	FB_API_ERROR_EMIT(api, err,
-		fb_json_values_free(values);
+		g_object_unref(values);
 		json_node_free(root);
 		return;
 	);
 
 	priv->sid = fb_json_values_next_int(values, 0);
 	stoken = fb_json_values_next_str_dup(values, NULL);
-	fb_json_values_free(values);
+	g_object_unref(values);
 
 	if (G_UNLIKELY(stoken != NULL)) {
 		g_free(priv->stoken);
@@ -1434,7 +1434,7 @@
 	}
 
 	g_slist_free_full(msgs, (GDestroyNotify) fb_api_message_free);
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
@@ -1688,7 +1688,7 @@
 	fb_json_values_update(values, &err);
 
 	FB_API_ERROR_EMIT(api, err,
-		fb_json_values_free(values);
+		g_object_unref(values);
 		json_node_free(root);
 		return;
 	);
@@ -1698,7 +1698,7 @@
 	priv->uid = fb_json_values_next_int(values, 0);
 
 	g_signal_emit_by_name(api, "auth");
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
@@ -1739,7 +1739,7 @@
 
 	if (G_UNLIKELY(err != NULL)) {
 		g_propagate_error(error, err);
-		fb_json_values_free(values);
+		g_object_unref(values);
 		return FALSE;
 	}
 
@@ -1758,7 +1758,7 @@
 	    !purple_strequal(str, "ARE_FRIENDS") &&
 	    (user->uid != priv->uid))
 	{
-		fb_json_values_free(values);
+		g_object_unref(values);
 		return FALSE;
 	}
 
@@ -1769,7 +1769,7 @@
 	user->csum = fb_http_params_dup_str(params, "oh", &err);
 	fb_http_params_free(params);
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 	return TRUE;
 }
 
@@ -1890,7 +1890,7 @@
 
 	g_free(writeid);
 	g_slist_free_full(users, (GDestroyNotify) fb_api_user_free);
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
@@ -2103,7 +2103,7 @@
 		g_propagate_error(error, err);
 	}
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 	return msgs;
 }
 
@@ -2144,14 +2144,14 @@
 	fb_json_values_update(values, &err);
 
 	FB_API_ERROR_EMIT(api, err,
-		fb_json_values_free(values);
+		g_object_unref(values);
 		return;
 	);
 
 	fb_api_message_reset(&msg, FALSE);
 	str = fb_json_values_next_str(values, "0");
 	tid = FB_ID_FROM_STR(str);
-	fb_json_values_free(values);
+	g_object_unref(values);
 
 	values = fb_json_values_new(node);
 	fb_json_values_add(values, FB_JSON_TYPE_BOOL, TRUE, "$.unread");
@@ -2222,7 +2222,7 @@
 	}
 
 	g_slist_free_full(msgs, (GDestroyNotify) fb_api_message_free);
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
@@ -2282,7 +2282,7 @@
 		fb_api_error_emit(api, err);
 	}
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
@@ -2329,20 +2329,20 @@
 
 	if (G_UNLIKELY(err != NULL)) {
 		g_propagate_error(error, err);
-		fb_json_values_free(values);
+		g_object_unref(values);
 		return FALSE;
 	}
 
 	str = fb_json_values_next_str(values, NULL);
 
 	if (str == NULL) {
-		fb_json_values_free(values);
+		g_object_unref(values);
 		return FALSE;
 	}
 
 	thrd->tid = FB_ID_FROM_STR(str);
 	thrd->topic = fb_json_values_next_str_dup(values, NULL);
-	fb_json_values_free(values);
+	g_object_unref(values);
 
 	values = fb_json_values_new(root);
 	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
@@ -2368,17 +2368,17 @@
 	if (G_UNLIKELY(err != NULL)) {
 		g_propagate_error(error, err);
 		fb_api_thread_reset(thrd, TRUE);
-		fb_json_values_free(values);
+		g_object_unref(values);
 		return FALSE;
 	}
 
 	if ((g_slist_length(thrd->users) < 2) || !haself) {
 		fb_api_thread_reset(thrd, TRUE);
-		fb_json_values_free(values);
+		g_object_unref(values);
 		return FALSE;
 	}
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 	return TRUE;
 }
 
@@ -2478,7 +2478,7 @@
 	fb_json_values_update(values, &err);
 
 	FB_API_ERROR_EMIT(api, err,
-		fb_json_values_free(values);
+		g_object_unref(values);
 		json_node_free(root);
 		return;
 	);
@@ -2487,7 +2487,7 @@
 	tid = FB_ID_FROM_STR(str);
 	g_signal_emit_by_name(api, "thread-create", tid);
 
-	fb_json_values_free(values);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
--- a/libpurple/protocols/facebook/json.c	Tue Aug 18 19:11:42 2015 -0400
+++ b/libpurple/protocols/facebook/json.c	Tue Aug 18 19:58:40 2015 -0400
@@ -27,6 +27,79 @@
 #include "json.h"
 #include "util.h"
 
+typedef struct _FbJsonValue FbJsonValue;
+
+struct _FbJsonValue
+{
+	const gchar *expr;
+	FbJsonType type;
+	gboolean required;
+	GValue value;
+};
+
+struct _FbJsonValuesPrivate
+{
+	JsonNode *root;
+	GQueue *queue;
+	GList *next;
+
+	gboolean isarray;
+	JsonArray *array;
+	guint index;
+
+	GError *error;
+};
+
+G_DEFINE_TYPE(FbJsonValues, fb_json_values, G_TYPE_OBJECT);
+
+static void
+fb_json_values_dispose(GObject *obj)
+{
+	FbJsonValue *value;
+	FbJsonValuesPrivate *priv = FB_JSON_VALUES(obj)->priv;
+
+	while (!g_queue_is_empty(priv->queue)) {
+		value = g_queue_pop_head(priv->queue);
+
+		if (G_IS_VALUE(&value->value)) {
+			g_value_unset(&value->value);
+		}
+
+		g_free(value);
+	}
+
+	if (priv->array != NULL) {
+		json_array_unref(priv->array);
+	}
+
+	if (priv->error != NULL) {
+		g_error_free(priv->error);
+	}
+
+	g_queue_free(priv->queue);
+}
+
+static void
+fb_json_values_class_init(FbJsonValuesClass *klass)
+{
+	GObjectClass *gklass = G_OBJECT_CLASS(klass);
+
+	gklass->dispose = fb_json_values_dispose;
+	g_type_class_add_private(klass, sizeof (FbJsonValuesPrivate));
+}
+
+static void
+fb_json_values_init(FbJsonValues *values)
+{
+	FbJsonValuesPrivate *priv;
+
+	priv = G_TYPE_INSTANCE_GET_PRIVATE(values, FB_TYPE_JSON_VALUES,
+	                                   FbJsonValuesPrivate);
+	values->priv = priv;
+
+	priv->queue = g_queue_new();
+}
+
 GQuark
 fb_json_error_quark(void)
 {
@@ -351,46 +424,16 @@
 FbJsonValues *
 fb_json_values_new(JsonNode *root)
 {
-	FbJsonValues *ret;
+	FbJsonValues *values;
+	FbJsonValuesPrivate *priv;
 
 	g_return_val_if_fail(root != NULL, NULL);
 
-	ret = g_new0(FbJsonValues, 1);
-	ret->root = root;
-	ret->queue = g_queue_new();
-
-	return ret;
-}
-
-void
-fb_json_values_free(FbJsonValues *values)
-{
-	FbJsonValue *value;
-
-	if (G_UNLIKELY(values == NULL)) {
-		return;
-	}
+	values = g_object_new(FB_TYPE_JSON_VALUES, NULL);
+	priv = values->priv;
+	priv->root = root;
 
-	while (!g_queue_is_empty(values->queue)) {
-		value = g_queue_pop_head(values->queue);
-
-		if (G_IS_VALUE(&value->value)) {
-			g_value_unset(&value->value);
-		}
-
-		g_free(value);
-	}
-
-	if (values->array != NULL) {
-		json_array_unref(values->array);
-	}
-
-	if (values->error != NULL) {
-		g_error_free(values->error);
-	}
-
-	g_queue_free(values->queue);
-	g_free(values);
+	return values;
 }
 
 void
@@ -398,52 +441,57 @@
                    const gchar *expr)
 {
 	FbJsonValue *value;
+	FbJsonValuesPrivate *priv;
 
 	g_return_if_fail(values != NULL);
 	g_return_if_fail(expr != NULL);
+	priv = values->priv;
 
 	value = g_new0(FbJsonValue, 1);
 	value->expr = expr;
 	value->type = type;
 	value->required = required;
 
-	g_queue_push_tail(values->queue, value);
+	g_queue_push_tail(priv->queue, value);
 }
 
 JsonNode *
 fb_json_values_get_root(FbJsonValues *values)
 {
+	FbJsonValuesPrivate *priv;
 	guint index;
 
 	g_return_val_if_fail(values != NULL, NULL);
+	priv = values->priv;
 
-	if (values->array == NULL) {
-		return values->root;
+	if (priv->array == NULL) {
+		return priv->root;
 	}
 
-	g_return_val_if_fail(values->array != NULL, NULL);
-	g_return_val_if_fail(values->index > 0, NULL);
-	index = values->index - 1;
+	g_return_val_if_fail(priv->index > 0, NULL);
+	index = priv->index - 1;
 
-	if (json_array_get_length(values->array) <= index) {
+	if (json_array_get_length(priv->array) <= index) {
 		return NULL;
 	}
 
-	return json_array_get_element(values->array, index);
+	return json_array_get_element(priv->array, index);
 }
 
 void
 fb_json_values_set_array(FbJsonValues *values, gboolean required,
                          const gchar *expr)
 {
+	FbJsonValuesPrivate *priv;
+
 	g_return_if_fail(values != NULL);
+	priv = values->priv;
 
-	values->array = fb_json_node_get_arr(values->root, expr,
-	                                     &values->error);
-	values->isarray = TRUE;
+	priv->array = fb_json_node_get_arr(priv->root, expr, &priv->error);
+	priv->isarray = TRUE;
 
-	if ((values->error != NULL) && !required) {
-		g_clear_error(&values->error);
+	if ((priv->error != NULL) && !required) {
+		g_clear_error(&priv->error);
 	}
 }
 
@@ -451,6 +499,7 @@
 fb_json_values_update(FbJsonValues *values, GError **error)
 {
 	FbJsonValue *value;
+	FbJsonValuesPrivate *priv;
 	GError *err = NULL;
 	GList *l;
 	GType type;
@@ -458,28 +507,29 @@
 	JsonNode *node;
 
 	g_return_val_if_fail(values != NULL, FALSE);
+	priv = values->priv;
 
-	if (G_UNLIKELY(values->error != NULL)) {
-		g_propagate_error(error, values->error);
-		values->error = NULL;
+	if (G_UNLIKELY(priv->error != NULL)) {
+		g_propagate_error(error, priv->error);
+		priv->error = NULL;
 		return FALSE;
 	}
 
-	if (values->isarray) {
-		if ((values->array == NULL) ||
-		    (json_array_get_length(values->array) <= values->index))
+	if (priv->isarray) {
+		if ((priv->array == NULL) ||
+		    (json_array_get_length(priv->array) <= priv->index))
 		{
 			return FALSE;
 		}
 
-		root = json_array_get_element(values->array, values->index++);
+		root = json_array_get_element(priv->array, priv->index++);
 	} else {
-		root = values->root;
+		root = priv->root;
 	}
 
 	g_return_val_if_fail(root != NULL, FALSE);
 
-	for (l = values->queue->head; l != NULL; l = l->next) {
+	for (l = priv->queue->head; l != NULL; l = l->next) {
 		value = l->data;
 		node = fb_json_node_get(root, value->expr, &err);
 
@@ -515,7 +565,7 @@
 		json_node_free(node);
 	}
 
-	values->next = values->queue->head;
+	priv->next = priv->queue->head;
 	return TRUE;
 }
 
@@ -523,12 +573,14 @@
 fb_json_values_next(FbJsonValues *values)
 {
 	FbJsonValue *value;
+	FbJsonValuesPrivate *priv;
 
 	g_return_val_if_fail(values != NULL, NULL);
-	g_return_val_if_fail(values->next != NULL, NULL);
+	priv = values->priv;
 
-	value = values->next->data;
-	values->next = values->next->next;
+	g_return_val_if_fail(priv->next != NULL, NULL);
+	value = priv->next->data;
+	priv->next = priv->next->next;
 
 	if (!G_IS_VALUE(&value->value)) {
 		return NULL;
--- a/libpurple/protocols/facebook/json.h	Tue Aug 18 19:11:42 2015 -0400
+++ b/libpurple/protocols/facebook/json.h	Tue Aug 18 19:58:40 2015 -0400
@@ -22,6 +22,13 @@
 #ifndef _FACEBOOK_JSON_H_
 #define _FACEBOOK_JSON_H_
 
+#define FB_TYPE_JSON_VALUES  (fb_json_values_get_type())
+#define FB_JSON_VALUES(obj)  (G_TYPE_CHECK_INSTANCE_CAST((obj), FB_TYPE_JSON_VALUES, FbJsonValues))
+#define FB_JSON_VALUES_CLASS(klass)  (G_TYPE_CHECK_CLASS_CAST((klass), FB_TYPE_JSON_VALUES, FbJsonValuesClass))
+#define FB_IS_JSON_VALUES(obj)  (G_TYPE_CHECK_INSTANCE_TYPE((obj), FB_TYPE_JSON_VALUES))
+#define FB_IS_JSON_VALUES_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), FB_TYPE_JSON_VALUES))
+#define FB_JSON_VALUES_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), FB_TYPE_JSON_VALUES, FbJsonValuesClass))
+
 /**
  * SECTION:json
  * @section_id: facebook-json
@@ -41,8 +48,9 @@
  */
 #define FB_JSON_ERROR fb_json_error_quark()
 
-typedef struct _FbJsonValue FbJsonValue;
 typedef struct _FbJsonValues FbJsonValues;
+typedef struct _FbJsonValuesClass FbJsonValuesClass;
+typedef struct _FbJsonValuesPrivate FbJsonValuesPrivate;
 
 /**
  * FbJsonError:
@@ -85,46 +93,35 @@
 } FbJsonType;
 
 /**
- * FbJsonValue:
- * @expr: The #JsonPath expression.
- * @type: The #FbJsonType.
- * @required: TRUE if the node is required, otherwise FALSE.
- * @value: The #GValue.
- *
- * Represents a JSON node value.
- */
-struct _FbJsonValue
-{
-	const gchar *expr;
-	FbJsonType type;
-	gboolean required;
-	GValue value;
-};
-
-/**
  * FbJsonValues:
- * @root: The root #JsonNode.
- * @queue: The queue of #FbJsonValue's.
- * @next: The next #FbJsonValue.
- * @isarray: #TRUE if an array is present, otherwise #FALSE.
- * @array: The #JsonArray or #NULL.
- * @index: The advancing array index.
- * @error: The #GError.
  *
  * Represents a JSON value handler.
  */
 struct _FbJsonValues
 {
-	JsonNode *root;
-	GQueue *queue;
-	GList *next;
+	/*< private >*/
+	GObject parent;
+	FbJsonValuesPrivate *priv;
+};
 
-	gboolean isarray;
-	JsonArray *array;
-	guint index;
+/**
+ * FbJsonValuesClass:
+ *
+ * The base class for all #FbJsonValues's.
+ */
+struct _FbJsonValuesClass
+{
+	/*< private >*/
+	GObjectClass parent_class;
+};
 
-	GError *error;
-};
+/**
+ * fb_json_values_get_type:
+ *
+ * Returns: The #GType for an #FbJsonValues.
+ */
+GType
+fb_json_values_get_type(void);
 
 /**
  * fb_json_error_quark:
@@ -382,7 +379,7 @@
  * @root: The root #JsonNode.
  *
  * Creates a new #FbJsonValues. The returned #FbJsonValues should be
- * freed with #fb_json_values_free() when no longer needed.
+ * freed with #g_object_unref when no longer needed.
  *
  * Returns: The new #FbJsonValues.
  */
@@ -390,15 +387,6 @@
 fb_json_values_new(JsonNode *root);
 
 /**
- * fb_json_values_free:
- * @values: The #FbJsonValues.
- *
- * Frees all memory used by the #FbJsonValues.
- */
-void
-fb_json_values_free(FbJsonValues *values);
-
-/**
  * fb_json_values_add:
  * @values: The #FbJsonValues.
  * @type: The #FbJsonType.

mercurial