diff options
author | Kinsey Moore <kmoore@digium.com> | 2013-05-10 13:13:06 +0000 |
---|---|---|
committer | Kinsey Moore <kmoore@digium.com> | 2013-05-10 13:13:06 +0000 |
commit | 7ce05bfb9b5f06c18451e37bb5b91cd543d6ba84 (patch) | |
tree | b4e833909ec2ba776d39848ecf8d28f74b341424 /rest-api-templates/res_stasis_http_resource.c.mustache | |
parent | 2cfedc12adf64cc24e855bd9ea30df3aa1b759ce (diff) |
Add channel events for res_stasis apps
This change adds a framework in res_stasis for handling events from
channel topics. JSON event generation and validation code is created
from event documentation in rest-api/api-docs/events.json to assist in
JSON event generation, ensure consistency, and ensure that accurate
documentation is available for ALL events that are received by
res_stasis applications.
The userevent application has been refactored along with the code that
handles userevent channel blob events to pass the headers as key/value
pairs in the JSON blob. As a side-effect, app_userevent now handles
duplicate keys by overwriting the previous value.
Review: https://reviewboard.asterisk.org/r/2428/
(closes issue ASTERISK-21180)
Patch-By: Kinsey Moore <kmoore@digium.com>
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@388275 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'rest-api-templates/res_stasis_http_resource.c.mustache')
-rw-r--r-- | rest-api-templates/res_stasis_http_resource.c.mustache | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/rest-api-templates/res_stasis_http_resource.c.mustache b/rest-api-templates/res_stasis_http_resource.c.mustache index b02ab62bd..9b1324c09 100644 --- a/rest-api-templates/res_stasis_http_resource.c.mustache +++ b/rest-api-templates/res_stasis_http_resource.c.mustache @@ -47,6 +47,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/module.h" #include "stasis_http/resource_{{name}}.h" +{{#has_events}} +#include "asterisk/stasis_channels.h" +{{/has_events}} {{#apis}} {{#operations}} @@ -96,6 +99,89 @@ static void stasis_http_{{c_nickname}}_cb( {{> rest_handler}} {{/root_path}} +{{#has_events}} +{{#events}} +{{> event_function_decl}} + ) +{ + RAII_VAR(struct ast_json *, message, NULL, ast_json_unref); + RAII_VAR(struct ast_json *, event, NULL, ast_json_unref); +{{#has_properties}} + struct ast_json *validator; +{{/has_properties}} +{{#channel}} + int ret; +{{/channel}} +{{#bridge}} +{{^channel}} + int ret; +{{/channel}} +{{/bridge}} + +{{#channel}} + ast_assert(channel_snapshot != NULL); +{{/channel}} +{{#bridge}} + ast_assert(bridge_snapshot != NULL); +{{/bridge}} +{{#has_properties}} + ast_assert(blob != NULL); +{{#channel}} + ast_assert(ast_json_object_get(blob, "channel") == NULL); +{{/channel}} +{{#bridge}} + ast_assert(ast_json_object_get(blob, "bridge") == NULL); +{{/bridge}} + ast_assert(ast_json_object_get(blob, "type") == NULL); +{{#properties}} + + validator = ast_json_object_get(blob, "{{name}}"); + if (validator) { + /* do validation? XXX */ +{{#required}} + } else { + /* fail message generation if the required parameter doesn't exist */ + return NULL; +{{/required}} + } +{{/properties}} + + event = ast_json_deep_copy(blob); +{{/has_properties}} +{{^has_properties}} + + event = ast_json_object_create(); +{{/has_properties}} + if (!event) { + return NULL; + } + +{{#channel}} + ret = ast_json_object_set(event, + "channel", ast_channel_snapshot_to_json(channel_snapshot)); + if (ret) { + return NULL; + } + +{{/channel}} +{{#bridge}} + ret = ast_json_object_set(event, + "bridge", ast_bridge_snapshot_to_json(bridge_snapshot)); + if (ret) { + return NULL; + } + +{{/bridge}} + message = ast_json_pack("{s: o}", "{{c_id}}", ast_json_ref(event)); + if (!message) { + return NULL; + } + + return ast_json_ref(message); +} + +{{/events}} +{{/has_events}} static int load_module(void) { return stasis_http_add_handler(&{{root_full_name}}); |