libpurple/protocols/facebook/json.c

Tue, 27 Jun 2017 11:58:03 -0500

author
Mike Ruprecht <cmaiku@gmail.com>
date
Tue, 27 Jun 2017 11:58:03 -0500
changeset 38381
0f253504b9dd
parent 37431
df4d0ab7eaae
child 39431
86688eb3f593
permissions
-rw-r--r--

facebook: Fix reading MQTT ping responses

MQTT ping packets are only a two byte header with a zero length
content. The Gio port of this was coded such that packets with zero
length contents were considered to not have been fully received.
This caused the MQTT connection to get stuck after a ping response
was received and eventually timeout. Therefore, the connection
would "fail" and reconnect every 1.5 minutes or so.

This patch fixes this by reworking that logic to also accept fully
received packets with a zero length content.

37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
1 /* purple
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
2 *
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
3 * Purple is the legal property of its developers, whose names are too numerous
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
4 * to list here. Please refer to the COPYRIGHT file distributed with this
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
5 * source distribution.
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
6 *
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
10 * (at your option) any later version.
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
11 *
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful,
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
15 * GNU General Public License for more details.
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
16 *
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
20 */
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
21
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
22 #include "internal.h"
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
23
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
24 #include <stdarg.h>
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
25 #include <string.h>
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
26
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
27 #include "json.h"
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
28 #include "util.h"
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
29
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
30 typedef struct _FbJsonValue FbJsonValue;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
31
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
32 struct _FbJsonValue
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
33 {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
34 const gchar *expr;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
35 FbJsonType type;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
36 gboolean required;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
37 GValue value;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
38 };
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
39
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
40 struct _FbJsonValuesPrivate
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
41 {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
42 JsonNode *root;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
43 GQueue *queue;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
44 GList *next;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
45
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
46 gboolean isarray;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
47 JsonArray *array;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
48 guint index;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
49
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
50 GError *error;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
51 };
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
52
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
53 G_DEFINE_TYPE(FbJsonValues, fb_json_values, G_TYPE_OBJECT);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
54
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
55 static void
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
56 fb_json_values_dispose(GObject *obj)
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
57 {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
58 FbJsonValue *value;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
59 FbJsonValuesPrivate *priv = FB_JSON_VALUES(obj)->priv;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
60
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
61 while (!g_queue_is_empty(priv->queue)) {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
62 value = g_queue_pop_head(priv->queue);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
63
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
64 if (G_IS_VALUE(&value->value)) {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
65 g_value_unset(&value->value);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
66 }
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
67
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
68 g_free(value);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
69 }
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
70
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
71 if (priv->array != NULL) {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
72 json_array_unref(priv->array);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
73 }
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
74
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
75 if (priv->error != NULL) {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
76 g_error_free(priv->error);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
77 }
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
78
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
79 g_queue_free(priv->queue);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
80 }
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
81
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
82 static void
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
83 fb_json_values_class_init(FbJsonValuesClass *klass)
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
84 {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
85 GObjectClass *gklass = G_OBJECT_CLASS(klass);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
86
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
87 gklass->dispose = fb_json_values_dispose;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
88 g_type_class_add_private(klass, sizeof (FbJsonValuesPrivate));
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
89 }
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
90
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
91 static void
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
92 fb_json_values_init(FbJsonValues *values)
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
93 {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
94 FbJsonValuesPrivate *priv;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
95
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
96 priv = G_TYPE_INSTANCE_GET_PRIVATE(values, FB_TYPE_JSON_VALUES,
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
97 FbJsonValuesPrivate);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
98 values->priv = priv;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
99
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
100 priv->queue = g_queue_new();
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
101 }
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
102
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
103 GQuark
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
104 fb_json_error_quark(void)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
105 {
37252
be11d9f148a6 facebook: initialize static GQuarks
James Geboski <jgeboski@gmail.com>
parents: 37251
diff changeset
106 static GQuark q = 0;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
107
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
108 if (G_UNLIKELY(q == 0)) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
109 q = g_quark_from_static_string("fb-json-error-quark");
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
110 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
111
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
112 return q;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
113 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
114
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
115 JsonBuilder *
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
116 fb_json_bldr_new(JsonNodeType type)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
117 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
118 JsonBuilder *bldr;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
119
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
120 bldr = json_builder_new();
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
121
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
122 switch (type) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
123 case JSON_NODE_ARRAY:
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
124 fb_json_bldr_arr_begin(bldr, NULL);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
125 break;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
126
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
127 case JSON_NODE_OBJECT:
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
128 fb_json_bldr_obj_begin(bldr, NULL);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
129 break;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
130
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
131 default:
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
132 break;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
133 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
134
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
135 return bldr;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
136 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
137
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
138 gchar *
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
139 fb_json_bldr_close(JsonBuilder *bldr, JsonNodeType type, gsize *size)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
140 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
141 gchar *ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
142 JsonGenerator *genr;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
143 JsonNode *root;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
144
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
145 switch (type) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
146 case JSON_NODE_ARRAY:
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
147 fb_json_bldr_arr_end(bldr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
148 break;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
149
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
150 case JSON_NODE_OBJECT:
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
151 fb_json_bldr_obj_end(bldr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
152 break;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
153
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
154 default:
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
155 break;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
156 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
157
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
158 genr = json_generator_new();
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
159 root = json_builder_get_root(bldr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
160
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
161 json_generator_set_root(genr, root);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
162 ret = json_generator_to_data(genr, size);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
163
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
164 json_node_free(root);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
165 g_object_unref(genr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
166 g_object_unref(bldr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
167
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
168 return ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
169 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
170
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
171 void
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
172 fb_json_bldr_arr_begin(JsonBuilder *bldr, const gchar *name)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
173 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
174 if (name != NULL) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
175 json_builder_set_member_name(bldr, name);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
176 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
177
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
178 json_builder_begin_array(bldr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
179 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
180
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
181 void
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
182 fb_json_bldr_arr_end(JsonBuilder *bldr)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
183 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
184 json_builder_end_array(bldr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
185 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
186
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
187 void
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
188 fb_json_bldr_obj_begin(JsonBuilder *bldr, const gchar *name)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
189 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
190 if (name != NULL) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
191 json_builder_set_member_name(bldr, name);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
192 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
193
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
194 json_builder_begin_object(bldr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
195 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
196
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
197 void
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
198 fb_json_bldr_obj_end(JsonBuilder *bldr)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
199 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
200 json_builder_end_object(bldr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
201 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
202
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
203 void
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
204 fb_json_bldr_add_bool(JsonBuilder *bldr, const gchar *name, gboolean value)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
205 {
37284
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
206 if (name != NULL) {
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
207 json_builder_set_member_name(bldr, name);
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
208 }
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
209
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
210 json_builder_add_boolean_value(bldr, value);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
211 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
212
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
213 void
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
214 fb_json_bldr_add_dbl(JsonBuilder *bldr, const gchar *name, gdouble value)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
215 {
37284
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
216 if (name != NULL) {
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
217 json_builder_set_member_name(bldr, name);
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
218 }
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
219
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
220 json_builder_add_double_value(bldr, value);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
221 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
222
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
223 void
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
224 fb_json_bldr_add_int(JsonBuilder *bldr, const gchar *name, gint64 value)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
225 {
37284
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
226 if (name != NULL) {
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
227 json_builder_set_member_name(bldr, name);
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
228 }
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
229
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
230 json_builder_add_int_value(bldr, value);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
231 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
232
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
233 void
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
234 fb_json_bldr_add_str(JsonBuilder *bldr, const gchar *name, const gchar *value)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
235 {
37284
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
236 if (name != NULL) {
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
237 json_builder_set_member_name(bldr, name);
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
238 }
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
239
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
240 json_builder_add_string_value(bldr, value);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
241 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
242
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
243 void
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
244 fb_json_bldr_add_strf(JsonBuilder *bldr, const gchar *name,
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
245 const gchar *format, ...)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
246 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
247 gchar *value;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
248 va_list ap;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
249
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
250 va_start(ap, format);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
251 value = g_strdup_vprintf(format, ap);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
252 va_end(ap);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
253
37284
53cb588d8760 facebook: implemented kicking/leaving group chats
James Geboski <jgeboski@gmail.com>
parents: 37269
diff changeset
254 fb_json_bldr_add_str(bldr, name, value);
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
255 g_free(value);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
256 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
257
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
258 JsonNode *
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
259 fb_json_node_new(const gchar *data, gssize size, GError **error)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
260 {
37429
7f8a2f301a82 facebook-json: Ensure data is null terminated for json-glib < 1.0.2
dequis <dx@dxzone.com.ar>
parents: 37363
diff changeset
261 gchar *slice;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
262 JsonNode *root;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
263 JsonParser *prsr;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
264
37431
df4d0ab7eaae facebook-json: fixed a size overflow with string duplication
James Geboski <jgeboski@gmail.com>
parents: 37430
diff changeset
265 g_return_val_if_fail(data != NULL, NULL);
df4d0ab7eaae facebook-json: fixed a size overflow with string duplication
James Geboski <jgeboski@gmail.com>
parents: 37430
diff changeset
266
df4d0ab7eaae facebook-json: fixed a size overflow with string duplication
James Geboski <jgeboski@gmail.com>
parents: 37430
diff changeset
267 if (size < 0) {
df4d0ab7eaae facebook-json: fixed a size overflow with string duplication
James Geboski <jgeboski@gmail.com>
parents: 37430
diff changeset
268 size = strlen(data);
df4d0ab7eaae facebook-json: fixed a size overflow with string duplication
James Geboski <jgeboski@gmail.com>
parents: 37430
diff changeset
269 }
df4d0ab7eaae facebook-json: fixed a size overflow with string duplication
James Geboski <jgeboski@gmail.com>
parents: 37430
diff changeset
270
37429
7f8a2f301a82 facebook-json: Ensure data is null terminated for json-glib < 1.0.2
dequis <dx@dxzone.com.ar>
parents: 37363
diff changeset
271 /* Ensure data is null terminated for json-glib < 1.0.2 */
7f8a2f301a82 facebook-json: Ensure data is null terminated for json-glib < 1.0.2
dequis <dx@dxzone.com.ar>
parents: 37363
diff changeset
272 slice = g_strndup(data, size);
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
273 prsr = json_parser_new();
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
274
37429
7f8a2f301a82 facebook-json: Ensure data is null terminated for json-glib < 1.0.2
dequis <dx@dxzone.com.ar>
parents: 37363
diff changeset
275 if (!json_parser_load_from_data(prsr, slice, size, error)) {
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
276 g_object_unref(prsr);
37429
7f8a2f301a82 facebook-json: Ensure data is null terminated for json-glib < 1.0.2
dequis <dx@dxzone.com.ar>
parents: 37363
diff changeset
277 g_free(slice);
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
278 return NULL;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
279 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
280
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
281 root = json_parser_get_root(prsr);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
282 root = json_node_copy(root);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
283
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
284 g_object_unref(prsr);
37429
7f8a2f301a82 facebook-json: Ensure data is null terminated for json-glib < 1.0.2
dequis <dx@dxzone.com.ar>
parents: 37363
diff changeset
285 g_free(slice);
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
286 return root;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
287 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
288
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
289 JsonNode *
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
290 fb_json_node_get(JsonNode *root, const gchar *expr, GError **error)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
291 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
292 GError *err = NULL;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
293 guint size;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
294 JsonArray *rslt;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
295 JsonNode *node;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
296 JsonNode *ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
297
37430
56c7dbe97266 facebook-json:`Special-case "$" to return root for json-glib < 0.99.2
dequis <dx@dxzone.com.ar>
parents: 37429
diff changeset
298 /* Special case for json-glib < 0.99.2 */
56c7dbe97266 facebook-json:`Special-case "$" to return root for json-glib < 0.99.2
dequis <dx@dxzone.com.ar>
parents: 37429
diff changeset
299 if (purple_strequal(expr, "$")) {
56c7dbe97266 facebook-json:`Special-case "$" to return root for json-glib < 0.99.2
dequis <dx@dxzone.com.ar>
parents: 37429
diff changeset
300 return json_node_copy(root);
56c7dbe97266 facebook-json:`Special-case "$" to return root for json-glib < 0.99.2
dequis <dx@dxzone.com.ar>
parents: 37429
diff changeset
301 }
56c7dbe97266 facebook-json:`Special-case "$" to return root for json-glib < 0.99.2
dequis <dx@dxzone.com.ar>
parents: 37429
diff changeset
302
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
303 node = json_path_query(expr, root, &err);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
304
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
305 if (err != NULL) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
306 g_propagate_error(error, err);
37251
8d6136db4399 facebook: removed unnecessary gotos
James Geboski <jgeboski@gmail.com>
parents: 37250
diff changeset
307 json_node_free(node);
8d6136db4399 facebook: removed unnecessary gotos
James Geboski <jgeboski@gmail.com>
parents: 37250
diff changeset
308 return NULL;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
309 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
310
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
311 rslt = json_node_get_array(node);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
312 size = json_array_get_length(rslt);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
313
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
314 if (size < 1) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
315 g_set_error(error, FB_JSON_ERROR, FB_JSON_ERROR_NOMATCH,
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
316 _("No matches for %s"), expr);
37251
8d6136db4399 facebook: removed unnecessary gotos
James Geboski <jgeboski@gmail.com>
parents: 37250
diff changeset
317 json_node_free(node);
8d6136db4399 facebook: removed unnecessary gotos
James Geboski <jgeboski@gmail.com>
parents: 37250
diff changeset
318 return NULL;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
319 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
320
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
321 if (size > 1) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
322 g_set_error(error, FB_JSON_ERROR, FB_JSON_ERROR_AMBIGUOUS,
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
323 _("Ambiguous matches for %s"), expr);
37251
8d6136db4399 facebook: removed unnecessary gotos
James Geboski <jgeboski@gmail.com>
parents: 37250
diff changeset
324 json_node_free(node);
8d6136db4399 facebook: removed unnecessary gotos
James Geboski <jgeboski@gmail.com>
parents: 37250
diff changeset
325 return NULL;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
326 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
327
37299
b14336308988 facebook: migrated FQL usage to GraphQL
James Geboski <jgeboski@gmail.com>
parents: 37284
diff changeset
328 if (json_array_get_null_element(rslt, 0)) {
b14336308988 facebook: migrated FQL usage to GraphQL
James Geboski <jgeboski@gmail.com>
parents: 37284
diff changeset
329 g_set_error(error, FB_JSON_ERROR, FB_JSON_ERROR_NULL,
b14336308988 facebook: migrated FQL usage to GraphQL
James Geboski <jgeboski@gmail.com>
parents: 37284
diff changeset
330 _("Null value for %s"), expr);
b14336308988 facebook: migrated FQL usage to GraphQL
James Geboski <jgeboski@gmail.com>
parents: 37284
diff changeset
331 json_node_free(node);
b14336308988 facebook: migrated FQL usage to GraphQL
James Geboski <jgeboski@gmail.com>
parents: 37284
diff changeset
332 return NULL;
b14336308988 facebook: migrated FQL usage to GraphQL
James Geboski <jgeboski@gmail.com>
parents: 37284
diff changeset
333 }
b14336308988 facebook: migrated FQL usage to GraphQL
James Geboski <jgeboski@gmail.com>
parents: 37284
diff changeset
334
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
335 ret = json_array_dup_element(rslt, 0);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
336 json_node_free(node);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
337 return ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
338 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
339
37315
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
340 JsonNode *
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
341 fb_json_node_get_nth(JsonNode *root, guint n)
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
342 {
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
343 GList *vals;
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
344 JsonNode *ret;
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
345 JsonObject *obj;
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
346
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
347 obj = json_node_get_object(root);
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
348 vals = json_object_get_values(obj);
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
349 ret = g_list_nth_data(vals, n);
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
350
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
351 g_list_free(vals);
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
352 return ret;
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
353 }
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
354
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
355 JsonArray *
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
356 fb_json_node_get_arr(JsonNode *root, const gchar *expr, GError **error)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
357 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
358 JsonArray *ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
359 JsonNode *rslt;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
360
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
361 rslt = fb_json_node_get(root, expr, error);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
362
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
363 if (rslt == NULL) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
364 return NULL;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
365 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
366
37269
129e87951cd6 facebook: fixed JSON parsing for older json-glib versions
James Geboski <jgeboski@gmail.com>
parents: 37252
diff changeset
367 ret = json_node_dup_array(rslt);
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
368 json_node_free(rslt);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
369 return ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
370 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
371
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
372 gboolean
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
373 fb_json_node_get_bool(JsonNode *root, const gchar *expr, GError **error)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
374 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
375 gboolean ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
376 JsonNode *rslt;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
377
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
378 rslt = fb_json_node_get(root, expr, error);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
379
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
380 if (rslt == NULL) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
381 return FALSE;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
382 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
383
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
384 ret = json_node_get_boolean(rslt);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
385 json_node_free(rslt);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
386 return ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
387 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
388
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
389 gdouble
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
390 fb_json_node_get_dbl(JsonNode *root, const gchar *expr, GError **error)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
391 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
392 gdouble ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
393 JsonNode *rslt;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
394
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
395 rslt = fb_json_node_get(root, expr, error);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
396
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
397 if (rslt == NULL) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
398 return 0.0;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
399 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
400
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
401 ret = json_node_get_double(rslt);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
402 json_node_free(rslt);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
403 return ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
404 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
405
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
406 gint64
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
407 fb_json_node_get_int(JsonNode *root, const gchar *expr, GError **error)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
408 {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
409 gint64 ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
410 JsonNode *rslt;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
411
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
412 rslt = fb_json_node_get(root, expr, error);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
413
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
414 if (rslt == NULL) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
415 return 0;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
416 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
417
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
418 ret = json_node_get_int(rslt);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
419 json_node_free(rslt);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
420 return ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
421 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
422
37269
129e87951cd6 facebook: fixed JSON parsing for older json-glib versions
James Geboski <jgeboski@gmail.com>
parents: 37252
diff changeset
423 gchar *
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
424 fb_json_node_get_str(JsonNode *root, const gchar *expr, GError **error)
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
425 {
37269
129e87951cd6 facebook: fixed JSON parsing for older json-glib versions
James Geboski <jgeboski@gmail.com>
parents: 37252
diff changeset
426 gchar *ret;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
427 JsonNode *rslt;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
428
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
429 rslt = fb_json_node_get(root, expr, error);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
430
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
431 if (rslt == NULL) {
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
432 return NULL;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
433 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
434
37269
129e87951cd6 facebook: fixed JSON parsing for older json-glib versions
James Geboski <jgeboski@gmail.com>
parents: 37252
diff changeset
435 ret = json_node_dup_string(rslt);
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
436 json_node_free(rslt);
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
437 return ret;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
438 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
439
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
440 FbJsonValues *
37334
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
441 fb_json_values_new(JsonNode *root)
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
442 {
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
443 FbJsonValues *values;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
444 FbJsonValuesPrivate *priv;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
445
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
446 g_return_val_if_fail(root != NULL, NULL);
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
447
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
448 values = g_object_new(FB_TYPE_JSON_VALUES, NULL);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
449 priv = values->priv;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
450 priv->root = root;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
451
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
452 return values;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
453 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
454
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
455 void
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
456 fb_json_values_add(FbJsonValues *values, FbJsonType type, gboolean required,
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
457 const gchar *expr)
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
458 {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
459 FbJsonValue *value;
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
460 FbJsonValuesPrivate *priv;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
461
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
462 g_return_if_fail(values != NULL);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
463 g_return_if_fail(expr != NULL);
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
464 priv = values->priv;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
465
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
466 value = g_new0(FbJsonValue, 1);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
467 value->expr = expr;
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
468 value->type = type;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
469 value->required = required;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
470
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
471 g_queue_push_tail(priv->queue, value);
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
472 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
473
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
474 JsonNode *
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
475 fb_json_values_get_root(FbJsonValues *values)
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
476 {
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
477 FbJsonValuesPrivate *priv;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
478 guint index;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
479
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
480 g_return_val_if_fail(values != NULL, NULL);
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
481 priv = values->priv;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
482
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
483 if (priv->array == NULL) {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
484 return priv->root;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
485 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
486
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
487 g_return_val_if_fail(priv->index > 0, NULL);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
488 index = priv->index - 1;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
489
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
490 if (json_array_get_length(priv->array) <= index) {
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
491 return NULL;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
492 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
493
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
494 return json_array_get_element(priv->array, index);
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
495 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
496
37334
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
497 void
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
498 fb_json_values_set_array(FbJsonValues *values, gboolean required,
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
499 const gchar *expr)
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
500 {
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
501 FbJsonValuesPrivate *priv;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
502
37334
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
503 g_return_if_fail(values != NULL);
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
504 priv = values->priv;
37334
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
505
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
506 priv->array = fb_json_node_get_arr(priv->root, expr, &priv->error);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
507 priv->isarray = TRUE;
37334
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
508
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
509 if ((priv->error != NULL) && !required) {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
510 g_clear_error(&priv->error);
37334
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
511 }
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
512 }
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
513
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
514 gboolean
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
515 fb_json_values_update(FbJsonValues *values, GError **error)
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
516 {
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
517 FbJsonValue *value;
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
518 FbJsonValuesPrivate *priv;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
519 GError *err = NULL;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
520 GList *l;
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
521 GType type;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
522 JsonNode *root;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
523 JsonNode *node;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
524
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
525 g_return_val_if_fail(values != NULL, FALSE);
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
526 priv = values->priv;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
527
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
528 if (G_UNLIKELY(priv->error != NULL)) {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
529 g_propagate_error(error, priv->error);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
530 priv->error = NULL;
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
531 return FALSE;
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
532 }
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
533
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
534 if (priv->isarray) {
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
535 if ((priv->array == NULL) ||
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
536 (json_array_get_length(priv->array) <= priv->index))
37334
860ee76f5f58 facebook: fixed all JSON arrays being required
James Geboski <jgeboski@gmail.com>
parents: 37321
diff changeset
537 {
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
538 return FALSE;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
539 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
540
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
541 root = json_array_get_element(priv->array, priv->index++);
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
542 } else {
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
543 root = priv->root;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
544 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
545
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
546 g_return_val_if_fail(root != NULL, FALSE);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
547
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
548 for (l = priv->queue->head; l != NULL; l = l->next) {
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
549 value = l->data;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
550 node = fb_json_node_get(root, value->expr, &err);
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
551
37315
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
552 if (G_IS_VALUE(&value->value)) {
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
553 g_value_unset(&value->value);
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
554 }
7a7771557143 facebook: implemented handling of message attachments
James Geboski <jgeboski@gmail.com>
parents: 37314
diff changeset
555
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
556 if (err != NULL) {
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
557 json_node_free(node);
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
558
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
559 if (value->required) {
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
560 g_propagate_error(error, err);
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
561 return FALSE;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
562 }
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
563
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
564 g_clear_error(&err);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
565 continue;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
566 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
567
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
568 type = json_node_get_value_type(node);
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
569
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
570 if (G_UNLIKELY(type != value->type)) {
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
571 g_set_error(error, FB_JSON_ERROR, FB_JSON_ERROR_TYPE,
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
572 _("Expected a %s but got a %s for %s"),
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
573 g_type_name(value->type),
37320
a21c8ba4d0e9 facebook: fixed the printing of invalid JSON type names
James Geboski <jgeboski@gmail.com>
parents: 37316
diff changeset
574 g_type_name(type),
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
575 value->expr);
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
576 json_node_free(node);
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
577 return FALSE;
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
578 }
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
579
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
580 json_node_get_value(node, &value->value);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
581 json_node_free(node);
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
582 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
583
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
584 priv->next = priv->queue->head;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
585 return TRUE;
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
586 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
587
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
588 const GValue *
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
589 fb_json_values_next(FbJsonValues *values)
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
590 {
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
591 FbJsonValue *value;
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
592 FbJsonValuesPrivate *priv;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
593
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
594 g_return_val_if_fail(values != NULL, NULL);
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
595 priv = values->priv;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
596
37363
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
597 g_return_val_if_fail(priv->next != NULL, NULL);
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
598 value = priv->next->data;
7201f07fe8f7 facebook: gobjectified the FbJsonValues interface
James Geboski <jgeboski@gmail.com>
parents: 37334
diff changeset
599 priv->next = priv->next->next;
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
600
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
601 if (!G_IS_VALUE(&value->value)) {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
602 return NULL;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
603 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
604
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
605 return &value->value;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
606 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
607
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
608 gboolean
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
609 fb_json_values_next_bool(FbJsonValues *values, gboolean defval)
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
610 {
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
611 const GValue *value;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
612
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
613 value = fb_json_values_next(values);
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
614
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
615 if (G_UNLIKELY(value == NULL)) {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
616 return defval;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
617 }
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
618
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
619 return g_value_get_boolean(value);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
620 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
621
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
622 gdouble
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
623 fb_json_values_next_dbl(FbJsonValues *values, gdouble defval)
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
624 {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
625 const GValue *value;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
626
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
627 value = fb_json_values_next(values);
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
628
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
629 if (G_UNLIKELY(value == NULL)) {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
630 return defval;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
631 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
632
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
633 return g_value_get_double(value);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
634 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
635
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
636 gint64
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
637 fb_json_values_next_int(FbJsonValues *values, gint64 defval)
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
638 {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
639 const GValue *value;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
640
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
641 value = fb_json_values_next(values);
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
642
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
643 if (G_UNLIKELY(value == NULL)) {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
644 return defval;
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
645 }
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
646
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
647 return g_value_get_int64(value);
37250
3f5570a17b15 facebook: initial import of bitlbee-facebook
James Geboski <jgeboski@gmail.com>
parents:
diff changeset
648 }
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
649
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
650 const gchar *
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
651 fb_json_values_next_str(FbJsonValues *values, const gchar *defval)
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
652 {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
653 const GValue *value;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
654
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
655 value = fb_json_values_next(values);
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
656
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
657 if (G_UNLIKELY(value == NULL)) {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
658 return defval;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
659 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
660
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
661 return g_value_get_string(value);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
662 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
663
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
664 gchar *
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
665 fb_json_values_next_str_dup(FbJsonValues *values, const gchar *defval)
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
666 {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
667 const GValue *value;
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
668
37316
9e3520d6ec49 facebook: refactored and improved JSON error handling
James Geboski <jgeboski@gmail.com>
parents: 37315
diff changeset
669 value = fb_json_values_next(values);
37314
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
670
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
671 if (G_UNLIKELY(value == NULL)) {
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
672 return g_strdup(defval);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
673 }
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
674
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
675 return g_value_dup_string(value);
1fedb5e19577 facebook: refactored the parsing of JSON values
James Geboski <jgeboski@gmail.com>
parents: 37299
diff changeset
676 }

mercurial