summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2013-07-19 19:23:39 +0000
committerKinsey Moore <kmoore@digium.com>2013-07-19 19:23:39 +0000
commit5a8f32703c445f7d09b5e029e85d76692626a67f (patch)
treeb8ad7eea354b19249f7ccf593f65584e5c1b5625 /main
parent0b83761f9a99d18105ad6cb13dd0282a85641f03 (diff)
Filter channels used as internal mechanisms
This adds new flags to the channel tech properties that flag it as different types of implementation detail used exclusively to provide a feature. Examples of channels that would have these flags include the announcement and recording channels used by confbridge which are the only two marked as such by this patch. Review: https://reviewboard.asterisk.org/r/2633/ (closes issue ASTERISK-21873) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@394808 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r--main/cdr.c6
-rw-r--r--main/cel.c24
-rw-r--r--main/manager_bridging.c29
-rw-r--r--main/manager_channels.c12
-rw-r--r--main/stasis_channels.c1
5 files changed, 66 insertions, 6 deletions
diff --git a/main/cdr.c b/main/cdr.c
index 57651aeef..056ca32a9 100644
--- a/main/cdr.c
+++ b/main/cdr.c
@@ -1902,11 +1902,7 @@ static int cdr_object_update_party_b(void *obj, void *arg, int flags)
/*! \internal \brief Filter channel snapshots by technology */
static int filter_channel_snapshot(struct ast_channel_snapshot *snapshot)
{
- if (!strncmp(snapshot->name, "CBAnn", 5) ||
- !strncmp(snapshot->name, "CBRec", 5)) {
- return 1;
- }
- return 0;
+ return snapshot->tech_properties & (AST_CHAN_TP_ANNOUNCER | AST_CHAN_TP_RECORDER);
}
/*! \internal \brief Filter a channel cache update */
diff --git a/main/cel.c b/main/cel.c
index 209d1451a..0e9519a1d 100644
--- a/main/cel.c
+++ b/main/cel.c
@@ -1196,6 +1196,14 @@ static void clear_bridge_primary(const char *bridge_id)
ao2_callback(bridge_primaries, OBJ_KEY | OBJ_NODATA | OBJ_UNLINK | OBJ_MULTIPLE, bridge_match_cb, dup_id);
}
+static int cel_filter_channel_snapshot(struct ast_channel_snapshot *snapshot)
+{
+ if (!snapshot) {
+ return 0;
+ }
+ return snapshot->tech_properties & (AST_CHAN_TP_ANNOUNCER | AST_CHAN_TP_RECORDER);
+}
+
static void cel_snapshot_update_cb(void *data, struct stasis_subscription *sub,
struct stasis_topic *topic,
struct stasis_message *message)
@@ -1209,6 +1217,10 @@ static void cel_snapshot_update_cb(void *data, struct stasis_subscription *sub,
old_snapshot = stasis_message_data(update->old_snapshot);
new_snapshot = stasis_message_data(update->new_snapshot);
+ if (cel_filter_channel_snapshot(old_snapshot) || cel_filter_channel_snapshot(new_snapshot)) {
+ return;
+ }
+
update_bridge_primary(new_snapshot);
for (i = 0; i < ARRAY_LEN(cel_channel_monitors); ++i) {
@@ -1242,6 +1254,10 @@ static void cel_bridge_enter_cb(
struct ast_channel_snapshot *chan_snapshot = blob->channel;
RAII_VAR(struct bridge_assoc *, assoc, find_bridge_primary_by_bridge_id(snapshot->uniqueid), ao2_cleanup);
+ if (cel_filter_channel_snapshot(chan_snapshot)) {
+ return;
+ }
+
if (snapshot->capabilities & (AST_BRIDGE_CAPABILITY_1TO1MIX | AST_BRIDGE_CAPABILITY_NATIVE)) {
if (assoc && assoc->track_as_conf) {
report_event_snapshot(chan_snapshot, AST_CEL_CONF_ENTER, NULL, NULL, NULL);
@@ -1303,6 +1319,10 @@ static void cel_bridge_leave_cb(
struct ast_bridge_snapshot *snapshot = blob->bridge;
struct ast_channel_snapshot *chan_snapshot = blob->channel;
+ if (cel_filter_channel_snapshot(chan_snapshot)) {
+ return;
+ }
+
if (snapshot->capabilities & (AST_BRIDGE_CAPABILITY_1TO1MIX | AST_BRIDGE_CAPABILITY_NATIVE)) {
RAII_VAR(struct bridge_assoc *, assoc,
find_bridge_primary_by_bridge_id(snapshot->uniqueid),
@@ -1366,6 +1386,10 @@ static void cel_dial_cb(void *data, struct stasis_subscription *sub,
{
struct ast_multi_channel_blob *blob = stasis_message_data(message);
+ if (cel_filter_channel_snapshot(ast_multi_channel_blob_get_channel(blob, "caller"))) {
+ return;
+ }
+
if (!get_caller_uniqueid(blob)) {
return;
}
diff --git a/main/manager_bridging.c b/main/manager_bridging.c
index 7fbbbea0b..ccad94785 100644
--- a/main/manager_bridging.c
+++ b/main/manager_bridging.c
@@ -140,6 +140,7 @@ struct ast_str *ast_manager_build_bridge_state_string(
suffix, snapshot->num_channels);
if (!res) {
+ ast_free(out);
return NULL;
}
@@ -239,6 +240,9 @@ static void bridge_merge_cb(void *data, struct stasis_subscription *sub,
to_text = ast_manager_build_bridge_state_string(merge_msg->to, "");
from_text = ast_manager_build_bridge_state_string(merge_msg->from, "From");
+ if (!to_text || !from_text) {
+ return;
+ }
/*** DOCUMENTATION
<managerEventInstance>
@@ -271,6 +275,9 @@ static void channel_enter_cb(void *data, struct stasis_subscription *sub,
bridge_text = ast_manager_build_bridge_state_string(blob->bridge, "");
channel_text = ast_manager_build_channel_state_string(blob->channel);
+ if (!bridge_text || !channel_text) {
+ return;
+ }
manager_event(EVENT_FLAG_CALL, "BridgeEnter",
"%s"
@@ -289,6 +296,9 @@ static void channel_leave_cb(void *data, struct stasis_subscription *sub,
bridge_text = ast_manager_build_bridge_state_string(blob->bridge, "");
channel_text = ast_manager_build_channel_state_string(blob->channel);
+ if (!bridge_text || !channel_text) {
+ return;
+ }
manager_event(EVENT_FLAG_CALL, "BridgeLeave",
"%s"
@@ -312,6 +322,10 @@ static int send_bridge_list_item_cb(void *obj, void *arg, void *data, int flags)
char *id_text = data;
RAII_VAR(struct ast_str *, bridge_info, ast_manager_build_bridge_state_string(snapshot, ""), ast_free);
+ if (!bridge_info) {
+ return 0;
+ }
+
astman_append(s,
"Event: BridgeListItem\r\n"
"%s"
@@ -367,6 +381,19 @@ static int send_bridge_info_item_cb(void *obj, void *arg, void *data, int flags)
char *uniqueid = obj;
struct mansession *s = arg;
char *id_text = data;
+ RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
+ struct ast_channel_snapshot *snapshot;
+ msg = stasis_cache_get(ast_channel_topic_all_cached(),
+ ast_channel_snapshot_type(), uniqueid);
+
+ if (!msg) {
+ return 0;
+ }
+
+ snapshot = stasis_message_data(msg);
+ if (snapshot->tech_properties & (AST_CHAN_TP_ANNOUNCER | AST_CHAN_TP_RECORDER)) {
+ return 0;
+ }
astman_append(s,
"Event: BridgeInfoChannel\r\n"
@@ -419,7 +446,7 @@ static int manager_bridge_info(struct mansession *s, const struct message *m)
"%s"
"%s"
"\r\n",
- ast_str_buffer(bridge_info),
+ S_COR(bridge_info, ast_str_buffer(bridge_info), ""),
ast_str_buffer(id_text));
return 0;
diff --git a/main/manager_channels.c b/main/manager_channels.c
index bc9e83d6e..6e8621973 100644
--- a/main/manager_channels.c
+++ b/main/manager_channels.c
@@ -533,6 +533,11 @@ struct ast_str *ast_manager_build_channel_state_string_prefix(
return NULL;
}
+ if (snapshot->tech_properties & (AST_CHAN_TP_ANNOUNCER | AST_CHAN_TP_RECORDER)) {
+ ast_free(out);
+ return NULL;
+ }
+
res = ast_str_set(&out, 0,
"%sChannel: %s\r\n"
"%sChannelState: %d\r\n"
@@ -560,6 +565,7 @@ struct ast_str *ast_manager_build_channel_state_string_prefix(
prefix, snapshot->uniqueid);
if (!res) {
+ ast_free(out);
return NULL;
}
@@ -1209,6 +1215,9 @@ static void channel_hold_cb(void *data, struct stasis_subscription *sub,
}
channel_event_string = ast_manager_build_channel_state_string(obj->snapshot);
+ if (!channel_event_string) {
+ return;
+ }
if (obj->blob) {
musicclass = ast_json_string_get(ast_json_object_get(obj->blob, "musicclass"));
@@ -1232,6 +1241,9 @@ static void channel_unhold_cb(void *data, struct stasis_subscription *sub,
RAII_VAR(struct ast_str *, channel_event_string, NULL, ast_free);
channel_event_string = ast_manager_build_channel_state_string(obj->snapshot);
+ if (!channel_event_string) {
+ return;
+ }
manager_event(EVENT_FLAG_CALL, "Unhold",
"%s",
diff --git a/main/stasis_channels.c b/main/stasis_channels.c
index be6521356..36a953e26 100644
--- a/main/stasis_channels.c
+++ b/main/stasis_channels.c
@@ -256,6 +256,7 @@ struct ast_channel_snapshot *ast_channel_snapshot_create(struct ast_channel *cha
snapshot->manager_vars = ast_channel_get_manager_vars(chan);
snapshot->channel_vars = ast_channel_get_vars(chan);
+ snapshot->tech_properties = ast_channel_tech(chan)->properties;
ao2_ref(snapshot, +1);
return snapshot;