static gboolean ipcam_event_input_msg_handler_read_param(IpcamEventInputMsgHandler *handler, JsonBuilder *builder, const gchar *name) { IpcamIConfig *iconfig; g_object_get(G_OBJECT(handler), "app", &iconfig, NULL); gboolean ret = FALSE; GVariant *value = NULL; value = ipcam_iconfig_read(iconfig, IPCAM_EVENT_INPUT_TYPE, name, "enable"); if (value) { json_builder_set_member_name(builder, "enable"); json_builder_add_boolean_value(builder, g_variant_get_boolean(value)); g_variant_unref(value); } value = ipcam_iconfig_read(iconfig, IPCAM_EVENT_INPUT_TYPE, name, "schedules"); if (value) { Schedules *sche; if (IS_64BIT_MACHINE) { sche = GSIZE_TO_POINTER(g_variant_get_uint64(value)); } else { sche = GSIZE_TO_POINTER(g_variant_get_uint32(value)); } gint i = 0; json_builder_set_member_name(builder, "schedules"); json_builder_begin_object(builder); if (sche) { for (i = ENUM_MON; i < ENUM_WEEKDAY_LAST; i++) { if (sche->schedule[i]) { json_builder_set_member_name(builder, weekday_name[i]); json_builder_add_string_value(builder, sche->schedule[i]); g_free(sche->schedule[i]); } } g_free(sche); } json_builder_end_object(builder); g_variant_unref(value); } return ret; }
static void insertToJson(gpointer name, gpointer v, gpointer user_data) { JsonBuilder *builder = (JsonBuilder *)user_data; if (name != NULL) json_builder_set_member_name (builder, (const char *)name); switch (G_VALUE_TYPE(v)) { case G_TYPE_BOOLEAN: json_builder_add_boolean_value (builder, g_value_get_boolean((GValue *)v)); break; case G_TYPE_STRING: json_builder_add_string_value (builder, g_value_get_string((GValue *)v)); break; case G_TYPE_INT: json_builder_add_int_value (builder, g_value_get_int((GValue *)v)); break; case G_TYPE_INT64: json_builder_add_int_value (builder, g_value_get_int64((GValue *)v)); break; case G_TYPE_DOUBLE: json_builder_add_double_value (builder, g_value_get_double((GValue *)v)); break; default: if (G_VALUE_TYPE(v) == G_TYPE_HASH_TABLE) { json_builder_begin_object (builder); GHashTable *map = (GHashTable *) g_value_get_boxed((GValue *)v); g_hash_table_foreach (map, insertToJson, builder); json_builder_end_object (builder); } else if (G_VALUE_TYPE(v) == G_TYPE_VALUE_ARRAY) { json_builder_begin_array (builder); GValueArray *array = (GValueArray *) g_value_get_boxed((GValue *)v); for (guint i = 0; i < array->n_values; i++) { GValue *value = g_value_array_get_nth(array, i); insertToJson(0, value, builder); } json_builder_end_array (builder); } else { g_print("unhandled type %s\n", G_VALUE_TYPE_NAME(v)); json_builder_add_null_value (builder); } break; } }
static JsonBuilder * _json_builder_add_gvariant (JsonBuilder *builder, GVariant *value) { g_return_val_if_fail (JSON_IS_BUILDER (builder), builder); g_variant_ref_sink (value); switch (g_variant_classify (value)) { case G_VARIANT_CLASS_BOOLEAN: json_builder_add_boolean_value (builder, g_variant_get_boolean (value)); break; case G_VARIANT_CLASS_BYTE: json_builder_add_int_value (builder, g_variant_get_byte (value)); break; case G_VARIANT_CLASS_INT16: json_builder_add_int_value (builder, g_variant_get_int16 (value)); break; case G_VARIANT_CLASS_UINT16: json_builder_add_int_value (builder, g_variant_get_uint16 (value)); break; case G_VARIANT_CLASS_INT32: json_builder_add_int_value (builder, g_variant_get_int32 (value)); break; case G_VARIANT_CLASS_UINT32: json_builder_add_int_value (builder, g_variant_get_uint32 (value)); break; case G_VARIANT_CLASS_INT64: json_builder_add_int_value (builder, g_variant_get_int64 (value)); break; case G_VARIANT_CLASS_UINT64: json_builder_add_int_value (builder, g_variant_get_uint64 (value)); break; case G_VARIANT_CLASS_HANDLE: json_builder_add_int_value (builder, g_variant_get_handle (value)); break; case G_VARIANT_CLASS_DOUBLE: json_builder_add_double_value (builder, g_variant_get_double (value)); break; case G_VARIANT_CLASS_STRING: /* explicit fall-through */ case G_VARIANT_CLASS_OBJECT_PATH: /* explicit fall-through */ case G_VARIANT_CLASS_SIGNATURE: json_builder_add_string_value (builder, g_variant_get_string (value, NULL)); break; /* TODO: */ case G_VARIANT_CLASS_VARIANT: { GVariant *child; child = g_variant_get_variant (value); _json_builder_add_gvariant (builder, child); g_variant_unref (child); } break; case G_VARIANT_CLASS_MAYBE: g_assert_not_reached (); break; case G_VARIANT_CLASS_ARRAY: { const GVariantType *type; const GVariantType *element_type; type = g_variant_get_type (value); element_type = g_variant_type_element (type); if (g_variant_type_is_dict_entry (element_type)) { GVariantIter iter; GVariant *child; json_builder_begin_object (builder); g_variant_iter_init (&iter, value); while ((child = g_variant_iter_next_value (&iter)) != NULL) { _json_builder_add_gvariant (builder, child); g_variant_unref (child); } json_builder_end_object (builder); } else { GVariantIter iter; GVariant *child; json_builder_begin_array (builder); g_variant_iter_init (&iter, value); while ((child = g_variant_iter_next_value (&iter)) != NULL) { _json_builder_add_gvariant (builder, child); g_variant_unref (child); } json_builder_end_array (builder); } } break; case G_VARIANT_CLASS_TUPLE: { GVariantIter iter; GVariant *child; json_builder_begin_array (builder); g_variant_iter_init (&iter, value); while ((child = g_variant_iter_next_value (&iter)) != NULL) { _json_builder_add_gvariant (builder, child); g_variant_unref (child); } json_builder_end_array (builder); } break; case G_VARIANT_CLASS_DICT_ENTRY: { GVariant *dict_key; GVariant *dict_value; gchar *dict_key_string; dict_key = g_variant_get_child_value (value, 0); dict_value = g_variant_get_child_value (value, 1); if (g_variant_is_of_type (dict_key, G_VARIANT_TYPE("s"))) dict_key_string = g_variant_dup_string (dict_key, NULL); else dict_key_string = g_variant_print (dict_key, FALSE); json_builder_set_member_name (builder, dict_key_string); _json_builder_add_gvariant (builder, dict_value); g_free (dict_key_string); g_variant_unref (dict_key); g_variant_unref (dict_value); } break; } g_variant_unref (value); return builder; }
static void directory_foreach_file(gpointer data, gpointer json_builder) { file_entry_t *file = (file_entry_t *)data; json_builder_begin_object(json_builder); json_builder_set_member_name(json_builder, "name"); if(file != NULL) { json_builder_add_string_value(json_builder, file->name); } else { json_builder_add_string_value(json_builder, "Error"); } json_builder_set_member_name(json_builder, "size"); json_builder_add_int_value(json_builder, file->size); json_builder_set_member_name(json_builder, "hidden"); json_builder_add_boolean_value(json_builder, file->hidden); json_builder_set_member_name(json_builder, "type"); switch(file->type) { case G_FILE_TYPE_REGULAR: { json_builder_add_string_value(json_builder, "regular"); break; } case G_FILE_TYPE_DIRECTORY: { json_builder_add_string_value(json_builder, "directory"); break; } case G_FILE_TYPE_SYMBOLIC_LINK: { json_builder_add_string_value(json_builder, "symlink"); break; } case G_FILE_TYPE_SPECIAL: { json_builder_add_string_value(json_builder, "special"); break; } case G_FILE_TYPE_SHORTCUT: { json_builder_add_string_value(json_builder, "shortcut"); break; } case G_FILE_TYPE_MOUNTABLE: { json_builder_add_string_value(json_builder, "mountable"); break; } case G_FILE_TYPE_UNKNOWN: default: { json_builder_add_string_value(json_builder, "unknown"); break; } } json_builder_set_member_name(json_builder, "last_modified"); json_builder_begin_array(json_builder); json_builder_add_int_value(json_builder, file->mod_time_sec); json_builder_add_int_value(json_builder, file->mod_time_usec); json_builder_end_array(json_builder); json_builder_set_member_name(json_builder, "mime"); json_builder_add_string_value(json_builder, file->mime); json_builder_set_member_name(json_builder, "access"); json_builder_begin_array(json_builder); json_builder_add_boolean_value(json_builder, file->access_read); json_builder_add_boolean_value(json_builder, file->access_write); json_builder_add_boolean_value(json_builder, file->access_execute); json_builder_end_array(json_builder); json_builder_set_member_name(json_builder, "owner"); json_builder_add_string_value(json_builder, file->owner); json_builder_set_member_name(json_builder, "group"); json_builder_add_string_value(json_builder, file->group); json_builder_end_object(json_builder); }
/* Save state */ static gboolean save_state(gpointer data) { queue_status qs; gboolean repeat, shuffle; int cur_track; GArray* tracks = NULL; JsonBuilder* jb = NULL; JsonGenerator* gen = NULL; gchar* out = NULL; GError* err = NULL; g_debug("savestate: starting to save the current state..."); /* Get data about the current state */ qs = queue_get_status(NULL, &cur_track, NULL); tracks = queue_tracks(); repeat = queue_get_repeat(); shuffle = queue_get_shuffle(); /* Save them in JSON */ jb = json_builder_new(); json_builder_begin_object(jb); json_builder_set_member_name(jb, "status"); switch (qs) { case STOPPED: json_builder_add_string_value(jb, "stopped"); break; case PLAYING: json_builder_add_string_value(jb, "playing"); break; case PAUSED: json_builder_add_string_value(jb, "paused"); break; default: g_warning("savestate: bad queue_status value: %d", qs); goto savestate_clean; } json_builder_set_member_name(jb, "repeat"); json_builder_add_boolean_value(jb, repeat); json_builder_set_member_name(jb, "shuffle"); json_builder_add_boolean_value(jb, shuffle); json_builder_set_member_name(jb, "current_track"); json_builder_add_int_value(jb, cur_track); json_builder_set_member_name(jb, "tracks"); json_builder_begin_array(jb); int i; for (i=0; i < tracks->len; i++) { sp_track* tr = g_array_index(tracks, sp_track*, i); if (!sp_track_is_loaded(tr)) { g_warning("savestate: queue track %d is not loaded", i); goto savestate_clean; } sp_link* lnk = sp_link_create_from_track(tr, 0); gchar uri[1024]; int uri_len = sp_link_as_string(lnk, uri, 1024); sp_link_release(lnk); if (uri_len >= 1024) { g_warning("savestate: URI too long for track %d", i); goto savestate_clean; } json_builder_add_string_value(jb, uri); } json_builder_end_array(jb); json_builder_end_object(jb); /* Store JSON to file */ gen = json_generator_new(); json_generator_set_root(gen, json_builder_get_root(jb)); out = json_generator_to_data(gen, NULL); if (g_file_set_contents(g_state_file_path, out, -1, &err)) g_debug("savestate: state saved to %s.", g_state_file_path); else g_warning("savestate: unable to dump status to file: %s", err->message); savestate_clean: if (tracks) g_array_free(tracks, TRUE); if (gen) g_object_unref(gen); if (jb) g_object_unref(jb); if (out) g_free(out); return FALSE; }
static void build_json (JsonBuilder *builder, GVariant *value) { const GVariantType *type; const GVariantType *element_type; g_variant_ref_sink (value); switch (g_variant_classify (value)) { case G_VARIANT_CLASS_BOOLEAN: json_builder_add_boolean_value (builder, g_variant_get_boolean (value)); break; case G_VARIANT_CLASS_BYTE: json_builder_add_int_value (builder, g_variant_get_byte (value)); break; case G_VARIANT_CLASS_INT16: json_builder_add_int_value (builder, g_variant_get_int16 (value)); break; case G_VARIANT_CLASS_UINT16: json_builder_add_int_value (builder, g_variant_get_uint16 (value)); break; case G_VARIANT_CLASS_INT32: json_builder_add_int_value (builder, g_variant_get_int32 (value)); break; case G_VARIANT_CLASS_UINT32: json_builder_add_int_value (builder, g_variant_get_uint32 (value)); break; case G_VARIANT_CLASS_INT64: json_builder_add_int_value (builder, g_variant_get_int64 (value)); break; case G_VARIANT_CLASS_UINT64: json_builder_add_int_value (builder, g_variant_get_uint64 (value)); break; case G_VARIANT_CLASS_HANDLE: json_builder_add_int_value (builder, g_variant_get_handle (value)); break; case G_VARIANT_CLASS_DOUBLE: json_builder_add_double_value (builder, g_variant_get_double (value)); break; case G_VARIANT_CLASS_STRING: /* explicit fall-through */ case G_VARIANT_CLASS_OBJECT_PATH: /* explicit fall-through */ case G_VARIANT_CLASS_SIGNATURE: { /* HACK: We can't use json_builder_add_string_value here since it turns empty strings into 'null' values inside arrays. https://bugzilla.gnome.org/show_bug.cgi?id=730803 */ JsonNode *string_element = json_node_alloc (); json_node_init_string (string_element, g_variant_get_string (value, NULL)); json_builder_add_value (builder, string_element); } break; case G_VARIANT_CLASS_VARIANT: build_json_variant (builder, value); break; case G_VARIANT_CLASS_ARRAY: type = g_variant_get_type (value); element_type = g_variant_type_element (type); if (g_variant_type_is_dict_entry (element_type)) build_json_dictionary (builder, element_type, value); else build_json_array_or_tuple (builder, value); break; case G_VARIANT_CLASS_TUPLE: build_json_array_or_tuple (builder, value); break; case G_VARIANT_CLASS_DICT_ENTRY: case G_VARIANT_CLASS_MAYBE: default: g_return_if_reached (); break; } g_variant_unref (value); }
static void add_bool_member (JsonBuilder *bob, const char* elm, gboolean b) { bob = json_builder_set_member_name (bob, elm); bob = json_builder_add_boolean_value (bob, b); }