[asterisk-commits] dlee: branch dlee/record r395134 - in /team/dlee/record: include/asterisk/ re...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jul 23 09:44:57 CDT 2013


Author: dlee
Date: Tue Jul 23 09:44:55 2013
New Revision: 395134

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395134
Log:
More review fixups; make playback use the recording object

Modified:
    team/dlee/record/include/asterisk/stasis_app_recording.h
    team/dlee/record/res/res_stasis_http_channels.c
    team/dlee/record/res/res_stasis_playback.c
    team/dlee/record/res/res_stasis_recording.c
    team/dlee/record/res/stasis_http/ari_model_validators.c
    team/dlee/record/res/stasis_http/ari_model_validators.h
    team/dlee/record/res/stasis_http/resource_recordings.c
    team/dlee/record/res/stasis_recording/stored.c
    team/dlee/record/rest-api/api-docs/channels.json
    team/dlee/record/rest-api/api-docs/recordings.json

Modified: team/dlee/record/include/asterisk/stasis_app_recording.h
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/include/asterisk/stasis_app_recording.h?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/include/asterisk/stasis_app_recording.h (original)
+++ team/dlee/record/include/asterisk/stasis_app_recording.h Tue Jul 23 09:44:55 2013
@@ -33,11 +33,37 @@
 
 /*! @{ */
 
+/*! \brief Structure representing a recording stored on disk */
 struct stasis_app_stored_recording;
 
+/*!
+ * \brief Returns the filename for this recording, for use with streamfile.
+ *
+ * The returned string will be valid until the \a recording object is freed.
+ *
+ * \param recording Recording to query.
+ * \return Absolute path to the recording file, without the extension.
+ * \return \c NULL on error.
+ */
+const char *stasis_app_stored_recording_get_file(
+	struct stasis_app_stored_recording *recording);
+
+/*!
+ * \brief Convert stored recording info to JSON.
+ *
+ * \param recording Recording to convert.
+ * \return JSON representation.
+ * \return \c NULL on error.
+ */
 struct ast_json *stasis_app_stored_recording_to_json(
 	struct stasis_app_stored_recording *recording);
 
+/*!
+ * \brief Find all stored recordings on disk.
+ *
+ * \return Container of \ref stasis_app_stored_recording objects.
+ * \return \c NULL on error.
+ */
 struct ao2_container *stasis_app_stored_recording_find_all(void);
 
 /*!
@@ -53,6 +79,13 @@
 struct stasis_app_stored_recording *stasis_app_stored_recording_find_by_name(
 	const char *name);
 
+/*!
+ * \brief Delete a recording from disk.
+ *
+ * \param recording Recording to delete.
+ * \return 0 on success.
+ * \return Non-zero on error.
+ */
 int stasis_app_stored_recording_delete(
 	struct stasis_app_stored_recording *recording);
 

Modified: team/dlee/record/res/res_stasis_http_channels.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/res/res_stasis_http_channels.c?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/res/res_stasis_http_channels.c (original)
+++ team/dlee/record/res/res_stasis_http_channels.c Tue Jul 23 09:44:55 2013
@@ -848,7 +848,7 @@
 		break;
 	default:
 		if (200 <= code && code <= 299) {
-			is_valid = ari_validate_void(
+			is_valid = ari_validate_live_recording(
 				response->message);
 		} else {
 			ast_log(LOG_ERROR, "Invalid error response %d for /channels/{channelId}/record\n", code);

Modified: team/dlee/record/res/res_stasis_playback.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/res/res_stasis_playback.c?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/res/res_stasis_playback.c (original)
+++ team/dlee/record/res/res_stasis_playback.c Tue Jul 23 09:44:55 2013
@@ -25,6 +25,7 @@
 
 /*** MODULEINFO
 	<depend type="module">res_stasis</depend>
+	<depend type="module">res_stasis_recording</depend>
 	<support_level>core</support_level>
  ***/
 
@@ -40,6 +41,7 @@
 #include "asterisk/paths.h"
 #include "asterisk/stasis_app_impl.h"
 #include "asterisk/stasis_app_playback.h"
+#include "asterisk/stasis_app_recording.h"
 #include "asterisk/stasis_channels.h"
 #include "asterisk/stringfields.h"
 #include "asterisk/uuid.h"
@@ -229,13 +231,14 @@
 		file = ast_strdup(playback->media + strlen(SOUND_URI_SCHEME));
 	} else if (ast_begins_with(playback->media, RECORDING_URI_SCHEME)) {
 		/* Play recording */
+		RAII_VAR(struct stasis_app_stored_recording *, recording, NULL,
+			ao2_cleanup);
 		const char *relname =
 			playback->media + strlen(RECORDING_URI_SCHEME);
-		if (relname[0] == '/') {
-			file = ast_strdup(relname);
-		} else {
-			ast_asprintf(&file, "%s/%s",
-				ast_config_AST_RECORDING_DIR, relname);
+		recording = stasis_app_stored_recording_find_by_name(relname);
+		if (recording) {
+			file = ast_strdup(stasis_app_stored_recording_get_file(
+					recording));
 		}
 	} else {
 		/* Play URL */
@@ -495,4 +498,4 @@
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "Stasis application playback support",
 	.load = load_module,
 	.unload = unload_module,
-	.nonoptreq = "res_stasis");
+	.nonoptreq = "res_stasis,res_stasis_recording");

Modified: team/dlee/record/res/res_stasis_recording.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/res/res_stasis_recording.c?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/res/res_stasis_recording.c (original)
+++ team/dlee/record/res/res_stasis_recording.c Tue Jul 23 09:44:55 2013
@@ -436,7 +436,8 @@
 	return 0;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "Stasis application recording support",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Stasis application recording support",
 	.load = load_module,
 	.unload = unload_module,
-	.nonoptreq = "res_stasis");
+	.nonoptreq = "res_stasis",
+	.load_pri = AST_MODPRI_APP_DEPEND);

