[asterisk-commits] bmd: branch group/newcdr r118019 - in /team/group/newcdr: include/asterisk/ m...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu May 22 19:01:04 CDT 2008
Author: bmd
Date: Thu May 22 19:01:03 2008
New Revision: 118019
URL: http://svn.digium.com/view/asterisk?view=rev&rev=118019
Log:
added CEL_LINKEDID_END event which emits when a linkedid leaves it's last channel
Modified:
team/group/newcdr/include/asterisk/cel.h
team/group/newcdr/main/cel.c
team/group/newcdr/main/channel.c
Modified: team/group/newcdr/include/asterisk/cel.h
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/include/asterisk/cel.h?view=diff&rev=118019&r1=118018&r2=118019
==============================================================================
--- team/group/newcdr/include/asterisk/cel.h (original)
+++ team/group/newcdr/include/asterisk/cel.h Thu May 22 19:01:03 2008
@@ -82,6 +82,8 @@
CEL_CONF_EXIT = 20,
/*! a user-defined event, the event name field should be set */
CEL_USER_DEFINED = 21,
+ /*! the last channel with the given linkedid is retired */
+ CEL_LINKEDID_END = 22,
};
/* there was in the early stages of design, a concept of struct ast_cel,
@@ -103,6 +105,15 @@
/*! Converts AMA flag to printable string */
char *ast_cel_flags2str(int flag);
+/*! If at least one CEL backend is looking for CEL_LINKEDID_END
+ * events, this function will check if the given channel is the last
+ * active channel with that linkedid, and if it is, emit a
+ * CEL_LINKEDID_END event.
+ *
+ * This should be called whenever a channel is freed or when a
+ * channel's linkedid is changed
+ */
+void ast_cel_check_retire_linkedid(const struct ast_channel *chan);
int ast_cel_setaccount(struct ast_channel *chan, const char *account);
Modified: team/group/newcdr/main/cel.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/main/cel.c?view=diff&rev=118019&r1=118018&r2=118019
==============================================================================
--- team/group/newcdr/main/cel.c (original)
+++ team/group/newcdr/main/cel.c Thu May 22 19:01:03 2008
@@ -58,7 +58,6 @@
{
return cel_enabled;
}
-
static char *handle_cli_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
@@ -362,6 +361,8 @@
return "EV_3WAY_END";
case CEL_HOOKFLASH:
return "EV_HOOKFLASH";
+ case CEL_LINKEDID_END:
+ return "EV_LINKEDID_END";
}
return "";
}
@@ -378,6 +379,32 @@
return "DOCUMENTATION";
}
return "Unknown";
+}
+
+void ast_cel_check_retire_linkedid(const struct ast_channel *chan)
+{
+ int found=0;
+ struct ast_channel *tmp = NULL;
+ const char *linkedid = chan->linkedid;
+
+ /* make sure we need to do all this work */
+ if (!ast_strlen_zero(linkedid) && (eventset & CEL_LINKEDID_END)) {
+
+ while ((tmp = ast_channel_walk_locked(tmp))) {
+
+ if (tmp != chan && tmp->linkedid && 0==strcmp(linkedid, tmp->linkedid)) {
+ found=1;
+ ast_channel_unlock(tmp);
+ break;
+ }
+
+ ast_channel_unlock(tmp);
+ }
+
+ if (!found) {
+ ast_cel_report_event(chan, CEL_LINKEDID_END, NULL, NULL);
+ }
+ }
}
int ast_cel_setaccount(struct ast_channel *chan, const char *account)
Modified: team/group/newcdr/main/channel.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/main/channel.c?view=diff&rev=118019&r1=118018&r2=118019
==============================================================================
--- team/group/newcdr/main/channel.c (original)
+++ team/group/newcdr/main/channel.c Thu May 22 19:01:03 2008
@@ -1307,6 +1307,7 @@
headp=&chan->varshead;
ast_cel_report_event(chan, CEL_CHANNEL_END, NULL, NULL);
+ ast_cel_check_retire_linkedid(chan);
AST_RWLIST_WRLOCK(&channels);
if (!AST_RWLIST_REMOVE(&channels, chan, chan_list)) {
@@ -3881,9 +3882,21 @@
}
}
+/*! Set the channel's linkedid to the given string, and also check to
+ * see if the channel's old linkedid is now being retired */
+static void ast_channel_change_linkedid(struct ast_channel *chan, const char *linkedid)
+{
+ /* if the linkedid for this channel is being changed from something, check... */
+ if (!ast_strlen_zero(chan->linkedid) && 0 != strcmp(chan->linkedid, linkedid)) {
+ ast_cel_check_retire_linkedid(chan);
+ }
+
+ ast_string_field_set(chan, linkedid, linkedid);
+}
+
/*!
- \brief Propagate the linked id from one channel to the other
+ \brief Propagate the oldest linkedid between associated channels
*/
void ast_channel_set_linkgroup(struct ast_channel *chan, struct ast_channel *peer)
@@ -3912,18 +3925,18 @@
/* just in case setting a stringfield to itself causes problems */
linkedid = ast_strdupa(linkedid);
- ast_string_field_set(chan, linkedid, linkedid);
- ast_string_field_set(peer, linkedid, linkedid);
+ ast_channel_change_linkedid(chan, linkedid);
+ ast_channel_change_linkedid(peer, linkedid);
if (chan->_bridge) {
bridged = ast_bridged_channel(chan);
if (bridged != peer) {
- ast_string_field_set(bridged, linkedid, linkedid);
+ ast_channel_change_linkedid(bridged, linkedid);
}
}
if (peer->_bridge) {
bridged = ast_bridged_channel(peer);
if (bridged != chan) {
- ast_string_field_set(bridged, linkedid, linkedid);
+ ast_channel_change_linkedid(bridged, linkedid);
}
}
}
More information about the asterisk-commits
mailing list