void post(SoupServer *server, SoupMessage *msg, const char *path) { JsonParser *parser = json_parser_new (); GError *err = NULL; g_debug("POST\n path= %s\nbody = '%s'", path, msg->request_body->data); if (json_parser_load_from_data (parser, msg->request_body->data, -1, &err)) { g_debug("parsed sucessfully"); GVariant *gv = json_gvariant_deserialize(json_parser_get_root(parser), NULL, NULL); if (gv) { char *debug = g_variant_print (gv, TRUE); g_debug ("converted to %s", debug); g_free (debug); //We need to store the signature, so package in a v GVariant *packaged = g_variant_new_variant(gv); struct btval key; key.data = (void*)path+1; key.size = strlen(path)-1; key.free_data = FALSE; key.mp = NULL; struct btval val; val.data =(void*) g_variant_get_data(packaged); val.size = g_variant_get_size(packaged); val.free_data = FALSE; val.mp = NULL; g_debug ("inserting with key %s", (char*)key.data); g_debug ("data checksum is %s", g_compute_checksum_for_data(G_CHECKSUM_MD5, val.data, val.size)); int success = btree_put(btree, &key, &val,0); if (0!=success) { g_debug("put failed: %s)", strerror(errno)); } g_variant_unref (packaged); g_variant_unref (gv); } } else { g_debug("failed to parse json: %s", err->message); g_error_free(err); } soup_message_set_status (msg, SOUP_STATUS_OK); }
/* Returns a new floating variant (essentially a fixed-up copy of @value) */ static GVariant * _my_replace (GVariant *value) { GVariant *ret; const gchar *dbus_type; if (g_variant_is_of_type (value, G_VARIANT_TYPE_VARDICT) && g_variant_lookup (value, "_dbus_type", "&s", &dbus_type)) { GVariant *passed_value; passed_value = g_variant_lookup_value (value, "value", NULL); if (passed_value != NULL) { JsonNode *serialized; GError *error; serialized = json_gvariant_serialize (passed_value); error = NULL; ret = json_gvariant_deserialize (serialized, dbus_type, &error); json_node_free (serialized); if (ret == NULL) { /* * HACK: Work around bug in JSON-glib, see: * https://bugzilla.gnome.org/show_bug.cgi?id=724319 */ if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_INVALID_DATA && g_variant_is_of_type (passed_value, G_VARIANT_TYPE_INT64) && g_strcmp0 (dbus_type, "d") == 0) { ret = g_variant_new_double (g_variant_get_int64 (passed_value)); g_clear_error (&error); } else { g_warning ("Error converting JSON to requested type %s: %s (%s, %d)", dbus_type, error->message, g_quark_to_string (error->domain), error->code); g_error_free (error); ret = g_variant_ref (value); } } } else { g_warning ("Malformed _dbus_type vardict"); ret = g_variant_ref (value); } } else if (g_variant_is_container (value)) { GVariantBuilder builder; GVariantIter iter; GVariant *child; g_variant_builder_init (&builder, g_variant_get_type (value)); g_variant_iter_init (&iter, value); while ((child = g_variant_iter_next_value (&iter)) != NULL) { g_variant_builder_add_value (&builder, _my_replace (child)); g_variant_unref (child); } ret = g_variant_builder_end (&builder); } else { ret = g_variant_ref (value); } return ret; }