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);


--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to