38
36
// static guint object_signals[LAST_SIGNAL] = { 0 };
40
38
/* functions prototype */
41
static void ibus_serializable_base_init (IBusSerializableClass *klass);
42
static void ibus_serializable_base_fini (IBusSerializableClass *klass);
43
static void ibus_serializable_class_init (IBusSerializableClass *klass);
39
static void ibus_serializable_base_init (IBusSerializableClass *class);
40
static void ibus_serializable_base_fini (IBusSerializableClass *class);
41
static void ibus_serializable_class_init (IBusSerializableClass *class);
44
42
static void ibus_serializable_init (IBusSerializable *object);
45
43
static void ibus_serializable_destroy (IBusSerializable *object);
46
44
static gboolean ibus_serializable_real_serialize (IBusSerializable *object,
47
IBusMessageIter *iter);
48
static gboolean ibus_serializable_real_deserialize (IBusSerializable *object,
49
IBusMessageIter *iter);
45
GVariantBuilder *builder);
46
static gint ibus_serializable_real_deserialize (IBusSerializable *object,
50
48
static gboolean ibus_serializable_real_copy (IBusSerializable *dest,
51
49
const IBusSerializable *src);
89
ibus_serializable_base_init (IBusSerializableClass *klass)
92
klass->signature = g_string_new ("a{sv}");
96
ibus_serializable_base_fini (IBusSerializableClass *klass)
99
g_string_free (klass->signature, TRUE);
100
klass->signature = NULL;
104
ibus_serializable_class_init (IBusSerializableClass *klass)
106
IBusObjectClass *object_class = IBUS_OBJECT_CLASS (klass);
108
parent_class = (IBusObjectClass *) g_type_class_peek_parent (klass);
110
g_type_class_add_private (klass, sizeof (IBusSerializablePrivate));
87
ibus_serializable_base_init (IBusSerializableClass *class)
92
ibus_serializable_base_fini (IBusSerializableClass *class)
97
ibus_serializable_class_init (IBusSerializableClass *class)
99
IBusObjectClass *object_class = IBUS_OBJECT_CLASS (class);
101
parent_class = (IBusObjectClass *) g_type_class_peek_parent (class);
103
g_type_class_add_private (class, sizeof (IBusSerializablePrivate));
112
105
object_class->destroy = (IBusObjectDestroyFunc) ibus_serializable_destroy;
114
klass->serialize = ibus_serializable_real_serialize;
115
klass->deserialize = ibus_serializable_real_deserialize;
116
klass->copy = ibus_serializable_real_copy;
120
ibus_serializable_init (IBusSerializable *object)
122
IBusSerializablePrivate *priv;
123
priv = IBUS_SERIALIZABLE_GET_PRIVATE (object);
125
priv->attachments = NULL;
126
g_datalist_init (&priv->attachments);
130
ibus_serializable_destroy (IBusSerializable *object)
132
IBusSerializablePrivate *priv;
133
priv = IBUS_SERIALIZABLE_GET_PRIVATE (object);
135
g_datalist_clear (&priv->attachments);
137
parent_class->destroy (IBUS_OBJECT (object));
107
class->serialize = ibus_serializable_real_serialize;
108
class->deserialize = ibus_serializable_real_deserialize;
109
class->copy = ibus_serializable_real_copy;
113
ibus_serializable_init (IBusSerializable *serializable)
115
serializable->priv = IBUS_SERIALIZABLE_GET_PRIVATE (serializable);
116
serializable->priv->attachments = NULL;
117
g_datalist_init (&serializable->priv->attachments);
121
ibus_serializable_destroy (IBusSerializable *serializable)
123
g_datalist_clear (&serializable->priv->attachments);
124
parent_class->destroy (IBUS_OBJECT (serializable));
156
143
g_slice_free (GValue, value);
160
_g_value_serialize (GValue *value,
161
IBusMessageIter *iter)
147
_g_value_serialize (GValue *value)
166
151
type = G_VALUE_TYPE (value);
167
152
g_return_val_if_fail (type != G_TYPE_INVALID, FALSE);
170
154
if (g_type_is_a (type, IBUS_TYPE_SERIALIZABLE)) {
171
155
IBusSerializable *object;
172
156
object = IBUS_SERIALIZABLE (g_value_get_object (value));
173
retval = ibus_message_iter_append (iter,
176
g_return_val_if_fail (retval, FALSE);
157
return ibus_serializable_serialize (object);
180
160
typedef const gchar *gstring;
182
#define CASE_ENTRY(TYPE, _type, signature) \
183
case G_TYPE_##TYPE: \
186
IBusMessageIter variant_iter; \
188
retval = ibus_message_iter_open_container (iter, \
192
g_return_val_if_fail (retval, FALSE); \
194
v = g_value_get_##_type (value); \
195
retval = ibus_message_iter_append (&variant_iter, \
198
g_return_val_if_fail (retval, FALSE); \
200
retval = ibus_message_iter_close_container (iter, &variant_iter); \
201
g_return_val_if_fail (retval, FALSE); \
162
#define CASE_ENTRY(TYPE, _type, signature) \
163
case G_TYPE_##TYPE: \
166
v = g_value_get_##_type (value); \
167
return g_variant_new ("v", g_variant_new (signature, v)); \
205
169
CASE_ENTRY(CHAR, char, "y");
206
170
CASE_ENTRY(BOOLEAN, boolean, "b");
214
178
#undef CASE_ENTRY
217
g_return_val_if_reached (FALSE);
181
g_assert_not_reached ();
221
_g_value_deserialize (IBusMessageIter *iter)
185
_g_value_deserialize (GVariant *variant)
223
IBusMessageIter variant_iter;
225
187
GValue *value = NULL;
228
retval = ibus_message_iter_recurse (iter, IBUS_TYPE_VARIANT, &variant_iter);
229
g_return_val_if_fail (retval, NULL);
231
type = ibus_message_iter_get_arg_type (&variant_iter);
233
if (type == IBUS_TYPE_STRUCT) {
188
const GVariantType *type;
190
type = g_variant_get_type (variant);
191
if (type == G_VARIANT_TYPE_TUPLE) {
234
192
IBusSerializable *object;
235
retval = ibus_message_iter_get (iter, IBUS_TYPE_SERIALIZABLE, &object);
236
g_return_val_if_fail (retval, NULL);
237
ibus_message_iter_next (iter);
193
object = ibus_serializable_deserialize (variant);
239
194
value = g_slice_new0 (GValue);
240
195
g_value_init (value, G_OBJECT_TYPE (object));
241
196
g_value_take_object (value, object);
245
200
typedef gchar *gstring;
247
#define CASE_ENTRY(TYPE, _type) \
248
case G_TYPE_##TYPE: \
251
ibus_message_iter_get_basic (&variant_iter, &v); \
252
ibus_message_iter_next (&variant_iter); \
253
value = g_slice_new0 (GValue); \
254
g_value_init (value, G_TYPE_##TYPE); \
255
g_value_set_##_type (value, v); \
256
ibus_message_iter_next (iter); \
259
CASE_ENTRY(CHAR, char);
260
CASE_ENTRY(BOOLEAN, boolean);
261
CASE_ENTRY(INT, int);
262
CASE_ENTRY(UINT, uint);
263
CASE_ENTRY(INT64, int64);
264
CASE_ENTRY(UINT64, uint64);
265
CASE_ENTRY(FLOAT, float);
266
CASE_ENTRY(DOUBLE, double);
267
CASE_ENTRY(STRING, string);
201
#define IF_ENTRY(TYPE, _type, signature) \
202
if (type == G_VARIANT_TYPE_##TYPE) { \
204
g_variant_get (variant, signature, &v); \
205
value = g_slice_new0 (GValue); \
206
g_value_init (value, G_TYPE_##TYPE); \
207
g_value_set_##_type (value, v); \
210
#define G_VARIANT_TYPE_CHAR G_VARIANT_TYPE_BYTE
211
IF_ENTRY(CHAR, char, "y");
212
#undef G_VARIANT_TYPE_CHAR
213
IF_ENTRY(BOOLEAN, boolean, "b");
214
#define G_VARIANT_TYPE_INT G_VARIANT_TYPE_INT32
215
#define G_VARIANT_TYPE_UINT G_VARIANT_TYPE_UINT32
216
IF_ENTRY(INT, int, "i");
217
IF_ENTRY(UINT, uint, "u");
218
#undef G_VARIANT_TYPE_INT
219
#undef G_VARIANT_TYPE_UINT
220
IF_ENTRY(INT64, int64, "x");
221
IF_ENTRY(UINT64, uint64, "t");
222
IF_ENTRY(DOUBLE, double, "d");
223
IF_ENTRY(STRING, string, "s");
269
225
g_return_val_if_reached (NULL);
273
229
_serialize_cb (GQuark key,
275
IBusMessageIter *iter)
231
GVariantBuilder *array)
277
IBusMessageIter dict_entry;
281
retval = ibus_message_iter_open_container (iter,
282
IBUS_TYPE_DICT_ENTRY,
285
g_return_if_fail (retval);
286
name = g_quark_to_string (key);
287
retval = ibus_message_iter_append (&dict_entry,
290
g_return_if_fail (retval);
292
retval = _g_value_serialize (value, &dict_entry);
293
g_return_if_fail (retval);
295
retval = ibus_message_iter_close_container (iter, &dict_entry);
296
g_return_if_fail (retval);
233
g_variant_builder_add (array, "{sv}",
234
g_quark_to_string (key), _g_value_serialize (value));
300
ibus_serializable_real_serialize (IBusSerializable *object,
301
IBusMessageIter *iter)
238
ibus_serializable_real_serialize (IBusSerializable *serializable,
239
GVariantBuilder *builder)
303
IBusSerializablePrivate *priv;
304
IBusMessageIter array_iter;
307
priv = IBUS_SERIALIZABLE_GET_PRIVATE (object);
309
retval = ibus_message_iter_open_container (iter,
313
g_return_val_if_fail (retval, FALSE);
315
g_datalist_foreach (&priv->attachments,
241
GVariantBuilder array;
242
g_variant_builder_init (&array, G_VARIANT_TYPE ("a{sv}"));
244
g_datalist_foreach (&serializable->priv->attachments,
316
245
(GDataForeachFunc) _serialize_cb,
319
retval = ibus_message_iter_close_container (iter, &array_iter);
320
g_return_val_if_fail (retval, FALSE);
247
g_variant_builder_add (builder, "a{sv}", &array);
326
252
ibus_serializable_real_deserialize (IBusSerializable *object,
327
IBusMessageIter *iter)
329
IBusMessageIter array_iter;
332
retval = ibus_message_iter_recurse (iter,
335
g_return_val_if_fail (retval, FALSE);
337
while (ibus_message_iter_get_arg_type (&array_iter) != G_TYPE_INVALID) {
340
IBusMessageIter dict_entry;
342
retval = ibus_message_iter_recurse (&array_iter,
343
IBUS_TYPE_DICT_ENTRY,
345
g_return_val_if_fail (retval, FALSE);
347
retval = ibus_message_iter_get (&dict_entry,
350
g_return_val_if_fail (retval, FALSE);
351
ibus_message_iter_next (&dict_entry);
353
value = _g_value_deserialize (&dict_entry);
354
g_return_val_if_fail (value != NULL, FALSE);
356
ibus_serializable_set_attachment (object, name, value);
358
ibus_message_iter_next (&array_iter);
257
GVariantIter *iter = NULL;
258
g_variant_get_child (variant, 1, "a{sv}", &iter);
259
while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) {
260
ibus_serializable_set_attachment (object, key, _g_value_deserialize (value));
361
ibus_message_iter_next (iter);
262
g_variant_iter_free (iter);
436
ibus_serializable_get_qattachment (IBusSerializable *object,
336
ibus_serializable_get_qattachment (IBusSerializable *serializable,
440
g_return_val_if_fail (IBUS_IS_SERIALIZABLE (object), NULL);
340
g_return_val_if_fail (IBUS_IS_SERIALIZABLE (serializable), NULL);
441
341
g_return_val_if_fail (key != 0, NULL);
443
IBusSerializablePrivate *priv;
444
priv = IBUS_SERIALIZABLE_GET_PRIVATE (object);
446
return (const GValue *) g_datalist_id_get_data (&priv->attachments, key);
343
return (const GValue *) g_datalist_id_get_data (&serializable->priv->attachments, key);
450
ibus_serializable_remove_qattachment (IBusSerializable *object,
347
ibus_serializable_remove_qattachment (IBusSerializable *serializable,
454
g_return_if_fail (IBUS_IS_SERIALIZABLE (object));
351
g_return_if_fail (IBUS_IS_SERIALIZABLE (serializable));
455
352
g_return_if_fail (key != 0);
457
IBusSerializablePrivate *priv;
458
priv = IBUS_SERIALIZABLE_GET_PRIVATE (object);
460
g_datalist_id_remove_no_notify (&priv->attachments, key);
354
g_datalist_id_remove_no_notify (&serializable->priv->attachments, key);
463
357
IBusSerializable *
481
375
g_return_val_if_reached (NULL);
485
ibus_serializable_serialize (IBusSerializable *object,
486
IBusMessageIter *iter)
379
ibus_serializable_serialize (IBusSerializable *object)
488
381
g_return_val_if_fail (IBUS_IS_SERIALIZABLE (object), FALSE);
489
g_return_val_if_fail (iter != NULL, FALSE);
491
IBusMessageIter variant_iter;
492
IBusMessageIter sub_iter;
497
signature = g_strdup_printf ("(s%s)", IBUS_SERIALIZABLE_GET_CLASS (object)->signature->str);
498
retval = ibus_message_iter_open_container (iter,
503
g_return_val_if_fail (retval, FALSE);
505
retval = ibus_message_iter_open_container (&variant_iter,
509
g_return_val_if_fail (retval, FALSE);
511
const gchar *type_name = g_type_name (G_OBJECT_TYPE (object));
512
g_return_val_if_fail (type_name != NULL, FALSE);
514
retval = ibus_message_iter_append (&sub_iter,
517
g_return_val_if_fail (retval, FALSE);
519
retval = IBUS_SERIALIZABLE_GET_CLASS (object)->serialize (object, &sub_iter);
520
g_return_val_if_fail (retval, FALSE);
522
retval = ibus_message_iter_close_container (&variant_iter, &sub_iter);
523
g_return_val_if_fail (retval, FALSE);
525
retval = ibus_message_iter_close_container (iter, &variant_iter);
526
g_return_val_if_fail (retval, FALSE);
384
GVariantBuilder builder;
385
g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
387
g_variant_builder_add (&builder, "s", g_type_name (G_OBJECT_TYPE (object)));
388
retval = IBUS_SERIALIZABLE_GET_CLASS (object)->serialize (object, &builder);
391
return g_variant_builder_end (&builder);
531
394
IBusSerializable *
532
ibus_serializable_deserialize (IBusMessageIter *iter)
395
ibus_serializable_deserialize (GVariant *variant)
534
g_return_val_if_fail (iter != NULL, NULL);
537
IBusMessageIter variant_iter;
538
IBusMessageIter sub_iter;
541
IBusSerializable *object;
543
type = ibus_message_iter_get_arg_type (iter);
545
if (type == IBUS_TYPE_VARIANT) {
546
retval = ibus_message_iter_recurse (iter, IBUS_TYPE_VARIANT, &variant_iter);
547
g_return_val_if_fail (retval, NULL);
549
retval = ibus_message_iter_recurse (&variant_iter, IBUS_TYPE_STRUCT, &sub_iter);
550
g_return_val_if_fail (retval, NULL);
552
else if (type == IBUS_TYPE_STRUCT) {
553
retval = ibus_message_iter_recurse (iter, IBUS_TYPE_STRUCT, &sub_iter);
554
g_return_val_if_fail (retval, NULL);
397
g_return_val_if_fail (variant != NULL, NULL);
399
GVariant *var = NULL;
400
switch (g_variant_classify (variant)) {
401
case G_VARIANT_CLASS_VARIANT:
402
var = g_variant_get_variant (variant);
404
case G_VARIANT_CLASS_TUPLE:
405
var = g_variant_ref (variant);
557
408
g_return_val_if_reached (NULL);
559
retval = ibus_message_iter_get (&sub_iter, G_TYPE_STRING, &type_name);
560
g_return_val_if_fail (retval, NULL);
561
ibus_message_iter_next (&sub_iter);
563
type = g_type_from_name (type_name);
411
gchar *type_name = NULL;
412
g_variant_get_child (var, 0, "&s", &type_name);
413
GType type = g_type_from_name (type_name);
565
415
g_return_val_if_fail (g_type_is_a (type, IBUS_TYPE_SERIALIZABLE), NULL);
567
object = g_object_new (type, NULL);
417
IBusSerializable *object = g_object_new (type, NULL);
569
retval = IBUS_SERIALIZABLE_GET_CLASS (object)->deserialize (object, &sub_iter);
419
gint retval = IBUS_SERIALIZABLE_GET_CLASS (object)->deserialize (object, var);
420
g_variant_unref (var);