[asterisk-commits] trunk r10046 - /trunk/apps/app_queue.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Tue Feb 14 14:50:36 MST 2006
Author: kpfleming
Date: Tue Feb 14 15:50:35 2006
New Revision: 10046
URL: http://svn.digium.com/view/asterisk?rev=10046&view=rev
Log:
don't use localuser structure for outbound calls (issue #6216)
various code cleanup and reorganization (issue #6216)
Modified:
trunk/apps/app_queue.c
Modified: trunk/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_queue.c?rev=10046&r1=10045&r2=10046&view=diff
==============================================================================
--- trunk/apps/app_queue.c (original)
+++ trunk/apps/app_queue.c Tue Feb 14 15:50:35 2006
@@ -261,7 +261,8 @@
use it not only for keeping track of what is in use but
also for keeping track of who we're dialing. */
-struct localuser {
+struct callattempt {
+ struct callattempt *q_next;
struct ast_channel *chan;
char interface[256];
int stillgoing;
@@ -269,11 +270,11 @@
int oldstatus;
time_t lastcall;
struct member *member;
- struct localuser *next;
};
+STANDARD_LOCAL_USER;
+
LOCAL_USER_DECL;
-
struct queue_ent {
struct ast_call_queue *parent; /*!< What queue is our parent */
@@ -1262,16 +1263,16 @@
}
/* Hang up a list of outgoing calls */
-static void hangupcalls(struct localuser *outgoing, struct ast_channel *exception)
-{
- struct localuser *oo;
+static void hangupcalls(struct callattempt *outgoing, struct ast_channel *exception)
+{
+ struct callattempt *oo;
while(outgoing) {
/* Hangup any existing lines we have open */
if (outgoing->chan && (outgoing->chan != exception))
ast_hangup(outgoing->chan);
oo = outgoing;
- outgoing=outgoing->next;
+ outgoing=outgoing->q_next;
free(oo);
}
}
@@ -1283,8 +1284,7 @@
/* Since a reload could have taken place, we have to traverse the list to
be sure it's still valid */
ast_mutex_lock(&q->lock);
- cur = q->members;
- while(cur) {
+ for (cur = q->members; cur; cur = cur->next) {
if (member == cur) {
cur->status = status;
if (!q->maskmemberstatus) {
@@ -1302,7 +1302,6 @@
}
break;
}
- cur = cur->next;
}
ast_mutex_unlock(&q->lock);
return 0;
@@ -1354,13 +1353,22 @@
return found;
}
-static int ring_entry(struct queue_ent *qe, struct localuser *tmp, int *busies)
+/*! \brief common hangup actions */
+static void do_hang(struct callattempt *o)
+{
+ o->stillgoing = 0;
+ ast_hangup(o->chan);
+ o->chan = NULL;
+}
+
+static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies)
{
int res;
int status;
char tech[256];
char *location;
+ /* on entry here, we know that tmp->chan == NULL */
if (qe->parent->wrapuptime && (time(NULL) - tmp->lastcall < qe->parent->wrapuptime)) {
if (option_debug)
ast_log(LOG_DEBUG, "Wrapuptime not yet expired for %s\n", tmp->interface);
@@ -1442,9 +1450,7 @@
ast_log(LOG_DEBUG, "ast call on peer returned %d\n", res);
else if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Couldn't call %s\n", tmp->interface);
- ast_hangup(tmp->chan);
- tmp->chan = NULL;
- tmp->stillgoing = 0;
+ do_hang(tmp);
(*busies)++;
return 0;
} else {
@@ -1468,69 +1474,58 @@
return 1;
}
-static int ring_one(struct queue_ent *qe, struct localuser *outgoing, int *busies)
-{
- struct localuser *cur;
- struct localuser *best;
- int bestmetric=0;
-
- do {
- best = NULL;
- cur = outgoing;
- while(cur) {
- if (cur->stillgoing && /* Not already done */
- !cur->chan && /* Isn't already going */
- (!best || (cur->metric < bestmetric))) { /* We haven't found one yet, or it's better */
- bestmetric = cur->metric;
- best = cur;
- }
- cur = cur->next;
- }
- if (best) {
- if (!qe->parent->strategy) {
- /* Ring everyone who shares this best metric (for ringall) */
- cur = outgoing;
- while(cur) {
- if (cur->stillgoing && !cur->chan && (cur->metric <= bestmetric)) {
- if (option_debug)
- ast_log(LOG_DEBUG, "(Parallel) Trying '%s' with metric %d\n", cur->interface, cur->metric);
- ring_entry(qe, cur, busies);
- }
- cur = cur->next;
- }
- } else {
- /* Ring just the best channel */
- if (option_debug)
- ast_log(LOG_DEBUG, "Trying '%s' with metric %d\n", best->interface, best->metric);
- ring_entry(qe, best, busies);
- }
- }
- } while (best && !best->chan);
- if (!best) {
- if (option_debug)
- ast_log(LOG_DEBUG, "Nobody left to try ringing in queue\n");
- return 0;
- }
- return 1;
-}
-
-static int store_next(struct queue_ent *qe, struct localuser *outgoing)
-{
- struct localuser *cur;
- struct localuser *best;
- int bestmetric=0;
-
- best = NULL;
- cur = outgoing;
- while(cur) {
+/*! \brief find the entry with the best metric, or NULL */
+static struct callattempt *find_best(struct callattempt *outgoing)
+{
+ struct callattempt *best = NULL, *cur;
+
+ for (cur = outgoing; cur; cur = cur->q_next) {
if (cur->stillgoing && /* Not already done */
!cur->chan && /* Isn't already going */
- (!best || (cur->metric < bestmetric))) { /* We haven't found one yet, or it's better */
- bestmetric = cur->metric;
+ (!best || cur->metric < best->metric)) { /* We haven't found one yet, or it's better */
best = cur;
}
- cur = cur->next;
- }
+ }
+ return best;
+}
+
+static int ring_one(struct queue_ent *qe, struct callattempt *outgoing, int *busies)
+{
+ int ret = 0;
+
+ while (ret == 0) {
+ struct callattempt *best = find_best(outgoing);
+ if (!best) {
+ if (option_debug)
+ ast_log(LOG_DEBUG, "Nobody left to try ringing in queue\n");
+ break;
+ }
+ if (!qe->parent->strategy) {
+ struct callattempt *cur;
+ /* Ring everyone who shares this best metric (for ringall) */
+ for (cur = outgoing; cur; cur = cur->q_next) {
+ if (cur->stillgoing && !cur->chan && cur->metric <= best->metric) {
+ if (option_debug)
+ ast_log(LOG_DEBUG, "(Parallel) Trying '%s' with metric %d\n", cur->interface, cur->metric);
+ ring_entry(qe, cur, busies);
+ }
+ }
+ } else {
+ /* Ring just the best channel */
+ if (option_debug)
+ ast_log(LOG_DEBUG, "Trying '%s' with metric %d\n", best->interface, best->metric);
+ ring_entry(qe, best, busies);
+ }
+ if (best->chan) /* break out with result = 1 */
+ ret = 1;
+ }
+ return ret;
+}
+
+static int store_next(struct queue_ent *qe, struct callattempt *outgoing)
+{
+ struct callattempt *best = find_best(outgoing);
+
if (best) {
/* Ring just the best channel */
if (option_debug)
@@ -1625,33 +1620,10 @@
#define AST_MAX_WATCHERS 256
-#define BUILD_WATCHERS do { \
- o = outgoing; \
- found = -1; \
- pos = 1; \
- numlines = 0; \
- watchers[0] = in; \
- while(o) { \
- /* Keep track of important channels */ \
- if (o->stillgoing) { \
- stillgoing = 1; \
- if (o->chan) { \
- watchers[pos++] = o->chan; \
- found = 1; \
- } \
- } \
- o = o->next; \
- numlines++; \
- } \
- } while(0)
-
-static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser *outgoing, int *to, char *digit, int prebusies, int caller_disconnect)
+static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callattempt *outgoing, int *to, char *digit, int prebusies, int caller_disconnect)
{
char *queue = qe->parent->name;
- char on[256] = "";
- struct localuser *o;
- int found;
- int numlines;
+ struct callattempt *o;
int status;
int sentringing = 0;
int numbusies = prebusies;
@@ -1659,21 +1631,35 @@
int stillgoing = 0;
int orig = *to;
struct ast_frame *f;
- struct localuser *peer = NULL;
- struct ast_channel *watchers[AST_MAX_WATCHERS];
- int pos;
+ struct callattempt *peer = NULL;
struct ast_channel *winner;
struct ast_channel *in = qe->chan;
+ char on[256] = "";
while(*to && !peer) {
- BUILD_WATCHERS;
- if ((found < 0) && stillgoing && !qe->parent->strategy) {
+ int numlines, retry, pos = 1;
+ struct ast_channel *watchers[AST_MAX_WATCHERS];
+ watchers[0] = in;
+
+ for (retry = 0; retry < 2; retry++) {
+ numlines = 0;
+ for (o = outgoing; o; o = o->q_next) { /* Keep track of important channels */
+ if (o->stillgoing) { /* Keep track of important channels */
+ stillgoing = 1;
+ if (o->chan)
+ watchers[pos++] = o->chan;
+ }
+ numlines++;
+ }
+ if (pos > 1 /* found */ || !stillgoing /* nobody listening */ ||
+ qe->parent->strategy /* ring would not be delivered */)
+ break;
/* On "ringall" strategy we only move to the next penalty level
when *all* ringing phones are done in the current penalty level */
ring_one(qe, outgoing, &numbusies);
- BUILD_WATCHERS;
- }
- if (found < 0) {
+ /* and retry... */
+ }
+ if (pos == 1 /* not found */) {
if (numlines == (numbusies + numnochan)) {
ast_log(LOG_DEBUG, "Everyone is busy at this time\n");
} else {
@@ -1683,8 +1669,7 @@
return NULL;
}
winner = ast_waitfor_n(watchers, pos, to);
- o = outgoing;
- while(o) {
+ for (o = outgoing; o; o = o->q_next) {
if (o->stillgoing && (o->chan) && (o->chan->_state == AST_STATE_UP)) {
if (!peer) {
if (option_verbose > 2)
@@ -1699,8 +1684,7 @@
char *tech;
ast_copy_string(tmpchan, o->chan->call_forward, sizeof(tmpchan));
if ((stuff = strchr(tmpchan, '/'))) {
- *stuff = '\0';
- stuff++;
+ *stuff++ = '\0';
tech = tmpchan;
} else {
snprintf(tmpchan, sizeof(tmpchan), "%s@%s", o->chan->call_forward, o->chan->context);
@@ -1752,9 +1736,7 @@
o->chan->cid.cid_rdnis = strdup(in->exten);
if (ast_call(o->chan, tmpchan, 0)) {
ast_log(LOG_NOTICE, "Failed to dial on local channel for call forward to '%s'\n", tmpchan);
- o->stillgoing = 0;
- ast_hangup(o->chan);
- o->chan = NULL;
+ do_hang(o);
numnochan++;
}
}
@@ -1777,11 +1759,9 @@
case AST_CONTROL_BUSY:
if (option_verbose > 2)
ast_verbose( VERBOSE_PREFIX_3 "%s is busy\n", o->chan->name);
- o->stillgoing = 0;
if (in->cdr)
ast_cdr_busy(in->cdr);
- ast_hangup(o->chan);
- o->chan = NULL;
+ do_hang(o);
if (qe->parent->strategy) {
if (qe->parent->timeoutrestart)
*to = orig;
@@ -1792,11 +1772,9 @@
case AST_CONTROL_CONGESTION:
if (option_verbose > 2)
ast_verbose( VERBOSE_PREFIX_3 "%s is circuit-busy\n", o->chan->name);
- o->stillgoing = 0;
if (in->cdr)
ast_cdr_busy(in->cdr);
- ast_hangup(o->chan);
- o->chan = NULL;
+ do_hang(o);
if (qe->parent->strategy) {
if (qe->parent->timeoutrestart)
*to = orig;
@@ -1823,9 +1801,7 @@
}
ast_frfree(f);
} else {
- o->stillgoing = 0;
- ast_hangup(o->chan);
- o->chan = NULL;
+ do_hang(o);
if (qe->parent->strategy) {
if (qe->parent->timeoutrestart)
*to = orig;
@@ -1833,7 +1809,6 @@
}
}
}
- o = o->next;
}
if (winner == in) {
f = ast_read(in);
@@ -1883,7 +1858,6 @@
}
return peer;
-
}
static int is_our_turn(struct queue_ent *qe)
@@ -1979,7 +1953,7 @@
return 0;
}
-static int calc_metric(struct ast_call_queue *q, struct member *mem, int pos, struct queue_ent *qe, struct localuser *tmp)
+static int calc_metric(struct ast_call_queue *q, struct member *mem, int pos, struct queue_ent *qe, struct callattempt *tmp)
{
if (mem->penalty > qe->max_penalty)
return -1;
@@ -2037,7 +2011,7 @@
static int try_calling(struct queue_ent *qe, const char *options, char *announceoverride, const char *url, int *go_on)
{
struct member *cur;
- struct localuser *outgoing=NULL, *tmp = NULL;
+ struct callattempt *outgoing=NULL; /* the queue we are building */
int to;
char restofit[AST_MAX_EXTENSION];
char oldexten[AST_MAX_EXTENSION]="";
@@ -2046,7 +2020,7 @@
char *newnum;
struct ast_channel *peer;
struct ast_channel *which;
- struct localuser *lpeer;
+ struct callattempt *lpeer;
struct member *member;
int res = 0, bridge = 0;
int numbusies = 0;
@@ -2104,8 +2078,9 @@
if (!ast_strlen_zero(announceoverride))
announce = announceoverride;
- while(cur) {
- if (!(tmp = ast_calloc(1, sizeof(*tmp)))) {
+ for (;cur; cur = cur->next) {
+ struct callattempt *tmp = ast_calloc(1, sizeof(*tmp));
+ if (!tmp) {
ast_mutex_unlock(&qe->parent->lock);
if (use_weight)
AST_LIST_UNLOCK(&queues);
@@ -2137,7 +2112,7 @@
/* Put them in the list of outgoing thingies... We're ready now.
XXX If we're forcibly removed, these outgoing calls won't get
hung up XXX */
- tmp->next = outgoing;
+ tmp->q_next = outgoing;
outgoing = tmp;
/* If this line is up, don't try anybody else */
if (outgoing->chan && (outgoing->chan->_state == AST_STATE_UP))
@@ -2145,13 +2120,8 @@
} else {
free(tmp);
}
-
- cur = cur->next;
- }
- if (qe->parent->timeout)
- to = qe->parent->timeout * 1000;
- else
- to = -1;
+ }
+ to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1;
ring_one(qe, outgoing, &numbusies);
ast_mutex_unlock(&qe->parent->lock);
if (use_weight)
@@ -2162,10 +2132,7 @@
store_next(qe, outgoing);
}
ast_mutex_unlock(&qe->parent->lock);
- if (lpeer)
- peer = lpeer->chan;
- else
- peer = NULL;
+ peer = lpeer ? lpeer->chan : NULL;
if (!peer) {
if (to) {
/* Must gotten hung up */
@@ -2175,9 +2142,7 @@
}
if (option_debug)
ast_log(LOG_DEBUG, "%s: Nobody answered.\n", qe->chan->name);
- goto out;
- }
- if (peer) {
+ } else { /* peer is valid */
/* Ah ha! Someone answered within the desired timeframe. Of course after this
we will always return with -1 so that it is hung up properly after the
conversation. */
@@ -2337,7 +2302,7 @@
res = 1; /* JDG: bridge successfully, leave app_queue */
else
res = bridge; /* bridge error, stay in the queue */
- }
+ }
out:
hangupcalls(outgoing, NULL);
return res;
@@ -2630,7 +2595,7 @@
static int pqm_exec(struct ast_channel *chan, void *data)
{
- struct localuser *u;
+ struct localuser *lu;
char *parse;
int priority_jump = 0;
AST_DECLARE_APP_ARGS(args,
@@ -2649,7 +2614,7 @@
AST_STANDARD_APP_ARGS(args, parse);
- LOCAL_USER_ADD(u);
+ LOCAL_USER_ADD(lu);
if (args.options) {
if (strchr(args.options, 'j'))
@@ -2658,7 +2623,7 @@
if (ast_strlen_zero(args.interface)) {
ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface[|options])\n");
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
return -1;
}
@@ -2667,23 +2632,23 @@
if (priority_jump || ast_opt_priority_jumping) {
if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) {
pbx_builtin_setvar_helper(chan, "PQMSTATUS", "NOTFOUND");
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
return 0;
}
}
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
pbx_builtin_setvar_helper(chan, "PQMSTATUS", "NOTFOUND");
return -1;
}
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
pbx_builtin_setvar_helper(chan, "PQMSTATUS", "PAUSED");
return 0;
}
static int upqm_exec(struct ast_channel *chan, void *data)
{
- struct localuser *u;
+ struct localuser *lu;
char *parse;
int priority_jump = 0;
AST_DECLARE_APP_ARGS(args,
@@ -2702,7 +2667,7 @@
AST_STANDARD_APP_ARGS(args, parse);
- LOCAL_USER_ADD(u);
+ LOCAL_USER_ADD(lu);
if (args.options) {
if (strchr(args.options, 'j'))
@@ -2711,7 +2676,7 @@
if (ast_strlen_zero(args.interface)) {
ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface[|options])\n");
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
return -1;
}
@@ -2720,16 +2685,16 @@
if (priority_jump || ast_opt_priority_jumping) {
if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) {
pbx_builtin_setvar_helper(chan, "UPQMSTATUS", "NOTFOUND");
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
return 0;
}
}
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
pbx_builtin_setvar_helper(chan, "UPQMSTATUS", "NOTFOUND");
return -1;
}
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
pbx_builtin_setvar_helper(chan, "UPQMSTATUS", "UNPAUSED");
return 0;
}
@@ -2737,7 +2702,7 @@
static int rqm_exec(struct ast_channel *chan, void *data)
{
int res=-1;
- struct localuser *u;
+ struct localuser *lu;
char *parse, *temppos = NULL;
int priority_jump = 0;
AST_DECLARE_APP_ARGS(args,
@@ -2757,7 +2722,7 @@
AST_STANDARD_APP_ARGS(args, parse);
- LOCAL_USER_ADD(u);
+ LOCAL_USER_ADD(lu);
if (ast_strlen_zero(args.interface)) {
args.interface = ast_strdupa(chan->name);
@@ -2794,14 +2759,14 @@
break;
}
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
return res;
}
static int aqm_exec(struct ast_channel *chan, void *data)
{
int res=-1;
- struct localuser *u;
+ struct localuser *lu;
char *parse, *temppos = NULL;
int priority_jump = 0;
AST_DECLARE_APP_ARGS(args,
@@ -2822,7 +2787,7 @@
AST_STANDARD_APP_ARGS(args, parse);
- LOCAL_USER_ADD(u);
+ LOCAL_USER_ADD(lu);
if (ast_strlen_zero(args.interface)) {
args.interface = ast_strdupa(chan->name);
@@ -2867,7 +2832,7 @@
break;
}
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
return res;
}
@@ -2875,7 +2840,7 @@
{
int res=-1;
int ringing=0;
- struct localuser *u;
+ struct localuser *lu;
const char *user_priority;
const char *max_penalty_str;
int prio;
@@ -2909,7 +2874,7 @@
}
AST_STANDARD_APP_ARGS(args, parse);
- LOCAL_USER_ADD(u);
+ LOCAL_USER_ADD(lu);
/* Setup our queue entry */
memset(&qe, 0, sizeof(qe));
@@ -3137,7 +3102,7 @@
set_queue_result(chan, reason);
res = 0;
}
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
return res;
}
@@ -3145,7 +3110,7 @@
{
int count = 0;
struct ast_call_queue *q;
- struct localuser *u;
+ struct localuser *lu;
struct member *m;
buf[0] = '\0';
@@ -3155,7 +3120,7 @@
return -1;
}
- LOCAL_USER_ADD(u);
+ LOCAL_USER_ADD(lu);
AST_LIST_LOCK(&queues);
@@ -3180,7 +3145,7 @@
}
snprintf(buf, len, "%d", count);
- LOCAL_USER_REMOVE(u);
+ LOCAL_USER_REMOVE(lu);
return 0;
}
@@ -3290,8 +3255,8 @@
q->dead = 1;
}
/* Chug through config file */
- cat = ast_category_browse(cfg, NULL);
- while(cat) {
+ cat = NULL;
+ while ((cat = ast_category_browse(cfg, cat)) ) {
if (!strcasecmp(cat, "general")) {
/* Initialize global settings */
queue_persistent_members = 0;
@@ -3324,8 +3289,7 @@
while(prev->next)
prev = prev->next;
}
- var = ast_variable_browse(cfg, cat);
- while(var) {
+ for (var = ast_variable_browse(cfg, cat); var; var = var->next) {
if (!strcasecmp(var->name, "member")) {
/* Add a new member */
ast_copy_string(interface, var->value, sizeof(interface));
@@ -3349,7 +3313,6 @@
} else {
queue_set_param(q, var->name, var->value, var->lineno, 1);
}
- var = var->next;
}
if (new) {
AST_LIST_INSERT_HEAD(&queues, q, list);
@@ -3357,7 +3320,6 @@
ast_mutex_unlock(&q->lock);
}
}
- cat = ast_category_browse(cfg, cat);
}
ast_config_destroy(cfg);
AST_LIST_TRAVERSE_SAFE_BEGIN(&queues, q, list) {
@@ -3488,11 +3450,9 @@
AST_LIST_LOCK(&queues);
AST_LIST_TRAVERSE(&queues, q, list) {
- if (!strncasecmp(word, q->name, wordlen)) {
- if (++which > state) {
- ret = strdup(q->name);
- break;
- }
+ if (!strncasecmp(word, q->name, wordlen) && (++which > state)) {
+ ret = strdup(q->name);
+ break;
}
}
AST_LIST_UNLOCK(&queues);
@@ -3624,9 +3584,8 @@
if (ast_strlen_zero(penalty_s))
penalty = 0;
- else if (sscanf(penalty_s, "%d", &penalty) != 1) {
+ else if (sscanf(penalty_s, "%d", &penalty) != 1)
penalty = 0;
- }
if (ast_strlen_zero(paused_s))
paused = 0;
@@ -3698,11 +3657,7 @@
if (set_member_paused(queuename, interface, paused))
astman_send_error(s, m, "Interface not found");
else
- if (paused)
- astman_send_ack(s, m, "Interface paused successfully");
- else
- astman_send_ack(s, m, "Interface unpaused successfully");
-
+ astman_send_ack(s, m, paused ? "Interface paused successfully" : "Interface unpaused successfully");
return 0;
}
@@ -3757,24 +3712,14 @@
{
/* 0 - add; 1 - queue; 2 - member; 3 - <member>; 4 - to; 5 - <queue>; 6 - penalty; 7 - <penalty> */
switch (pos) {
- case 3:
- /* Don't attempt to complete name of member (infinite possibilities) */
+ case 3: /* Don't attempt to complete name of member (infinite possibilities) */
return NULL;
- case 4:
- if (state == 0) {
- return strdup("to");
- } else {
- return NULL;
- }
- case 5:
- /* No need to duplicate code */
+ case 4: /* only one possible match, "to" */
+ return state == 0 ? strdup("to") : NULL;
+ case 5: /* <queue> */
return complete_queue(line, word, pos, state);
- case 6:
- if (state == 0) {
- return strdup("penalty");
- } else {
- return NULL;
- }
+ case 6: /* only one possible match, "penalty" */
+ return state == 0 ? strdup("penalty") : NULL;
case 7:
if (state < 100) { /* 0-99 */
char *num;
@@ -3827,23 +3772,16 @@
struct ast_call_queue *q;
struct member *m;
- /* 0 - add; 1 - queue; 2 - member; 3 - <member>; 4 - to; 5 - <queue> */
- if ((pos > 5) || (pos < 3)) {
- return NULL;
- }
- if (pos == 4) {
- if (state == 0) {
- return strdup("from");
- } else {
- return NULL;
- }
- }
-
- if (pos == 5) {
- /* No need to duplicate code */
- return complete_queue(line, word, pos, state);
- }
-
+ /* 0 - add; 1 - queue; 2 - member; 3 - <member>; 4 - from; 5 - <queue> */
+ if (pos > 5 || pos < 3)
+ return NULL;
+ if (pos == 4) /* only one possible match, 'from' */
+ return state == 0 ? strdup("from") : NULL;
+
+ if (pos == 5) /* No need to duplicate code */
+ return complete_queue(line, word, pos, state);
+
+ /* here is the case for 3, <member> */
if (!AST_LIST_EMPTY(&queues)) {
AST_LIST_TRAVERSE(&queues, q, list) {
ast_mutex_lock(&q->lock);
More information about the asterisk-commits
mailing list