-#include <jansson.h>
-
-
-struct JsonApiResource
-{
- /**
- * DLL
- */
- struct JsonApiResource *next;
-
- /**
- * DLL
- */
- struct JsonApiResource *prev;
-
- /**
- * Resource content
- */
- json_t *res_obj;
-};
-
-
-struct JsonApiResponse
-{
- /**
- * DLL Resource
- */
- struct JsonApiResource *res_list_head;
-
- /**
- * DLL Resource
- */
- struct JsonApiResource *res_list_tail;
-
- /**
- * num resources
- */
- int res_count;
-};
-
-/**
- * JSON API
- */
-
-/**
- * Create a JSON API resource
- *
- * @param type the JSON API resource type
- * @param id the JSON API resource id
- * @return a new JSON API resource or NULL on error.
- */
-struct JsonApiResource*
-GNUNET_REST_jsonapi_resource_new (const char *type, const char *id)
-{
- struct JsonApiResource *res;
-
- if ( (NULL == type) || (0 == strlen (type)) )
- return NULL;
- if ( (NULL == id) || (0 == strlen (id)) )
- return NULL;
-
- res = GNUNET_new (struct JsonApiResource);
-
- res->res_obj = json_object ();
-
- json_object_set_new (res->res_obj, GNUNET_REST_JSONAPI_KEY_ID, json_string (id));
- json_object_set_new (res->res_obj, GNUNET_REST_JSONAPI_KEY_TYPE, json_string (type));
-
- return res;
-}
-
-/**
- * Delete a JSON API resource
- *
- * @param res the JSON resource
- * @param result Pointer where the resource should be stored
- */
-void
-GNUNET_REST_jsonapi_resource_delete (struct JsonApiResource *resource)
-{
- json_decref (resource->res_obj);
- GNUNET_free (resource);
-}
-
-/**
- * Add a JSON API attribute
- *
- * @param res the JSON resource
- * @param key the key for the attribute
- * @param json the json_t attribute to add
- * @return #GNUNET_OK if added successfully
- * #GNUNET_SYSERR if not
- */
-int
-GNUNET_REST_jsonapi_resource_add_attr (const struct JsonApiResource *resource,
- const char* key,
- json_t *json)
-{
- if ( (NULL == resource) ||
- (NULL == key) ||
- (NULL == json) )
- return GNUNET_SYSERR;
- json_object_set (resource->res_obj, key, json);
- return GNUNET_OK;
-}
-
-
-
-
-/**
- * Create a JSON API primary data
- *
- * @param type the JSON API resource type
- * @param id the JSON API resource id
- * @return a new JSON API resource or NULL on error.
- */
-struct JsonApiResponse*
-GNUNET_REST_jsonapi_response_new ()
-{
- struct JsonApiResponse *result;
-
- result = GNUNET_new (struct JsonApiResponse);
- result->res_count = 0;
- return result;
-}
-
-/**
- * Delete a JSON API primary data
- *
- * @param type the JSON API resource type
- * @param id the JSON API resource id
- * @return a new JSON API resource or NULL on error.
- */
-void
-GNUNET_REST_jsonapi_response_delete (struct JsonApiResponse *resp)
-{
- struct JsonApiResource *res;
-
- for (res = resp->res_list_head;
- res != NULL;
- res = res->next)
- GNUNET_REST_jsonapi_resource_delete (res);
- GNUNET_free (resp);
-}
-
-/**
- * Add a JSON API resource to primary data
- *
- * @param data The JSON API data to add to
- * @param res the JSON API resource to add
- * @return the new number of resources
- */
-void
-GNUNET_REST_jsonapi_response_resource_add (struct JsonApiResponse *resp,
- struct JsonApiResource *res)
-{
- GNUNET_CONTAINER_DLL_insert (resp->res_list_head,
- resp->res_list_tail,
- res);
-
- resp->res_count++;
-}
-
-/**
- * Add a JSON API resource to primary data
- *
- * @param data The JSON API data to add to
- * @param res the JSON API resource to add
- * @return the new number of resources
- */
-void
-GNUNET_REST_jsonapi_data_resource_remove (struct JsonApiResponse *resp,
- struct JsonApiResource *res)
-{
- GNUNET_CONTAINER_DLL_remove (resp->res_list_head,
- resp->res_list_tail,
- res);
- resp->res_count--;
-}
-
-/**
- * String serialze jsonapi primary data
- *
- * @param data the JSON API primary data
- * @param result where to store the result
- * @return GNUNET_SYSERR on error else GNUNET_OK
- */
-int
-GNUNET_REST_jsonapi_data_serialize (const struct JsonApiResponse *resp,
- char **result)
-{
- struct JsonApiResource *res;
- json_t *root_json;
- json_t *res_arr;
-
- if ( (NULL == resp) ||
- (0 == resp->res_count) )
- return GNUNET_SYSERR;
-
- root_json = json_object ();
-
- if (1 == resp->res_count)
- {
- json_object_set (root_json, GNUNET_REST_JSONAPI_KEY_DATA, resp->res_list_head->res_obj);
- }
- else
- {
- res_arr = json_array ();
- for (res = resp->res_list_head;
- res != NULL;
- res = res->next)
- {
- json_array_append (res_arr, res->res_obj);
- }
- json_object_set (root_json, GNUNET_REST_JSONAPI_KEY_DATA, res_arr);
- }
- *result = json_dumps (root_json, JSON_COMPACT);
- return GNUNET_OK;
-}