res_stasis: Extend bridge type to be a comma separated list of bridge attributes.
authorJoshua Colp <jcolp@digium.com>
Wed, 19 Mar 2014 12:54:25 +0000 (12:54 +0000)
committerJoshua Colp <jcolp@digium.com>
Wed, 19 Mar 2014 12:54:25 +0000 (12:54 +0000)
This change turns the bridge type field into a comma separated list of attributes.
These attributes include: mixing, holding, dtmf_events, and proxy_media. By setting
the various attributes a user can control the type of bridge created with the
behavior they need for their application.

(closes issue ASTERISK-23437)
Reported by: Matt Jordan

Review: https://reviewboard.asterisk.org/r/3359/
........

Merged revisions 410904 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@410905 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
res/ari/resource_bridges.h
res/res_stasis.c
rest-api/api-docs/bridges.json

diff --git a/CHANGES b/CHANGES
index 8ddbf56..2551c0b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -103,6 +103,16 @@ Core
  * Exposed sorcery-based configuration files like pjsip.conf to dialplans via
    the new AST_SORCERY diaplan function.
 
+=======
+ARI
+------------------
+ * The live recording object on recording events now contains a target_uri
+   field which contains the URI of what is being recorded.
+
+ * The bridge type used when creating a bridge is now a comma separated list of
+   bridge properties. Valid options are: mixing, holding, dtmf_events, and
+   proxy_media.
+
  * A channelId can now be provided when creating a channel, either in the
    uri (POST channels/my-channel-id) or as query parameter.  A local channel
    will suffix the second channel id with ';2' unless provided as query
index 1b87823..5dca827 100644 (file)
@@ -52,7 +52,7 @@ struct ast_ari_bridges_list_args {
 void ast_ari_bridges_list(struct ast_variable *headers, struct ast_ari_bridges_list_args *args, struct ast_ari_response *response);
 /*! \brief Argument struct for ast_ari_bridges_create() */
 struct ast_ari_bridges_create_args {
-       /*! \brief Type of bridge to create. */
+       /*! \brief Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media). */
        const char *type;
        /*! \brief Unique ID to give to the bridge being created. */
        const char *bridge_id;
@@ -82,7 +82,7 @@ int ast_ari_bridges_create_parse_body(
 void ast_ari_bridges_create(struct ast_variable *headers, struct ast_ari_bridges_create_args *args, struct ast_ari_response *response);
 /*! \brief Argument struct for ast_ari_bridges_create_or_update_with_id() */
 struct ast_ari_bridges_create_or_update_with_id_args {
-       /*! \brief Set the type of bridge. */
+       /*! \brief Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media) to set. */
        const char *type;
        /*! \brief Unique ID to give to the bridge being created. */
        const char *bridge_id;
index e7a8d98..cfb1a7a 100644 (file)
@@ -588,19 +588,29 @@ static void control_unlink(struct stasis_app_control *control)
 struct ast_bridge *stasis_app_bridge_create(const char *type, const char *name, const char *id)
 {
        struct ast_bridge *bridge;
-       int capabilities;
+       char *requested_type, *requested_types = ast_strdupa(type);
+       int capabilities = 0;
        int flags = AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM | AST_BRIDGE_FLAG_MERGE_INHIBIT_TO
                | AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM | AST_BRIDGE_FLAG_SWAP_INHIBIT_TO
                | AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY;
 
-       if (ast_strlen_zero(type) || !strcmp(type, "mixing")) {
-               capabilities = AST_BRIDGE_CAPABILITY_1TO1MIX |
-                       AST_BRIDGE_CAPABILITY_MULTIMIX |
-                       AST_BRIDGE_CAPABILITY_NATIVE;
-               flags |= AST_BRIDGE_FLAG_SMART;
-       } else if (!strcmp(type, "holding")) {
-               capabilities = AST_BRIDGE_CAPABILITY_HOLDING;
-       } else {
+       while ((requested_type = strsep(&requested_types, ","))) {
+               requested_type = ast_strip(requested_type);
+
+               if (!strcmp(requested_type, "mixing")) {
+                       capabilities |= AST_BRIDGE_CAPABILITY_1TO1MIX |
+                               AST_BRIDGE_CAPABILITY_MULTIMIX |
+                               AST_BRIDGE_CAPABILITY_NATIVE;
+                       flags |= AST_BRIDGE_FLAG_SMART;
+               } else if (!strcmp(requested_type, "holding")) {
+                       capabilities |= AST_BRIDGE_CAPABILITY_HOLDING;
+               } else if (!strcmp(requested_type, "dtmf_events") ||
+                       !strcmp(requested_type, "proxy_media")) {
+                       capabilities &= ~AST_BRIDGE_CAPABILITY_NATIVE;
+               }
+       }
+
+       if (!capabilities) {
                return NULL;
        }
 
index 3e89978..0038510 100644 (file)
                                        "parameters": [
                                                {
                                                        "name": "type",
-                                                       "description": "Type of bridge to create.",
+                                                       "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media).",
                                                        "paramType": "query",
                                                        "required": false,
                                                        "allowMultiple": false,
-                                                       "dataType": "string",
-                                                       "allowableValues": {
-                                                               "valueType": "LIST",
-                                                               "values": [
-                                                                       "mixing",
-                                                                       "holding"
-                                                               ]
-                                                       }
+                                                       "dataType": "string"
                                                },
                                                {
                                                        "name": "bridgeId",
                                        "parameters": [
                                                {
                                                        "name": "type",
-                                                       "description": "Set the type of bridge.",
+                                                       "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media) to set.",
                                                        "paramType": "query",
                                                        "required": false,
                                                        "allowMultiple": false,
-                                                       "dataType": "string",
-                                                       "allowableValues": {
-                                                               "valueType": "LIST",
-                                                               "values": [
-                                                                       "mixing",
-                                                                       "holding"
-                                                               ]
-                                                       }
+                                                       "dataType": "string"
                                                },
                                                {
                                                        "name": "bridgeId",