[Asterisk-cvs] asterisk/apps app_queue.c,1.136,1.137

kpfleming at lists.digium.com kpfleming at lists.digium.com
Sun May 15 01:37:22 CDT 2005


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

Modified Files:
	app_queue.c 
Log Message:
allow caller to exit during position announcement by pressing valid exit key (bug #3821, with mods)


Index: app_queue.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_queue.c,v
retrieving revision 1.136
retrieving revision 1.137
diff -u -d -r1.136 -r1.137
--- app_queue.c	21 Apr 2005 06:02:43 -0000	1.136
+++ app_queue.c	15 May 2005 05:42:51 -0000	1.137
@@ -516,9 +516,9 @@
 				/* No luck, join at the end of the queue */
 				if (!inserted)
 					insert_entry(q, prev, qe, &pos);
-				strncpy(qe->moh, q->moh, sizeof(qe->moh) - 1);
-				strncpy(qe->announce, q->announce, sizeof(qe->announce) - 1);
-				strncpy(qe->context, q->context, sizeof(qe->context) - 1);
+				ast_copy_string(qe->moh, q->moh, sizeof(qe->moh));
+				ast_copy_string(qe->announce, q->announce, sizeof(qe->announce));
+				ast_copy_string(qe->context, q->context, sizeof(qe->context));
 				q->count++;
 				res = 0;
 				manager_event(EVENT_FLAG_CALL, "Join", 
@@ -589,19 +589,32 @@
 	res = ast_streamfile(chan, filename, chan->language);
 
 	if (!res)
-		res = ast_waitstream(chan, "");
+		res = ast_waitstream(chan, AST_DIGIT_ANY);
 	else
 		res = 0;
 
-	if (res) {
-		ast_log(LOG_WARNING, "ast_streamfile failed on %s \n", chan->name);
-		res = 0;
-	}
 	ast_stopstream(chan);
 
 	return res;
 }
 
+static int valid_exit(struct queue_ent *qe, char digit)
+{
+	char tmp[2];
+
+	if (ast_strlen_zero(qe->context))
+		return 0;
+	tmp[0] = digit;
+	tmp[1] = '\0';
+	if (ast_exists_extension(qe->chan, qe->context, tmp, 1, qe->chan->cid.cid_num)) {
+		ast_copy_string(qe->chan->context, qe->context, sizeof(qe->chan->context));
+		ast_copy_string(qe->chan->exten, tmp, sizeof(qe->chan->exten));
+		qe->chan->priority = 0;
+		return 1;
+	}
+	return 0;
+}
+
 static int say_position(struct queue_ent *qe)
 {
 	int res = 0, avgholdmins, avgholdsecs;
@@ -610,21 +623,29 @@
 	/* Check to see if this is ludicrous -- if we just announced position, don't do it again*/
 	time(&now);
 	if ( (now - qe->last_pos) < 15 )
-		return -1;
+		return 0;
 
 	/* If either our position has changed, or we are over the freq timer, say position */
 	if ( (qe->last_pos_said == qe->pos) && ((now - qe->last_pos) < qe->parent->announcefrequency) )
-		return -1;
+		return 0;
 
 	ast_moh_stop(qe->chan);
 	/* Say we're next, if we are */
 	if (qe->pos == 1) {
-		res += play_file(qe->chan, qe->parent->sound_next);
-		goto posout;
+		res = play_file(qe->chan, qe->parent->sound_next);
+		if (res && valid_exit(qe, res))
+			goto playout;
+		else
+			goto posout;
 	} else {
-		res += play_file(qe->chan, qe->parent->sound_thereare);
-		res += ast_say_number(qe->chan, qe->pos, AST_DIGIT_ANY, qe->chan->language, (char *) NULL); /* Needs gender */
-		res += play_file(qe->chan, qe->parent->sound_calls);
+		res = play_file(qe->chan, qe->parent->sound_thereare);
+			goto playout;
+		res = ast_say_number(qe->chan, qe->pos, AST_DIGIT_ANY, qe->chan->language, (char *) NULL); /* Needs gender */
+		if (res && valid_exit(qe, res))
+			goto playout;
+		res = play_file(qe->chan, qe->parent->sound_calls);
+		if (res && valid_exit(qe, res))
+			goto playout;
 	}
 	/* Round hold time to nearest minute */
 	avgholdmins = abs(( (qe->parent->holdtime + 30) - (now - qe->start) ) / 60);
@@ -644,33 +665,54 @@
 	   supposed to be only once and we have already said it, say it */
 	if ((avgholdmins+avgholdsecs) > 0 && (qe->parent->announceholdtime) &&
 	    (!(qe->parent->announceholdtime == ANNOUNCEHOLDTIME_ONCE) && qe->last_pos)) {
-		res += play_file(qe->chan, qe->parent->sound_holdtime);
-		if(avgholdmins>0) {
+		res = play_file(qe->chan, qe->parent->sound_holdtime);
+		if (res && valid_exit(qe, res))
+			goto playout;
+
+		if (avgholdmins>0) {
 			if (avgholdmins < 2) {
-				res += play_file(qe->chan, qe->parent->sound_lessthan);
-				res += ast_say_number(qe->chan, 2, AST_DIGIT_ANY, qe->chan->language, (char *)NULL);
-			} else 
-				res += ast_say_number(qe->chan, avgholdmins, AST_DIGIT_ANY, qe->chan->language, (char*) NULL);
-			res += play_file(qe->chan, qe->parent->sound_minutes);
+				res = play_file(qe->chan, qe->parent->sound_lessthan);
+				if (res && valid_exit(qe, res))
+					goto playout;
+
+				res = ast_say_number(qe->chan, 2, AST_DIGIT_ANY, qe->chan->language, (char *)NULL);
+				if (res && valid_exit(qe, res))
+					goto playout;
+			} else {
+				res = ast_say_number(qe->chan, avgholdmins, AST_DIGIT_ANY, qe->chan->language, (char*) NULL);
+				if (res && valid_exit(qe, res))
+					goto playout;
+			}
+			
+			res = play_file(qe->chan, qe->parent->sound_minutes);
+			if (res && valid_exit(qe, res))
+				goto playout;
 		}
-		if(avgholdsecs>0) {
-			res += ast_say_number(qe->chan, avgholdsecs, AST_DIGIT_ANY, qe->chan->language, (char*) NULL);
-			res += play_file(qe->chan, qe->parent->sound_seconds);
+		if (avgholdsecs>0) {
+			res = ast_say_number(qe->chan, avgholdsecs, AST_DIGIT_ANY, qe->chan->language, (char*) NULL);
+			if (res && valid_exit(qe, res))
+				goto playout;
+
+			res = play_file(qe->chan, qe->parent->sound_seconds);
+			if (res && valid_exit(qe, res))
+				goto playout;
 		}
 
 	}
 
-	posout:
+ posout:
+	if (option_verbose > 2)
+		ast_verbose(VERBOSE_PREFIX_3 "Told %s in %s their queue position (which was %d)\n",
+			    qe->chan->name, qe->parent->name, qe->pos);
+	res = play_file(qe->chan, qe->parent->sound_thanks);
+
+ playout:
 	/* Set our last_pos indicators */
  	qe->last_pos = now;
 	qe->last_pos_said = qe->pos;
-
-	if (option_verbose > 2)
-		ast_verbose(VERBOSE_PREFIX_3 "Told %s in %s their queue position (which was %d)\n", qe->chan->name, qe->parent->name, qe->pos);
-	res += play_file(qe->chan, qe->parent->sound_thanks);
 	ast_moh_start(qe->chan, qe->moh);
 
-	return (res>0);
+	return res;
 }
 
 static void record_abandoned(struct queue_ent *qe)
@@ -871,7 +913,7 @@
 		return 0;
 	}
 
-	strncpy(tech, tmp->interface, sizeof(tech) - 1);
+	ast_copy_string(tech, tmp->interface, sizeof(tech));
 	if ((location = strchr(tech, '/')))
 		*location++ = '\0';
 	else
@@ -1033,23 +1075,6 @@
 	return 0;
 }
 
