gboolean is_in_members (JsonReader * reader, const char *member) { gchar **members = json_reader_list_members (reader); int member_size = json_reader_count_members (reader); for (int i = 0; i < member_size; i++) { if (strcmp (members[i], member) == 0) { //g_print("found member: %s = %s\n", members[i], member); return TRUE; } } return FALSE; }
static gboolean dt_noiseprofile_verify(JsonParser *parser) { JsonReader *reader = NULL; gboolean valid = TRUE; dt_print(DT_DEBUG_CONTROL, "[noiseprofile] verifying noiseprofile file\n"); JsonNode *root = json_parser_get_root(parser); if(!root) _ERROR("can't get the root node"); reader = json_reader_new(root); if(!json_reader_read_member(reader, "version")) _ERROR("can't find file version."); // check the file version const int version = json_reader_get_int_value(reader); json_reader_end_member(reader); if(version != DT_NOISE_PROFILE_VERSION) _ERROR("file version is not what this code understands"); if(!json_reader_read_member(reader, "noiseprofiles")) _ERROR("can't find `noiseprofiles' entry."); if(!json_reader_is_array(reader)) _ERROR("`noiseprofiles' is supposed to be an array"); // go through all makers const int n_makers = json_reader_count_elements(reader); dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found %d makers\n", n_makers); for(int i = 0; i < n_makers; i++) { if(!json_reader_read_element(reader, i)) _ERROR("can't access maker at position %d / %d", i+1, n_makers); if(!json_reader_read_member(reader, "maker")) _ERROR("missing `maker`"); dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found maker `%s'\n", json_reader_get_string_value(reader)); // go through all models and check those json_reader_end_member(reader); if(!json_reader_read_member(reader, "models")) _ERROR("missing `models`"); const int n_models = json_reader_count_elements(reader); dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found %d models\n", n_models); for(int j = 0; j < n_models; j++) { if(!json_reader_read_element(reader, j)) _ERROR("can't access model at position %d / %d", j+1, n_models); if(!json_reader_read_member(reader, "model")) _ERROR("missing `model`"); dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found %s\n", json_reader_get_string_value(reader)); json_reader_end_member(reader); if(!json_reader_read_member(reader, "profiles")) _ERROR("missing `profiles`"); const int n_profiles = json_reader_count_elements(reader); dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found %d profiles\n", n_profiles); for(int k = 0; k < n_profiles; k++) { if(!json_reader_read_element(reader, k)) _ERROR("can't access profile at position %d / %d", k+1, n_profiles); gchar** member_names = json_reader_list_members(reader); // name if(!is_member(member_names, "name")) { g_strfreev(member_names); _ERROR("missing `name`"); } // iso if(!is_member(member_names, "iso")) { g_strfreev(member_names); _ERROR("missing `iso`"); } // a if(!is_member(member_names, "a")) { g_strfreev(member_names); _ERROR("missing `a`"); } json_reader_read_member(reader, "a"); if(json_reader_count_elements(reader) != 3) { g_strfreev(member_names); _ERROR("`a` with size != 3"); } json_reader_end_member(reader); // b if(!is_member(member_names, "b")) { g_strfreev(member_names); _ERROR("missing `b`"); } json_reader_read_member(reader, "b"); if(json_reader_count_elements(reader) != 3) { g_strfreev(member_names); _ERROR("`b` with size != 3"); } json_reader_end_member(reader); json_reader_end_element(reader); g_strfreev(member_names); } // profiles json_reader_end_member(reader); json_reader_end_element(reader); } // models json_reader_end_member(reader); json_reader_end_element(reader); } // makers json_reader_end_member(reader); dt_print(DT_DEBUG_CONTROL, "[noiseprofile] verifying noiseprofile completed\n"); end: if(reader) g_object_unref(reader); return valid; }
GList *dt_noiseprofile_get_matching(const dt_image_t *cimg) { JsonParser *parser = darktable.noiseprofile_parser; JsonReader *reader = NULL; GList *result = NULL; if(!parser) goto end; dt_print(DT_DEBUG_CONTROL, "[noiseprofile] looking for maker `%s', model `%s'\n", cimg->camera_maker, cimg->camera_model); JsonNode *root = json_parser_get_root(parser); reader = json_reader_new(root); json_reader_read_member(reader, "noiseprofiles"); // go through all makers const int n_makers = json_reader_count_elements(reader); dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found %d makers\n", n_makers); for(int i = 0; i < n_makers; i++) { json_reader_read_element(reader, i); json_reader_read_member(reader, "maker"); if(g_strstr_len(cimg->camera_maker, -1, json_reader_get_string_value(reader))) { dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found `%s' as `%s'\n", cimg->camera_maker, json_reader_get_string_value(reader)); // go through all models and check those json_reader_end_member(reader); json_reader_read_member(reader, "models"); const int n_models = json_reader_count_elements(reader); dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found %d models\n", n_models); for(int j = 0; j < n_models; j++) { json_reader_read_element(reader, j); json_reader_read_member(reader, "model"); if(!g_strcmp0(cimg->camera_model, json_reader_get_string_value(reader))) { dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found %s\n", cimg->camera_model); // we got a match, return at most bufsize elements json_reader_end_member(reader); json_reader_read_member(reader, "profiles"); const int n_profiles = json_reader_count_elements(reader); dt_print(DT_DEBUG_CONTROL, "[noiseprofile] found %d profiles\n", n_profiles); for(int k = 0; k < n_profiles; k++) { dt_noiseprofile_t tmp_profile = { 0 }; json_reader_read_element(reader, k); gchar** member_names = json_reader_list_members(reader); // do we want to skip this entry? if(is_member(member_names, "skip")) { json_reader_read_member(reader, "skip"); gboolean skip = json_reader_get_boolean_value(reader); json_reader_end_member(reader); if(skip) { json_reader_end_element(reader); g_strfreev(member_names); continue; } } // maker tmp_profile.maker = g_strdup(cimg->camera_maker); // model tmp_profile.model = g_strdup(cimg->camera_model); // name json_reader_read_member(reader, "name"); tmp_profile.name = g_strdup(json_reader_get_string_value(reader)); json_reader_end_member(reader); // iso json_reader_read_member(reader, "iso"); tmp_profile.iso = json_reader_get_double_value(reader); json_reader_end_member(reader); // a json_reader_read_member(reader, "a"); for(int a = 0; a < 3; a++) { json_reader_read_element(reader, a); tmp_profile.a[a] = json_reader_get_double_value(reader); json_reader_end_element(reader); } json_reader_end_member(reader); // b json_reader_read_member(reader, "b"); for(int b = 0; b < 3; b++) { json_reader_read_element(reader, b); tmp_profile.b[b] = json_reader_get_double_value(reader); json_reader_end_element(reader); } json_reader_end_member(reader); json_reader_end_element(reader); // everything worked out, add tmp_profile to result dt_noiseprofile_t *new_profile = (dt_noiseprofile_t *)malloc(sizeof(dt_noiseprofile_t)); *new_profile = tmp_profile; result = g_list_append(result, new_profile); g_strfreev(member_names); } // profiles goto end; } json_reader_end_member(reader); json_reader_end_element(reader); } // models } json_reader_end_member(reader); json_reader_end_element(reader); } // makers json_reader_end_member(reader); end: if(reader) g_object_unref(reader); if(result) result = g_list_sort(result, _sort_by_iso); return result; }
/** * Checks the fields from the file loaded in parser for presence of {parent} and * {getinfo} values. These member names containing such values are added to the * lists of the test files to be replaced later. * * @param parser - Parser where file is loaded * @param tfile - testfile containing details * @param testpath - Base path to tests */ void tests_check_fields_from_loaded_testfile(JsonParser *parser,testfile *tfile, gchar* testpath) { gchar* filepath = g_strjoin("/",testpath,tfile->file,NULL); JsonReader *reader = json_reader_new (json_parser_get_root (parser)); gchar** members = json_reader_list_members(reader); // Go through all members of this json for(gint membidx = 0; members[membidx] != NULL; membidx++) { // Get the value of current member gchar* membstring = get_json_member_string(reader,members[membidx]); // Requires information from other file if(g_strcmp0(membstring,"{parent}") == 0) { // Add member name to list tfile->required = g_slist_append(tfile->required,g_strdup(members[membidx])); JsonParser *par_parser = json_parser_new(); // Create file offering more information gchar* par_infopath = g_strjoin(".",filepath,"info",members[membidx],"json",NULL); if(load_json_from_file(par_parser,par_infopath)) { JsonGenerator *par_generator = json_generator_new(); json_generator_set_root(par_generator, json_parser_get_root(par_parser)); // Initialize struct for the new json and store json jsonreply* info = jsonreply_initialize(); info->data = json_generator_to_data(par_generator,&(info->length)); // To verify that this item is in correct position in the list // and corresponds to the member string location gint add_position = g_slist_length(tfile->required) - 1; tfile->reqinfo = g_slist_insert(tfile->reqinfo,info,add_position); g_object_unref(par_generator); } g_free(par_infopath); g_object_unref(par_parser); } // Requires more information from the server if(g_strcmp0(membstring,"{getinfo}") == 0) { // Add member name to list tfile->moreinfo = g_slist_append(tfile->moreinfo,g_strdup(members[membidx])); JsonParser *info_parser = json_parser_new(); // Create path to the file offering more information gchar* infopath = g_strjoin(".",filepath,"getinfo",members[membidx],"json",NULL); // Load the json file if(load_json_from_file(info_parser,infopath)) { JsonGenerator *info_generator = json_generator_new(); json_generator_set_root(info_generator, json_parser_get_root(info_parser)); // Initialize struct for the new json and store json jsonreply* info = jsonreply_initialize(); info->data = json_generator_to_data(info_generator,&(info->length)); // To verify that this item is in correct position in the list // and corresponds to the member string location gint add_position = g_slist_length(tfile->moreinfo) - 1; tfile->infosend = g_slist_insert(tfile->infosend,info,add_position); g_object_unref(info_generator); } g_free(infopath); g_object_unref(info_parser); } g_free(membstring); } g_strfreev(members); g_free(filepath); g_object_unref(reader); }