]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_ari_channels: Add the ability to stop locally generated ringing on a channel.
authorJoshua Colp <jcolp@digium.com>
Wed, 13 Nov 2013 23:11:32 +0000 (23:11 +0000)
committerJoshua Colp <jcolp@digium.com>
Wed, 13 Nov 2013 23:11:32 +0000 (23:11 +0000)
Using the 'ring' operation it is possible to start locally generated ringback if
the channel is answered. This change adds the ability to stop it by using DELETE.
........

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

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

include/asterisk/stasis_app.h
res/ari/resource_channels.c
res/ari/resource_channels.h
res/res_ari_channels.c
res/stasis/control.c
rest-api/api-docs/channels.json

index 8b1f4563aa3ddd251fca68687c21a3041c724c92..0f4ca27a9594ab003c688b44e6597bca6f6b1c66 100644 (file)
@@ -283,6 +283,16 @@ int stasis_app_control_continue(struct stasis_app_control *control, const char *
  */
 int stasis_app_control_ring(struct stasis_app_control *control);
 
+/*!
+ * \brief Stop locally generated ringing on the channel associated with this control.
+ *
+ * \param control Control for \c res_stasis.
+ *
+ * \return 0 for success.
+ * \return -1 for error.
+ */
+int stasis_app_control_ring_stop(struct stasis_app_control *control);
+
 /*!
  * \brief Send DTMF to the channel associated with this control.
  *
index 2b09a32819d1c3e5e200673cd8cd04ffdbaa0639..2ddfae1c50209c019dfe93e211c9180442f92844 100644 (file)
@@ -140,6 +140,22 @@ void ast_ari_channels_ring(struct ast_variable *headers,
        ast_ari_response_no_content(response);
 }
 
+void ast_ari_channels_ring_stop(struct ast_variable *headers,
+       struct ast_ari_channels_ring_stop_args *args,
+       struct ast_ari_response *response)
+{
+       RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
+
+       control = find_control(response, args->channel_id);
+       if (control == NULL) {
+               return;
+       }
+
+       stasis_app_control_ring_stop(control);
+
+       ast_ari_response_no_content(response);
+}
+
 void ast_ari_channels_mute(struct ast_variable *headers,
        struct ast_ari_channels_mute_args *args,
        struct ast_ari_response *response)
index 089f3fa7a03e028f097ef4b23cf0bedca83b0872..6106b006144fda0dfd2a64ec4c1247a26c058bce 100644 (file)
@@ -152,6 +152,19 @@ struct ast_ari_channels_ring_args {
  * \param[out] response HTTP response
  */
 void ast_ari_channels_ring(struct ast_variable *headers, struct ast_ari_channels_ring_args *args, struct ast_ari_response *response);
+/*! \brief Argument struct for ast_ari_channels_ring_stop() */
+struct ast_ari_channels_ring_stop_args {
+       /*! \brief Channel's id */
+       const char *channel_id;
+};
+/*!
+ * \brief Stop ringing indication on a channel if locally generated.
+ *
+ * \param headers HTTP headers
+ * \param args Swagger parameters
+ * \param[out] response HTTP response
+ */
+void ast_ari_channels_ring_stop(struct ast_variable *headers, struct ast_ari_channels_ring_stop_args *args, struct ast_ari_response *response);
 /*! \brief Argument struct for ast_ari_channels_send_dtmf() */
 struct ast_ari_channels_send_dtmf_args {
        /*! \brief Channel's id */
index 82cb1740f7ad2724b9b89ea031fdf3825f4ca38d..6f2005e61a7592065ce27868fd326a1fdd463c1c 100644 (file)
@@ -482,6 +482,64 @@ static void ast_ari_channels_ring_cb(
        }
 #endif /* AST_DEVMODE */
 
+fin: __attribute__((unused))
+       return;
+}
+/*!
+ * \brief Parameter parsing callback for /channels/{channelId}/ring.
+ * \param get_params GET parameters in the HTTP request.
+ * \param path_vars Path variables extracted from the request.
+ * \param headers HTTP headers.
+ * \param[out] response Response to the HTTP request.
+ */
+static void ast_ari_channels_ring_stop_cb(
+       struct ast_variable *get_params, struct ast_variable *path_vars,
+       struct ast_variable *headers, struct ast_ari_response *response)
+{
+       struct ast_ari_channels_ring_stop_args args = {};
+       struct ast_variable *i;
+#if defined(AST_DEVMODE)
+       int is_valid;
+       int code;
+#endif /* AST_DEVMODE */
+
+       for (i = path_vars; i; i = i->next) {
+               if (strcmp(i->name, "channelId") == 0) {
+                       args.channel_id = (i->value);
+               } else
+               {}
+       }
+       ast_ari_channels_ring_stop(headers, &args, response);
+#if defined(AST_DEVMODE)
+       code = response->response_code;
+
+       switch (code) {
+       case 0: /* Implementation is still a stub, or the code wasn't set */
+               is_valid = response->message == NULL;
+               break;
+       case 500: /* Internal Server Error */
+       case 501: /* Not Implemented */
+       case 404: /* Channel not found */
+       case 409: /* Channel not in a Stasis application */
+               is_valid = 1;
+               break;
+       default:
+               if (200 <= code && code <= 299) {
+                       is_valid = ast_ari_validate_void(
+                               response->message);
+               } else {
+                       ast_log(LOG_ERROR, "Invalid error response %d for /channels/{channelId}/ring\n", code);
+                       is_valid = 0;
+               }
+       }
+
+       if (!is_valid) {
+               ast_log(LOG_ERROR, "Response validation failed for /channels/{channelId}/ring\n");
+               ast_ari_response_error(response, 500,
+                       "Internal Server Error", "Response validation failed");
+       }
+#endif /* AST_DEVMODE */
+
 fin: __attribute__((unused))
        return;
 }
@@ -1242,6 +1300,7 @@ static struct stasis_rest_handlers channels_channelId_ring = {
        .path_segment = "ring",
        .callbacks = {
                [AST_HTTP_POST] = ast_ari_channels_ring_cb,
+               [AST_HTTP_DELETE] = ast_ari_channels_ring_stop_cb,
        },
        .num_children = 0,
        .children = {  }
index 6c61df061cbc85866a678866e73b313bc15d6b52..868aff5ea6b1a34873aec9ed3969667e37463185 100644 (file)
@@ -341,6 +341,21 @@ int stasis_app_control_ring(struct stasis_app_control *control)
        return 0;
 }
 
+static void *app_control_ring_stop(struct stasis_app_control *control,
+       struct ast_channel *chan, void *data)
+{
+       ast_indicate(control->channel, -1);
+
+       return NULL;
+}
+
+int stasis_app_control_ring_stop(struct stasis_app_control *control)
+{
+       stasis_app_send_command_async(control, app_control_ring_stop, NULL);
+
+       return 0;
+}
+
 struct stasis_app_control_mute_data {
        enum ast_frame_type frametype;
        unsigned int direction;
index d3ed5194dca997cfc61a84797c88c4ba2d17c8b9..dd611ccaad057a4d201821129b9a2f60a12e8288 100644 (file)
                                                        "reason": "Channel not in a Stasis application"
                                                }
                                        ]
+                               },
+                               {
+                                       "httpMethod": "DELETE",
+                                       "summary": "Stop ringing indication on a channel if locally generated.",
+                                       "nickname": "ringStop",
+                                       "responseClass": "void",
+                                       "parameters": [
+                                               {
+                                                       "name": "channelId",
+                                                       "description": "Channel's id",
+                                                       "paramType": "path",
+                                                       "required": true,
+                                                       "allowMultiple": false,
+                                                       "dataType": "string"
+                                               }
+                                       ],
+                                       "errorResponses": [
+                                               {
+                                                       "code": 404,
+                                                       "reason": "Channel not found"
+                                               },
+                                               {
+                                                       "code": 409,
+                                                       "reason": "Channel not in a Stasis application"
+                                               }
+                                       ]
                                }
                        ]
                },