-static int valid_exit(struct queue_ent *qe, char digit)
-{
-	char tmp[2];
-
-	if (ast_strlen_zero(qe->context))
-		return 0;
-	tmp[0] = digit;
-	tmp[1] = '\0';
-	if (ast_exists_extension(qe->chan, qe->context, tmp, 1, qe->chan->cid.cid_num)) {
-		strncpy(qe->chan->context, qe->context, sizeof(qe->chan->context) - 1);
-		strncpy(qe->chan->exten, tmp, sizeof(qe->chan->exten) - 1);
-		qe->chan->priority = 0;
-		return 1;
-	}
-	return 0;
-}
-
 #define AST_MAX_WATCHERS 256
 
 #define BUILD_WATCHERS do { \
@@ -1122,7 +1147,7 @@
 					char tmpchan[256]="";
 					char *stuff;
 					char *tech;
-					strncpy(tmpchan, o->chan->call_forward, sizeof(tmpchan) - 1);
+					ast_copy_string(tmpchan, o->chan->call_forward, sizeof(tmpchan));
 					if ((stuff = strchr(tmpchan, '/'))) {
 						*stuff = '\0';
 						stuff++;
@@ -1161,7 +1186,7 @@
 							if (!o->chan->cid.cid_name)
 								ast_log(LOG_WARNING, "Out of memory\n");	
 						}
