[asterisk-commits] dlee: branch dlee/ASTERISK-21969 r396426 - in /team/dlee/ASTERISK-21969/res: ...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Aug 8 14:55:14 CDT 2013
Author: dlee
Date: Thu Aug 8 14:55:13 2013
New Revision: 396426
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=396426
Log:
Channel update messages
Modified:
team/dlee/ASTERISK-21969/res/res_stasis.c
team/dlee/ASTERISK-21969/res/stasis/app.c
Modified: team/dlee/ASTERISK-21969/res/res_stasis.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/res/res_stasis.c?view=diff&rev=396426&r1=396425&r2=396426
==============================================================================
--- team/dlee/ASTERISK-21969/res/res_stasis.c (original)
+++ team/dlee/ASTERISK-21969/res/res_stasis.c Thu Aug 8 14:55:13 2013
@@ -200,130 +200,6 @@
return ao2_find(app_bridges, bridge_id, OBJ_KEY);
}
-/*! \brief Typedef for blob handler callbacks */
-typedef struct ast_json *(*channel_blob_handler_cb)(struct ast_channel_blob *);
-
-/*! \brief Typedef for callbacks that get called on channel snapshot updates */
-typedef struct ast_json *(*channel_snapshot_monitor)(
- struct ast_channel_snapshot *old_snapshot,
- struct ast_channel_snapshot *new_snapshot,
- const struct timeval *tv);
-
-static struct ast_json *simple_channel_event(
- const char *type,
- struct ast_channel_snapshot *snapshot,
- const struct timeval *tv)
-{
- return ast_json_pack("{s: s, s: o, s: o}",
- "type", type,
- "timestamp", ast_json_timeval(*tv, NULL),
- "channel", ast_channel_snapshot_to_json(snapshot));
-}
-
-static struct ast_json *channel_created_event(
- struct ast_channel_snapshot *snapshot,
- const struct timeval *tv)
-{
- return simple_channel_event("ChannelCreated", snapshot, tv);
-}
-
-static struct ast_json *channel_destroyed_event(
- struct ast_channel_snapshot *snapshot,
- const struct timeval *tv)
-{
- return ast_json_pack("{s: s, s: o, s: i, s: s, s: o}",
- "type", "ChannelDestroyed",
- "timestamp", ast_json_timeval(*tv, NULL),
- "cause", snapshot->hangupcause,
- "cause_txt", ast_cause2str(snapshot->hangupcause),
- "channel", ast_channel_snapshot_to_json(snapshot));
-}
-
-static struct ast_json *channel_state_change_event(
- struct ast_channel_snapshot *snapshot,
- const struct timeval *tv)
-{
- return simple_channel_event("ChannelStateChange", snapshot, tv);
-}
-
-/*! \brief Handle channel state changes */
-static struct ast_json *channel_state(
- struct ast_channel_snapshot *old_snapshot,
- struct ast_channel_snapshot *new_snapshot,
- const struct timeval *tv)
-{
- struct ast_channel_snapshot *snapshot = new_snapshot ? new_snapshot : old_snapshot;
-
- if (!old_snapshot) {
- return channel_created_event(snapshot, tv);
- } else if (!new_snapshot) {
- return channel_destroyed_event(snapshot, tv);
- } else if (old_snapshot->state != new_snapshot->state) {
- return channel_state_change_event(snapshot, tv);
- }
-
- return NULL;
-}
-
-static struct ast_json *channel_dialplan(
- struct ast_channel_snapshot *old_snapshot,
- struct ast_channel_snapshot *new_snapshot,
- const struct timeval *tv)
-{
- RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
-
- /* No Newexten event on cache clear */
- if (!new_snapshot) {
- return NULL;
- }
-
- /* Empty application is not valid for a Newexten event */
- if (ast_strlen_zero(new_snapshot->appl)) {
- return NULL;
- }
-
- if (old_snapshot && ast_channel_snapshot_cep_equal(old_snapshot, new_snapshot)) {
- return NULL;
- }
-
- return ast_json_pack("{s: s, s: o, s: s, s: s, s: o}",
- "type", "ChannelDialplan",
- "timestamp", ast_json_timeval(*tv, NULL),
- "dialplan_app", new_snapshot->appl,
- "dialplan_app_data", new_snapshot->data,
- "channel", ast_channel_snapshot_to_json(new_snapshot));
-}
-
-static struct ast_json *channel_callerid(
- struct ast_channel_snapshot *old_snapshot,
- struct ast_channel_snapshot *new_snapshot,
- const struct timeval *tv)
-{
- RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
-
- /* No NewCallerid event on cache clear or first event */
- if (!old_snapshot || !new_snapshot) {
- return NULL;
- }
-
- if (ast_channel_snapshot_caller_id_equal(old_snapshot, new_snapshot)) {
- return NULL;
- }
-
- return ast_json_pack("{s: s, s: o, s: i, s: s, s: o}",
- "type", "ChannelCallerId",
- "timestamp", ast_json_timeval(*tv, NULL),
- "caller_presentation", new_snapshot->caller_pres,
- "caller_presentation_txt", ast_describe_caller_presentation(
- new_snapshot->caller_pres),
- "channel", ast_channel_snapshot_to_json(new_snapshot));
-}
-
-channel_snapshot_monitor channel_monitors[] = {
- channel_state,
- channel_dialplan,
- channel_callerid
-};
/*!
* \brief In addition to running ao2_cleanup(), this function also removes the
Modified: team/dlee/ASTERISK-21969/res/stasis/app.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/res/stasis/app.c?view=diff&rev=396426&r1=396425&r2=396426
==============================================================================
--- team/dlee/ASTERISK-21969/res/stasis/app.c (original)
+++ team/dlee/ASTERISK-21969/res/stasis/app.c Thu Aug 8 14:55:13 2013
@@ -29,6 +29,7 @@
#include "app.h"
+#include "asterisk/callerid.h"
#include "asterisk/stasis_app.h"
#include "asterisk/stasis_bridges.h"
#include "asterisk/stasis_channels.h"
@@ -221,6 +222,154 @@
app_send(app, json);
}
+/*! \brief Typedef for callbacks that get called on channel snapshot updates */
+typedef struct ast_json *(*channel_snapshot_monitor)(
+ struct ast_channel_snapshot *old_snapshot,
+ struct ast_channel_snapshot *new_snapshot,
+ const struct timeval *tv);
+
+static struct ast_json *simple_channel_event(
+ const char *type,
+ struct ast_channel_snapshot *snapshot,
+ const struct timeval *tv)
+{
+ return ast_json_pack("{s: s, s: o, s: o}",
+ "type", type,
+ "timestamp", ast_json_timeval(*tv, NULL),
+ "channel", ast_channel_snapshot_to_json(snapshot));
+}
+
+static struct ast_json *channel_created_event(
+ struct ast_channel_snapshot *snapshot,
+ const struct timeval *tv)
+{
+ return simple_channel_event("ChannelCreated", snapshot, tv);
+}
+
+static struct ast_json *channel_destroyed_event(
+ struct ast_channel_snapshot *snapshot,
+ const struct timeval *tv)
+{
+ return ast_json_pack("{s: s, s: o, s: i, s: s, s: o}",
+ "type", "ChannelDestroyed",
+ "timestamp", ast_json_timeval(*tv, NULL),
+ "cause", snapshot->hangupcause,
+ "cause_txt", ast_cause2str(snapshot->hangupcause),
+ "channel", ast_channel_snapshot_to_json(snapshot));
+}
+
+static struct ast_json *channel_state_change_event(
+ struct ast_channel_snapshot *snapshot,
+ const struct timeval *tv)
+{
+ return simple_channel_event("ChannelStateChange", snapshot, tv);
+}
+
+/*! \brief Handle channel state changes */
+static struct ast_json *channel_state(
+ struct ast_channel_snapshot *old_snapshot,
+ struct ast_channel_snapshot *new_snapshot,
+ const struct timeval *tv)
+{
+ struct ast_channel_snapshot *snapshot = new_snapshot ? new_snapshot : old_snapshot;
+
+ if (!old_snapshot) {
+ return channel_created_event(snapshot, tv);
+ } else if (!new_snapshot) {
+ return channel_destroyed_event(snapshot, tv);
+ } else if (old_snapshot->state != new_snapshot->state) {
+ return channel_state_change_event(snapshot, tv);
+ }
+
+ return NULL;
+}
+
+static struct ast_json *channel_dialplan(
+ struct ast_channel_snapshot *old_snapshot,
+ struct ast_channel_snapshot *new_snapshot,
+ const struct timeval *tv)
+{
+ RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
+
+ /* No Newexten event on cache clear */
+ if (!new_snapshot) {
+ return NULL;
+ }
+
+ /* Empty application is not valid for a Newexten event */
+ if (ast_strlen_zero(new_snapshot->appl)) {
+ return NULL;
+ }
+
+ if (old_snapshot && ast_channel_snapshot_cep_equal(old_snapshot, new_snapshot)) {
+ return NULL;
+ }
+
+ return ast_json_pack("{s: s, s: o, s: s, s: s, s: o}",
+ "type", "ChannelDialplan",
+ "timestamp", ast_json_timeval(*tv, NULL),
+ "dialplan_app", new_snapshot->appl,
+ "dialplan_app_data", new_snapshot->data,
+ "channel", ast_channel_snapshot_to_json(new_snapshot));
+}
+
+static struct ast_json *channel_callerid(
+ struct ast_channel_snapshot *old_snapshot,
+ struct ast_channel_snapshot *new_snapshot,
+ const struct timeval *tv)
+{
+ RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
+
+ /* No NewCallerid event on cache clear or first event */
+ if (!old_snapshot || !new_snapshot) {
+ return NULL;
+ }
+
+ if (ast_channel_snapshot_caller_id_equal(old_snapshot, new_snapshot)) {
+ return NULL;
+ }
+
+ return ast_json_pack("{s: s, s: o, s: i, s: s, s: o}",
+ "type", "ChannelCallerId",
+ "timestamp", ast_json_timeval(*tv, NULL),
+ "caller_presentation", new_snapshot->caller_pres,
+ "caller_presentation_txt", ast_describe_caller_presentation(
+ new_snapshot->caller_pres),
+ "channel", ast_channel_snapshot_to_json(new_snapshot));
+}
+
+static channel_snapshot_monitor channel_monitors[] = {
+ channel_state,
+ channel_dialplan,
+ channel_callerid
+};
+
+static void sub_channel_update_handler(void *data,
+ struct stasis_subscription *sub,
+ struct stasis_topic *topic,
+ struct stasis_message *message)
+{
+ struct app *app = data;
+ struct stasis_cache_update *update = stasis_message_data(message);
+ struct ast_channel_snapshot *new_snapshot = stasis_message_data(update->new_snapshot);
+ struct ast_channel_snapshot *old_snapshot = stasis_message_data(update->old_snapshot);
+ /* Pull timestamp from the new snapshot, or from the update message
+ * when there isn't one. */
+ const struct timeval *tv = update->new_snapshot ?
+ stasis_message_timestamp(update->new_snapshot) :
+ stasis_message_timestamp(message);
+ int i;
+
+ for (i = 0; i < ARRAY_LEN(channel_monitors); ++i) {
+ RAII_VAR(struct ast_json *, msg, NULL, ast_json_unref);
+
+ msg = channel_monitors[i](old_snapshot, new_snapshot, tv);
+ if (msg) {
+ app_send(app, msg);
+ }
+ }
+}
+
static struct ast_json *simple_bridge_event(
const char *type,
struct ast_bridge_snapshot *snapshot,
@@ -339,6 +488,9 @@
res |= stasis_message_router_add_cache_update(app->router,
ast_bridge_snapshot_type(), sub_bridge_update_handler, app);
+
+ res |= stasis_message_router_add_cache_update(app->router,
+ ast_channel_snapshot_type(), sub_channel_update_handler, app);
res |= stasis_message_router_set_default(app->router,
sub_default_handler, app);
More information about the asterisk-commits
mailing list