diff options
author | nirav <nirav@teisuu.com> | 2019-03-28 09:10:52 +0530 |
---|---|---|
committer | nirav <nirav@teisuu.com> | 2019-03-28 09:10:52 +0530 |
commit | 477e1ba2977435ae7bb75c7dbd95cf28247f89bd (patch) | |
tree | ce1f9719a7d11bbd47e9adea26dd610bc087962e /libgs/src/status.c | |
parent | cc727e972f7fdc871ee1f42cf014151b67422bf0 (diff) | |
download | ap_client-477e1ba2977435ae7bb75c7dbd95cf28247f89bd.tar.gz ap_client-477e1ba2977435ae7bb75c7dbd95cf28247f89bd.zip |
Diffstat (limited to 'libgs/src/status.c')
-rw-r--r-- | libgs/src/status.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/libgs/src/status.c b/libgs/src/status.c new file mode 100644 index 0000000..5bcdb74 --- /dev/null +++ b/libgs/src/status.c @@ -0,0 +1,120 @@ +#define _POSIX_C_SOURCE 200809L +#include <err.h> +#include <string.h> +#include <jansson.h> +#include "status.h" +#include "account.h" +#include "log.h" + +struct gs_status *gs_status_from_json(const char *json_data) +{ + struct gs_status *s; + json_t *root; + json_error_t error; + + root = json_loads(json_data, 0, &error); + if (!root) { + gs_log(GS_WARNING, "status_from_json", + "json parse error: line %d: %s", error.line, error.text); + return NULL; + } + + s = gs_status_from_json_t(root); + json_decref(root); + return s; +} + +struct gs_status *gs_status_from_json_t(const json_t *root) +{ + struct gs_status *s; + if (!root) { + gs_log(GS_WARNING, "gs_status_from_json_t", "json data is null"); + return NULL; + } + + if (!json_is_object(root)) { + gs_log(GS_WARNING, "gs_status_from_json_t", "json root is not object"); + return NULL; + } + + s = calloc(1, sizeof(struct gs_status)); + if (!s) { + err(1, "gs_status_from_json_t"); + return NULL; + } + + json_t *id = json_object_get(root, "id"); + if (json_is_string(id)) { + s->id = strdup(json_string_value(id)); + } + + json_t *uri = json_object_get(root, "uri"); + if (json_is_string(uri)) { + s->uri = strdup(json_string_value(uri)); + } + + json_t *url = json_object_get(root, "url"); + if (json_is_string(url)) { + s->url = strdup(json_string_value(url)); + } + + json_t *account = json_object_get(root, "account"); + if (json_is_object(account)) { + s->account = gs_account_from_json_t(account); + } + + json_t *in_reply_to_id = json_object_get(root, "in_reply_to_id"); + if (json_is_string(in_reply_to_id)) { + s->in_reply_to_id = strdup(json_string_value(in_reply_to_id)); + } + + json_t *in_reply_to_account_id = + json_object_get(root, "in_reply_to_account_id"); + if (json_is_string(in_reply_to_account_id)) { + s->in_reply_to_account_id = + strdup(json_string_value(in_reply_to_account_id)); + } + + json_t *content = json_object_get(root, "content"); + if (json_is_string(content)) { + s->content = strdup(json_string_value(content)); + } + + json_t *replies_count = json_object_get(root, "replies_count"); + if (json_is_integer(replies_count)) { + s->replies_count = json_integer_value(replies_count); + } + + json_t *reblogs_count = json_object_get(root, "reblogs_count"); + if (json_is_integer(reblogs_count)) { + s->reblogs_count = json_integer_value(reblogs_count); + } + + json_t *favourites_count = json_object_get(root, "favourites_count"); + if (json_is_integer(favourites_count)) { + s->favourites_count = json_integer_value(favourites_count); + } + + return s; +} + +void gs_status_free(struct gs_status *s) +{ + if (s->id) + free(s->id); + if (s->uri) + free(s->uri); + if (s->url) + free(s->url); + if (s->account) + gs_account_free(s->account); + if (s->in_reply_to_id) + free(s->in_reply_to_id); + if (s->in_reply_to_account_id) + free(s->in_reply_to_account_id); + if (s->reblog) + gs_status_free(s->reblog); + if (s->content) + free(s->content); + free(s); +} |