diff --git a/README.markdown b/README.markdown index 6dbdd0d..03553f2 100644 --- a/README.markdown +++ b/README.markdown @@ -295,6 +295,7 @@ Dependency The following packages are required to build libsearpc: -* glib-2.0 >= 2.16.0 -* gobject-2.0 >= 2.16.0 +* glib-2.0 >= 2.26.0 +* gobject-2.0 >= 2.26.0 +* jansson >= 2.2.1 * python simplejson (for pysearpc) diff --git a/configure.ac b/configure.ac index 97c6663..ae04cf9 100644 --- a/configure.ac +++ b/configure.ac @@ -70,14 +70,14 @@ AC_SUBST(MACOS) # Checks for libraries. -GLIB_REQUIRED=2.31.0 +GLIB_REQUIRED=2.26.0 # check and subst gobject PKG_CHECK_MODULES(GLIB, [gobject-2.0 >= $GLIB_REQUIRED]) AC_SUBST(GLIB_CFLAGS) AC_SUBST(GLIB_LIBS) -JANSSON_REQUIRED=2.4 +JANSSON_REQUIRED=2.2.1 PKG_CHECK_MODULES(JANSSON, [jansson >= $JANSSON_REQUIRED]) AC_SUBST(JANSSON_CFLAGS) diff --git a/demo/searpc-demo-client.c b/demo/searpc-demo-client.c index 7f07f48..5b76a7e 100644 --- a/demo/searpc-demo-client.c +++ b/demo/searpc-demo-client.c @@ -60,6 +60,7 @@ static char *transport_callback(void *arg, const char *fcall_str, return g_strndup(pac_ret->data, *ret_len); } +/*The function is copied from searpc-server.c for convience*/ void searpc_set_objlist_to_ret_object (json_t *object, GList *ret) { @@ -131,15 +132,18 @@ main(int argc, char *argv[]) } else printf("the length of string 'hello searpc' is %d.\n", ret);*/ - GList *ans=searpc_client_call__objlist(rpc_client, "searpc_glisttest", TEST_OBJECT_TYPE, &error, - 3, "int", 12, "int", 4, "string", "Hehehe!"); + GList *ans=searpc_client_call__objlist(rpc_client, "searpc_objlisttest", + TEST_OBJECT_TYPE, &error, + 3, "int", 4, "int", 10, "string", "A rpc test."); + json_t *object=json_object(); - searpc_set_objlist_to_ret_object(object,ans); + searpc_set_objlist_to_ret_object (object,ans); + if (error != NULL) { fprintf(stderr, "error: %s\n", error->message); exit(-1); - } else - printf("%s\n",json_dumps(object,JSON_INDENT(2))); + } + else printf("%s\n", json_dumps (object, JSON_INDENT(2))); json_decref(object); close(sockfd); diff --git a/demo/searpc-demo-server.c b/demo/searpc-demo-server.c index 9b1836e..3ce3dab 100644 --- a/demo/searpc-demo-server.c +++ b/demo/searpc-demo-server.c @@ -34,18 +34,18 @@ searpc_strlen(const char *str) } static GList * -searpc_glisttest(int a, int c, const char *str) +searpc_objlisttest(int count, int len, const char *str) { GList *ret=NULL; int i; - for (i=0; i!=c; ++i) + for (i=0; i!=count; ++i) { TestObject *obj=g_object_new (TEST_OBJECT_TYPE, NULL); - obj->a=a; - obj->c=strlen(str); - g_free(obj->str); - obj->str=g_strdup(str); - obj->boo=TRUE; + obj->len = strlen(str); + g_free (obj->str); + obj->str = g_strdup(str); + if (len == obj->len) + obj->equal = TRUE; ret = g_list_prepend (ret, obj); } return ret; @@ -70,8 +70,8 @@ start_rpc_service(void) "searpc_strlen", searpc_signature_int__string()); searpc_server_register_function("searpc-demo", - searpc_glisttest, - "searpc_glisttest", + searpc_objlisttest, + "searpc_objlisttest", searpc_signature_objlist__int_int_string()); } @@ -148,7 +148,6 @@ main(int argc, char *argv[]) /* Execute the RPC function */ char *res = searpc_server_call_function ("searpc-demo", pac->data, fcall_len, &ret_len); - pac_ret = (packet *)buf; pac_ret->length = htons((uint16_t)ret_len); memcpy(pac_ret->data, res, ret_len); diff --git a/demo/test-object.c b/demo/test-object.c index 5673b24..2cc12b9 100644 --- a/demo/test-object.c +++ b/demo/test-object.c @@ -1,108 +1,84 @@ #include "test-object.h" -G_DEFINE_TYPE(TestObject, test_object, G_TYPE_OBJECT); +G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT); enum { - PROP_0, - PROP_INT_A, - PROP_INT_B, - PROP_INT_C, - PROP_STR, - PROP_BOOL, - N_PROPERTIES + PROP_0, + PROP_LEN, + PROP_STR, + PROP_EQU, + N_PROPERTIES }; static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; static void test_object_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { - TestObject *self = TEST_OBJECT (object); - switch (property_id) - { - case PROP_INT_A: - self->a = g_value_get_int(value); - break; - case PROP_INT_B: - self->b = g_value_get_int64(value); - break; - case PROP_INT_C: - self->c = g_value_get_uint(value); - break; - case PROP_STR: - g_free (self->str); - self->str = g_value_dup_string (value); - break; - case PROP_BOOL: - self->boo = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } + TestObject *self = TEST_OBJECT (object); + switch (property_id) { + case PROP_LEN: + self->len = g_value_get_int (value); + break; + case PROP_STR: + g_free (self->str); + self->str = g_value_dup_string (value); + break; + case PROP_EQU: + self->equal = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } } static void test_object_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { - TestObject *self = TEST_OBJECT (object); - switch (property_id) - { - case PROP_INT_A: - g_value_set_int(value, self->a); - break; - case PROP_INT_B: - g_value_set_int64(value, self->b); - break; - case PROP_INT_C: - g_value_set_uint(value, self->c); - break; - case PROP_STR: - g_value_set_string (value, self->str); - break; - case PROP_BOOL: - g_value_set_boolean (value, self->boo); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } + TestObject *self = TEST_OBJECT (object); + switch (property_id) { + case PROP_LEN: + g_value_set_int (value, self->len); + break; + case PROP_STR: + g_value_set_string (value, self->str); + break; + case PROP_EQU: + g_value_set_boolean (value, self->equal); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } } static void test_object_dispose (GObject *object) { - g_printf("Instance disposed!\n"); - G_OBJECT_CLASS (test_object_parent_class)->dispose(object); + G_OBJECT_CLASS (test_object_parent_class)->dispose(object); } static void test_object_finalize (GObject *object) { - g_printf("Instance finalized!\n"); - TestObject *self = TEST_OBJECT (object); - g_free(self->str); - G_OBJECT_CLASS (test_object_parent_class)->finalize(object); + TestObject *self = TEST_OBJECT (object); + g_free(self->str); + G_OBJECT_CLASS (test_object_parent_class)->finalize(object); } static void test_object_class_init(TestObjectClass *klass) { - g_printf("Class inited!\n"); - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->set_property = test_object_set_property; - gobject_class->get_property = test_object_get_property; - gobject_class->dispose = test_object_dispose; - gobject_class->finalize = test_object_finalize; + gobject_class->set_property = test_object_set_property; + gobject_class->get_property = test_object_get_property; + gobject_class->dispose = test_object_dispose; + gobject_class->finalize = test_object_finalize; - obj_properties[PROP_INT_A]=g_param_spec_int ("a","","",-200,1000,0,G_PARAM_READWRITE); - obj_properties[PROP_INT_B]=g_param_spec_int64 ("b","","",0,10000000000,6000000000, G_PARAM_READWRITE); - obj_properties[PROP_INT_C]=g_param_spec_uint ("c","","",0,100,60, G_PARAM_READWRITE); - obj_properties[PROP_STR]=g_param_spec_string ("str","","","Hello world!", G_PARAM_READWRITE); - obj_properties[PROP_BOOL]=g_param_spec_boolean ("boo","","",FALSE,G_PARAM_READWRITE); - g_object_class_install_properties (gobject_class,N_PROPERTIES,obj_properties); + obj_properties[PROP_LEN] = g_param_spec_int ("len", "", "", -1, 256, 0, G_PARAM_READWRITE); + obj_properties[PROP_STR] = g_param_spec_string ("str", "", "", "Hello world!", G_PARAM_READWRITE); + obj_properties[PROP_EQU] = g_param_spec_boolean ("equal", "", "", FALSE, G_PARAM_READWRITE); + g_object_class_install_properties (gobject_class, N_PROPERTIES, obj_properties); } static void test_object_init(TestObject *self) { - g_printf("Instance inited!\n"); - self->a=0; - self->b=6000000000; - self->c=60; - self->str=g_strdup("Hello world!"); - self->boo=FALSE; + self->len = 0; + self->str = g_strdup("Hello world!"); + self->equal = FALSE; } diff --git a/demo/test-object.h b/demo/test-object.h index f897b79..f3f7589 100644 --- a/demo/test-object.h +++ b/demo/test-object.h @@ -15,16 +15,14 @@ typedef struct _TestObject TestObject; typedef struct _TestObjectClass TestObjectClass; struct _TestObject { - GObject parent; - gint a; - gint64 b; - guint c; - gchar * str; - gboolean boo; + GObject parent; + int len; + gchar *str; + gboolean equal; }; struct _TestObjectClass { - GObjectClass parent_class; + GObjectClass parent_class; }; #endif diff --git a/lib/searpc-client.c b/lib/searpc-client.c index 2ab0581..abebec8 100644 --- a/lib/searpc-client.c +++ b/lib/searpc-client.c @@ -70,11 +70,10 @@ fcall_to_str (const char *fname, int n_params, va_list args, gsize *len) for (; i < n_params; i++) { const char *type = va_arg(args, const char *); void *value = va_arg(args, void *); - printf("%s\n",type); if (strcmp(type, "int") == 0) - json_array_append_new(array, json_integer((int)value)); + json_array_append_new (array, json_integer ((int)value)); else if (strcmp(type, "int64") == 0) - json_array_append_new (array, json_integer(*((gint64 *)value))); + json_array_append_new (array, json_integer (*((gint64 *)value))); else if (strcmp(type, "string") == 0) json_array_add_string_or_null_element (array, (char *)value); else { @@ -278,6 +277,7 @@ searpc_client_call__objlist (SearpcClient *client, const char *fname, va_start (args, n_params); fstr = fcall_to_str (fname, n_params, args, &len); va_end (args); + if (!fstr) { g_set_error (error, DFT_DOMAIN, 0, "Invalid Parameter"); return NULL; @@ -617,6 +617,5 @@ searpc_client_fret__objlist (GType gtype, char *data, size_t len, GError **error json_decref(object); return g_list_reverse(ret); } - return NULL; } diff --git a/lib/searpc-server.c b/lib/searpc-server.c index 9903dd8..4cf9b70 100644 --- a/lib/searpc-server.c +++ b/lib/searpc-server.c @@ -149,7 +149,6 @@ searpc_marshal_set_ret_common (json_t *object, int *len, GError *error) *len=strlen(data); json_decref(object); - printf("%s\n",data); return data; } diff --git a/lib/searpc-utils.c b/lib/searpc-utils.c index db130e7..080fb57 100644 --- a/lib/searpc-utils.c +++ b/lib/searpc-utils.c @@ -4,179 +4,170 @@ #include "searpc-utils.h" -json_t *json_serialize_pspec (const GValue *value) +static json_t *json_serialize_pspec (const GValue *value) { - /* Only types in json-glib but G_TYPE_BOXED */ - switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value))) - { - case G_TYPE_STRING: - if (!g_value_get_string (value)) - break; - else - return json_string(g_value_get_string(value)); - case G_TYPE_BOOLEAN: - return json_boolean(g_value_get_boolean(value)); - case G_TYPE_INT: - return json_integer(g_value_get_int(value)); - case G_TYPE_UINT: - return json_integer(g_value_get_uint(value)); - case G_TYPE_LONG: - return json_integer(g_value_get_long(value)); - case G_TYPE_ULONG: - return json_integer(g_value_get_ulong(value)); - case G_TYPE_INT64: - return json_integer(g_value_get_int64(value)); - case G_TYPE_FLOAT: - return json_real(g_value_get_float(value)); - case G_TYPE_DOUBLE: - return json_real(g_value_get_double(value)); - case G_TYPE_CHAR: - return json_integer(g_value_get_schar(value)); - case G_TYPE_UCHAR: - return json_integer(g_value_get_uchar(value)); - case G_TYPE_ENUM: - return json_integer(g_value_get_enum(value)); - case G_TYPE_FLAGS: - return json_integer(g_value_get_flags(value)); - case G_TYPE_NONE: - break; - case G_TYPE_OBJECT: - { - GObject *object = g_value_get_object(value); - if (object) - return json_gobject_serialize(object); - } - break; - defalut: - g_warning("Unsuppoted type `%s'",g_type_name(G_VALUE_TYPE(value))); + /* Only types in json-glib but G_TYPE_BOXED */ + switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value))) { + case G_TYPE_STRING: + if (!g_value_get_string (value)) + break; + else + return json_string (g_value_get_string (value)); + case G_TYPE_BOOLEAN: + if (g_value_get_boolean (value)) + return json_true (); + else return json_false (); + case G_TYPE_INT: + return json_integer (g_value_get_int (value)); + case G_TYPE_UINT: + return json_integer (g_value_get_uint (value)); + case G_TYPE_LONG: + return json_integer (g_value_get_long (value)); + case G_TYPE_ULONG: + return json_integer (g_value_get_ulong (value)); + case G_TYPE_INT64: + return json_integer (g_value_get_int64 (value)); + case G_TYPE_FLOAT: + return json_real (g_value_get_float (value)); + case G_TYPE_DOUBLE: + return json_real (g_value_get_double (value)); + case G_TYPE_CHAR: + return json_integer (g_value_get_schar (value)); + case G_TYPE_UCHAR: + return json_integer (g_value_get_uchar (value)); + case G_TYPE_ENUM: + return json_integer (g_value_get_enum (value)); + case G_TYPE_FLAGS: + return json_integer (g_value_get_flags (value)); + case G_TYPE_NONE: + break; + case G_TYPE_OBJECT: + { + GObject *object = g_value_get_object (value); + if (object) + return json_gobject_serialize (object); + } + break; + defalut: + g_warning("Unsuppoted type `%s'",g_type_name (G_VALUE_TYPE (value))); } - return json_null(); + return json_null(); } json_t *json_gobject_serialize (GObject *gobject) { - json_t *object = json_object(); - GParamSpec **pspecs; - guint n_pspecs, i; + json_t *object = json_object(); + GParamSpec **pspecs; + guint n_pspecs, i; - pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (gobject), &n_pspecs); + pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (gobject), &n_pspecs); - for (i=0;i!=n_pspecs;++i) - { - json_t *node; - GParamSpec *pspec = pspecs[i]; - GValue value = { 0, }; + for (i=0; i!=n_pspecs; ++i) { + json_t *node; + GParamSpec *pspec = pspecs[i]; + GValue value = { 0, }; - g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - g_object_get_property(gobject, pspec->name, &value); - node=json_serialize_pspec (&value); + g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec)); + g_object_get_property(gobject, pspec->name, &value); + node=json_serialize_pspec (&value); - if (node) - json_object_set_new (object, pspec->name, node); + if (node) + json_object_set_new (object, pspec->name, node); - g_value_unset (&value); + g_value_unset (&value); } - g_free (pspecs); + g_free (pspecs); - return object; + return object; } -gboolean json_deserialize_pspec (GValue *value, GParamSpec *pspec, json_t *node) +static gboolean json_deserialize_pspec (GValue *value, GParamSpec *pspec, json_t *node) { - switch (json_typeof(node)) - { - case JSON_OBJECT: - if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_OBJECT)) - { - GObject *object; + switch (json_typeof(node)) { + case JSON_OBJECT: + if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_OBJECT)) { + GObject *object; + object = json_gobject_deserialize (G_VALUE_TYPE (value), node); + if (object) + g_value_take_object (value, object); + else + g_value_set_object (value, NULL); - object = json_gobject_deserialize (G_VALUE_TYPE (value), node); - if (object) - g_value_take_object (value, object); - else - g_value_set_object (value, NULL); - - return TRUE; - } - break; - case JSON_STRING: - if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_STRING) - { - g_value_set_string(value, json_string_value(node)); - return TRUE; - } - break; - case JSON_INTEGER: - { - json_int_t int_value = json_integer_value (node); - switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value))) - { - case G_TYPE_CHAR: - g_value_set_schar(value, (gchar)int_value); - return TRUE; - case G_TYPE_UCHAR: - g_value_set_uchar (value, (guchar)int_value); - return TRUE; - case G_TYPE_INT: - g_value_set_int (value, (gint)int_value); - return TRUE; - case G_TYPE_UINT: - g_value_set_uint(value, (guint)int_value); - return TRUE; - case G_TYPE_LONG: - g_value_set_long(value, (glong)int_value); - return TRUE; - case G_TYPE_ULONG: - g_value_set_ulong(value, (gulong)int_value); - return TRUE; - case G_TYPE_INT64: - g_value_set_int64(value,(gint64)int_value); - return TRUE; - case G_TYPE_ENUM: - g_value_set_enum(value,(gint64)int_value); - return TRUE; - case G_TYPE_FLAGS: - g_value_set_flags(value,(gint64)int_value); - return TRUE; - } - } - break; - case JSON_REAL: - { - double real_value = json_real_value(node); - switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value))) - { - case G_TYPE_FLOAT: - g_value_set_float(value,(gfloat)real_value); - return TRUE; - case G_TYPE_DOUBLE: - g_value_set_double(value,(gdouble)real_value); - return TRUE; - } - } - break; - case JSON_TRUE: - case JSON_FALSE: - if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_BOOLEAN) - { - g_value_set_boolean(value,(gboolean)json_is_true(node)); - return TRUE; - } - break; - case JSON_NULL: - if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_STRING) - { - g_value_set_string (value, NULL); - return TRUE; - } - else if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_OBJECT) - { - g_value_set_object (value, NULL); - return TRUE; - } - } + return TRUE; + } + break; + case JSON_STRING: + if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_STRING) { + g_value_set_string(value, json_string_value(node)); + return TRUE; + } + break; + case JSON_INTEGER: + { + json_int_t int_value = json_integer_value (node); + switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value))) { + case G_TYPE_CHAR: + g_value_set_schar(value, (gchar)int_value); + return TRUE; + case G_TYPE_UCHAR: + g_value_set_uchar (value, (guchar)int_value); + return TRUE; + case G_TYPE_INT: + g_value_set_int (value, (gint)int_value); + return TRUE; + case G_TYPE_UINT: + g_value_set_uint(value, (guint)int_value); + return TRUE; + case G_TYPE_LONG: + g_value_set_long(value, (glong)int_value); + return TRUE; + case G_TYPE_ULONG: + g_value_set_ulong(value, (gulong)int_value); + return TRUE; + case G_TYPE_INT64: + g_value_set_int64(value,(gint64)int_value); + return TRUE; + case G_TYPE_ENUM: + g_value_set_enum(value,(gint64)int_value); + return TRUE; + case G_TYPE_FLAGS: + g_value_set_flags(value,(gint64)int_value); + return TRUE; + } + } + break; + case JSON_REAL: + { + double real_value = json_real_value(node); + switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value))) { + case G_TYPE_FLOAT: + g_value_set_float(value,(gfloat)real_value); + return TRUE; + case G_TYPE_DOUBLE: + g_value_set_double(value,(gdouble)real_value); + return TRUE; + } + } + break; + case JSON_TRUE: + case JSON_FALSE: + if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_BOOLEAN) { + g_value_set_boolean(value,(gboolean)json_is_true(node)); + return TRUE; + } + break; + case JSON_NULL: + if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_STRING) { + g_value_set_string (value, NULL); + return TRUE; + } + else if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_OBJECT) { + g_value_set_object (value, NULL); + return TRUE; + } + } return FALSE; @@ -184,58 +175,57 @@ gboolean json_deserialize_pspec (GValue *value, GParamSpec *pspec, json_t *node) GObject *json_gobject_deserialize (GType gtype, json_t *object) { - GObjectClass *klass; - GObject *ret; - guint n_members, i; - json_t *val; - const char *member_name; - GArray *construct_params; + GObjectClass *klass; + GObject *ret; + guint n_members, i; + json_t *head, *member; + const char *member_name; + GArray *construct_params; - klass = g_type_class_ref (gtype); - n_members = json_object_size (object); - construct_params = g_array_sized_new (FALSE, FALSE, sizeof (GParameter), n_members); + klass = g_type_class_ref (gtype); + n_members = json_object_size (object); + construct_params = g_array_sized_new (FALSE, FALSE, sizeof (GParameter), n_members); + head = json_object_iter (object); - json_object_foreach(object,member_name,val) - { - GParamSpec *pspec; - GParameter param = { NULL, }; + for (member=head; member; member=json_object_iter_next (object, member)) { + GParamSpec *pspec; + GParameter param = { NULL, }; + const char *member_name = json_object_iter_key (member); + json_t *val = json_object_iter_value(member); - pspec = g_object_class_find_property (klass, member_name); + pspec = g_object_class_find_property (klass, member_name); - if (!pspec) - continue; + if (!pspec) + continue; - if (pspec->flags & G_PARAM_CONSTRUCT_ONLY) - continue; + if (pspec->flags & G_PARAM_CONSTRUCT_ONLY) + continue; - if (!(pspec->flags & G_PARAM_WRITABLE)) - continue; + if (!(pspec->flags & G_PARAM_WRITABLE)) + continue; - g_value_init(¶m.value, G_PARAM_SPEC_VALUE_TYPE (pspec)); + g_value_init(¶m.value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - if (json_deserialize_pspec (¶m.value, pspec, val)) - { - param.name = g_strdup (pspec->name); - g_array_append_val (construct_params, param); - } - else - g_warning ("Failed to deserialize \"%s\" property of type \"%s\" for an object of type \"%s\"", pspec->name, - g_type_name (G_VALUE_TYPE (¶m.value)), g_type_name (gtype)); - + if (json_deserialize_pspec (¶m.value, pspec, val)) { + param.name = g_strdup (pspec->name); + g_array_append_val (construct_params, param); + } + else + g_warning ("Failed to deserialize \"%s\" property of type \"%s\" for an object of type \"%s\"", + pspec->name, g_type_name (G_VALUE_TYPE (¶m.value)), g_type_name (gtype)); } - ret = g_object_newv (gtype, construct_params->len, (GParameter *) construct_params->data); + ret = g_object_newv (gtype, construct_params->len, (GParameter *) construct_params->data); - for (i=0; i!= construct_params->len; ++i) - { - GParameter *param = &g_array_index (construct_params, GParameter, i); - g_free ((gchar *) param->name); - g_value_unset (¶m->value); + for (i=0; i!= construct_params->len; ++i) { + GParameter *param = &g_array_index (construct_params, GParameter, i); + g_free ((gchar *) param->name); + g_value_unset (¶m->value); } - g_array_free(construct_params, TRUE); - g_type_class_unref(klass); + g_array_free(construct_params, TRUE); + g_type_class_unref(klass); - return ret; + return ret; } diff --git a/lib/searpc-utils.h b/lib/searpc-utils.h index d9568b7..93b488e 100644 --- a/lib/searpc-utils.h +++ b/lib/searpc-utils.h @@ -2,61 +2,59 @@ #include #include -#define SEAFILE_JSON_DOMAIN g_quark_from_string("SEAFILE_JSON") +#define SEARPC_JSON_DOMAIN g_quark_from_string("SEARPC_JSON") typedef enum { - SEAFILE_JSON_ERROR_LOAD, - SEAFILE_JSON_ERROR_PACK, - SEAFILE_JSON_ERROR_UPACK -}SEAFILEJSONERROR; + SEARPC_JSON_ERROR_LOAD, + SEARPC_JSON_ERROR_PACK, + SEARPC_JSON_ERROR_UPACK +} SEARPCJSONERROR; -json_t *json_serialize_pspec (const GValue *); json_t *json_gobject_serialize (GObject *); -gboolean json_deserialize_pspec (GValue *, GParamSpec *, json_t *); GObject *json_gobject_deserialize (GType , json_t *); inline static void setjetoge(const json_error_t *jerror, GError *error) { -/* Load is the only function I use which reports errors */ - g_set_error(&error, SEAFILE_JSON_DOMAIN, SEAFILE_JSON_ERROR_LOAD, "%s", jerror->text); + /* Load is the only function I use which reports errors */ + g_set_error(&error, SEARPC_JSON_DOMAIN, SEARPC_JSON_ERROR_LOAD, "%s", jerror->text); } inline static const char *json_object_get_string_or_null_member (json_t *object,const char *member_name) { - json_t *ret = json_object_get (object, member_name); - if (ret) - return json_string_value(ret); - else - return NULL; + json_t *ret = json_object_get (object, member_name); + if (ret) + return json_string_value(ret); + else + return NULL; } inline static void json_object_set_string_or_null_member (json_t *object,const char *member_name,const char *value) { - if (value) - json_object_set_new(object,member_name,json_string(value)); - else - json_object_set_new(object,member_name,json_null()); + if (value) + json_object_set_new(object,member_name, json_string(value)); + else + json_object_set_new(object,member_name, json_null()); } inline static const char *json_array_get_string_or_null_element (json_t *array, size_t index) { - json_t *ret=json_array_get(array,index); - if (ret) - return json_string_value(ret); - else - return NULL; + json_t *ret=json_array_get (array,index); + if (ret) + return json_string_value (ret); + else + return NULL; } inline static void json_array_add_string_or_null_element (json_t *array, const char *value) { - if (value) - json_array_append_new(array, json_string(value)); - else - json_array_append_new(array, json_null()); + if (value) + json_array_append_new (array, json_string (value)); + else + json_array_append_new (array, json_null ()); } inline static json_int_t json_array_get_int_element (json_t *array, size_t index) { - return json_integer_value(json_array_get(array, index)); + return json_integer_value (json_array_get (array, index)); }