[Asterisk-cvs] asterisk/apps app_dial.c,1.92,1.93

mattf at lists.digium.com mattf at lists.digium.com
Thu Sep 9 22:29:26 CDT 2004


Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv10442/apps

Modified Files:
	app_dial.c 
Log Message:
macro support in the dial command


Index: app_dial.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_dial.c,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -d -r1.92 -r1.93
--- app_dial.c	27 Aug 2004 03:16:16 -0000	1.92
+++ app_dial.c	10 Sep 2004 02:31:30 -0000	1.93
@@ -67,6 +67,7 @@
 "             that are assigned to you.\n"
 "      'r' -- indicate ringing to the calling party, pass no audio until answered.\n"
 "      'm' -- provide hold music to the calling party until answered.\n"
+"      'M(x) -- Executes the macro (x) upon connect of the call\n"
 "      'h' -- allow callee to hang up by hitting *.\n"
 "      'H' -- allow caller to hang up by hitting *.\n"
 "      'C' -- reset call detail record for this call.\n"
@@ -420,6 +421,7 @@
 	int allowredir_out=0;
 	int allowdisconnect_in=0;
 	int allowdisconnect_out=0;
+	int hasmacro = 0;
 	int privacy=0;
 	int announce=0;
 	int resetcdr=0;
@@ -448,6 +450,7 @@
 	char *sdtmfptr;
 	char sdtmfdata[256] = "";
 	char *stack,*var;
+	char *mac = NULL, macroname[256] = "";
 	char status[256]="";
 	char toast[80];
 	int play_to_caller=0,play_to_callee=0;
@@ -610,6 +613,27 @@
 				announce = 0;
 			}
 		}
+		
+		/* Get the macroname from the dial option string */
+		if ((mac = strstr(transfer, "M("))) {
+			hasmacro = 1;
+			strncpy(macroname, mac + 2, sizeof(macroname) - 1);
+			while (*mac && (*mac != ')'))
+				*(mac++) = 'X';
+			if (*mac)
+				*mac = 'X';
+			else {
+				ast_log(LOG_WARNING, "Could not find macro to which we should jump.\n");
+				hasmacro = 0;
+			}
+			mac = strchr(macroname, ')');
+			if (mac)
+				*mac = '\0';
+			else {
+				ast_log(LOG_WARNING, "Macro flag set without trailing ')'\n");
+				hasmacro = 0;
+			}
+		}
 		/* Extract privacy info from transfer */
 		if ((s = strstr(transfer, "P("))) {
 			privacy = 1;
@@ -907,6 +931,32 @@
 		} else
 			res = 0;
 
+		if (hasmacro && macroname) {
+			void *app = NULL;
+
+			res = ast_autoservice_start(chan);
+			if (res) {
+				ast_log(LOG_ERROR, "Unable to start autoservice on calling channel\n");
+				res = -1;
+			}
+
+			app = pbx_findapp("Macro");
+
+			if (app && !res) {
+				res = pbx_exec(peer, app, macroname, 1);
+				ast_log(LOG_DEBUG, "Macro exited with status %d\n", res);
+				res = 0;
+			} else {
+				ast_log(LOG_ERROR, "Could not find application Macro\n");
+				res = -1;
+			}
+
+			if (ast_autoservice_stop(chan) < 0) {
+				ast_log(LOG_ERROR, "Could not stop autoservice on calling channel\n");
+				res = -1;
+			}
+		}
+
 		if (!res) {
 			if (calldurationlimit > 0) {
 				time(&now);




More information about the svn-commits mailing list