diff --git a/clients/c/cosmopolite.c b/clients/c/cosmopolite.c index 4d4348d..686e040 100644 --- a/clients/c/cosmopolite.c +++ b/clients/c/cosmopolite.c @@ -299,7 +299,7 @@ void cosmo_unsubscribe(cosmo *instance, json_t *subject) { assert(!pthread_mutex_unlock(&instance->lock)); } -void cosmo_send_message(cosmo *instance, const json_t *subject, json_t *message) { +void cosmo_send_message(cosmo *instance, json_t *subject, json_t *message) { char sender_message_id[COSMO_UUID_SIZE]; cosmo_uuid(sender_message_id); char *encoded = json_dumps(message, JSON_ENCODE_ANY); @@ -311,6 +311,49 @@ void cosmo_send_message(cosmo *instance, const json_t *subject, json_t *message) free(encoded); } +json_t *cosmo_get_messages(cosmo *instance, json_t *subject) { + assert(!pthread_mutex_lock(&instance->lock)); + json_t *subscription = cosmo_find_subscription(instance, subject); + if (!subscription) { + assert(!pthread_mutex_unlock(&instance->lock)); + return NULL; + } + json_t *messages = json_object_get(subscription, "messages"); + json_t *ret = json_deep_copy(messages); + assert(!pthread_mutex_unlock(&instance->lock)); + + return ret; +} + +json_t *cosmo_get_last_message(cosmo *instance, json_t *subject) { + assert(!pthread_mutex_lock(&instance->lock)); + json_t *subscription = cosmo_find_subscription(instance, subject); + if (!subscription) { + assert(!pthread_mutex_unlock(&instance->lock)); + return NULL; + } + json_t *messages = json_object_get(subscription, "messages"); + json_t *last_message = json_array_get(messages, json_array_size(messages) - 1); + json_t *ret = json_deep_copy(last_message); + assert(!pthread_mutex_unlock(&instance->lock)); + + return ret; +} + +json_t *cosmo_get_pins(cosmo *instance, json_t *subject) { + assert(!pthread_mutex_lock(&instance->lock)); + json_t *subscription = cosmo_find_subscription(instance, subject); + if (!subscription) { + assert(!pthread_mutex_unlock(&instance->lock)); + return NULL; + } + json_t *pins = json_object_get(subscription, "pins"); + json_t *ret = json_deep_copy(pins); + assert(!pthread_mutex_unlock(&instance->lock)); + + return ret; +} + cosmo *cosmo_create(const char *base_url, const char *client_id) { curl_global_init(CURL_GLOBAL_DEFAULT); srandomdev(); diff --git a/clients/c/cosmopolite.h b/clients/c/cosmopolite.h index 9677fdb..30433be 100644 --- a/clients/c/cosmopolite.h +++ b/clients/c/cosmopolite.h @@ -34,15 +34,14 @@ const char *cosmo_current_profile(cosmo *instance); json_t *cosmo_subject(const char *name, const char *readable_only_by, const char *writeable_only_by); void cosmo_subscribe(cosmo *instance, json_t *subject, const json_int_t messages, const json_int_t last_id); void cosmo_unsubscribe(cosmo *instance, json_t *subject); -void cosmo_send_message(cosmo *instance, const json_t *subject, json_t *message); +void cosmo_send_message(cosmo *instance, json_t *subject, json_t *message); -// TODO -json_t *cosmo_get_messages(cosmo *instance, const json_t *subject); -json_t *cosmo_get_last_message(cosmo *instance, const json_t *subject); -json_t *cosmo_get_pins(cosmo *instance, const json_t *subject); +json_t *cosmo_get_messages(cosmo *instance, json_t *subject); +json_t *cosmo_get_last_message(cosmo *instance, json_t *subject); +json_t *cosmo_get_pins(cosmo *instance, json_t *subject); // Hard TODO -void cosmo_pin(cosmo *instance, const json_t *subject, json_t *message); -void cosmo_unpin(cosmo *instance, const json_t *subject, json_t *message); +void cosmo_pin(cosmo *instance, json_t *subject, json_t *message); +void cosmo_unpin(cosmo *instance, json_t *subject, json_t *message); #endif