diff --git a/include/mastodont_emoji.h b/include/mastodont_emoji.h index 5502120..6f03b16 100644 --- a/include/mastodont_emoji.h +++ b/include/mastodont_emoji.h @@ -37,8 +37,12 @@ struct mstdnt_emoji_reaction /* TODO Accounts */ }; +void load_emoji_from_json(struct mstdnt_emoji* emo, cJSON* emo_json); +void load_emoji_react_from_json(struct mstdnt_emoji_reaction* emo, cJSON* emo_json); +void _mstdnt_val_emojis_call(cJSON* v, void* _type); +void _mstdnt_val_emoji_reactions_call(cJSON* v, void* _type); void cleanup_emoji_reaction(struct mstdnt_emoji_reaction* reactions); void cleanup_emoji_reactions(struct mstdnt_emoji_reaction* reactions, size_t s); -void _mstdnt_val_emoji_reactions_call(cJSON* v, void* _type); +void cleanup_emojis(struct mstdnt_emoji* emo); #endif /* MASTODONT_EMOJI */ diff --git a/include/mastodont_status.h b/include/mastodont_status.h index 997c4a0..5d0801b 100644 --- a/include/mastodont_status.h +++ b/include/mastodont_status.h @@ -50,6 +50,7 @@ struct mstdnt_status struct mstdnt_mention* mentions; struct mstdnt_tag* tags; struct mstdnt_emoji* emojis; + size_t emojis_len; /* Information attributes */ unsigned reblogs_count; diff --git a/src/emoji.c b/src/emoji.c index fa99476..a1e5d12 100644 --- a/src/emoji.c +++ b/src/emoji.c @@ -18,7 +18,26 @@ #include #include -static void load_emoji_reacts_from_json(struct mstdnt_emoji_reaction* emo, cJSON* emo_json) +void load_emoji_from_json(struct mstdnt_emoji* emo, cJSON* emo_json) +{ + cJSON* it; + + /* Zero out */ + memset(emo, 0, sizeof(struct mstdnt_emoji)); + + struct _mstdnt_val_ref refs[] = { + { "shortcode", &(emo->shortcode), _mstdnt_val_string_call }, + { "url", &(emo->url), _mstdnt_val_string_call }, + { "static_url", &(emo->static_url), _mstdnt_val_string_call }, + { "visible_in_picker", &(emo->visible_in_picker), _mstdnt_val_bool_call }, + { "category", &(emo->category), _mstdnt_val_string_call }, + }; + + for (it = emo_json; it; it = it->next) + _mstdnt_key_val_ref(it, refs, _mstdnt_arr_len(refs)); +} + +void load_emoji_react_from_json(struct mstdnt_emoji_reaction* emo, cJSON* emo_json) { cJSON* it; @@ -32,9 +51,7 @@ static void load_emoji_reacts_from_json(struct mstdnt_emoji_reaction* emo, cJSON }; for (it = emo_json; it; it = it->next) - { _mstdnt_key_val_ref(it, refs, _mstdnt_arr_len(refs)); - } } void _mstdnt_val_emoji_reactions_call(cJSON* v, void* _type) @@ -61,10 +78,38 @@ void _mstdnt_val_emoji_reactions_call(cJSON* v, void* _type) int i; for (it = v_array, i = 0; it; (++i, it = it->next)) { - load_emoji_reacts_from_json((*emos) + i, it->child); + load_emoji_react_from_json((*emos) + i, it->child); } } +void _mstdnt_val_emojis_call(cJSON* v, void* _type) +{ + struct _mstdnt_generic_args* args = _type; + struct mstdnt_emoji** emos = args->arg; + cJSON* v_array = v->child; + cJSON* att = NULL; + + size_t size = cJSON_GetArraySize(v); + *(args->size) = size; + /* No attachments, ignore */ + if (size == 0) + { + *emos = NULL; + return; + } + + *emos = calloc(1, sizeof(struct mstdnt_emoji) * size); + if (*emos == NULL) + return; + + cJSON* it; + int i; + for (it = v_array, i = 0; it; (++i, it = it->next)) + { + load_emoji_from_json((*emos) + i, it->child); + } +} + void cleanup_emoji_reaction(struct mstdnt_emoji_reaction* reaction) { /* NOP, this will be implemented soon*/ @@ -79,3 +124,9 @@ void cleanup_emoji_reactions(struct mstdnt_emoji_reaction* reactions, size_t s) cleanup_emoji_reaction(reactions + s); free(reactions); } + +void cleanup_emojis(struct mstdnt_emoji* emo) +{ + if (!emo) return; + free(emo); +} diff --git a/src/status.c b/src/status.c index ba612c8..aed6927 100644 --- a/src/status.c +++ b/src/status.c @@ -56,6 +56,11 @@ int mstdnt_status_from_json(struct mstdnt_status* status, cJSON* js) &(status->media_attachments_len), }; + struct _mstdnt_generic_args emj_args = { + &(status->emojis), + &(status->emojis_len) + }; + struct _mstdnt_val_ref vals[] = { { "id", &(status->id), _mstdnt_val_string_call }, { "uri", &(status->uri), _mstdnt_val_string_call }, @@ -72,6 +77,7 @@ int mstdnt_status_from_json(struct mstdnt_status* status, cJSON* js) { "favourited", &(status->favourited), _mstdnt_val_bool_call }, { "reblogged", &(status->reblogged), _mstdnt_val_bool_call }, { "muted", &(status->muted), _mstdnt_val_bool_call }, + { "emojis", &emj_args, _mstdnt_val_emojis_call }, { "bookmarked", &(status->bookmarked), _mstdnt_val_bool_call }, { "pinned", &(status->pinned), _mstdnt_val_bool_call }, { "reblogs_count", &(status->reblogs_count), _mstdnt_val_uint_call },