[asterisk-commits] file: trunk r402805 - in /trunk: ./ include/asterisk/ res/ res/ari/ res/stasi...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Nov 13 17:11:34 CST 2013


Author: file
Date: Wed Nov 13 17:11:32 2013
New Revision: 402805

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=402805
Log:
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

Modified:
    trunk/   (props changed)
    trunk/include/asterisk/stasis_app.h
    trunk/res/ari/resource_channels.c
    trunk/res/ari/resource_channels.h
    trunk/res/res_ari_channels.c
    trunk/res/stasis/control.c
    trunk/rest-api/api-docs/channels.json

Propchange: trunk/
------------------------------------------------------------------------------
--- branch-12-merged (original)
+++ branch-12-merged Wed Nov 13 17:11:32 2013
@@ -1,1 +1,1 @@
-/branches/12:1-398558,398560-398577,398579-399305,399307-401390,401392-402738,402755,402757,402767,402769,402787,402793
+/branches/12:1-398558,398560-398577,398579-399305,399307-401390,401392-402738,402755,402757,402767,402769,402787,402793,402804

Modified: trunk/include/asterisk/stasis_app.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/stasis_app.h?view=diff&rev=402805&r1=402804&r2=402805
==============================================================================
--- trunk/include/asterisk/stasis_app.h (original)
+++ trunk/include/asterisk/stasis_app.h Wed Nov 13 17:11:32 2013
@@ -284,6 +284,16 @@
 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.
  *
  * \param control Control for \c res_stasis.

Modified: trunk/res/ari/resource_channels.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/ari/resource_channels.c?view=diff&rev=402805&r1=402804&r2=402805
==============================================================================
--- trunk/res/ari/resource_channels.c (original)
+++ trunk/res/ari/resource_channels.c Wed Nov 13 17:11:32 2013
@@ -136,6 +136,22 @@
 	}
 
 	stasis_app_control_ring(control);
+
+	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);
 }

Modified: trunk/res/ari/resource_channels.h
URL: http://svnview.digium.com/svn/asterisk/trunk/res/ari/resource_channels.h?view=diff&rev=402805&r1=402804&r2=402805
==============================================================================
--- trunk/res/ari/resource_channels.h (original)
+++ trunk/res/ari/resource_channels.h Wed Nov 13 17:11:32 2013
@@ -152,6 +152,19 @@
  * \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 */

Modified: trunk/res/res_ari_channels.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_ari_channels.c?view=diff&rev=402805&r1=402804&r2=402805
==============================================================================
--- trunk/res/res_ari_channels.c (original)
+++ trunk/res/res_ari_channels.c Wed Nov 13 17:11:32 2013
@@ -452,6 +452,64 @@
 		{}
 	}
 	ast_ari_channels_ring(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}/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;
 
@@ -1242,6 +1300,7 @@
 	.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 = {  }

Modified: trunk/res/stasis/control.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/stasis/control.c?view=diff&rev=402805&r1=402804&r2=402805
==============================================================================
--- trunk/res/stasis/control.c (original)
+++ trunk/res/stasis/control.c Wed Nov 13 17:11:32 2013
@@ -341,6 +341,21 @@
 	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;

Modified: trunk/rest-api/api-docs/channels.json
URL: http://svnview.digium.com/svn/asterisk/trunk/rest-api/api-docs/channels.json?view=diff&rev=402805&r1=402804&r2=402805
==============================================================================
--- trunk/rest-api/api-docs/channels.json (original)
+++ trunk/rest-api/api-docs/channels.json Wed Nov 13 17:11:32 2013
@@ -266,6 +266,32 @@
 					"httpMethod": "POST",
 					"summary": "Indicate ringing to a channel.",
 					"nickname": "ring",
+					"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"
+						}
+					]
+				},
+				{
+					"httpMethod": "DELETE",
+					"summary": "Stop ringing indication on a channel if locally generated.",
+					"nickname": "ringStop",
 					"responseClass": "void",
 					"parameters": [
 						{




More information about the asterisk-commits mailing list