res_ari: Add "module loaded" check to ari stubs
[asterisk/asterisk.git] / res / res_ari_sounds.c
index a7411b5..8d5928a 100644 (file)
 
 /*** MODULEINFO
        <depend type="module">res_ari</depend>
+       <depend type="module">res_ari_model</depend>
        <depend type="module">res_stasis</depend>
        <support_level>core</support_level>
  ***/
 
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
+#include "asterisk/app.h"
 #include "asterisk/module.h"
 #include "asterisk/stasis_app.h"
 #include "ari/resource_sounds.h"
@@ -48,6 +48,25 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "ari/ari_model_validators.h"
 #endif
 
+#define MAX_VALS 128
+
+int ast_ari_sounds_list_parse_body(
+       struct ast_json *body,
+       struct ast_ari_sounds_list_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "lang");
+       if (field) {
+               args->lang = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "format");
+       if (field) {
+               args->format = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /sounds.
  * \param get_params GET parameters in the HTTP request.
@@ -55,18 +74,18 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
  * \param headers HTTP headers.
  * \param[out] response Response to the HTTP request.
  */
-static void ast_ari_get_sounds_cb(
+static void ast_ari_sounds_list_cb(
+       struct ast_tcptls_session_instance *ser,
        struct ast_variable *get_params, struct ast_variable *path_vars,
-       struct ast_variable *headers, struct ast_ari_response *response)
+       struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 {
+       struct ast_ari_sounds_list_args args = {};
+       struct ast_variable *i;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
 #endif /* AST_DEVMODE */
 
-       struct ast_get_sounds_args args = {};
-       struct ast_variable *i;
-
        for (i = get_params; i; i = i->next) {
                if (strcmp(i->name, "lang") == 0) {
                        args.lang = (i->value);
@@ -76,7 +95,11 @@ static void ast_ari_get_sounds_cb(
                } else
                {}
        }
-       ast_ari_get_sounds(headers, &args, response);
+       if (ast_ari_sounds_list_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
+       }
+       ast_ari_sounds_list(headers, &args, response);
 #if defined(AST_DEVMODE)
        code = response->response_code;
 
@@ -104,6 +127,9 @@ static void ast_ari_get_sounds_cb(
                        "Internal Server Error", "Response validation failed");
        }
 #endif /* AST_DEVMODE */
+
+fin: __attribute__((unused))
+       return;
 }
 /*!
  * \brief Parameter parsing callback for /sounds/{soundId}.
@@ -112,25 +138,25 @@ static void ast_ari_get_sounds_cb(
  * \param headers HTTP headers.
  * \param[out] response Response to the HTTP request.
  */
-static void ast_ari_get_stored_sound_cb(
+static void ast_ari_sounds_get_cb(
+       struct ast_tcptls_session_instance *ser,
        struct ast_variable *get_params, struct ast_variable *path_vars,
-       struct ast_variable *headers, struct ast_ari_response *response)
+       struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 {
+       struct ast_ari_sounds_get_args args = {};
+       struct ast_variable *i;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
 #endif /* AST_DEVMODE */
 
-       struct ast_get_stored_sound_args args = {};
-       struct ast_variable *i;
-
        for (i = path_vars; i; i = i->next) {
                if (strcmp(i->name, "soundId") == 0) {
                        args.sound_id = (i->value);
                } else
                {}
        }
-       ast_ari_get_stored_sound(headers, &args, response);
+       ast_ari_sounds_get(headers, &args, response);
 #if defined(AST_DEVMODE)
        code = response->response_code;
 
@@ -158,45 +184,58 @@ static void ast_ari_get_stored_sound_cb(
                        "Internal Server Error", "Response validation failed");
        }
 #endif /* AST_DEVMODE */
+
+fin: __attribute__((unused))
+       return;
 }
 
-/*! \brief REST handler for /api-docs/sounds.{format} */
+/*! \brief REST handler for /api-docs/sounds.json */
 static struct stasis_rest_handlers sounds_soundId = {
        .path_segment = "soundId",
        .is_wildcard = 1,
        .callbacks = {
-               [AST_HTTP_GET] = ast_ari_get_stored_sound_cb,
+               [AST_HTTP_GET] = ast_ari_sounds_get_cb,
        },
        .num_children = 0,
        .children = {  }
 };
-/*! \brief REST handler for /api-docs/sounds.{format} */
+/*! \brief REST handler for /api-docs/sounds.json */
 static struct stasis_rest_handlers sounds = {
        .path_segment = "sounds",
        .callbacks = {
-               [AST_HTTP_GET] = ast_ari_get_sounds_cb,
+               [AST_HTTP_GET] = ast_ari_sounds_list_cb,
        },
        .num_children = 1,
        .children = { &sounds_soundId, }
 };
 
+static int unload_module(void)
+{
+       ast_ari_remove_handler(&sounds);
+       stasis_app_unref();
+       return 0;
+}
+
 static int load_module(void)
 {
        int res = 0;
+
+       CHECK_ARI_MODULE_LOADED();
+
+
        stasis_app_ref();
        res |= ast_ari_add_handler(&sounds);
-       return res;
-}
+       if (res) {
+               unload_module();
+               return AST_MODULE_LOAD_DECLINE;
+       }
 
-static int unload_module(void)
-{
-       ast_ari_remove_handler(&sounds);
-       stasis_app_unref();
-       return 0;
+       return AST_MODULE_LOAD_SUCCESS;
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "RESTful API module - Sound resources",
+       .support_level = AST_MODULE_SUPPORT_CORE,
        .load = load_module,
        .unload = unload_module,
        .nonoptreq = "res_ari,res_stasis",
-       );
+);