summaryrefslogtreecommitdiff
path: root/res/res_ari_channels.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2013-11-13 23:11:32 +0000
committerJoshua Colp <jcolp@digium.com>2013-11-13 23:11:32 +0000
commit67b650543c3ea59418bf159323d7244c343f85f6 (patch)
tree5c7e3cc32898eabb207393983cab28d72f1f6a39 /res/res_ari_channels.c
parentf6593b4156b0daa0a74f1f04dc062a6b24acab6c (diff)
res_ari_channels: Add the ability to stop locally generated ringing on a channel.
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
Diffstat (limited to 'res/res_ari_channels.c')
-rw-r--r--res/res_ari_channels.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/res/res_ari_channels.c b/res/res_ari_channels.c
index 82cb1740f..6f2005e61 100644
--- a/res/res_ari_channels.c
+++ b/res/res_ari_channels.c
@@ -486,6 +486,64 @@ 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;
+}
+/*!
* \brief Parameter parsing callback for /channels/{channelId}/dtmf.
* \param get_params GET parameters in the HTTP request.
* \param path_vars Path variables extracted from the request.
@@ -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 = { }