-						strncpy(o->chan->accountcode, in->accountcode, sizeof(o->chan->accountcode) - 1);
+						ast_copy_string(o->chan->accountcode, in->accountcode, sizeof(o->chan->accountcode));
 						o->chan->cdrflags = in->cdrflags;
 
 						if (in->cid.cid_ani) {
@@ -1354,7 +1379,9 @@
 
 		/* Make a position announcement, if enabled */
 		if (qe->parent->announcefrequency && !ringing)
-			say_position(qe);
+			res = say_position(qe);
+		if (res)
+			break;
 
 		/* Wait a second before checking again */
 		res = ast_waitfordigit(qe->chan, RECHECK * 1000);
@@ -1494,7 +1521,7 @@
 	if (option_debug)
 		ast_log(LOG_DEBUG, "%s is trying to call a queue member.\n", 
 							qe->chan->name);
-	strncpy(queuename, qe->parent->name, sizeof(queuename) - 1);
+	ast_copy_string(queuename, qe->parent->name, sizeof(queuename));
 	time(&now);
 	cur = qe->parent->members;
 	if (!ast_strlen_zero(qe->announce))
@@ -1523,7 +1550,7 @@
 		tmp->member = cur;		/* Never directly dereference!  Could change on reload */
 		tmp->oldstatus = cur->status;
 		tmp->lastcall = cur->lastcall;
-		strncpy(tmp->interface, cur->interface, sizeof(tmp->interface)-1);
+		ast_copy_string(tmp->interface, cur->interface, sizeof(tmp->interface)-1);
 		/* If we're dialing by extension, look at the extension to know what to dial */
 		if ((newnum = strstr(tmp->interface, "/BYEXTENSION"))) {
 			newnum++;
@@ -1690,8 +1717,8 @@
 				      "Holdtime: %ld\r\n",
 				      queuename, qe->chan->uniqueid, peer->name, member->interface,
 				      (long)time(NULL) - qe->start);
-		strncpy(oldcontext, qe->chan->context, sizeof(oldcontext) - 1);
-		strncpy(oldexten, qe->chan->exten, sizeof(oldexten) - 1);
+		ast_copy_string(oldcontext, qe->chan->context, sizeof(oldcontext));
+		ast_copy_string(oldexten, qe->chan->exten, sizeof(oldexten));
 		time(&callstart);
 
 		bridge = ast_bridge_call(qe->chan,peer, &bridge_config);
@@ -1772,7 +1799,7 @@
 		memset(cur, 0, sizeof(struct member));
 		cur->penalty = penalty;
 		cur->paused = paused;
-		strncpy(cur->interface, interface, sizeof(cur->interface) - 1);
+		ast_copy_string(cur->interface, interface, sizeof(cur->interface));
 		if (!strchr(cur->interface, '/'))
 			ast_log(LOG_WARNING, "No location at interface '%s'\n", interface);
 		cur->status = ast_device_state(interface);
@@ -2159,7 +2186,7 @@
 			interface++;
 		}
 		else {
-			strncpy(tmpchan, chan->name, sizeof(tmpchan) - 1);
+			ast_copy_string(tmpchan, chan->name, sizeof(tmpchan));
 			interface = strrchr(tmpchan, '-');
 			if (interface)
 				*interface = '\0';
@@ -2230,7 +2257,7 @@
 			}
 		}
 		if (!interface || ast_strlen_zero(interface)) {
-			strncpy(tmpchan, chan->name, sizeof(tmpchan) - 1);
+			ast_copy_string(tmpchan, chan->name, sizeof(tmpchan));
 			interface = strrchr(tmpchan, '-');
 			if (interface)
 				*interface = '\0';
@@ -2303,7 +2330,7 @@
 	qe.start = time(NULL);
 	
 	/* Parse our arguments XXX Check for failure XXX */
-	strncpy(info, (char *) data, sizeof(info) - 1);
+	ast_copy_string(info, (char *) data, sizeof(info));
 	queuename = strsep(&info_ptr, "|");
 	options = strsep(&info_ptr, "|");
 	url = strsep(&info_ptr, "|");
@@ -2396,7 +2423,12 @@
 				if (makeannouncement) {
 					/* Make a position announcement, if enabled */
 					if (qe.parent->announcefrequency && !ringing)
-						say_position(&qe);
+						res = say_position(&qe);
+					if (res && valid_exit(&qe, res)) {
+						ast_queue_log(queuename, chan->uniqueid, "NONE", "EXITWITHKEY", "%c|%d", res, qe.pos);
+						break;
+					}
+
 				}
 				makeannouncement = 1;
 
@@ -2534,7 +2566,7 @@
 					/* Initialize it */
 					memset(q, 0, sizeof(struct ast_call_queue));
 					ast_mutex_init(&q->lock);
-					strncpy(q->name, cat, sizeof(q->name) - 1);
+					ast_copy_string(q->name, cat, sizeof(q->name));
 					new = 1;
 				} else new = 0;
 			} else
