diff options
Diffstat (limited to 'main/features.c')
-rw-r--r-- | main/features.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/main/features.c b/main/features.c index 9f257f7a0..6f3d0f9cb 100644 --- a/main/features.c +++ b/main/features.c @@ -2408,7 +2408,8 @@ static void atxfer_fail_cleanup(struct ast_channel *transferee, struct ast_chann * Party B was the caller to party C and is the last known mode * for party B. */ - if (ast_channel_connected_line_macro(transferee, transferer, connected_line, 1, 0)) { + if (ast_channel_connected_line_sub(transferee, transferer, connected_line, 0) && + ast_channel_connected_line_macro(transferee, transferer, connected_line, 1, 0)) { ast_channel_update_connected_line(transferer, connected_line, NULL); } ast_party_connected_line_free(connected_line); @@ -2816,7 +2817,8 @@ static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, st ast_party_connected_line_copy(&connected_line, &transferer->connected); ast_channel_unlock(transferer); connected_line.source = AST_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER; - if (ast_channel_connected_line_macro(newchan, xferchan, &connected_line, 1, 0)) { + if (ast_channel_connected_line_sub(newchan, xferchan, &connected_line, 0) && + ast_channel_connected_line_macro(newchan, xferchan, &connected_line, 1, 0)) { ast_channel_update_connected_line(xferchan, &connected_line, NULL); } @@ -2825,7 +2827,8 @@ static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, st ast_connected_line_copy_from_caller(&connected_line, &xferchan->caller); ast_channel_unlock(xferchan); connected_line.source = AST_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER; - if (ast_channel_connected_line_macro(xferchan, newchan, &connected_line, 0, 0)) { + if (ast_channel_connected_line_sub(xferchan, newchan, &connected_line, 0) && + ast_channel_connected_line_macro(xferchan, newchan, &connected_line, 0, 0)) { ast_channel_update_connected_line(newchan, &connected_line, NULL); } @@ -3614,7 +3617,8 @@ static struct ast_channel *feature_request_and_dial(struct ast_channel *caller, ast_party_connected_line_free(&connected); } else { ast_autoservice_start(transferee); - if (ast_channel_connected_line_macro(chan, caller, f, 1, 1)) { + if (ast_channel_connected_line_sub(chan, caller, f, 1) && + ast_channel_connected_line_macro(chan, caller, f, 1, 1)) { ast_indicate_data(caller, AST_CONTROL_CONNECTED_LINE, f->data.ptr, f->datalen); } @@ -3623,7 +3627,8 @@ static struct ast_channel *feature_request_and_dial(struct ast_channel *caller, } else if (f->subclass.integer == AST_CONTROL_REDIRECTING) { if (!caller_hungup) { ast_autoservice_start(transferee); - if (ast_channel_redirecting_macro(chan, caller, f, 1, 1)) { + if (ast_channel_redirecting_sub(chan, caller, f, 1) && + ast_channel_redirecting_macro(chan, caller, f, 1, 1)) { ast_indicate_data(caller, AST_CONTROL_REDIRECTING, f->data.ptr, f->datalen); } @@ -4151,16 +4156,16 @@ int ast_bridge_call(struct ast_channel *chan, struct ast_channel *peer, struct a ast_indicate(other, f->subclass.integer); break; case AST_CONTROL_CONNECTED_LINE: - if (!ast_channel_connected_line_macro(who, other, f, who != chan, 1)) { - break; + if (ast_channel_connected_line_sub(who, other, f, 1) && + ast_channel_connected_line_macro(who, other, f, who != chan, 1)) { + ast_indicate_data(other, f->subclass.integer, f->data.ptr, f->datalen); } - ast_indicate_data(other, f->subclass.integer, f->data.ptr, f->datalen); break; case AST_CONTROL_REDIRECTING: - if (!ast_channel_redirecting_macro(who, other, f, who != chan, 1)) { - break; + if (ast_channel_redirecting_sub(who, other, f, 1) && + ast_channel_redirecting_macro(who, other, f, who != chan, 1)) { + ast_indicate_data(other, f->subclass.integer, f->data.ptr, f->datalen); } - ast_indicate_data(other, f->subclass.integer, f->data.ptr, f->datalen); break; case AST_CONTROL_AOC: case AST_CONTROL_HOLD: @@ -5172,7 +5177,8 @@ static int parked_call_exec(struct ast_channel *chan, const char *data) ast_connected_line_copy_from_caller(&connected, &chan->caller); ast_channel_unlock(chan); connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER; - if (ast_channel_connected_line_macro(chan, peer, &connected, 0, 0)) { + if (ast_channel_connected_line_sub(chan, peer, &connected, 0) && + ast_channel_connected_line_macro(chan, peer, &connected, 0, 0)) { ast_channel_update_connected_line(peer, &connected, NULL); } @@ -5187,7 +5193,8 @@ static int parked_call_exec(struct ast_channel *chan, const char *data) ast_connected_line_copy_from_caller(&connected, &peer->caller); ast_channel_unlock(peer); connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER; - if (ast_channel_connected_line_macro(peer, chan, &connected, 1, 0)) { + if (ast_channel_connected_line_sub(peer, chan, &connected, 0) && + ast_channel_connected_line_macro(peer, chan, &connected, 1, 0)) { ast_channel_update_connected_line(chan, &connected, NULL); } @@ -7319,7 +7326,8 @@ int ast_do_pickup(struct ast_channel *chan, struct ast_channel *target) ast_party_connected_line_copy(&connected_caller, &target->connected); ast_channel_unlock(target);/* The pickup race is avoided so we do not need the lock anymore. */ connected_caller.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER; - if (ast_channel_connected_line_macro(NULL, chan, &connected_caller, 0, 0)) { + if (ast_channel_connected_line_sub(NULL, chan, &connected_caller, 0) && + ast_channel_connected_line_macro(NULL, chan, &connected_caller, 0, 0)) { ast_channel_update_connected_line(chan, &connected_caller, NULL); } ast_party_connected_line_free(&connected_caller); |