diff options
Diffstat (limited to 'restapi')
-rw-r--r-- | restapi/CMakeLists.txt | 1 | ||||
-rw-r--r-- | restapi/subscriptions.c | 63 | ||||
-rw-r--r-- | restapi/subscriptions.h | 9 |
3 files changed, 73 insertions, 0 deletions
diff --git a/restapi/CMakeLists.txt b/restapi/CMakeLists.txt index 45a22c2..e1cad6a 100644 --- a/restapi/CMakeLists.txt +++ b/restapi/CMakeLists.txt @@ -3,3 +3,4 @@ file(GLOB_RECURSE SOURCES *.c) ADD_LIBRARY(restapi STATIC ${SOURCES}) add_dependencies(restapi cjson-build) target_link_libraries(restapi common) +target_link_libraries(restapi ${CMAKE_CURRENT_BINARY_DIR}/../cjson/src/cjson-build/libcjson.a) diff --git a/restapi/subscriptions.c b/restapi/subscriptions.c new file mode 100644 index 0000000..b52ea9a --- /dev/null +++ b/restapi/subscriptions.c @@ -0,0 +1,63 @@ +#include <cjson/cJSON.h> +#include <curl/curl.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "common/http.h" +#include "subscriptions.h" + +struct subscription* // returns NULL if error or a uthash of subscriptions that needs to be freed by the caller +restapi_subscriptions_get(void) +{ + struct subscription* subscriptions = NULL; + + const char* buffer = http_get("/api/v1/subscriptions.get"); + + if (buffer == NULL) { + fprintf(stderr, "Error while subscriptions_get, http get didn't return any data.\n"); + return NULL; + } + + cJSON* json = cJSON_Parse(buffer); + if (json == NULL) { + const char *error_ptr = cJSON_GetErrorPtr(); + if (error_ptr != NULL) + fprintf(stderr, "Json parsing error before: %s\n", error_ptr); + fprintf(stderr, "Error while subscriptions_get, couldn't parse json output :\n%s\n", buffer); + goto get_json_cleanup; + } + + const cJSON* success = cJSON_GetObjectItemCaseSensitive(json, "success"); + if (cJSON_IsTrue(success)) { + cJSON* updates = cJSON_GetObjectItemCaseSensitive(json, "update"); + if (!cJSON_IsArray(updates)) { + fprintf(stderr, "Error while subscriptions_get, couldn't parse json output :\n%s\n", buffer); + goto get_json_cleanup; + } + const cJSON* update = NULL; + cJSON_ArrayForEach(update, updates) { + const cJSON* id = cJSON_GetObjectItemCaseSensitive(update, "_id"); + const cJSON* name = cJSON_GetObjectItemCaseSensitive(update, "name"); + const cJSON* type = cJSON_GetObjectItemCaseSensitive(update, "t"); + const cJSON* open = cJSON_GetObjectItemCaseSensitive(update, "open"); + enum subscription_type etype; + if (!cJSON_IsString(id) || id->valuestring == NULL || !cJSON_IsString(name) || name->valuestring == NULL || !cJSON_IsString(type) || type->valuestring == NULL || !cJSON_IsTrue(open)) + continue; + if (strcmp(type->valuestring, "c") == 0) + etype = SUBSCRIPTION_CHANNEL; + else if (strcmp(type->valuestring, "d") == 0) + etype = SUBSCRIPTION_DIRECT; + else if (strcmp(type->valuestring, "p") == 0) + etype = SUBSCRIPTION_PRIVATE; + else { + fprintf(stderr, "Bug found : Unknown subscription type %s\n%s\n", type->valuestring, buffer); + exit(999); + } + common_subscription_add(&subscriptions, id->valuestring, name->valuestring, etype); + } + } +get_json_cleanup: + cJSON_Delete(json); + return subscriptions; +} diff --git a/restapi/subscriptions.h b/restapi/subscriptions.h new file mode 100644 index 0000000..0347e15 --- /dev/null +++ b/restapi/subscriptions.h @@ -0,0 +1,9 @@ +#ifndef RESTAPI_SUBSCRIPTIONS_H_ +#define RESTAPI_SUBSCRIPTIONS_H_ + +#include "common/subscriptions.h" + +struct subscription* // returns NULL if error or a uthash of subscriptions that needs to be freed by the caller +restapi_subscriptions_get(void); + +#endif |