Author: rmudgett Date: Wed Jun 26 20:15:05 2013 New Revision: 393031 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=393031 Log: Complete connecting the agent to the caller.
Modified: team/rmudgett/bridge_phase/apps/app_agent_pool.c Modified: team/rmudgett/bridge_phase/apps/app_agent_pool.c URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/apps/app_agent_pool.c?view=diff&rev=393031&r1=393030&r2=393031 ============================================================================== --- team/rmudgett/bridge_phase/apps/app_agent_pool.c (original) +++ team/rmudgett/bridge_phase/apps/app_agent_pool.c Wed Jun 26 20:15:05 2013 @@ -236,6 +236,7 @@ AST_STRING_FIELD(save_calls_in); /*! Recording format filename extension. */ AST_STRING_FIELD(record_format); +/* BUGBUG Add an agent waiting COLP to differentiate between an incomming caller's COLP and so the caller's COLP does not hang around after the call. */ ); /*! * \brief Number of seconds for agent to ack a call before being logged off. @@ -922,12 +923,60 @@ /*! Agent holding bridge deferred creation lock. */ AST_MUTEX_DEFINE_STATIC(agent_holding_lock); +/*! + * \internal + * \brief Connect the agent with the waiting caller. + * \since 12.0.0 + * + * \param bridge_channel Agent channel connecting to the caller. + * \param agent Which agent is connecting to the caller. + * + * \note The agent is locked on entry and not locked on exit. + * + * \return Nothing + */ +static void agent_connect_caller(struct ast_bridge_channel *bridge_channel, struct agent_pvt *agent) +{ + struct ast_bridge *caller_bridge; + int res; + + caller_bridge = agent->caller_bridge; + agent->caller_bridge = NULL; + agent->state = AGENT_STATE_ON_CALL; + time(&agent->call_start); + agent_unlock(agent); + + if (!caller_bridge) { + /* Reset agent. */ + ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_END); + return; + } + res = ast_bridge_move(caller_bridge, bridge_channel->bridge, bridge_channel->chan, + NULL, 0); + if (res) { + /* Reset agent. */ + ast_bridge_destroy(caller_bridge); + ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_END); + return; + } + ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_ANSWER, NULL, 0); +} + static int bridge_agent_hold_ack(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, void *hook_pvt) { -// struct agent_pvt *agent = hook_pvt; - - /* Connect to caller now. */ - /*! \todo BUGBUG bridge_agent_hold_ack() not written */ + struct agent_pvt *agent = hook_pvt; + + agent_lock(agent); + switch (agent->state) { + case AGENT_STATE_CALL_WAIT_ACK: + /* Connect to caller now. */ + ast_debug(1, "Agent %s: Acked call.\n", agent->username); + agent_connect_caller(bridge_channel, agent); + return 0; + default: + break; + } + agent_unlock(agent); return 0; } @@ -1523,17 +1572,17 @@ ? agent->override_ack_call : agent->cfg->ack_call) { agent->state = AGENT_STATE_CALL_WAIT_ACK; agent->ack_time = ast_tvnow(); - } else { - /* Connect to caller now. */ -/* BUGBUG need to finish here. */ - } - break; + break; + } + + /* Connect to caller now. */ + ast_debug(1, "Agent %s: Immediately connecting to call.\n", agent->username); + agent_connect_caller(bridge_channel, agent); + return; default: break; } agent_unlock(agent); - - /*! \todo BUGBUG agent_alert() not written */ } static int send_alert_to_agent(struct ast_bridge_channel *bridge_channel, const char *agent_id) @@ -1666,6 +1715,7 @@ ast_bridge_features_cleanup(&caller_features); ast_verb(3, "Agent '%s' not logged in.\n", agent->username); pbx_builtin_setvar_helper(chan, "AGENT_STATUS", "NOT_LOGGED_IN"); + caller_abort_agent(agent); return 0; } @@ -1684,7 +1734,7 @@ return 0; } - ast_queue_control(chan, AST_CONTROL_RINGING); + ast_indicate(chan, AST_CONTROL_RINGING); ast_bridge_join(caller_bridge, chan, NULL, &caller_features, NULL, 1); ast_bridge_features_cleanup(&caller_features); -- _____________________________________________________________________ -- 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