From bd5c0210f1ae93e039175a408d017cf2082a9118 Mon Sep 17 00:00:00 2001 From: "me@ow.nekobit.net" Date: Wed, 23 Feb 2022 20:35:45 +0000 Subject: [PATCH] Lists FossilOrigin-Name: 750612213d72c01abacb84c3b2be29a8b0e988922f11ea49237909003798787f --- include/mastodont.h | 2 + include/mastodont_list.h | 41 +++++++++++++++++++ src/list.c | 85 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 include/mastodont_list.h create mode 100644 src/list.c diff --git a/include/mastodont.h b/include/mastodont.h index 5e21e6e..acb40e8 100644 --- a/include/mastodont.h +++ b/include/mastodont.h @@ -17,6 +17,8 @@ #define MASTODONT_H #include #include +#include +#include /* Functions required form curl */ void mastodont_global_curl_init(); diff --git a/include/mastodont_list.h b/include/mastodont_list.h new file mode 100644 index 0000000..82259c8 --- /dev/null +++ b/include/mastodont_list.h @@ -0,0 +1,41 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +#ifndef MASTODONT_LIST_H +#define MASTODONT_LIST_H +#include +#include +#include + +struct mstdnt_list +{ + char* id; + char* title; + char* replies_policy; +}; + +int mstdnt_load_list_from_json(struct mstdnt_list* list, cJSON* js); + +int mstdnt_load_lists_from_result(struct mstdnt_list* lists[], + struct mstdnt_storage* storage, + struct mstdnt_fetch_results* results, + size_t* size); + +int mastodont_get_lists(mastodont_t* api, + struct mstdnt_list* lists[], + struct mstdnt_storage* storage, + size_t* size); + +#endif /* MASTODONT_LIST_H */ diff --git a/src/list.c b/src/list.c new file mode 100644 index 0000000..f612e1d --- /dev/null +++ b/src/list.c @@ -0,0 +1,85 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include + +int mstdnt_load_list_from_json(struct mstdnt_list* list, cJSON* js) +{ + cJSON* v; + struct _mstdnt_str_val strings[] = { + { "id", &(list->id) }, + { "title", &(list->title) }, + { "replies_policy", &(list->replies_policy) } + }; + + for (v = js; v; v = v->next) + if (_mstdnt_key_val_iter(v, strings, _mstdnt_arr_len(strings), + NULL, 0) == 1) + return 1; +} + + +int mstdnt_load_lists_from_result(struct mstdnt_list* lists[], + struct mstdnt_storage* storage, + struct mstdnt_fetch_results* results, + size_t* size) +{ + size_t i = 0; + cJSON* root, *list_j_list; + if (_mstdnt_json_init(&root, results, storage)) + return 1; + + if (!cJSON_IsArray(root)) + return 1; + + if (size) *size = cJSON_GetArraySize(root); + + /* malloc array - cJSON does a loop to count, let's do it once preferably */ + *lists = malloc((size ? *size : cJSON_GetArraySize(root)) + * sizeof(struct mstdnt_list)); + if (*lists == NULL) + return 1; + + cJSON_ArrayForEach(list_j_list, root) + { + mstdnt_load_list_from_json((*lists) + i++, list_j_list->child); + } + storage->needs_cleanup = 1; + return 0; +} + +int mastodont_get_lists(mastodont_t* data, + struct mstdnt_list* lists[], + struct mstdnt_storage* storage, + size_t* size) +{ + int res = 0; + cJSON* root; + struct mstdnt_fetch_results results = { 0 }; + storage->needs_cleanup = 0; + + if (mastodont_fetch_curl(data, "api/v1/lists", + &results, CURLOPT_HTTPGET) != CURLE_OK) + { + return 1; + } + + // TODO +cleanup: + return res; +}