From 7ce05bfb9b5f06c18451e37bb5b91cd543d6ba84 Mon Sep 17 00:00:00 2001 From: Kinsey Moore Date: Fri, 10 May 2013 13:13:06 +0000 Subject: 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 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@388275 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- rest-api-templates/asterisk_processor.py | 53 +++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) (limited to 'rest-api-templates/asterisk_processor.py') diff --git a/rest-api-templates/asterisk_processor.py b/rest-api-templates/asterisk_processor.py index 81aefbb39..b1fac013a 100644 --- a/rest-api-templates/asterisk_processor.py +++ b/rest-api-templates/asterisk_processor.py @@ -107,7 +107,6 @@ class PathSegment(Stringify): """ return len(self.__children) - class AsteriskProcessor(SwaggerPostProcessor): """A SwaggerPostProcessor which adds fields needed to generate Asterisk RESTful HTTP binding code. @@ -145,6 +144,18 @@ class AsteriskProcessor(SwaggerPostProcessor): segment = resource_api.root_path.get_child(api.path.split('/')) for operation in api.operations: segment.operations.append(operation) + resource_api.api_declaration.has_events = False + for model in resource_api.api_declaration.models: + if model.id == "Event": + resource_api.api_declaration.has_events = True + break + if resource_api.api_declaration.has_events: + resource_api.api_declaration.events = \ + [self.process_model(model, context) for model in \ + resource_api.api_declaration.models if model.id != "Event"] + else: + resource_api.api_declaration.events = [] + # Since every API path should start with /[resource], root should # have exactly one child. if resource_api.root_path.num_children() != 1: @@ -177,3 +188,43 @@ class AsteriskProcessor(SwaggerPostProcessor): parameter.c_space = '' else: parameter.c_space = ' ' + + def process_model(self, model, context): + model.c_id = snakify(model.id) + model.channel = False + model.channel_desc = "" + model.bridge = False + model.bridge_desc = "" + model.properties = [self.process_property(model, prop, context) for prop in model.properties] + model.properties = [prop for prop in model.properties if prop] + model.has_properties = (len(model.properties) != 0) + return model + + def process_property(self, model, prop, context): + # process channel separately since it will be pulled out + if prop.name == 'channel' and prop.type == 'Channel': + model.channel = True + model.channel_desc = prop.description or "" + return None + + # process bridge separately since it will be pulled out + if prop.name == 'bridge' and prop.type == 'Bridge': + model.bridge = True + model.bridge_desc = prop.description or "" + return None + + prop.c_name = snakify(prop.name) + if prop.type in self.type_mapping: + prop.c_type = self.type_mapping[prop.type] + prop.c_convert = self.convert_mapping[prop.c_type] + else: + prop.c_type = "Property type %s not mappable to a C type" % (prop.type) + prop.c_convert = "Property type %s not mappable to a C conversion" % (prop.type) + #raise SwaggerError( + # "Invalid property type %s" % prop.type, context) + # You shouldn't put a space between 'char *' and the variable + if prop.c_type.endswith('*'): + prop.c_space = '' + else: + prop.c_space = ' ' + return prop -- cgit v1.2.3