From 477e1ba2977435ae7bb75c7dbd95cf28247f89bd Mon Sep 17 00:00:00 2001 From: nirav Date: Thu, 28 Mar 2019 09:10:52 +0530 Subject: Move APIs into libgs dir --- libgs/src/status.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 libgs/src/status.c (limited to 'libgs/src/status.c') 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 +#include +#include +#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); +} -- cgit v1.2.3