#define _POSIX_C_SOURCE 200809L #include #include #include #include "status.h" #include "account.h" #include "log.h" struct status *status_from_json(const char *json_data) { struct status *s; json_t *root; json_error_t error; root = json_loads(json_data, 0, &error); if (!root) { log_msg(LOG_WARNING, "status_from_json", "json parse error: line %d: %s", error.line, error.text); return NULL; } s = status_from_json_t(root); json_decref(root); return s; } struct status *status_from_json_t(const json_t *root) { struct status *s; if (!root) { log_msg(LOG_WARNING, "status_from_json_t", "json data is null"); return NULL; } if (!json_is_object(root)) { log_msg(LOG_WARNING, "status_from_json_t", "json root is not object"); return NULL; } s = calloc(1, sizeof(struct status)); if (!s) { err(1, "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 = 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 status_free(struct status *s) { if (s->id) free(s->id); if (s->uri) free(s->uri); if (s->url) free(s->url); if (s->account) 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) status_free(s->reblog); if (s->content) free(s->content); free(s); }