[asterisk-commits] murf: branch group/newcdr r164347 - in /team/group/newcdr: ./ apps/ main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Dec 15 11:53:03 CST 2008
Author: murf
Date: Mon Dec 15 11:53:02 2008
New Revision: 164347
URL: http://svn.digium.com/view/asterisk?view=rev&rev=164347
Log:
Merged revisions 164202-164203,164205,164208 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r164202 | russell | 2008-12-15 07:40:08 -0700 (Mon, 15 Dec 2008) | 2 lines
Fix build WRT ast_str_opaque
................
r164203 | russell | 2008-12-15 07:40:24 -0700 (Mon, 15 Dec 2008) | 39 lines
Merged revisions 164201 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r164201 | russell | 2008-12-15 08:31:37 -0600 (Mon, 15 Dec 2008) | 31 lines
Handle a case where a call can be bridged to a channel that is still ringing.
The issue that was reported was about a case where a RINGING channel got
redirected to an extension to pick up a call from parking. Once the parked
call got taken out of parking, it heard silence until the other side answered.
Ideally, the caller that was parked would get a ringing indication. This patch
fixes this case so that the caller receives ringback once it comes out of
parking until the other side answers.
The fixes are:
- Make sure we remember that a channel was an outgoing channel when doing
a masquerade. This prevents an erroneous ast_answer() call on the channel,
which causes a bogus 200 OK to be sent in the case of SIP.
- Add some additional comments to explain related parts of code.
- Update the handling of the ast_channel visible_indication field. Storing
values that are not stateful is pointless. Control frames that are events
or commands should be ignored.
- When a bridge first starts, check to see if the peer channel needs to be
given ringing indication because the calling side is still ringing.
- Rework ast_indicate_data() a bit for the sake of readability.
(closes issue #13747)
Reported by: davidw
Tested by: russell
Review: http://reviewboard.digium.com/r/90/
........
................
r164205 | file | 2008-12-15 08:06:38 -0700 (Mon, 15 Dec 2008) | 10 lines
Blocked revisions 164204 via svnmerge
........
r164204 | file | 2008-12-15 11:05:08 -0400 (Mon, 15 Dec 2008) | 4 lines
Can we try not to assign an unsigned int to -1?
(closes issue #14074)
Reported by: wetwired
........
................
r164208 | file | 2008-12-15 08:21:23 -0700 (Mon, 15 Dec 2008) | 2 lines
Update to work with new ast_str changes.
................
Modified:
team/group/newcdr/ (props changed)
team/group/newcdr/apps/app_jack.c
team/group/newcdr/main/channel.c
team/group/newcdr/main/features.c
team/group/newcdr/main/utils.c
Propchange: team/group/newcdr/
------------------------------------------------------------------------------
Binary property 'branch-1.4-blocked' - no diff available.
Propchange: team/group/newcdr/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.
Propchange: team/group/newcdr/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Dec 15 11:53:02 2008
@@ -1,1 +1,1 @@
-/trunk:1-164174
+/trunk:1-164222
Modified: team/group/newcdr/apps/app_jack.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/apps/app_jack.c?view=diff&rev=164347&r1=164346&r2=164347
==============================================================================
--- team/group/newcdr/apps/app_jack.c (original)
+++ team/group/newcdr/apps/app_jack.c Mon Dec 15 11:53:02 2008
@@ -182,7 +182,7 @@
ast_str_append(&str, 0, ", %s", jack_status_to_str((1 << i)));
}
- ast_log(LOG_NOTICE, "%s: %s\n", prefix, str->str);
+ ast_log(LOG_NOTICE, "%s: %s\n", prefix, ast_str_buffer(str));
}
static int alloc_resampler(struct jack_data *jack_data, int input)
Modified: team/group/newcdr/main/channel.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/main/channel.c?view=diff&rev=164347&r1=164346&r2=164347
==============================================================================
--- team/group/newcdr/main/channel.c (original)
+++ team/group/newcdr/main/channel.c Mon Dec 15 11:53:02 2008
@@ -2948,64 +2948,126 @@
return ast_indicate_data(chan, condition, NULL, 0);
}
-int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen)
-{
+static int attribute_const is_visible_indication(enum ast_control_frame_type condition)
+{
+ /* Don't include a default case here so that we get compiler warnings
+ * when a new type is added. */
+
+ switch (condition) {
+ case AST_CONTROL_PROGRESS:
+ case AST_CONTROL_PROCEEDING:
+ case AST_CONTROL_VIDUPDATE:
+ case AST_CONTROL_SRCUPDATE:
+ case AST_CONTROL_RADIO_KEY:
+ case AST_CONTROL_RADIO_UNKEY:
+ case AST_CONTROL_OPTION:
+ case AST_CONTROL_WINK:
+ case AST_CONTROL_FLASH:
+ case AST_CONTROL_OFFHOOK:
+ case AST_CONTROL_TAKEOFFHOOK:
+ case AST_CONTROL_ANSWER:
+ case AST_CONTROL_HANGUP:
+ case AST_CONTROL_T38:
+ return 0;
+
+ case AST_CONTROL_CONGESTION:
+ case AST_CONTROL_BUSY:
+ case AST_CONTROL_RINGING:
+ case AST_CONTROL_RING:
+ case AST_CONTROL_HOLD:
+ case AST_CONTROL_UNHOLD:
+ return 1;
+ }
+
+ return 0;
+}
+
+int ast_indicate_data(struct ast_channel *chan, int _condition,
+ const void *data, size_t datalen)
+{
+ /* By using an enum, we'll get compiler warnings for values not handled
+ * in switch statements. */
+ enum ast_control_frame_type condition = _condition;
+ const struct ind_tone_zone_sound *ts = NULL;
int res = -1;
ast_channel_lock(chan);
- /* Stop if we're a zombie or need a soft hangup */
+
+ /* Don't bother if the channel is about to go away, anyway. */
if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
ast_channel_unlock(chan);
return -1;
}
- if (chan->tech->indicate)
+
+ if (chan->tech->indicate) {
+ /* See if the channel driver can handle this condition. */
res = chan->tech->indicate(chan, condition, data, datalen);
+ }
+
ast_channel_unlock(chan);
- if (!chan->tech->indicate || res) {
- /*
- * Device does not support (that) indication, lets fake
- * it by doing our own tone generation. (PM2002)
- */
- if (condition < 0)
- ast_playtones_stop(chan);
- else {
- const struct ind_tone_zone_sound *ts = NULL;
- switch (condition) {
- case AST_CONTROL_RINGING:
- ts = ast_get_indication_tone(chan->zone, "ring");
- break;
- case AST_CONTROL_BUSY:
- ts = ast_get_indication_tone(chan->zone, "busy");
- break;
- case AST_CONTROL_CONGESTION:
- ts = ast_get_indication_tone(chan->zone, "congestion");
- break;
- }
- if (ts && ts->data[0]) {
- ast_debug(1, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
- ast_playtones_start(chan,0,ts->data, 1);
- res = 0;
- chan->visible_indication = condition;
- } else if (condition == AST_CONTROL_PROGRESS) {
- /* ast_playtones_stop(chan); */
- } else if (condition == AST_CONTROL_PROCEEDING) {
- /* Do nothing, really */
- } else if (condition == AST_CONTROL_HOLD) {
- /* Do nothing.... */
- } else if (condition == AST_CONTROL_UNHOLD) {
- /* Do nothing.... */
- } else if (condition == AST_CONTROL_VIDUPDATE) {
- /* Do nothing.... */
- } else if (condition == AST_CONTROL_SRCUPDATE) {
- /* Do nothing... */
- } else {
- /* not handled */
- ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name);
- res = -1;
- }
- }
- } else
+
+ if (chan->tech->indicate && !res) {
+ /* The channel driver successfully handled this indication */
+ if (is_visible_indication(condition)) {
+ chan->visible_indication = condition;
+ }
+ return 0;
+ }
+
+ /* The channel driver does not support this indication, let's fake
+ * it by doing our own tone generation if applicable. */
+
+ if (condition < 0) {
+ /* Stop any tones that are playing */
+ ast_playtones_stop(chan);
+ return 0;
+ }
+
+ /* Handle conditions that we have tones for. */
+ switch (condition) {
+ case AST_CONTROL_RINGING:
+ ts = ast_get_indication_tone(chan->zone, "ring");
+ break;
+ case AST_CONTROL_BUSY:
+ ts = ast_get_indication_tone(chan->zone, "busy");
+ break;
+ case AST_CONTROL_CONGESTION:
+ ts = ast_get_indication_tone(chan->zone, "congestion");
+ break;
+ case AST_CONTROL_PROGRESS:
+ case AST_CONTROL_PROCEEDING:
+ case AST_CONTROL_VIDUPDATE:
+ case AST_CONTROL_SRCUPDATE:
+ case AST_CONTROL_RADIO_KEY:
+ case AST_CONTROL_RADIO_UNKEY:
+ case AST_CONTROL_OPTION:
+ case AST_CONTROL_WINK:
+ case AST_CONTROL_FLASH:
+ case AST_CONTROL_OFFHOOK:
+ case AST_CONTROL_TAKEOFFHOOK:
+ case AST_CONTROL_ANSWER:
+ case AST_CONTROL_HANGUP:
+ case AST_CONTROL_RING:
+ case AST_CONTROL_HOLD:
+ case AST_CONTROL_UNHOLD:
+ case AST_CONTROL_T38:
+ /* Nothing left to do for these. */
+ res = 0;
+ break;
+ }
+
+ if (ts && ts->data[0]) {
+ /* We have a tone to play, yay. */
+ ast_debug(1, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
+ ast_playtones_start(chan, 0, ts->data, 1);
+ res = 0;
chan->visible_indication = condition;
+ }
+
+ if (res) {
+ /* not handled */
+ ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name);
+ }
return res;
}
@@ -4294,6 +4356,8 @@
/* Clone exception becomes real one, as with fdno */
ast_copy_flags(original, clone, AST_FLAG_EXCEPTION);
original->fdno = clone->fdno;
+ ast_copy_flags(original, clone, AST_FLAG_EXCEPTION | AST_FLAG_OUTGOING);
+ original->fdno = clone->fdno;
/* Schedule context remains the same */
/* Stream stuff stays the same */
/* Keep the original state. The fixup code will need to work with it most likely */
@@ -4346,10 +4410,18 @@
ast_log(LOG_WARNING, "Channel type '%s' does not have a fixup routine (for %s)! Bad things may happen.\n",
original->tech->type, original->name);
- /* If an indication is currently playing maintain it on the channel that is taking the place of original */
- if (original->visible_indication)
+ /*
+ * If an indication is currently playing, maintain it on the channel
+ * that is taking the place of original
+ *
+ * This is needed because the masquerade is swapping out in the internals
+ * of this channel, and the new channel private data needs to be made
+ * aware of the current visible indication (RINGING, CONGESTION, etc.)
+ */
+ if (original->visible_indication) {
ast_indicate(original, original->visible_indication);
-
+ }
+
/* Now, at this point, the "clone" channel is totally F'd up. We mark it as
a zombie so nothing tries to touch it. If it's already been marked as a
zombie, then free it now (since it already is considered invalid). */
@@ -4741,7 +4813,6 @@
c1->_bridge = c0;
ast_set_owners_and_peers(c0, c1);
- ast_cel_report_event(c0, CEL_BRIDGE_START, NULL, NULL, NULL);
o0nativeformats = c0->nativeformats;
o1nativeformats = c1->nativeformats;
@@ -4915,7 +4986,7 @@
if (ast_channel_make_compatible(c0, c1)) {
ast_log(LOG_WARNING, "Can't make %s and %s compatible\n", c0->name, c1->name);
manager_bridge_event(0, 1, c0, c1);
- ast_cel_report_event(c0, CEL_BRIDGE_END, NULL, NULL, NULL);
+ /* ast_cel_report_event(c0, CEL_BRIDGE_END, NULL, NULL, NULL); */
return AST_BRIDGE_FAILED;
}
o0nativeformats = c0->nativeformats;
Modified: team/group/newcdr/main/features.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/main/features.c?view=diff&rev=164347&r1=164346&r2=164347
==============================================================================
--- team/group/newcdr/main/features.c (original)
+++ team/group/newcdr/main/features.c Mon Dec 15 11:53:02 2008
@@ -2244,8 +2244,16 @@
if (chan && peer) {
pbx_builtin_setvar_helper(chan, "BRIDGEPEER", peer->name);
pbx_builtin_setvar_helper(peer, "BRIDGEPEER", chan->name);
- } else if (chan)
+ } else if (chan) {
pbx_builtin_setvar_helper(chan, "BLINDTRANSFER", NULL);
+ }
+
+ /* This is an interesting case. One example is if a ringing channel gets redirected to
+ * an extension that picks up a parked call. This will make sure that the call taken
+ * out of parking gets told that the channel it just got bridged to is still ringing. */
+ if (chan->_state == AST_STATE_RINGING && peer->visible_indication != AST_CONTROL_RINGING) {
+ ast_indicate(peer, AST_CONTROL_RINGING);
+ }
if (monitor_ok) {
const char *monitor_exec;
@@ -2346,6 +2354,7 @@
ast_set_flag(peer_cdr, AST_CDR_FLAG_BRIDGED);
}
}
+ ast_cel_report_event(chan, CEL_BRIDGE_START, NULL, NULL, NULL);
for (;;) {
struct ast_channel *other; /* used later */
@@ -2508,7 +2517,10 @@
}
before_you_go:
+
+
if (res != AST_PBX_KEEPALIVE && config->end_bridge_callback) {
+ ast_cel_report_event(chan, CEL_BRIDGE_END, NULL, NULL, NULL);
config->end_bridge_callback(config->end_bridge_callback_data);
}
Modified: team/group/newcdr/main/utils.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/main/utils.c?view=diff&rev=164347&r1=164346&r2=164347
==============================================================================
--- team/group/newcdr/main/utils.c (original)
+++ team/group/newcdr/main/utils.c Mon Dec 15 11:53:02 2008
@@ -820,7 +820,7 @@
it's acquired... */
if (lock_info->locks[i].lock_addr == this_lock_addr) {
append_lock_information(&str, lock_info, i);
- ast_log(LOG_NOTICE, "%s", str->str);
+ ast_log(LOG_NOTICE, "%s", ast_str_buffer(str));
break;
}
}
@@ -893,7 +893,7 @@
if (!str)
return CLI_FAILURE;
- ast_cli(a->fd, "%s", str->str);
+ ast_cli(a->fd, "%s", ast_str_buffer(str));
ast_free(str);
More information about the asterisk-commits
mailing list