[asterisk-commits] rizzo: trunk r48550 - /trunk/apps/app_queue.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Sun Dec 17 15:47:30 MST 2006


Author: rizzo
Date: Sun Dec 17 16:47:30 2006
New Revision: 48550

URL: http://svn.digium.com/view/asterisk?view=rev&rev=48550
Log:
replace ast_build_string() with ast_str_*();

simplify __queues_show()


Modified:
    trunk/apps/app_queue.c

Modified: trunk/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_queue.c?view=diff&rev=48550&r1=48549&r2=48550
==============================================================================
--- trunk/apps/app_queue.c (original)
+++ trunk/apps/app_queue.c Sun Dec 17 16:47:30 2006
@@ -4035,141 +4035,107 @@
 	return 1;
 }
 
-static int __queues_show(struct mansession *s, int manager, int fd, int argc, char **argv)
+/*! \brief direct ouput to manager or cli with proper terminator */
+static void do_print(struct mansession *s, int fd, const char *str)
+{
+	if (s)
+		astman_append(s, "%s\r\n", str);
+	else
+		ast_cli(fd, "%s\n", str);
+}
+
+static int __queues_show(struct mansession *s, int fd, int argc, char **argv)
 {
 	struct call_queue *q;
-	struct queue_ent *qe;
-	struct member *mem;
-	int pos, queue_show;
-	time_t now;
-	char max_buf[80];
-	char *max;
-	size_t max_left;
-	float sl = 0;
-	char *term = manager ? "\r\n" : "\n";
-
-	time(&now);
-	if (argc == 2)
-		queue_show = 0;
-	else if (argc == 3)
-		queue_show = 1;
-	else
+	struct ast_str *out = ast_str_alloca(80);
+	int found = 0;
+	time_t now = time(NULL);
+
+	if (argc != 2 && argc != 3)
 		return RESULT_SHOWUSAGE;
 
 	/* We only want to load realtime queues when a specific queue is asked for. */
-	if (queue_show)
+	if (argc == 3)	/* specific queue */
 		load_realtime_queue(argv[2]);
 
 	AST_LIST_LOCK(&queues);
-	if (AST_LIST_EMPTY(&queues)) {
-		AST_LIST_UNLOCK(&queues);
-		if (queue_show) {
-			if (s)
-				astman_append(s, "No such queue: %s.%s",argv[2], term);
-			else
-				ast_cli(fd, "No such queue: %s.%s",argv[2], term);
-		} else {
-			if (s)
-				astman_append(s, "No queues.%s", term);
-			else
-				ast_cli(fd, "No queues.%s", term);
-		}
-		return RESULT_SUCCESS;
-	}
 	AST_LIST_TRAVERSE(&queues, q, list) {
+		float sl;
+
 		ast_mutex_lock(&q->lock);
-		if (queue_show) {
-			if (strcasecmp(q->name, argv[2]) != 0) {
-				ast_mutex_unlock(&q->lock);
-				if (!AST_LIST_NEXT(q, list)) {
-					ast_cli(fd, "No such queue: %s.%s",argv[2], term);
-					break;
-				}
-				continue;
-			}
-		}
-		max_buf[0] = '\0';
-		max = max_buf;
-		max_left = sizeof(max_buf);
+		if (argc == 3 && !strcasecmp(q->name, argv[2])) {
+			ast_mutex_unlock(&q->lock);
+			continue;
+		}
+		found = 1;
+
+		ast_str_set(&out, 0, "%-12.12s has %d calls (max ", q->name, q->count);
 		if (q->maxlen)
-			ast_build_string(&max, &max_left, "%d", q->maxlen);
+			ast_str_append(&out, 0, "%d", q->maxlen);
 		else
-			ast_build_string(&max, &max_left, "unlimited");
+			ast_str_append(&out, 0, "unlimited");
 		sl = 0;
 		if (q->callscompleted > 0)
 			sl = 100 * ((float) q->callscompletedinsl / (float) q->callscompleted);
-		if (s)
-			astman_append(s, "%-12.12s has %d calls (max %s) in '%s' strategy (%ds holdtime), W:%d, C:%d, A:%d, SL:%2.1f%% within %ds%s",
-				q->name, q->count, max_buf, int2strat(q->strategy), q->holdtime, q->weight,
-				q->callscompleted, q->callsabandoned,sl,q->servicelevel, term);
+		ast_str_append(&out, 0, ") in '%s' strategy (%ds holdtime), W:%d, C:%d, A:%d, SL:%2.1f%% within %ds",
+			int2strat(q->strategy), q->holdtime, q->weight,
+			q->callscompleted, q->callsabandoned,sl,q->servicelevel);
+		do_print(s, fd, out->str);
+		if (!q->members)
+			do_print(s, fd, "   No Members");
+		else {
+			struct member *mem;
+
+			do_print(s, fd, "   Members: ");
+			for (mem = q->members; mem; mem = mem->next) {
+				ast_str_set(&out, 0, "      %s", mem->interface);
+				if (mem->penalty)
+					ast_str_append(&out, 0, " with penalty %d", mem->penalty);
+				ast_str_append(&out, 0, "%s%s (%s)",
+					mem->dynamic ? " (dynamic)" : "",
+					mem->paused ? " (paused)" : "",
+					devstate2str(mem->status));
+				if (mem->calls)
+					ast_str_append(&out, 0, " has taken %d calls (last was %ld secs ago)",
+						mem->calls, (long) (time(NULL) - mem->lastcall));
+				else
+					ast_str_append(&out, 0, " has taken no calls yet");
+				do_print(s, fd, out->str);
+			}
+		}
+		if (!q->head)
+			do_print(s, fd, "   No Callers");
+		else {
+			struct queue_ent *qe;
+			int pos = 1;
+
+			do_print(s, fd, "   Callers: ");
+			for (qe = q->head; qe; qe = qe->next) {
+				ast_str_set(&out, 0, "      %d. %s (wait: %ld:%2.2ld, prio: %d)",
+					pos++, qe->chan->name, (long) (now - qe->start) / 60,
+					(long) (now - qe->start) % 60, qe->prio);
+				do_print(s, fd, out->str);
+			}
+		}
+		do_print(s, fd, "");	/* blank line between entries */
+		ast_mutex_unlock(&q->lock);
+		if (argc == 3)	/* print a specific entry */
+			break;
+	}
+	AST_LIST_UNLOCK(&queues);
+	if (!found) {
+		if (argc == 3)
+			ast_str_set(&out, 0, "No such queue: %s.", argv[2]);
 		else
-			ast_cli(fd, "%-12.12s has %d calls (max %s) in '%s' strategy (%ds holdtime), W:%d, C:%d, A:%d, SL:%2.1f%% within %ds%s",
-				q->name, q->count, max_buf, int2strat(q->strategy), q->holdtime, q->weight, q->callscompleted, q->callsabandoned,sl,q->servicelevel, term);
-		if (q->members) {
-			if (s)
-				astman_append(s, "   Members: %s", term);
-			else
-				ast_cli(fd, "   Members: %s", term);
-			for (mem = q->members; mem; mem = mem->next) {
-				max_buf[0] = '\0';
-				max = max_buf;
-				max_left = sizeof(max_buf);
-				if (mem->penalty)
-					ast_build_string(&max, &max_left, " with penalty %d", mem->penalty);
-				if (mem->dynamic)
-					ast_build_string(&max, &max_left, " (dynamic)");
-				if (mem->paused)
-					ast_build_string(&max, &max_left, " (paused)");
-				ast_build_string(&max, &max_left, " (%s)", devstate2str(mem->status));
-				if (mem->calls) {
-					ast_build_string(&max, &max_left, " has taken %d calls (last was %ld secs ago)",
-						mem->calls, (long) (time(NULL) - mem->lastcall));
-				} else
-					ast_build_string(&max, &max_left, " has taken no calls yet");
-				if (s)
-					astman_append(s, "      %s%s%s", mem->interface, max_buf, term);
-				else
-					ast_cli(fd, "      %s%s%s", mem->interface, max_buf, term);
-			}
-		} else if (s)
-			astman_append(s, "   No Members%s", term);
-		else	
-			ast_cli(fd, "   No Members%s", term);
-		if (q->head) {
-			pos = 1;
-			if (s)
-				astman_append(s, "   Callers: %s", term);
-			else
-				ast_cli(fd, "   Callers: %s", term);
-			for (qe = q->head; qe; qe = qe->next) {
-				if (s)
-					astman_append(s, "      %d. %s (wait: %ld:%2.2ld, prio: %d)%s",
-						pos++, qe->chan->name, (long) (now - qe->start) / 60,
-						(long) (now - qe->start) % 60, qe->prio, term);
-				else
-					ast_cli(fd, "      %d. %s (wait: %ld:%2.2ld, prio: %d)%s", pos++,
-						qe->chan->name, (long) (now - qe->start) / 60,
-						(long) (now - qe->start) % 60, qe->prio, term);
-			}
-		} else if (s)
-			astman_append(s, "   No Callers%s", term);
-		else
-			ast_cli(fd, "   No Callers%s", term);
-		if (s)
-			astman_append(s, "%s", term);
-		else
-			ast_cli(fd, "%s", term);
-		ast_mutex_unlock(&q->lock);
-		if (queue_show)
-			break;
-	}
-	AST_LIST_UNLOCK(&queues);
+			ast_str_set(&out, 0, "No queues.");
+		do_print(s, fd, out->str);
+	}
 	return RESULT_SUCCESS;
 }
 
 static int queue_show(int fd, int argc, char **argv)
 {
-	return __queues_show(NULL, 0, fd, argc, argv);
+	return __queues_show(NULL, fd, argc, argv);
 }
 
 static char *complete_queue(const char *line, const char *word, int pos, int state)
@@ -4198,7 +4164,7 @@
 {
 	char *a[] = { "queue", "show" };
 
-	__queues_show(s, 1, -1, 2, a);
+	__queues_show(s, -1, 2, a);
 	astman_append(s, "\r\n\r\n");	/* Properly terminate Manager output */
 
 	return RESULT_SUCCESS;



More information about the asterisk-commits mailing list