diff options
author | dec05eba <dec05eba@protonmail.com> | 2021-03-03 12:52:21 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2021-03-03 12:52:21 +0100 |
commit | ef49fb417f582ec837cde6b551a0bf0cfafe3d4d (patch) | |
tree | 0f1230ff9286496a30bb25291e81c6e0157297b2 /src/rss_html_common.c | |
parent | 3d5be6f0623e61ecfb1c8086263a615f6b13f1d7 (diff) |
Use cJSON instead of the existing json library
Diffstat (limited to 'src/rss_html_common.c')
-rw-r--r-- | src/rss_html_common.c | 368 |
1 files changed, 60 insertions, 308 deletions
diff --git a/src/rss_html_common.c b/src/rss_html_common.c index 168195e..e8e98a5 100644 --- a/src/rss_html_common.c +++ b/src/rss_html_common.c @@ -1,164 +1,58 @@ #include "rss_html_common.h" -#include "json.h" +#include "../depends/cJSON.h" #include "fileutils.h" #include <string.h> #include <stdio.h> +#include <stdlib.h> #include <time.h> #include <assert.h> int write_plugin_json_to_file(const char *dir, const char *filename, const char *url, const char *updated, const char *start_after, const char *start_after_url, const char *plugin_name) { - struct json_string_s title_json_key; - create_json_string(&title_json_key, "title", 5); - - struct json_string_s title_json_value_str; - create_json_string(&title_json_value_str, start_after, start_after ? strlen(start_after) : 0); - struct json_value_s title_json_value; - init_json_value_str(&title_json_value, &title_json_value_str); - - struct json_string_s time_json_key; - create_json_string(&time_json_key, "time", 4); - - struct json_string_s time_value_str; - create_json_string(&time_value_str, updated, strlen(updated)); - struct json_value_s time_json_value; - init_json_value_str(&time_json_value, &time_value_str); - - struct json_string_s url_json_key; - create_json_string(&url_json_key, "url", 3); - - struct json_string_s url_value_str; - create_json_string(&url_value_str, start_after_url, start_after_url ? strlen(start_after_url) : 0); - struct json_value_s url_json_value; - init_json_value_str(&url_json_value, &url_value_str); - - struct json_string_s plugin_json_key; - create_json_string(&plugin_json_key, "plugin", 6); - - struct json_string_s plugin_json_value_str; - create_json_string(&plugin_json_value_str, plugin_name, plugin_name ? strlen(plugin_name) : 0); - struct json_value_s plugin_json_value; - init_json_value_str(&plugin_json_value, &plugin_json_value_str); - - struct json_string_s link_json_key; - create_json_string(&link_json_key, "link", 4); - - struct json_string_s link_json_value_str; - create_json_string(&link_json_value_str, url, strlen(url)); - struct json_value_s link_json_value; - init_json_value_str(&link_json_value, &link_json_value_str); - - struct json_string_s updated_json_key; - create_json_string(&updated_json_key, "updated", 7); - - struct json_string_s updated_json_value_str; - create_json_string(&updated_json_value_str, updated, strlen(updated)); - struct json_value_s updated_json_value; - init_json_value_str(&updated_json_value, &updated_json_value_str); - - struct json_string_s downloaded_json_key; - create_json_string(&downloaded_json_key, "downloaded", 10); - - struct json_object_s downloaded_json; - downloaded_json.start = NULL; - downloaded_json.length = 0; - - struct json_value_s downloaded_json_value; - downloaded_json_value.payload = &downloaded_json; - downloaded_json_value.type = json_type_object; - - struct json_object_element_s downloaded_title_element; - downloaded_title_element.name = &title_json_key; - downloaded_title_element.value = &title_json_value; - - struct json_object_element_s downloaded_time_element; - downloaded_time_element.name = &time_json_key; - downloaded_time_element.value = &time_json_value; - - struct json_object_element_s downloaded_url_element; - downloaded_url_element.name = &url_json_key; - downloaded_url_element.value = &url_json_value; - - downloaded_title_element.next = &downloaded_time_element; - downloaded_time_element.next = &downloaded_url_element; - downloaded_url_element.next = NULL; - - struct json_array_s downloaded_json_array; - downloaded_json_array.start = NULL; - downloaded_json_array.length = 0; - struct json_array_element_s downloaded_json_array_element; - - if(start_after) { - downloaded_json.start = &downloaded_title_element; - downloaded_json.length = 3; + int result = 0; - downloaded_json_array_element.value = &downloaded_json_value; - downloaded_json_array_element.next = NULL; - downloaded_json_array.start = &downloaded_json_array_element; - downloaded_json_array.length = 1; + cJSON *json_body = cJSON_CreateObject(); + if(!json_body) { + result = -1; + goto cleanup; } - struct json_value_s downloaded_json_array_value; - downloaded_json_array_value.payload = &downloaded_json_array; - downloaded_json_array_value.type = json_type_array; + cJSON_AddStringToObject(json_body, "link", url); + cJSON_AddStringToObject(json_body, "updated", updated); + if(plugin_name) + cJSON_AddStringToObject(json_body, "plugin", plugin_name); - struct json_object_s json_root; - json_root.length = 3; - - struct json_object_element_s link_element; - link_element.name = &link_json_key; - link_element.value = &link_json_value; - - struct json_object_element_s updated_element; - updated_element.name = &updated_json_key; - updated_element.value = &updated_json_value; - - struct json_object_element_s downloaded_element; - downloaded_element.name = &downloaded_json_key; - downloaded_element.value = &downloaded_json_array_value; - - struct json_object_element_s plugin_element; - plugin_element.name = &plugin_json_key; - plugin_element.value = &plugin_json_value; + cJSON *downloaded_item_json = cJSON_CreateObject(); + if(!downloaded_item_json) { + result = -1; + goto cleanup; + } - link_element.next = &updated_element; - updated_element.next = &downloaded_element; - downloaded_element.next = NULL; + if(start_after) + cJSON_AddStringToObject(downloaded_item_json, "title", start_after); + if(start_after_url) + cJSON_AddStringToObject(downloaded_item_json, "url", start_after_url); + cJSON_AddStringToObject(downloaded_item_json, "time", updated); - if(plugin_name) { - json_root.start = &plugin_element; - plugin_element.next = &link_element; - } else { - json_root.start = &link_element; + cJSON *downloaded_json = cJSON_AddArrayToObject(json_body, "downloaded"); + if(!downloaded_json) { + result = -1; + goto cleanup; } + cJSON_AddItemToArray(downloaded_json, downloaded_item_json); - struct json_value_s json_root_value; - json_root_value.payload = &json_root; - json_root_value.type = json_type_object; - size_t json_body_size = 0; - char *json_body_str = json_write_pretty(&json_root_value, " ", "\n", &json_body_size); + char *json_body_str = cJSON_Print(json_body); if(!json_body_str) { - fprintf(stderr, "Failed to write json data to file %s/%s\n", dir, filename); - return -1; + result = -1; + goto cleanup; } - - /* Workaround json bug (?) */ - json_body_size = strlen(json_body_str); - - int result = file_overwrite_in_dir(dir, filename, json_body_str, json_body_size); + result = file_overwrite_in_dir(dir, filename, json_body_str, strlen(json_body_str)); free(json_body_str); - return result; -} -static struct json_array_element_s* get_last_element_in_json_array(struct json_array_s *json_array) { - struct json_array_element_s *json_element = json_array->start; - while(json_element) { - struct json_array_element_s *next_json_element = json_element->next; - if(next_json_element) - json_element = next_json_element; - else - return json_element; - } - return NULL; + cleanup: + cJSON_Delete(json_body); + if(result != 0) + fprintf(stderr, "Failed to write json data to file %s/%s\n", dir, filename); + return result; } /* TODO: If this fails in the middle, recover and update the next time somehow */ @@ -184,193 +78,51 @@ int tracked_item_update_latest(TrackedItem *tracked_item, char *tracked_dir, Dow goto cleanup; } - struct json_value_s *updated_field = json_object_get_field_by_name(tracked_item->json_data, "updated"); - if(updated_field) { - struct json_string_s *updated_json = json_value_as_string(updated_field); - updated_json->string = updated; - updated_json->string_size = updated_len; + cJSON *updated_field = cJSON_GetObjectItemCaseSensitive(tracked_item->json_data, "updated"); + if(updated_field && cJSON_IsString(updated_field)) { + cJSON_SetValuestring(updated_field, updated); } else { fprintf(stderr, "Corrupt json for rss item: %s\n", item_filepath); } - struct json_value_s *downloaded_json = json_object_get_field_by_name(tracked_item->json_data, "downloaded"); - struct json_array_s *downloaded_json_array_orig = NULL; - struct json_array_s *downloaded_json_array = NULL; - - struct json_array_s new_downloaded_array; - new_downloaded_array.length = 1; - new_downloaded_array.start = NULL; - - struct json_value_s new_downloaded_array_val; - new_downloaded_array_val.payload = &new_downloaded_array; - new_downloaded_array_val.type = json_type_array; - - struct json_string_s downloaded_json_key; - create_json_string(&downloaded_json_key, "downloaded", 10); - - struct json_object_element_s new_downloaded_array_obj_el; - new_downloaded_array_obj_el.name = &downloaded_json_key; - new_downloaded_array_obj_el.value = &new_downloaded_array_val; - - if(downloaded_json) { - downloaded_json_array = json_value_as_array(downloaded_json); - if(!downloaded_json_array) { - fprintf(stderr, "Corrupt json for rss item: %s\n", item_filepath); - result = -1; - goto cleanup; - } - downloaded_json_array_orig = downloaded_json_array; - } else { - downloaded_json_array = &new_downloaded_array; + cJSON *downloaded_json = cJSON_GetObjectItemCaseSensitive(tracked_item->json_data, "downloaded"); + if(!downloaded_json) + downloaded_json = cJSON_AddArrayToObject(tracked_item->json_data, "downloaded"); + if(!downloaded_json || !cJSON_IsArray(downloaded_json)) { + result = -1; + goto cleanup; } - struct json_string_s title_json_key; - create_json_string(&title_json_key, "title", 5); - - struct json_string_s filename_json_key; - create_json_string(&filename_json_key, "filename", 8); - - struct json_string_s time_json_key; - create_json_string(&time_json_key, "time", 4); - - struct json_string_s url_json_key; - create_json_string(&url_json_key, "url", 3); - - struct json_string_s title_json_value_str[MAX_UPDATE_ITEMS]; - struct json_value_s title_json_value[MAX_UPDATE_ITEMS]; - struct json_string_s filename_json_value_str[MAX_UPDATE_ITEMS]; - struct json_value_s filename_json_value[MAX_UPDATE_ITEMS]; - struct json_string_s time_value_str[MAX_UPDATE_ITEMS]; - struct json_value_s time_json_value[MAX_UPDATE_ITEMS]; - struct json_string_s url_value_str[MAX_UPDATE_ITEMS]; - struct json_value_s url_json_value[MAX_UPDATE_ITEMS]; - - struct json_object_element_s downloaded_title_element[MAX_UPDATE_ITEMS]; - struct json_object_element_s downloaded_filename_element[MAX_UPDATE_ITEMS]; - struct json_object_element_s downloaded_time_element[MAX_UPDATE_ITEMS]; - struct json_object_element_s downloaded_url_element[MAX_UPDATE_ITEMS]; - - struct json_object_s new_downloaded_json_obj[MAX_UPDATE_ITEMS]; - struct json_value_s new_downloaded_json_val[MAX_UPDATE_ITEMS]; - struct json_array_element_s new_downloaded_item_element[MAX_UPDATE_ITEMS]; - - char items_timestamps[MAX_UPDATE_ITEMS][32]; - - struct json_array_element_s *last_downloaded_element = NULL; for(int i = 0; i < num_download_items; ++i) { - create_json_string(&title_json_value_str[i], download_items[i]->title, strlen(download_items[i]->title)); - init_json_value_str(&title_json_value[i], &title_json_value_str[i]); - - if(filenames) { - create_json_string(&filename_json_value_str[i], filenames[i], strlen(filenames[i])); - init_json_value_str(&filename_json_value[i], &filename_json_value_str[i]); - } - - sprintf(items_timestamps[i], "%ld", timestamps[i]); - int updated_len = strlen(items_timestamps[i]); - create_json_string(&time_value_str[i], items_timestamps[i], updated_len); - init_json_value_str(&time_json_value[i], &time_value_str[i]); - - create_json_string(&url_value_str[i], download_items[i]->link, strlen(download_items[i]->link)); - init_json_value_str(&url_json_value[i], &url_value_str[i]); - - downloaded_title_element[i].name = &title_json_key; - downloaded_title_element[i].value = &title_json_value[i]; - - if(filenames) { - downloaded_filename_element[i].name = &filename_json_key; - downloaded_filename_element[i].value = &filename_json_value[i]; - } - - downloaded_time_element[i].name = &time_json_key; - downloaded_time_element[i].value = &time_json_value[i]; - - downloaded_url_element[i].name = &url_json_key; - downloaded_url_element[i].value = &url_json_value[i]; - - downloaded_title_element[i].next = &downloaded_time_element[i]; - downloaded_time_element[i].next = &downloaded_url_element[i]; - downloaded_url_element[i].next = NULL; - if(filenames) { - downloaded_url_element[i].next = &downloaded_filename_element[i]; - downloaded_filename_element[i].next = NULL; - new_downloaded_json_obj[i].length = 4; - } else { - new_downloaded_json_obj[i].length = 3; + cJSON *downloaded_item_json = cJSON_CreateObject(); + if(!downloaded_item_json) { + result = -1; + goto cleanup; } - new_downloaded_json_obj[i].start = &downloaded_title_element[i]; - - new_downloaded_json_val[i].payload = &new_downloaded_json_obj[i]; - new_downloaded_json_val[i].type = json_type_object; - - new_downloaded_item_element[i].value = &new_downloaded_json_val[i]; - new_downloaded_item_element[i].next = NULL; + char timestamp[32]; + snprintf(timestamp, sizeof(timestamp), "%ld", timestamps[i]); - if(downloaded_json_array->length > 0) { - if(!last_downloaded_element) - last_downloaded_element = get_last_element_in_json_array(downloaded_json_array); - - if(last_downloaded_element) - last_downloaded_element->next = &new_downloaded_item_element[i]; - else - downloaded_json_array->start = &new_downloaded_item_element[i]; - - last_downloaded_element = &new_downloaded_item_element[i]; - downloaded_json_array->length++; - } else { - downloaded_json_array->start = &new_downloaded_item_element[i]; - downloaded_json_array->length = 1; - last_downloaded_element = &new_downloaded_item_element[i]; + cJSON_AddStringToObject(downloaded_item_json, "title", download_items[i]->title); + cJSON_AddStringToObject(downloaded_item_json, "time", timestamp); + cJSON_AddStringToObject(downloaded_item_json, "url", download_items[i]->link); + if(filenames) + cJSON_AddStringToObject(downloaded_item_json, "filename", filenames[i]); - if(!downloaded_json_array_orig) { - struct json_object_element_s *prev_start = tracked_item->json_data->start; - tracked_item->json_data->start = &new_downloaded_array_obj_el; - new_downloaded_array_obj_el.next = prev_start; - tracked_item->json_data->length++; - } - } + cJSON_AddItemToArray(downloaded_json, downloaded_item_json); } - struct json_value_s json_root_value; - json_root_value.payload = tracked_item->json_data; - json_root_value.type = json_type_object; - - size_t json_body_size = 0; - char *json_body_str = json_write_pretty(&json_root_value, " ", "\n", &json_body_size); + char *json_body_str = cJSON_Print(tracked_item->json_data); if(!json_body_str) { - fprintf(stderr, "Failed to write json data to file %s/data\n", item_filepath); result = -1; goto cleanup; } - - /* Workaround json bug (?) */ - json_body_size = strlen(json_body_str); - - result = file_overwrite_in_dir(item_filepath, "data", json_body_str, json_body_size); + result = file_overwrite_in_dir(item_filepath, "data", json_body_str, strlen(json_body_str)); free(json_body_str); cleanup: + if(result != 0) + fprintf(stderr, "Failed to update data for item: %s\n", item_filepath); tracked_dir[tracked_dir_len] = '\0'; return result; } - -struct json_value_s* json_object_get_field_by_name(struct json_object_s *json_obj, const char *name) { - struct json_object_element_s *obj_element = json_obj->start; - while(obj_element) { - if(strcmp(obj_element->name->string, name) == 0) - return obj_element->value; - obj_element = obj_element->next; - } - return NULL; -} - -void create_json_string(struct json_string_s *json_result, const char *str, int len) { - json_result->string = str; - json_result->string_size = len; -} - -void init_json_value_str(struct json_value_s *json_value, struct json_string_s *json_str) { - json_value->payload = json_str; - json_value->type = json_type_string; -} |