[asterisk-commits] dlee: branch dlee/stasis-app r381763 - in /team/dlee/stasis-app: apps/ includ...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Feb 19 12:37:54 CST 2013


Author: dlee
Date: Tue Feb 19 12:37:50 2013
New Revision: 381763

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=381763
Log:
Back to JSON messages; compiles and passed unit test

Modified:
    team/dlee/stasis-app/apps/app_stasis.c
    team/dlee/stasis-app/apps/stasis_json.c
    team/dlee/stasis-app/include/asterisk/app_stasis.h
    team/dlee/stasis-app/include/asterisk/json.h
    team/dlee/stasis-app/res/res_json.c

Modified: team/dlee/stasis-app/apps/app_stasis.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/stasis-app/apps/app_stasis.c?view=diff&rev=381763&r1=381762&r2=381763
==============================================================================
--- team/dlee/stasis-app/apps/app_stasis.c (original)
+++ team/dlee/stasis-app/apps/app_stasis.c Tue Feb 19 12:37:50 2013
@@ -57,13 +57,6 @@
 	</application>
  ***/
 
-static struct stasis_message_type *__ast_app_event;
-
-struct stasis_message_type *ast_app_event(void) {
-	ast_assert(__ast_app_event != NULL);
-	return __ast_app_event;
-}
-
 /*! Maximum number of arguments for the Stasis dialplan application */
 #define MAX_ARGS 128
 
@@ -102,15 +95,6 @@
 	ast_free(app->name);
 }
 
