aboutsummaryrefslogtreecommitdiff
path: root/src/rss_html_common.c
blob: f1aa7ad8947047eed24b75d7939a0e00d61b1a7c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "rss_html_common.h"
#include "json.h"
#include "fileutils.h"
#include <string.h>
#include <stdio.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;

        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;
    }

    struct json_value_s downloaded_json_array_value;
    downloaded_json_array_value.payload = &downloaded_json_array;
    downloaded_json_array_value.type = json_type_array;

    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;

    link_element.next = &updated_element;
    updated_element.next = &downloaded_element;
    downloaded_element.next = NULL;

    if(plugin_name) {
        json_root.start = &plugin_element;
        plugin_element.next = &link_element;
    } else {
        json_root.start = &link_element;
    }

    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);
    if(!json_body_str) {
        fprintf(stderr, "Failed to write json data to file %s/%s\n", dir, filename);
        return -1;
    }

    /* Workaround json bug (?) */
    json_body_size = strlen(json_body_str);

    int result = file_overwrite_in_dir(dir, filename, json_body_str, json_body_size);
    free(json_body_str);
    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;
}