Modified: team/dlee/record/res/stasis_http/ari_model_validators.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/res/stasis_http/ari_model_validators.c?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/res/stasis_http/ari_model_validators.c (original)
+++ team/dlee/record/res/stasis_http/ari_model_validators.c Tue Jul 23 09:44:55 2013
@@ -578,16 +578,36 @@
 {
 	int res = 1;
 	struct ast_json_iter *iter;
-	int has_id = 0;
-
-	for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
-		if (strcmp("id", ast_json_object_iter_key(iter)) == 0) {
-			int prop_is_valid;
-			has_id = 1;
-			prop_is_valid = ari_validate_string(
-				ast_json_object_iter_value(iter));
-			if (!prop_is_valid) {
-				ast_log(LOG_ERROR, "ARI LiveRecording field id failed validation\n");
+	int has_format = 0;
+	int has_name = 0;
+
+	for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+		if (strcmp("format", ast_json_object_iter_key(iter)) == 0) {
+			int prop_is_valid;
+			has_format = 1;
+			prop_is_valid = ari_validate_string(
+				ast_json_object_iter_value(iter));
+			if (!prop_is_valid) {
+				ast_log(LOG_ERROR, "ARI LiveRecording field format failed validation\n");
+				res = 0;
+			}
+		} else
+		if (strcmp("name", ast_json_object_iter_key(iter)) == 0) {
+			int prop_is_valid;
+			has_name = 1;
+			prop_is_valid = ari_validate_string(
+				ast_json_object_iter_value(iter));
+			if (!prop_is_valid) {
+				ast_log(LOG_ERROR, "ARI LiveRecording field name failed validation\n");
+				res = 0;
+			}
+		} else
+		if (strcmp("state", ast_json_object_iter_key(iter)) == 0) {
+			int prop_is_valid;
+			prop_is_valid = ari_validate_string(
+				ast_json_object_iter_value(iter));
+			if (!prop_is_valid) {
+				ast_log(LOG_ERROR, "ARI LiveRecording field state failed validation\n");
 				res = 0;
 			}
 		} else
@@ -599,8 +619,13 @@
 		}
 	}
 
-	if (!has_id) {
-		ast_log(LOG_ERROR, "ARI LiveRecording missing required field id\n");
+	if (!has_format) {
+		ast_log(LOG_ERROR, "ARI LiveRecording missing required field format\n");
+		res = 0;
+	}
+
+	if (!has_name) {
+		ast_log(LOG_ERROR, "ARI LiveRecording missing required field name\n");
 		res = 0;
 	}
 

Modified: team/dlee/record/res/stasis_http/ari_model_validators.h
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/res/stasis_http/ari_model_validators.h?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/res/stasis_http/ari_model_validators.h (original)
+++ team/dlee/record/res/stasis_http/ari_model_validators.h Tue Jul 23 09:44:55 2013
@@ -816,7 +816,9 @@
  * - id: string (required)
  * - technology: string (required)
  * LiveRecording
- * - id: string (required)
+ * - format: string (required)
+ * - name: string (required)
+ * - state: string
  * StoredRecording
  * - format: string (required)
  * - name: string (required)

Modified: team/dlee/record/res/stasis_http/resource_recordings.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/res/stasis_http/resource_recordings.c?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/res/stasis_http/resource_recordings.c (original)
+++ team/dlee/record/res/stasis_http/resource_recordings.c Tue Jul 23 09:44:55 2013
@@ -61,6 +61,7 @@
 			json, stasis_app_stored_recording_to_json(recording));
 		if (r != 0) {
 			stasis_http_response_alloc_failed(response);
+			ao2_iterator_destroy(&i);
 			return;
 		}
 	}
