1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
/* json-gobject.c - JSON GObject integration
*
* This file is part of JSON-GLib
* Copyright (C) 2007 OpenedHand Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* Author:
* Emmanuele Bassi <ebassi@openedhand.com>
*/
/**
* SECTION:json-serializable
* @short_description: Interface for serialize and deserialize special GObjects
*
* FIXME
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <string.h>
#include <stdlib.h>
#include "json-types-private.h"
#include "json-gobject-private.h"
/**
* json_serializable_serialize_property:
* @serializable: a #JsonSerializable object
* @property_name: the name of the property
* @value: the value of the property
* @pspec: a #GParamSpec
*
* Asks a #JsonSerializable implementation to serialize a #GObject
* property into a #JsonNode object.
*
* Return value: a #JsonNode containing the serialized property
*/
JsonNode *
json_serializable_serialize_property (JsonSerializable *serializable,
const gchar *property_name,
const GValue *value,
GParamSpec *pspec)
{
JsonSerializableIface *iface;
g_return_val_if_fail (JSON_IS_SERIALIZABLE (serializable), NULL);
g_return_val_if_fail (property_name != NULL, NULL);
g_return_val_if_fail (value != NULL, NULL);
g_return_val_if_fail (pspec != NULL, NULL);
iface = JSON_SERIALIZABLE_GET_IFACE (serializable);
return iface->serialize_property (serializable, property_name, value, pspec);
}
/**
* json_serializable_deserialize_property:
* @serializable: a #JsonSerializable
* @property_name: the name of the property
* @value: a pointer to an uninitialized #GValue
* @pspec: a #GParamSpec
* @property_node: a #JsonNode containing the serialized property
*
* Asks a #JsonSerializable implementation to deserialize the
* property contained inside @property_node into @value.
*
* Return value: %TRUE if the property was successfully deserialized.
*/
gboolean
json_serializable_deserialize_property (JsonSerializable *serializable,
const gchar *property_name,
GValue *value,
GParamSpec *pspec,
JsonNode *property_node)
{
JsonSerializableIface *iface;
g_return_val_if_fail (JSON_IS_SERIALIZABLE (serializable), FALSE);
g_return_val_if_fail (property_name != NULL, FALSE);
g_return_val_if_fail (value != NULL, FALSE);
g_return_val_if_fail (pspec != NULL, FALSE);
g_return_val_if_fail (property_node != NULL, FALSE);
iface = JSON_SERIALIZABLE_GET_IFACE (serializable);
return iface->deserialize_property (serializable,
property_name,
value,
pspec,
property_node);
}
static gboolean
json_serializable_real_deserialize (JsonSerializable *serializable,
const gchar *name,
GValue *value,
GParamSpec *pspec,
JsonNode *node)
{
return json_deserialize_pspec (value, pspec, node);
}
static JsonNode *
json_serializable_real_serialize (JsonSerializable *serializable,
const gchar *name,
const GValue *value,
GParamSpec *pspec)
{
return json_serialize_pspec (value, pspec);
}
static void
json_serializable_base_init (gpointer g_class,
gpointer data)
{
static gboolean is_initialized = FALSE;
if (G_UNLIKELY (!is_initialized))
{
JsonSerializableIface *iface = g_class;
iface->serialize_property = json_serializable_real_serialize;
iface->deserialize_property = json_serializable_real_deserialize;
is_initialized = TRUE;
}
}
GType
json_serializable_get_type (void)
{
static GType iface_type = 0;
if (!iface_type)
iface_type =
g_type_register_static_simple (G_TYPE_INTERFACE,
g_intern_static_string ("JsonSerializable"),
sizeof (JsonSerializableIface),
json_serializable_base_init,
0, NULL, 0);
return iface_type;
}
|