@@ -2561,15 +2593,15 @@
 				q->announce[0] = '\0';
 				q->context[0] = '\0';
 				q->monfmt[0] = '\0';
-				strncpy(q->sound_next, "queue-youarenext", sizeof(q->sound_next) - 1);
-				strncpy(q->sound_thereare, "queue-thereare", sizeof(q->sound_thereare) - 1);
-				strncpy(q->sound_calls, "queue-callswaiting", sizeof(q->sound_calls) - 1);
-				strncpy(q->sound_holdtime, "queue-holdtime", sizeof(q->sound_holdtime) - 1);
-				strncpy(q->sound_minutes, "queue-minutes", sizeof(q->sound_minutes) - 1);
-				strncpy(q->sound_seconds, "queue-seconds", sizeof(q->sound_seconds) - 1);
-				strncpy(q->sound_thanks, "queue-thankyou", sizeof(q->sound_thanks) - 1);
-				strncpy(q->sound_lessthan, "queue-less-than", sizeof(q->sound_lessthan) - 1);
-				strncpy(q->sound_reporthold, "queue-reporthold", sizeof(q->sound_reporthold) - 1);
+				ast_copy_string(q->sound_next, "queue-youarenext", sizeof(q->sound_next));
+				ast_copy_string(q->sound_thereare, "queue-thereare", sizeof(q->sound_thereare));
+				ast_copy_string(q->sound_calls, "queue-callswaiting", sizeof(q->sound_calls));
+				ast_copy_string(q->sound_holdtime, "queue-holdtime", sizeof(q->sound_holdtime));
+				ast_copy_string(q->sound_minutes, "queue-minutes", sizeof(q->sound_minutes));
+				ast_copy_string(q->sound_seconds, "queue-seconds", sizeof(q->sound_seconds));
+				ast_copy_string(q->sound_thanks, "queue-thankyou", sizeof(q->sound_thanks));
+				ast_copy_string(q->sound_lessthan, "queue-less-than", sizeof(q->sound_lessthan));
+				ast_copy_string(q->sound_reporthold, "queue-reporthold", sizeof(q->sound_reporthold));
 				prev = q->members;
 				if (prev) {
 					/* find the end of any dynamic members */
@@ -2583,7 +2615,7 @@
 						cur = malloc(sizeof(struct member));
 						if (cur) {
 							memset(cur, 0, sizeof(struct member));
-							strncpy(cur->interface, var->value, sizeof(cur->interface) - 1);
+							ast_copy_string(cur->interface, var->value, sizeof(cur->interface));
 							if ((tmp = strchr(cur->interface, ','))) {
 								*tmp = '\0';
 								tmp++;
@@ -2600,35 +2632,35 @@
 							prev = cur;
 						}
 					} else if (!strcasecmp(var->name, "music") || !strcasecmp(var->name, "musiconhold")) {
-						strncpy(q->moh, var->value, sizeof(q->moh) - 1);
+						ast_copy_string(q->moh, var->value, sizeof(q->moh));
 					} else if (!strcasecmp(var->name, "announce")) {
-						strncpy(q->announce, var->value, sizeof(q->announce) - 1);
+						ast_copy_string(q->announce, var->value, sizeof(q->announce));
 					} else if (!strcasecmp(var->name, "context")) {
-						strncpy(q->context, var->value, sizeof(q->context) - 1);
+						ast_copy_string(q->context, var->value, sizeof(q->context));
 					} else if (!strcasecmp(var->name, "timeout")) {
 						q->timeout = atoi(var->value);
 					} else if (!strcasecmp(var->name, "monitor-join")) {
 						q->monjoin = ast_true(var->value);
 					} else if (!strcasecmp(var->name, "monitor-format")) {
-						strncpy(q->monfmt, var->value, sizeof(q->monfmt) - 1);
+						ast_copy_string(q->monfmt, var->value, sizeof(q->monfmt));
 					} else if (!strcasecmp(var->name, "queue-youarenext")) {
-						strncpy(q->sound_next, var->value, sizeof(q->sound_next) - 1);
+						ast_copy_string(q->sound_next, var->value, sizeof(q->sound_next));
 					} else if (!strcasecmp(var->name, "queue-thereare")) {
-						strncpy(q->sound_thereare, var->value, sizeof(q->sound_thereare) - 1);
+						ast_copy_string(q->sound_thereare, var->value, sizeof(q->sound_thereare));
 					} else if (!strcasecmp(var->name, "queue-callswaiting")) {
-						strncpy(q->sound_calls, var->value, sizeof(q->sound_calls) - 1);
+						ast_copy_string(q->sound_calls, var->value, sizeof(q->sound_calls));
 					} else if (!strcasecmp(var->name, "queue-holdtime")) {
-						strncpy(q->sound_holdtime, var->value, sizeof(q->sound_holdtime) - 1);
+						ast_copy_string(q->sound_holdtime, var->value, sizeof(q->sound_holdtime));
 					} else if (!strcasecmp(var->name, "queue-minutes")) {
-						strncpy(q->sound_minutes, var->value, sizeof(q->sound_minutes) - 1);
+						ast_copy_string(q->sound_minutes, var->value, sizeof(q->sound_minutes));
 					} else if (!strcasecmp(var->name, "queue-seconds")) {
-						strncpy(q->sound_seconds, var->value, sizeof(q->sound_seconds) - 1);
+						ast_copy_string(q->sound_seconds, var->value, sizeof(q->sound_seconds));
 					} else if (!strcasecmp(var->name, "queue-lessthan")) {
-						strncpy(q->sound_lessthan, var->value, sizeof(q->sound_lessthan) - 1);
+						ast_copy_string(q->sound_lessthan, var->value, sizeof(q->sound_lessthan));
 					} else if (!strcasecmp(var->name, "queue-thankyou")) {
-						strncpy(q->sound_thanks, var->value, sizeof(q->sound_thanks) - 1);
+						ast_copy_string(q->sound_thanks, var->value, sizeof(q->sound_thanks));
 					} else if (!strcasecmp(var->name, "queue-reporthold")) {
-						strncpy(q->sound_reporthold, var->value, sizeof(q->sound_reporthold) - 1);
+						ast_copy_string(q->sound_reporthold, var->value, sizeof(q->sound_reporthold));
 					} else if (!strcasecmp(var->name, "announce-frequency")) {
 						q->announcefrequency = atoi(var->value);
 					} else if (!strcasecmp(var->name, "announce-round-seconds")) {
@@ -2740,22 +2772,22 @@
 {
 	switch(status) {
 	case AST_DEVICE_UNKNOWN:
-		strncpy(buf, "unknown", buflen - 1);
+		ast_copy_string(buf, "unknown", buflen);
 		break;
 	case AST_DEVICE_NOT_INUSE:
-		strncpy(buf, "notinuse", buflen - 1);
+		ast_copy_string(buf, "notinuse", buflen);
 		break;
 	case AST_DEVICE_INUSE:
-		strncpy(buf, "inuse", buflen - 1);
+		ast_copy_string(buf, "inuse", buflen);
 		break;
 	case AST_DEVICE_BUSY:
-		strncpy(buf, "busy", buflen - 1);
+		ast_copy_string(buf, "busy", buflen);
 		break;
 	case AST_DEVICE_INVALID:
-		strncpy(buf, "invalid", buflen - 1);
+		ast_copy_string(buf, "invalid", buflen);
 		break;
 	case AST_DEVICE_UNAVAILABLE:
-		strncpy(buf, "unavailable", buflen - 1);
+		ast_copy_string(buf, "unavailable", buflen);
 		break;
 	default:
 		snprintf(buf, buflen, "unknown status %d", status);
@@ -2804,7 +2836,7 @@
 		if (q->maxlen)
 			snprintf(max, sizeof(max), "%d", q->maxlen);
 		else
-			strncpy(max, "unlimited", sizeof(max) - 1);
+			ast_copy_string(max, "unlimited", sizeof(max));
 		sl = 0;
 		if(q->callscompleted > 0)
 			sl = 100*((float)q->callscompletedinsl/(float)q->callscompleted);
@@ -2827,7 +2859,7 @@
 					snprintf(calls, sizeof(calls), " has taken %d calls (last was %ld secs ago)",
 							mem->calls, (long)(time(NULL) - mem->lastcall));
 				} else
-					strncpy(calls, " has taken no calls yet", sizeof(calls) - 1);
+					ast_copy_string(calls, " has taken no calls yet", sizeof(calls));
 				ast_cli(fd, "      %s%s%s\n", mem->interface, max, calls);
 			}
 		} else




More information about the svn-commits mailing list