-static void stasis_app_event_dtor(void *obj) {
-	struct stasis_app_event *app_event = obj;
-
-	ast_free(app_event->event_name);
-	app_event->event_name = NULL;
-	ast_json_unref(app_event->event_details);
-	app_event->event_details = NULL;
-}
-
 /*! Constructor for \ref stasis_app. */
 static struct stasis_app *app_create(const char *name, stasis_app_handler handler, void *data)
 {
@@ -183,51 +167,49 @@
  * \param app App to send the message to.
  * \param message Message to send.
  */
-static void app_send(struct stasis_app *app, struct stasis_message *message)
+static void app_send(struct stasis_app *app, struct ast_json *message)
 {
 	app->handler(app->data, app->name, message);
 }
 
-static struct stasis_message *stasis_app_event_create(const char *event_name, const struct ast_channel_snapshot *channel_info, const struct ast_json *extra_info) {
-	RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup);
-	RAII_VAR(struct stasis_app_event *, app_event, NULL, ao2_cleanup);
-	RAII_VAR(struct ast_json *, event_details, NULL, ast_json_unref);
+struct ast_json *stasis_app_event_create(const char *event_name, const struct ast_channel_snapshot *channel_info, const struct ast_json *extra_info) {
+	RAII_VAR(struct ast_json *, message, NULL, ao2_cleanup);
+	int r;
 
 	if (event_name == NULL) {
 		return NULL;
 	}
 
-	app_event = ao2_alloc(sizeof(*app_event), stasis_app_event_dtor);
-
-	app_event->event_name = ast_strdup(event_name);
-	if (!app_event->event_name) {
+	if (extra_info) {
+		message = ast_json_deep_copy(extra_info);
+	} else {
+		message = ast_json_object_create();
+	}
+	if (!message) {
 		ast_log(LOG_ERROR, "Allocation failed\n");
 		return NULL;
 	}
 
-	if (extra_info) {
-		event_details = ast_json_deep_copy(extra_info);
-	} else {
-		event_details = ast_json_object_create();
-	}
+	r = ast_json_object_set(message, "event_name", ast_json_string_create(event_name));
+	if (r != 0) {
+		ast_log(LOG_ERROR, "Allocation failed\n");
+		return NULL;
+	}
+
 	if (channel_info) {
-		ast_json_object_add(event_details, "channel_info", channel_info);
-	}
-	app_event->event_details = ast_json_ref(event_details);
-
-	message = stasis_message_create(stasis_app_event(), app_event);
-	if (!message) {
-		return NULL;
-	}
-
-	ao2_ref(message, +1);
-	return message;
+		if (ast_json_object_set(message, "channel_info", ast_channel_snapshot_to_json(channel_info)) != 0) {
+			ast_log(LOG_ERROR, "Failed to add channel info to event\n");
+			return NULL;
+		}
+	}
+
+	return ast_json_ref(message);
 }
 
 static int send_start_msg(struct stasis_app *app, struct ast_channel *chan, int argc, char *argv[])
 {
 	RAII_VAR(struct ast_json *, msg_info, NULL, ast_json_unref);
-	RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
+	RAII_VAR(struct ast_json *, msg, NULL, ast_json_unref);
 	RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
 
 	struct ast_json *json_args;
@@ -236,13 +218,13 @@
 	ast_assert(chan != NULL);
 
 	msg_info = ast_json_pack("{s: []}", "args");
-	if (!msg) {
+	if (!msg_info) {
 		ast_log(LOG_ERROR, "Couldn't create message for %s\n", app->name);
 		return -1;
 	}
 
 	/* Append arguments to args array */
-	json_args = ast_json_object_get(msg, "args");
+	json_args = ast_json_object_get(msg_info, "args");
 	ast_assert(json_args != NULL);
 	for (i = 0; i < argc; ++i) {
 		if (ast_json_array_append(json_args, ast_json_string_create(argv[i])) != 0) {
@@ -252,9 +234,8 @@
 	}
 
 	/* Set channel info */
-	snapshot = ast_channel_snapshot_create(chan);
-	if (ast_json_object_set(msg, "channel-info", ast_channel_snapshot_to_json(snapshot)) != 0) {
-		ast_log(LOG_ERROR, "Couldn't attach channel-info info to message\n");
+	msg = stasis_app_event_create("stasis-start", snapshot, msg_info);
+	if (!msg) {
 		return -1;
 	}
 
@@ -269,21 +250,12 @@
 
 	ast_assert(chan != NULL);
 
-	msg = ast_json_pack("{s: s, s: s}",
-			    "event", "app-end",
-			    "app_name", app->name,
-			    "channel_id", ast_channel_uniqueid(chan));
-	if (!msg) {
-		ast_log(LOG_ERROR, "Couldn't create message for %s\n", app->name);
-		return -1;
-	}
-
 	/* Set channel info */
 	snapshot = ast_channel_snapshot_create(chan);
-	if (ast_json_object_set(msg, "channel-info", ast_channel_snapshot_to_json(snapshot)) != 0) {
-		ast_log(LOG_ERROR, "Couldn't attach channel-info info to message\n");
-		return -1;
-	}
+	if (snapshot == NULL) {
+		return -1;
+	}
+	msg = stasis_app_event_create("stasis-end", snapshot, NULL);
 
 	app_send(app, msg);
 	return 0;
@@ -405,7 +377,7 @@
 		RAII_VAR(struct ast_json *, msg, NULL, ast_json_unref);
 		SCOPED_LOCK(app_lock, app, ao2_lock, ao2_unlock);
 
-		msg = ast_json_pack("{s: s}", "event", "application-replaced");
+		msg = stasis_app_event_create("application-replaced", NULL, NULL);
 		app->handler(app->data, app_name, msg);
 
 		app->handler = handler;
@@ -413,7 +385,7 @@
 	} else {
 		app = app_create(app_name, handler, data);
 		if (app) {
-			ao2_link(apps, app);
+			ao2_link_flags(apps, app, OBJ_NOLOCK);
 		} else {
 			ast_log(LOG_ERROR, "Failed to allocate stasis_app\n");
 			return -1;
@@ -434,11 +406,6 @@
 {
 	int r = 0;
 
-	__ast_app_event = stasis_message_type_create("ast_app_event");
-	if (__ast_app_event == NULL) {
-		return AST_MODULE_LOAD_FAILURE;
-	}
-
 	__stasis_apps = ao2_container_alloc(APPS_NUM_BUCKETS, app_hash, app_compare);
 	if (__stasis_apps == NULL) {
 		return AST_MODULE_LOAD_FAILURE;
@@ -451,9 +418,6 @@
 static int unload_module(void)
 {
 	int r = 0;
-
-	ao2_cleanup(__ast_app_event);
-	__ast_app_event = NULL;
 
 	ao2_cleanup(__stasis_apps);
 	__stasis_apps = NULL;

Modified: team/dlee/stasis-app/apps/stasis_json.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/stasis-app/apps/stasis_json.c?view=diff&rev=381763&r1=381762&r2=381763
==============================================================================
--- team/dlee/stasis-app/apps/stasis_json.c (original)
+++ team/dlee/stasis-app/apps/stasis_json.c Tue Feb 19 12:37:50 2013
@@ -29,12 +29,18 @@
 
 #include "asterisk/app_stasis.h"
 
-struct ast_json *ast_channel_snapshot_to_json(struct ast_channel_snapshot *snapshot)
+struct ast_json *ast_channel_snapshot_to_json(const struct ast_channel_snapshot *snapshot)
 {
-	RAII_VAR(struct ast_json *, json_chan, ast_json_object_create(), ast_json_unref);
+	RAII_VAR(struct ast_json *, json_chan, NULL, ast_json_unref);
 	int r = 0;
 
+	if (snapshot == NULL) {
+		return NULL;
+	}
+
+	json_chan = ast_json_object_create();
 	if (!json_chan) { ast_log(LOG_ERROR, "Error creating channel json object\n"); return NULL; }
+
 	r = ast_json_object_set(json_chan, "name", ast_json_string_create(snapshot->name));
 	if (r) { ast_log(LOG_ERROR, "Error adding attrib to channel json object\n"); return NULL; }
 	r = ast_json_object_set(json_chan, "state", ast_json_string_create(ast_state2str(snapshot->state)));

Modified: team/dlee/stasis-app/include/asterisk/app_stasis.h
URL: http://svnview.digium.com/svn/asterisk/team/dlee/stasis-app/include/asterisk/app_stasis.h?view=diff&rev=381763&r1=381762&r2=381763
==============================================================================
--- team/dlee/stasis-app/include/asterisk/app_stasis.h (original)
+++ team/dlee/stasis-app/include/asterisk/app_stasis.h Tue Feb 19 12:37:50 2013
@@ -54,8 +54,12 @@
 void stasis_app_handler_unref(struct stasis_app_handler *handler);
 
 /*!
- * \brief Send a message to the given Stasis application
- * \param app_name Name of the application to invoke
+ * \brief Send a message to the given Stasis application.
+ *
+ * The message given to the handler is a borrowed copy. If you want to keep a
+ * reference to it, you should use \c ast_ref() to keep it around.
+ *
+ * \param app_name Name of the application to invoke.
  * \param message Message to send (borrowed reference)
  * \return 0 for success.
  * \return -1 for error.
@@ -72,7 +76,7 @@
  * \param app_name Name of the application being dispatched to.
  * \param message Message to handle. (borrowed copy)
  */
-typedef void (*stasis_app_handler)(void *data, const char *app_name, struct stasis_message *message);
+typedef void (*stasis_app_handler)(void *data, const char *app_name, struct ast_json *message);
 
 /*!
  * \brief Register a new Stasis application.
@@ -97,19 +101,16 @@
  * \return JSON object representing channel snapshot.
  * \return \c NULL on error
  */
-struct ast_json *ast_channel_snapshot_to_json(struct ast_channel_snapshot *snapshot);
+struct ast_json *ast_channel_snapshot_to_json(const struct ast_channel_snapshot *snapshot);
 
 /*!
- * \brief This wrapper around \ref ast_json to make it an AO2 object.
+ * \brief Create an event message for a Stasis application.
+ * \param event_name Name of the event. Cannot be \c NULL.
+ * \param channel_info Optional channel information to include in the event.
+ * \param extra_info Optional extra information to include in the event.
+ * \return New event message.
+ * \return \c NULL on error.
  */
-struct stasis_app_event {
-	char *event_name;
-	struct ast_json *event_details;
-};
-
-/*!
- * \brief Message type for \ref stasis_app_event.
- */
-struct stasis_message_type *stasis_app_event(void);
+struct ast_json *stasis_app_event_create(const char *event_name, const struct ast_channel_snapshot *channel_info, const struct ast_json *extra_info);
 
 #endif /* _ASTERISK_APP_STASIS_H */

Modified: team/dlee/stasis-app/include/asterisk/json.h
URL: http://svnview.digium.com/svn/asterisk/team/dlee/stasis-app/include/asterisk/json.h?view=diff&rev=381763&r1=381762&r2=381763
==============================================================================
--- team/dlee/stasis-app/include/asterisk/json.h (original)
+++ team/dlee/stasis-app/include/asterisk/json.h Tue Feb 19 12:37:50 2013
@@ -786,7 +786,7 @@
  * \return JSON string with ISO 8601 formatted date/time.
  * \return \c NULL on error.
  */
-struct ast_json *ast_json_timeval(struct timeval *tv, const char *zone);
+struct ast_json *ast_json_timeval(const struct timeval *tv, const char *zone);
 
 /*!
  * \brief Construct a context/exten/priority as JSON.

Modified: team/dlee/stasis-app/res/res_json.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/stasis-app/res/res_json.c?view=diff&rev=381763&r1=381762&r2=381763
==============================================================================
--- team/dlee/stasis-app/res/res_json.c (original)
+++ team/dlee/stasis-app/res/res_json.c Tue Feb 19 12:37:50 2013
@@ -519,7 +519,7 @@
 			     "priority", priority != -1 ? ast_json_integer_create(priority) : ast_json_null());
 }
 
-struct ast_json *ast_json_timeval(struct timeval *tv, const char *zone)
+struct ast_json *ast_json_timeval(const struct timeval *tv, const char *zone)
 {
 	char buf[AST_ISO8601_LEN];
 	struct ast_tm tm = {};




More information about the asterisk-commits mailing list