Author: mmichelson Date: Wed Jun 26 11:17:44 2013 New Revision: 392969 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=392969 Log: Get blond transfers working properly.
This change involves changing the BLOND state to a terminal one. The idea originally was for this state to not be terminal so that it could transition in case we need to re-call any of the parties involved. However, I am instead going to create a different state to be used for that scenario. Modified: team/mmichelson/atxfer_features/main/bridging_basic.c Modified: team/mmichelson/atxfer_features/main/bridging_basic.c URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/atxfer_features/main/bridging_basic.c?view=diff&rev=392969&r1=392968&r2=392969 ============================================================================== --- team/mmichelson/atxfer_features/main/bridging_basic.c (original) +++ team/mmichelson/atxfer_features/main/bridging_basic.c Wed Jun 26 11:17:44 2013 @@ -514,6 +514,19 @@ ast_bridge_channel_write_unhold(bridge_channel); } +static void ringing(struct ast_channel *chan) +{ + RAII_VAR(struct ast_bridge_channel *, bridge_channel, NULL, ao2_cleanup); + + ast_channel_lock(chan); + bridge_channel = ast_channel_get_bridge_channel(chan); + ast_channel_unlock(chan); + + ast_assert(bridge_channel != NULL); + + ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_RINGING, NULL, 0); +} + static void bridge_unhold(struct ast_bridge *bridge) { struct ast_frame unhold = { @@ -590,11 +603,7 @@ return TRANSFER_FAIL; case STIMULUS_DTMF_ATXFER_COMPLETE: case STIMULUS_TRANSFERER_HANGUP: - /* XXX For this state change, I need to take the - * transferee off hold, but the transferer is not in the - * bridge. Can I just write directly to the bridge? - * Queue it on the bridge? - */ + bridge_unhold(props->transferee_bridge); return TRANSFER_BLOND; case STIMULUS_TARGET_ANSWER: return TRANSFER_CONSULTING; @@ -773,49 +782,24 @@ static int complete_enter(struct attended_transfer_properties *props) { - if (props->transferer) { + if (ast_check_hangup(props->transferer)) { + bridge_merge(props->transferee_bridge, props->target_bridge, NULL, 0); + } else { bridge_merge(props->transferee_bridge, props->target_bridge, &props->transferer, 1); + } + + return 0; +} + +static int blond_enter(struct attended_transfer_properties *props) +{ + if (ast_check_hangup(props->transferer)) { + bridge_merge(props->transferee_bridge, props->target_bridge, NULL, 0); } else { - bridge_merge(props->transferee_bridge, props->target_bridge, NULL, 0); - } - - return 0; -} - -static int blond_enter(struct attended_transfer_properties *props) -{ - if (ast_check_hangup(props->transferer)) { - return 0; - } - ast_softhangup(props->transferer, AST_SOFTHANGUP_EXPLICIT); - props->transferer = ast_channel_unref(props->transferer); - return 0; -} - -static enum attended_transfer_state blond_next(struct attended_transfer_properties *props, - enum attended_transfer_stimulus stimulus) -{ - switch (stimulus) { - default: - case STIMULUS_NONE: - case STIMULUS_DTMF_ATXFER_ABORT: - case STIMULUS_DTMF_ATXFER_COMPLETE: - case STIMULUS_DTMF_ATXFER_THREEWAY: - case STIMULUS_DTMF_ATXFER_SWAP: - case STIMULUS_TRANSFERER_HANGUP: - case STIMULUS_TRANSFERER_ANSWER: - ast_assert(0); - case STIMULUS_TRANSFEREE_HANGUP: - return TRANSFER_FAIL; - case STIMULUS_TARGET_ANSWER: - return TRANSFER_COMPLETE; - case STIMULUS_TARGET_HANGUP: - case STIMULUS_TIMEOUT: - if (props->atxferdropcall) { - return TRANSFER_FAIL; - } - return TRANSFER_RECALLING; - } + bridge_merge(props->transferee_bridge, props->target_bridge, &props->transferer, 1); + } + ringing(props->transfer_target); + return 0; } static int recalling_enter(struct attended_transfer_properties *props) @@ -871,6 +855,7 @@ static enum attended_transfer_state retransfer_next(struct attended_transfer_properties *props, enum attended_transfer_stimulus stimulus) { + /* XXX This is no longer correct */ return TRANSFER_BLOND; } @@ -938,8 +923,7 @@ [TRANSFER_BLOND] = { .state_name = "Blond", .enter = blond_enter, - .next = blond_next, - .flags = TRANSFER_STATE_IS_TIMED, + .flags = TRANSFER_STATE_IS_TERMINAL, }, [TRANSFER_RECALLING] = { .state_name = "Recalling", -- _____________________________________________________________________ -- 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