[Asterisk-Dev] $50 BOUNTY RE: [Asterisk-Users] Agents / ackcall

Greg Boehnlein damin at nacs.net
Sun Feb 22 18:15:26 MST 2004


The winner of the $50 bounty is... ME!

I wrote the code myself. Maybe I had too much coffee, but once I got into 
it, I couldn't stop. All told it was about 2 hours of me scratching my 
head and trying to remember C programming basics from 10 years ago that 
hasn't been touched in so long that it has cobwebs on it.

I've updated the patch to add support for custom preackannounce 
messages, configureable in the agents.conf file.

The latest patch can be downloaded from:
http://www.nacs.net/~damin/agent-preack-announce.patch

To use it you will need to do the following:

1. Download the patch and stick in in /usr/src/asterisk
2. Apply the patch;

[root at asterisk]# cd /usr/src/asterisk
[root at asterisk asterisk]# patch -p1 < agent-preack-announce.patch 
patching file channels/chan_agent.c

3. Issue a "make install" to rebuild chan_agent.so (or just "make" and 
   copy channels/chan_aget.so to /usr/lib/asterisk/modules)
4. Add a "preackannounce=filename" (do NOT add the .gsm extension) to your 
   agents.config file

Example:

[agents]
preackannounce=all-your-base
agent => 102,1,Xlite Soft Phone

Works for me so far.

Comments appreciated. This is a hack, to be sure, but it works for my 
needs right now.

--- asterisk/channels/chan_agent.c.gjb	2004-02-21 13:55:35.000000000 -0500
+++ asterisk/channels/chan_agent.c	2004-02-22 19:47:25.000000000 -0500
@@ -70,6 +70,7 @@
 "context. \n";
 
 static char moh[80] = "default";
+static char preackannounce[80];              /* Pre Acknowledgement Announcement to play */
 
 #define AST_MAX_AGENT	80		/* Agent ID or Password max length */
 #define AST_MAX_BUF	256
@@ -80,6 +81,7 @@
 static int autologoff;
 static int wrapuptime;
 static int ackcall;
+static int preack;
 
 static int usecnt =0;
 static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
@@ -101,7 +103,8 @@
 	int abouttograb;					/* About to grab */
 	int autologoff;					/* Auto timeout time */
 	int ackcall;					/* ackcall */
-	time_t start;						/* When call started */
+        int preack;                                     /* If we have a preackannounce file */
+        time_t start;						/* When call started */
 	struct timeval lastdisc;			/* When last disconnected */
 	int wrapuptime;						/* Wrapup time in ms */
 	unsigned int group;					/* Group memberships */
@@ -220,6 +223,7 @@
 	strncpy(p->name, name ? name : "", sizeof(p->name) - 1);
 	strncpy(p->moh, moh, sizeof(p->moh) - 1);
 	p->ackcall = ackcall;
+        p->preack = preack;
 	p->autologoff = autologoff;
 	p->wrapuptime = wrapuptime;
 	if (pending)
@@ -281,7 +285,8 @@
 }
 static struct ast_frame  *agent_read(struct ast_channel *ast)
 {
-	struct agent_pvt *p = ast->pvt->pvt;
+        int res = -1;
+        struct agent_pvt *p = ast->pvt->pvt;
 	struct ast_frame *f = NULL;
 	static struct ast_frame null_frame = { AST_FRAME_NULL, };
 	static struct ast_frame answer_frame = { AST_FRAME_CONTROL, AST_CONTROL_ANSWER };
@@ -308,14 +313,32 @@
 		}
 	}
 	if (f && (f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_ANSWER)) {
+	
 /* TC */
 		if (p->ackcall) {
-			if (option_verbose > 2)
-				ast_verbose(VERBOSE_PREFIX_3 "%s answered, waiting for '#' to acknowledge\n", p->chan->name);
+		   if (p->preack == 1)
+		     {
+			
+			ast_stopstream(p->chan);
+			res = ast_streamfile(p->chan, preackannounce, p->chan->language);
+			if (!res)
+			  res = ast_waitstream(p->chan, "");
+			else 
+			  {
+			     
+			     ast_verbose(VERBOSE_PREFIX_3 "ast_streamfile failed on %s\n", p->chan->name);              
+			     res = 0;
+			  }
+			ast_stopstream(p->chan);
+		     }
+		   
+		   if (option_verbose > 2)
+		     ast_verbose(VERBOSE_PREFIX_3 "%s answered, waiting for '#' to acknowledge\n", p->chan->name);
 			/* Don't pass answer along */
 			ast_frfree(f);
 			f = &null_frame;
 	        }
+	   
         else {
 			p->acknowledged = 1;
 			f = &answer_frame;
@@ -730,6 +753,7 @@
 	autologoff = 0;
 	wrapuptime = 0;
 	ackcall = 1;
+        preack = 0;
 	cfg = ast_load(config);
 	if (!cfg) {
 		ast_log(LOG_NOTICE, "No agent configuration found -- agent support disabled\n");
@@ -765,13 +789,16 @@
 			if (!strcasecmp(v->value, "always"))
 				ackcall = 2;
 			else if (ast_true(v->value))
-                ackcall = 1;
+		                ackcall = 1;
 			else
 				ackcall = 0;
 		} else if (!strcasecmp(v->name, "wrapuptime")) {
 			wrapuptime = atoi(v->value);
 			if (wrapuptime < 0)
 				wrapuptime = 0;
+		} else if (!strcasecmp(v->name, "preackannounce")) {
+		        strncpy(preackannounce, v->value, sizeof(preackannounce) - 1);
+		        preack = 1;
 		} else if (!strcasecmp(v->name, "musiconhold")) {
 			strncpy(moh, v->value, sizeof(moh) - 1);
 		} else if (!strcasecmp(v->name, "recordagentcalls")) {

-- 
    Vice President of N2Net, a New Age Consulting Service, Inc. Company
         http://www.n2net.net Where everything clicks into place!
                             KP-216-121-ST




More information about the asterisk-dev mailing list