@@ -86,7 +87,6 @@
 	}
 
 	json = stasis_app_stored_recording_to_json(recording);
-
 	if (json == NULL) {
 		stasis_http_response_error(response, 500,
 			"Internal Server Error", "Error building response");
@@ -122,14 +122,14 @@
 				"Internal Server Error",
 				"Delete failed");
 			break;
-		case ENOENT:
-			/* Treat does not exist errors as success */
-			stasis_http_response_no_content(response);
-			break;
 		default:
 			ast_log(LOG_WARNING,
 				"Unexpected error deleting recording %s: %s\n",
 				args->recording_name, strerror(errno));
+			stasis_http_response_error(response, 500,
+				"Internal Server Error",
+				"Delete failed");
+			break;
 		}
 		return;
 	}

Modified: team/dlee/record/res/stasis_recording/stored.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/res/stasis_recording/stored.c?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/res/stasis_recording/stored.c (original)
+++ team/dlee/record/res/stasis_recording/stored.c Tue Jul 23 09:44:55 2013
@@ -51,6 +51,15 @@
 	struct stasis_app_stored_recording *recording = obj;
 
 	ast_string_field_free_memory(recording);
+}
+
+const char *stasis_app_stored_recording_get_file(
+	struct stasis_app_stored_recording *recording)
+{
+	if (!recording) {
+		return NULL;
+	}
+	return recording->file;
 }
 
 /*!
@@ -260,16 +269,9 @@
 	recording->format = strrchr(recording->file, '.');
 	*(recording->format++) = '\0';
 
-	/* Build recording name */
-	name = ast_str_create(255);
-	if (!name) {
-		return -1;
-	}
-	if (!ast_strlen_zero(subdir)) {
-		ast_str_append(&name, 0, "/%s", subdir);
-	}
-	ast_str_append(&name, 0, "/%s", filename);
-	ast_string_field_set(recording, name, ast_str_buffer(name));
+	/* Removed the recording dir from the file for the name. */
+	ast_string_field_set(recording, name,
+		recording->file + strlen(ast_config_AST_RECORDING_DIR) + 1);
 
 	/* Add it to the recordings container */
 	ao2_link(recordings, recording);

Modified: team/dlee/record/rest-api/api-docs/channels.json
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/rest-api/api-docs/channels.json?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/rest-api/api-docs/channels.json (original)
+++ team/dlee/record/rest-api/api-docs/channels.json Tue Jul 23 09:44:55 2013
@@ -538,7 +538,7 @@
 					"summary": "Start a recording.",
 					"notes": "Record audio from a channel. Note that this will not capture audio sent to the channel. The bridge itself has a record feature if that's what you want.",
 					"nickname": "recordChannel",
-					"responseClass": "void",
+					"responseClass": "LiveRecording",
 					"parameters": [
 						{
 							"name": "channelId",

Modified: team/dlee/record/rest-api/api-docs/recordings.json
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record/rest-api/api-docs/recordings.json?view=diff&rev=395134&r1=395133&r2=395134
==============================================================================
--- team/dlee/record/rest-api/api-docs/recordings.json (original)
+++ team/dlee/record/rest-api/api-docs/recordings.json Tue Jul 23 09:44:55 2013
@@ -276,9 +276,28 @@
 			"id": "LiveRecording",
 			"description": "A recording that is in progress",
 			"properties": {
-				"id": {
+				"name": {
 					"required": true,
-					"type": "string"
+					"type": "string",
+					"description": "Base name for the recording"
+				},
+				"format": {
+					"required": true,
+					"type": "string",
+					"description": "Recording format (wav, gsm, etc.)"
+				},
+				"state": {
+					"required": false,
+					"type": "string",
+					"allowableValues": {
+						"valueType": "LIST",
+						"values": [
+							"queued",
+							"playing",
+							"paused",
+							"done"
+						]
+					}
 				}
 			}
 		}




More information about the asterisk-commits mailing list