[asterisk-commits] rmudgett: branch rmudgett/bridge_phase r393057 - /team/rmudgett/bridge_phase/...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Jun 27 11:30:58 CDT 2013


Author: rmudgett
Date: Thu Jun 27 11:30:56 2013
New Revision: 393057

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=393057
Log:
Implement agent waiting COLP.

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=393057&r1=393056&r2=393057
==============================================================================
--- team/rmudgett/bridge_phase/apps/app_agent_pool.c (original)
+++ team/rmudgett/bridge_phase/apps/app_agent_pool.c Thu Jun 27 11:30:56 2013
@@ -72,6 +72,11 @@
 			and will hear a configurable <literal>beep</literal> sound when a new call
 			comes in for the agent.  Login failures will continue in the dialplan
 			with AGENT_STATUS set.</para>
+			<para>Before logging in, you can setup on the real agent channel the
+			CHANNEL(dtmf-features) an agent will have when talking to a caller
+			and you can setup on the channel running this application the
+			CONNECTEDLINE() information the agent will see while waiting for a
+			caller.</para>
 			<para>AGENT_STATUS enumeration values:</para>
 			<enumlist>
 				<enum name = "INVALID"><para>The specified agent is invalid.</para></enum>
@@ -87,6 +92,7 @@
 			<ref type="application">UnpauseQueueMember</ref>
 			<ref type="function">AGENT</ref>
 			<ref type="function">CHANNEL(dtmf-features)</ref>
+			<ref type="function">CONNECTEDLINE()</ref>
 			<ref type="filename">agents.conf</ref>
 			<ref type="filename">queues.conf</ref>
 		</see-also>
@@ -236,7 +242,6 @@
 		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.
@@ -512,6 +517,8 @@
 		/*! Login override DTMF string for an agent to accept a call. */
 		AST_STRING_FIELD(override_dtmf_accept);
 	);
+	/*! Connected line information to send when reentering the holding bridge. */
+	struct ast_party_connected_line waiting_colp;
 	/*! Flags show if settings were overridden by channel vars. */
 	unsigned int flags;
 	/*! Login override number of seconds for agent to ack a call before being logged off. */
@@ -671,6 +678,11 @@
 		agent_devstate_changed(doomed->username);
 	}
 
+	ast_party_connected_line_free(&doomed->waiting_colp);
+	if (doomed->caller_bridge) {
+		ast_bridge_destroy(doomed->caller_bridge);
+		doomed->caller_bridge = NULL;
+	}
 	if (doomed->logged) {
 		doomed->logged = ast_channel_unref(doomed->logged);
 	}
@@ -692,6 +704,7 @@
 		return NULL;
 	}
 	ast_string_field_set(agent, username, cfg->username);
+	ast_party_connected_line_init(&agent->waiting_colp);
 	ao2_ref(cfg, +1);
 	agent->cfg = cfg;
 	agent->devstate = AST_DEVICE_UNAVAILABLE;
@@ -1432,6 +1445,12 @@
 				|| ast_check_hangup_locked(logged)) {
 				break;
 			}
+
+			/*
+			 * It is safe to access agent->waiting_colp without a lock.  It
+			 * is only setup on agent login and not changed.
+			 */
+			ast_channel_update_connected_line(logged, &agent->waiting_colp, NULL);
 		}
 		ast_channel_unref(logged);
 		ast_bridge_features_cleanup(&features);
@@ -1720,25 +1739,30 @@
 
 /*!
  * \internal
- * \brief Setup agent override config values.
+ * \brief Get agent config values from the login channel.
  * \since 12.0.0
  *
- * \param agent What to setup override config values on.
+ * \param agent What to setup channel config values on.
  * \param chan Channel logging in as an agent.
  *
  * \return Nothing
  */
-static void agent_login_override_config(struct agent_pvt *agent, struct ast_channel *chan)
+static void agent_login_channel_config(struct agent_pvt *agent, struct ast_channel *chan)
 {
 	struct ast_flags opts = { 0 };
+	struct ast_party_connected_line connected;
 	unsigned int override_ack_call = 0;
 	unsigned int override_auto_logoff = 0;
 	unsigned int override_wrapup_time = 0;
 	const char *override_dtmf_accept = NULL;
 	const char *var;
 
-	/* Get override values from channel. */
+	ast_party_connected_line_init(&connected);
+
+	/* Get config values from channel. */
 	ast_channel_lock(chan);
+	ast_party_connected_line_copy(&connected, ast_channel_connected(chan));
+
 	var = pbx_builtin_getvar_helper(chan, "AGENTACKCALL");
 	if (!ast_strlen_zero(var)) {
 		override_ack_call = ast_true(var) ? 1 : 0;
@@ -1766,8 +1790,11 @@
 	}
 	ast_channel_unlock(chan);
 
-	/* Set override values on agent. */
+	/* Set config values on agent. */
 	agent_lock(agent);
+	ast_party_connected_line_free(&agent->waiting_colp);
+	agent->waiting_colp = connected;
+
 	ast_string_field_set(agent, override_dtmf_accept, override_dtmf_accept);
 	ast_copy_flags(agent, &opts, AST_FLAGS_ALL);
 	agent->override_auto_logoff = override_auto_logoff;
@@ -1846,7 +1873,7 @@
 	time(&agent->login_start);
 	agent_unlock(agent);
 
-	agent_login_override_config(agent, chan);
+	agent_login_channel_config(agent, chan);
 
 	if (!ast_test_flag(&opts, OPT_SILENT)
 		&& !ast_streamfile(chan, "agent-loginok", ast_channel_language(chan))) {




More information about the asterisk-commits mailing list