Tue, 18 Aug 2015 19:58:40 -0400
facebook: gobjectified the FbJsonValues interface
--- 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.