summaryrefslogtreecommitdiff
path: root/rest-api-templates/res_stasis_http_resource.c.mustache
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2013-05-10 13:13:06 +0000
committerKinsey Moore <kmoore@digium.com>2013-05-10 13:13:06 +0000
commit7ce05bfb9b5f06c18451e37bb5b91cd543d6ba84 (patch)
treeb4e833909ec2ba776d39848ecf8d28f74b341424 /rest-api-templates/res_stasis_http_resource.c.mustache
parent2cfedc12adf64cc24e855bd9ea30df3aa1b759ce (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.mustache86
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}});