[asterisk-commits] trunk r34193 - /trunk/apps/app_queue.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Wed Jun 14 16:20:09 MST 2006
Author: kpfleming
Date: Wed Jun 14 18:20:08 2006
New Revision: 34193
URL: http://svn.digium.com/view/asterisk?rev=34193&view=rev
Log:
various coding style cleanup and minor fixes
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=34193&r1=34192&r2=34193&view=diff
==============================================================================
--- trunk/apps/app_queue.c (original)
+++ trunk/apps/app_queue.c Wed Jun 14 18:20:08 2006
@@ -420,20 +420,24 @@
static char *int2strat(int strategy)
{
int x;
- for (x=0;x<sizeof(strategies) / sizeof(strategies[0]);x++) {
+
+ for (x = 0; x < sizeof(strategies) / sizeof(strategies[0]); x++) {
if (strategy == strategies[x].strategy)
return strategies[x].name;
}
+
return "<unknown>";
}
static int strat2int(const char *strategy)
{
int x;
- for (x=0;x<sizeof(strategies) / sizeof(strategies[0]);x++) {
+
+ for (x = 0; x < sizeof(strategies) / sizeof(strategies[0]); x++) {
if (!strcasecmp(strategy, strategies[x].name))
return strategies[x].strategy;
}
+
return -1;
}
@@ -587,8 +591,6 @@
{
struct member *cur;
- /* Add a new member */
-
if ((cur = ast_calloc(1, sizeof(*cur)))) {
cur->penalty = penalty;
cur->paused = paused;
@@ -615,6 +617,7 @@
static void init_queue(struct ast_call_queue *q)
{
int i;
+
q->dead = 0;
q->retry = DEFAULT_RETRY;
q->timeout = -1;
@@ -642,7 +645,7 @@
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));
ast_copy_string(q->sound_periodicannounce[0], "queue-periodic-announce", sizeof(q->sound_periodicannounce[0]));
- for (i=1;i<MAX_PERIODIC_ANNOUNCEMENTS;i++) {
+ for (i = 1; i < MAX_PERIODIC_ANNOUNCEMENTS; i++) {
q->sound_periodicannounce[i][0]='\0';
}
}
@@ -749,6 +752,7 @@
int i = 0;
char *c, *lastc;
char buff[80];
+
if (!strcasecmp(param, "music") || !strcasecmp(param, "musiconhold")) {
ast_copy_string(q->moh, val, sizeof(q->moh));
} else if (!strcasecmp(param, "announce")) {
@@ -898,24 +902,20 @@
struct member *m, *prev_m;
int penalty = 0;
- if(penalty_str) {
+ if (penalty_str) {
penalty = atoi(penalty_str);
- if(penalty < 0)
+ if (penalty < 0)
penalty = 0;
}
/* Find the member, or the place to put a new one. */
- prev_m = NULL;
- m = q->members;
- while (m && strcmp(m->interface, interface)) {
- prev_m = m;
- m = m->next;
- }
+ for (m = q->members, prev_m = NULL;
+ m && strcmp(m->interface, interface);
+ prev_m = m, m = m->next);
/* Create a new one if not found, else update penalty */
if (!m) {
- m = create_queue_member(interface, penalty, 0);
- if (m) {
+ if ((m = create_queue_member(interface, penalty, 0))) {
m->dead = 0;
add_to_interfaces(interface);
if (prev_m) {
@@ -970,9 +970,8 @@
/* Find the queue in the in-core list (we will create a new one if not found). */
AST_LIST_TRAVERSE(&queues, q, list) {
- if (!strcasecmp(q->name, queuename)) {
+ if (!strcasecmp(q->name, queuename))
break;
- }
}
/* Static queues override realtime. */
@@ -1024,38 +1023,32 @@
}
init_queue(q); /* Ensure defaults for all parameters not set explicitly. */
- v = queue_vars;
memset(tmpbuf, 0, sizeof(tmpbuf));
- while(v) {
+ for (v = queue_vars; v; v = v->next) {
/* Convert to dashes `-' from underscores `_' as the latter are more SQL friendly. */
- if((tmp = strchr(v->name, '_')) != NULL) {
+ if ((tmp = strchr(v->name, '_'))) {
ast_copy_string(tmpbuf, v->name, sizeof(tmpbuf));
tmp_name = tmpbuf;
tmp = tmp_name;
- while((tmp = strchr(tmp, '_')) != NULL)
+ while ((tmp = strchr(tmp, '_')))
*tmp++ = '-';
} else
tmp_name = v->name;
queue_set_param(q, tmp_name, v->value, -1, 0);
- v = v->next;
}
if (q->strategy == QUEUE_STRATEGY_ROUNDROBIN)
rr_dep_warning();
/* Temporarily set non-dynamic members dead so we can detect deleted ones. */
- m = q->members;
- while (m) {
+ for (m = q->members; m; m = m->next) {
if (!m->dynamic)
m->dead = 1;
- m = m->next;
- }
-
- interface = ast_category_browse(member_config, NULL);
- while (interface) {
+ }
+
+ interface = NULL;
+ while (ast_category_browse(member_config, interface))
rt_handle_member_record(q, interface, ast_variable_retrieve(member_config, interface, "penalty"));
- interface = ast_category_browse(member_config, interface);
- }
/* Delete all realtime members that have been deleted in DB. */
m = q->members;
@@ -1083,7 +1076,7 @@
static struct ast_call_queue *load_realtime_queue(char *queuename)
{
- struct ast_variable *queue_vars = NULL;
+ struct ast_variable *queue_vars;
struct ast_config *member_config = NULL;
struct ast_call_queue *q;
@@ -1137,8 +1130,7 @@
int inserted = 0;
enum queue_member_status stat;
- q = load_realtime_queue(queuename);
- if (!q)
+ if (!(q = load_realtime_queue(queuename)))
return res;
AST_LIST_LOCK(&queues);
@@ -1159,7 +1151,7 @@
inserted = 0;
prev = NULL;
cur = q->head;
- while(cur) {
+ while (cur) {
/* We have higher priority than the current user, enter
* before him, after all the other users with priority
* higher or equal to our priority. */
@@ -1179,7 +1171,6 @@
ast_copy_string(qe->context, q->context, sizeof(qe->context));
q->count++;
res = 0;
- /* XXX missing CalledIDnum ? */
manager_event(EVENT_FLAG_CALL, "Join",
"Channel: %s\r\nCallerID: %s\r\nCallerIDName: %s\r\nQueue: %s\r\nPosition: %d\r\nCount: %d\r\nUniqueid: %s\r\n",
qe->chan->name,
@@ -1191,6 +1182,7 @@
}
ast_mutex_unlock(&q->lock);
AST_LIST_UNLOCK(&queues);
+
return res;
}
@@ -1200,12 +1192,8 @@
ast_stopstream(chan);
res = ast_streamfile(chan, filename, chan->language);
-
if (!res)
res = ast_waitstream(chan, AST_DIGIT_ANY);
- else
- res = 0;
-
ast_stopstream(chan);
return res;
@@ -1239,6 +1227,7 @@
/* Return 1 on a successful goto */
return 1;
}
+
return 0;
}
@@ -1249,11 +1238,11 @@
/* 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 )
+ if ((now - qe->last_pos) < 15)
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) )
+ if ((qe->last_pos_said == qe->pos) && ((now - qe->last_pos) < qe->parent->announcefrequency))
return 0;
ast_moh_stop(qe->chan);
@@ -1276,14 +1265,14 @@
goto playout;
}
/* Round hold time to nearest minute */
- avgholdmins = abs(( (qe->parent->holdtime + 30) - (now - qe->start) ) / 60);
+ avgholdmins = abs(((qe->parent->holdtime + 30) - (now - qe->start)) / 60);
/* If they have specified a rounding then round the seconds as well */
- if(qe->parent->roundingseconds) {
- avgholdsecs = (abs(( (qe->parent->holdtime + 30) - (now - qe->start) )) - 60 * avgholdmins) / qe->parent->roundingseconds;
- avgholdsecs*= qe->parent->roundingseconds;
+ if (qe->parent->roundingseconds) {
+ avgholdsecs = (abs(((qe->parent->holdtime + 30) - (now - qe->start))) - 60 * avgholdmins) / qe->parent->roundingseconds;
+ avgholdsecs *= qe->parent->roundingseconds;
} else {
- avgholdsecs=0;
+ avgholdsecs = 0;
}
if (option_verbose > 2)
@@ -1297,17 +1286,17 @@
if (res && valid_exit(qe, res))
goto playout;
- if (avgholdmins>0) {
+ if (avgholdmins > 0) {
if (avgholdmins < 2) {
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);
+ res = ast_say_number(qe->chan, 2, AST_DIGIT_ANY, qe->chan->language, 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);
+ res = ast_say_number(qe->chan, avgholdmins, AST_DIGIT_ANY, qe->chan->language, NULL);
if (res && valid_exit(qe, res))
goto playout;
}
@@ -1317,7 +1306,7 @@
goto playout;
}
if (avgholdsecs>0) {
- res = ast_say_number(qe->chan, avgholdsecs, AST_DIGIT_ANY, qe->chan->language, (char*) NULL);
+ res = ast_say_number(qe->chan, avgholdsecs, AST_DIGIT_ANY, qe->chan->language, NULL);
if (res && valid_exit(qe, res))
goto playout;
@@ -1373,14 +1362,12 @@
struct queue_ent *cur, *prev = NULL;
int pos = 0;
- q = qe->parent;
- if (!q)
+ if (!(q = qe->parent))
return;
ast_mutex_lock(&q->lock);
prev = NULL;
- cur = q->head;
- while(cur) {
+ for (cur = q->head; cur; cur = cur->next) {
if (cur == qe) {
q->count--;
@@ -1400,9 +1387,9 @@
cur->pos = ++pos;
prev = cur;
}
- cur = cur->next;
}
ast_mutex_unlock(&q->lock);
+
if (q->dead && !q->count) {
/* It's dead and nobody is in it, so kill it */
AST_LIST_LOCK(&queues);
@@ -1417,12 +1404,12 @@
{
struct callattempt *oo;
- while(outgoing) {
+ while (outgoing) {
/* Hangup any existing lines we have open */
if (outgoing->chan && (outgoing->chan != exception))
ast_hangup(outgoing->chan);
oo = outgoing;
- outgoing=outgoing->q_next;
+ outgoing = outgoing->q_next;
free(oo);
}
}
@@ -1435,22 +1422,22 @@
be sure it's still valid */
ast_mutex_lock(&q->lock);
for (cur = q->members; cur; cur = cur->next) {
- if (member == cur) {
- cur->status = status;
- if (!q->maskmemberstatus) {
- manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
- "Queue: %s\r\n"
- "Location: %s\r\n"
- "Membership: %s\r\n"
- "Penalty: %d\r\n"
- "CallsTaken: %d\r\n"
- "LastCall: %d\r\n"
- "Status: %d\r\n"
- "Paused: %d\r\n",
- q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
- cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
- }
- break;
+ if (member != cur)
+ continue;
+
+ cur->status = status;
+ if (!q->maskmemberstatus) {
+ manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
+ "Queue: %s\r\n"
+ "Location: %s\r\n"
+ "Membership: %s\r\n"
+ "Penalty: %d\r\n"
+ "CallsTaken: %d\r\n"
+ "LastCall: %d\r\n"
+ "Status: %d\r\n"
+ "Paused: %d\r\n",
+ q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
+ cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
}
}
ast_mutex_unlock(&q->lock);
@@ -1486,13 +1473,14 @@
ast_mutex_lock(&q->lock);
if (q->count && q->members) {
for (mem = q->members; mem; mem = mem->next) {
- if (!strcmp(mem->interface, member->interface)) {
- ast_log(LOG_DEBUG, "Found matching member %s in queue '%s'\n", mem->interface, q->name);
- if (q->weight > rq->weight) {
- ast_log(LOG_DEBUG, "Queue '%s' (weight %d, calls %d) is preferred over '%s' (weight %d, calls %d)\n", q->name, q->weight, q->count, rq->name, rq->weight, rq->count);
- found = 1;
- break;
- }
+ if (strcmp(mem->interface, member->interface))
+ continue;
+
+ ast_log(LOG_DEBUG, "Found matching member %s in queue '%s'\n", mem->interface, q->name);
+ if (q->weight > rq->weight) {
+ ast_log(LOG_DEBUG, "Queue '%s' (weight %d, calls %d) is preferred over '%s' (weight %d, calls %d)\n", q->name, q->weight, q->count, rq->name, rq->weight, rq->count);
+ found = 1;
+ break;
}
}
}
@@ -1564,9 +1552,6 @@
/* Request the peer */
tmp->chan = ast_request(tech, qe->chan->nativeformats, location, &status);
if (!tmp->chan) { /* If we can't, just go on to the next call */
-#if 0
- ast_log(LOG_NOTICE, "Unable to create channel of type '%s' for Queue\n", cur->tech);
-#endif
if (qe->chan->cdr)
ast_cdr_busy(qe->chan->cdr);
tmp->stillgoing = 0;
@@ -1596,8 +1581,7 @@
tmp->chan->adsicpe = qe->chan->adsicpe;
/* Place the call, but don't wait on the answer */
- res = ast_call(tmp->chan, location, 0);
- if (res) {
+ if ((res = ast_call(tmp->chan, location, 0))) {
/* Again, keep going even if there's an error */
if (option_debug)
ast_log(LOG_DEBUG, "ast call on peer returned %d\n", res);
@@ -1624,6 +1608,7 @@
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Called %s\n", tmp->interface);
}
+
return 1;
}
@@ -1634,11 +1619,12 @@
for (cur = outgoing; cur; cur = cur->q_next) {
if (cur->stillgoing && /* Not already done */
- !cur->chan && /* Isn't already going */
- (!best || cur->metric < best->metric)) { /* We haven't found one yet, or it's better */
- best = cur;
- }
- }
+ !cur->chan && /* Isn't already going */
+ (!best || cur->metric < best->metric)) { /* We haven't found one yet, or it's better */
+ best = cur;
+ }
+ }
+
return best;
}
@@ -1672,6 +1658,7 @@
if (best->chan) /* break out with result = 1 */
ret = 1;
}
+
return ret;
}
@@ -1695,6 +1682,7 @@
}
}
qe->parent->wrapped = 0;
+
return 0;
}
@@ -1713,15 +1701,8 @@
/* Stop playback */
ast_stopstream(chan);
- } else {
- res = 0;
}
- /*if (res) {
- ast_log(LOG_WARNING, "ast_streamfile failed on %s \n", chan->name);
- res = 0;
- }*/
-
return res;
}
@@ -1782,7 +1763,6 @@
/*! \brief RNA == Ring No Answer. Common code that is executed when we try a queue member and they don't answer. */
static void rna(int rnatime, struct queue_ent *qe, char *membername)
{
-
if (option_verbose > 2)
ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", rnatime);
ast_queue_log(qe->parent->name, qe->chan->uniqueid, membername, "RINGNOANSWER", "%d", rnatime);
@@ -1818,7 +1798,7 @@
long starttime = 0;
long endtime = 0;
- starttime = (long)time(NULL);
+ starttime = (long) time(NULL);
while(*to && !peer) {
int numlines, retry, pos = 1;
@@ -1863,9 +1843,10 @@
} else if (o->chan && (o->chan == winner)) {
ast_copy_string(on, o->member->interface, sizeof(on));
if (!ast_strlen_zero(o->chan->call_forward)) {
- char tmpchan[256]="";
+ char tmpchan[256];
char *stuff;
char *tech;
+
ast_copy_string(tmpchan, o->chan->call_forward, sizeof(tmpchan));
if ((stuff = strchr(tmpchan, '/'))) {
*stuff++ = '\0';
@@ -1979,9 +1960,8 @@
}
ast_frfree(f);
} else {
- endtime = (long)time(NULL);
- endtime -= starttime;
- rna(endtime*1000, qe, on);
+ endtime = (long) time(NULL) - starttime;
+ rna(endtime * 1000, qe, on);
do_hang(o);
if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) {
if (qe->parent->timeoutrestart)
@@ -1993,15 +1973,9 @@
}
if (winner == in) {
f = ast_read(in);
-#if 0
- if (f && (f->frametype != AST_FRAME_VOICE))
- printf("Frame type: %d, %d\n", f->frametype, f->subclass);
- else if (!f || (f->frametype != AST_FRAME_VOICE))
- printf("Hangup received on %s\n", in->name);
-#endif
if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP))) {
/* Got hung up */
- *to=-1;
+ *to = -1;
if (f)
ast_frfree(f);
return NULL;
@@ -2009,15 +1983,15 @@
if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass == '*')) {
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
- *to=0;
+ *to = 0;
ast_frfree(f);
return NULL;
}
if ((f->frametype == AST_FRAME_DTMF) && (f->subclass != '*') && valid_exit(qe, f->subclass)) {
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_3 "User pressed digit: %c\n", f->subclass);
- *to=0;
- *digit=f->subclass;
+ *to = 0;
+ *digit = f->subclass;
ast_frfree(f);
return NULL;
}
@@ -2028,7 +2002,6 @@
}
return peer;
-
}
static int is_our_turn(struct queue_ent *qe)
@@ -2054,28 +2027,26 @@
}
} else {
-
/* This needs a lock. How many members are available to be served? */
-
ast_mutex_lock(&qe->parent->lock);
ch = qe->parent->head;
- cur = qe->parent->members;
-
- while (cur) {
- if (cur->status == 1)
- avl++;
- cur = cur->next;
- }
-
- if (option_debug)
- ast_log(LOG_DEBUG, "There are %d available members.\n", avl);
if (qe->parent->strategy == QUEUE_STRATEGY_RINGALL) {
if (option_debug)
- ast_log(LOG_DEBUG, "Even though there are %d available members, the strategy is ringall so only the head call is allowed in!\n", avl);
+ ast_log(LOG_DEBUG, "Even though there are %d available members, the strategy is ringall so only the head call is allowed in\n", avl);
avl = 1;
- }
+ } else {
+ cur = qe->parent->members;
+ while (cur) {
+ if (cur->status == 1)
+ avl++;
+ cur = cur->next;
+ }
+ }
+
+ if (option_debug)
+ ast_log(LOG_DEBUG, "There are %d available members.\n", avl);
while ((idx < avl) && (ch) && (ch != qe)) {
idx++;
@@ -2149,6 +2120,7 @@
if ((res = ast_waitfordigit(qe->chan, RECHECK * 1000)))
break;
}
+
return res;
}
@@ -2231,7 +2203,7 @@
static int try_calling(struct queue_ent *qe, const char *options, char *announceoverride, const char *url, int *go_on, const char *agi)
{
struct member *cur;
- struct callattempt *outgoing=NULL; /* the queue we are building */
+ struct callattempt *outgoing = NULL; /* the list of calls we are building */
int to;
char oldexten[AST_MAX_EXTENSION]="";
char oldcontext[AST_MAX_CONTEXT]="";
@@ -2260,7 +2232,6 @@
char mixmonargs[1512];
struct ast_app *mixmonapp = NULL;
char *p;
-
memset(&bridge_config, 0, sizeof(bridge_config));
time(&now);
@@ -2308,8 +2279,9 @@
if (!ast_strlen_zero(announceoverride))
announce = announceoverride;
- for (;cur; cur = cur->next) {
+ for (; cur; cur = cur->next) {
struct callattempt *tmp = ast_calloc(1, sizeof(*tmp));
+
if (!tmp) {
ast_mutex_unlock(&qe->parent->lock);
if (use_weight)
@@ -2317,13 +2289,6 @@
goto out;
}
tmp->stillgoing = -1;
- if (option_debug) {
- if (url)
- ast_log(LOG_DEBUG, "Queue with URL=%s_\n", url);
- else
- ast_log(LOG_DEBUG, "Simple queue (no URL)\n");
- }
-
tmp->member = cur; /* Never directly dereference! Could change on reload */
tmp->oldstatus = cur->status;
tmp->lastcall = cur->lastcall;
@@ -2383,6 +2348,7 @@
outgoing = NULL;
if (announce || qe->parent->reportholdtime || qe->parent->memberdelay) {
int res2;
+
res2 = ast_autoservice_start(qe->chan);
if (!res2) {
if (qe->parent->memberdelay) {
@@ -2514,13 +2480,12 @@
}
if (!monitor_options)
- monitor_options = ast_strdupa("");
+ monitor_options = "";
if (strchr(monitor_options, '|')) {
ast_log(LOG_WARNING, "MONITOR_OPTIONS cannot contain a '|'! Not recording.\n");
mixmonapp = NULL;
}
-
if (mixmonapp) {
if (!ast_strlen_zero(monitor_exec) && !ast_strlen_zero(monitor_options))
@@ -2567,7 +2532,7 @@
"Holdtime: %ld\r\n"
"BridgedChannel: %s\r\n",
queuename, qe->chan->uniqueid, peer->name, member->interface,
- (long)time(NULL) - qe->start,peer->uniqueid);
+ (long) time(NULL) - qe->start,peer->uniqueid);
ast_copy_string(oldcontext, qe->chan->context, sizeof(oldcontext));
ast_copy_string(oldexten, qe->chan->exten, sizeof(oldexten));
time(&callstart);
@@ -2576,10 +2541,11 @@
if (strcasecmp(oldcontext, qe->chan->context) || strcasecmp(oldexten, qe->chan->exten)) {
ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "TRANSFER", "%s|%s|%ld|%ld",
- qe->chan->exten, qe->chan->context, (long)(callstart - qe->start), (long)(time(NULL) - callstart));
+ qe->chan->exten, qe->chan->context, (long) (callstart - qe->start),
+ (long) (time(NULL) - callstart));
} else if (qe->chan->_softhangup) {
ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "COMPLETECALLER", "%ld|%ld",
- (long)(callstart - qe->start), (long)(time(NULL) - callstart));
+ (long) (callstart - qe->start), (long) (time(NULL) - callstart));
if (qe->parent->eventwhencalled)
manager_event(EVENT_FLAG_AGENT, "AgentComplete",
"Queue: %s\r\n"
@@ -2590,9 +2556,10 @@
"TalkTime: %ld\r\n"
"Reason: caller\r\n",
queuename, qe->chan->uniqueid, peer->name, member->interface,
- (long)(callstart - qe->start), (long)(time(NULL) - callstart));
+ (long) (callstart - qe->start), (long) (time(NULL) - callstart));
} else {
- ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "COMPLETEAGENT", "%ld|%ld", (long)(callstart - qe->start), (long)(time(NULL) - callstart));
+ ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "COMPLETEAGENT", "%ld|%ld",
+ (long) (callstart - qe->start), (long) (time(NULL) - callstart));
if (qe->parent->eventwhencalled)
manager_event(EVENT_FLAG_AGENT, "AgentComplete",
"Queue: %s\r\n"
@@ -2602,7 +2569,7 @@
"TalkTime: %ld\r\n"
"Reason: agent\r\n",
queuename, qe->chan->uniqueid, peer->name, (long)(callstart - qe->start),
- (long)(time(NULL) - callstart));
+ (long) (time(NULL) - callstart));
}
if (bridge != AST_PBX_NO_HANGUP_PEER)
@@ -2612,6 +2579,7 @@
}
out:
hangupcalls(outgoing, NULL);
+
return res;
}
@@ -2627,10 +2595,13 @@
{
struct member *mem;
- if (q)
- for (mem = q->members; mem; mem = mem->next)
- if (!strcasecmp(interface, mem->interface))
- return mem;
+ if (!q)
+ return NULL;
+
+ for (mem = q->members; mem; mem = mem->next) {
+ if (!strcasecmp(interface, mem->interface))
+ return mem;
+ }
return NULL;
}
@@ -2684,42 +2655,46 @@
AST_LIST_LOCK(&queues);
AST_LIST_TRAVERSE(&queues, q, list) {
ast_mutex_lock(&q->lock);
- if (!strcmp(q->name, queuename)) {
- if ((last_member = interface_exists(q, interface))) {
- if ((look = q->members) == last_member) {
- q->members = last_member->next;
- } else {
- while (look != NULL) {
- if (look->next == last_member) {
- look->next = last_member->next;
- break;
- } else {
- look = look->next;
- }
+ if (strcmp(q->name, queuename)) {
+ ast_mutex_unlock(&q->lock);
+ continue;
+ }
+
+ if ((last_member = interface_exists(q, interface))) {
+ if ((look = q->members) == last_member) {
+ q->members = last_member->next;
+ } else {
+ while (look != NULL) {
+ if (look->next == last_member) {
+ look->next = last_member->next;
+ break;
+ } else {
+ look = look->next;
}
}
- manager_event(EVENT_FLAG_AGENT, "QueueMemberRemoved",
- "Queue: %s\r\n"
- "Location: %s\r\n",
- q->name, last_member->interface);
- free(last_member);
-
- if (queue_persistent_members)
- dump_queue_members(q);
-
- res = RES_OKAY;
- } else {
- res = RES_EXISTS;
- }
- ast_mutex_unlock(&q->lock);
- break;
+ }
+ manager_event(EVENT_FLAG_AGENT, "QueueMemberRemoved",
+ "Queue: %s\r\n"
+ "Location: %s\r\n",
+ q->name, last_member->interface);
+ free(last_member);
+
+ if (queue_persistent_members)
+ dump_queue_members(q);
+
+ res = RES_OKAY;
+ } else {
+ res = RES_EXISTS;
}
ast_mutex_unlock(&q->lock);
- }
- if (res == RES_OKAY) {
+ break;
+ }
+
+ if (res == RES_OKAY)
remove_from_interfaces(interface);
- }
+
AST_LIST_UNLOCK(&queues);
+
return res;
}
@@ -2732,47 +2707,44 @@
/* \note Ensure the appropriate realtime queue is loaded. Note that this
* short-circuits if the queue is already in memory. */
- q = load_realtime_queue(queuename);
+ if (!(q = load_realtime_queue(queuename)))
+ return res;
AST_LIST_LOCK(&queues);
- if (q) {
- ast_mutex_lock(&q->lock);
- if (interface_exists(q, interface) == NULL) {
-
- add_to_interfaces(interface);
-
- new_member = create_queue_member(interface, penalty, paused);
-
- if (new_member != NULL) {
- new_member->dynamic = 1;
- new_member->next = q->members;
- q->members = new_member;
- manager_event(EVENT_FLAG_AGENT, "QueueMemberAdded",
- "Queue: %s\r\n"
- "Location: %s\r\n"
- "Membership: %s\r\n"
- "Penalty: %d\r\n"
- "CallsTaken: %d\r\n"
- "LastCall: %d\r\n"
- "Status: %d\r\n"
- "Paused: %d\r\n",
- q->name, new_member->interface, new_member->dynamic ? "dynamic" : "static",
- new_member->penalty, new_member->calls, (int)new_member->lastcall, new_member->status, new_member->paused);
-
- if (dump)
- dump_queue_members(q);
-
- res = RES_OKAY;
- } else {
- res = RES_OUTOFMEMORY;
- }
+ ast_mutex_lock(&q->lock);
+ if (interface_exists(q, interface) == NULL) {
+ add_to_interfaces(interface);
+ if ((new_member = create_queue_member(interface, penalty, paused))) {
+ new_member->dynamic = 1;
+ new_member->next = q->members;
+ q->members = new_member;
+ manager_event(EVENT_FLAG_AGENT, "QueueMemberAdded",
+ "Queue: %s\r\n"
+ "Location: %s\r\n"
+ "Membership: %s\r\n"
+ "Penalty: %d\r\n"
+ "CallsTaken: %d\r\n"
+ "LastCall: %d\r\n"
+ "Status: %d\r\n"
+ "Paused: %d\r\n",
+ q->name, new_member->interface, new_member->dynamic ? "dynamic" : "static",
+ new_member->penalty, new_member->calls, (int) new_member->lastcall,
+ new_member->status, new_member->paused);
+
+ if (dump)
+ dump_queue_members(q);
+
+ res = RES_OKAY;
} else {
- res = RES_EXISTS;
- }
- ast_mutex_unlock(&q->lock);
- }
+ res = RES_OUTOFMEMORY;
+ }
+ } else {
+ res = RES_EXISTS;
+ }
+ ast_mutex_unlock(&q->lock);
AST_LIST_UNLOCK(&queues);
+
return res;
}
@@ -2813,10 +2785,7 @@
}
AST_LIST_UNLOCK(&queues);
- if (found)
- return RESULT_SUCCESS;
- else
- return RESULT_FAILURE;
+ return found ? RESULT_SUCCESS : RESULT_FAILURE;
}
/* Reload dynamic queue members persisted into the astdb */
@@ -2956,6 +2925,7 @@
LOCAL_USER_REMOVE(lu);
pbx_builtin_setvar_helper(chan, "PQMSTATUS", "PAUSED");
+
return 0;
}
@@ -3008,6 +2978,7 @@
LOCAL_USER_REMOVE(lu);
pbx_builtin_setvar_helper(chan, "UPQMSTATUS", "UNPAUSED");
+
return 0;
}
@@ -3071,6 +3042,7 @@
}
LOCAL_USER_REMOVE(lu);
+
return res;
}
@@ -3143,6 +3115,7 @@
}
LOCAL_USER_REMOVE(lu);
+
return res;
}
@@ -3156,10 +3129,8 @@
int prio;
int max_penalty;
enum queue_result reason = QUEUE_UNKNOWN;
-
/* whether to exit Queue application after the timeout hits */
int go_on = 0;
-
char *parse;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(queuename);
@@ -3169,7 +3140,6 @@
AST_APP_ARG(queuetimeoutstr);
AST_APP_ARG(agi);
);
-
/* Our queue entry */
struct queue_ent qe;
@@ -3257,7 +3227,8 @@
if (res < 0) {
/* Record this abandoned call */
record_abandoned(&qe);
- ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON", "%d|%d|%ld", qe.pos, qe.opos, (long)time(NULL) - qe.start);
+ ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON", "%d|%d|%ld",
+ qe.pos, qe.opos, (long) time(NULL) - qe.start);
if (option_verbose > 2) {
ast_verbose(VERBOSE_PREFIX_3 "User disconnected from queue %s while waiting their turn\n", args.queuename);
}
@@ -3273,6 +3244,7 @@
}
if (!res) {
int makeannouncement = 0;
+
for (;;) {
/* This is the wait loop for the head caller*/
/* To exit, they may get their call answered; */
@@ -3314,10 +3286,13 @@
if (res < 0) {
if (!qe.handled) {
record_abandoned(&qe);
- ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON", "%d|%d|%ld", qe.pos, qe.opos, (long)time(NULL) - qe.start);
+ ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON",
+ "%d|%d|%ld", qe.pos, qe.opos,
+ (long) time(NULL) - qe.start);
}
} else if (valid_exit(&qe, res)) {
- ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHKEY", "%s|%d", qe.digits, qe.pos);
+ ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHKEY",
+ "%s|%d", qe.digits, qe.pos);
}
break;
}
@@ -3405,6 +3380,7 @@
res = 0;
}
LOCAL_USER_REMOVE(lu);
+
return res;
}
@@ -3425,15 +3401,12 @@
LOCAL_USER_ADD(lu);
AST_LIST_LOCK(&queues);
-
- /* Find the right queue */
AST_LIST_TRAVERSE(&queues, q, list) {
if (!strcasecmp(q->name, data)) {
ast_mutex_lock(&q->lock);
break;
}
}
-
AST_LIST_UNLOCK(&queues);
if (q) {
@@ -3449,6 +3422,7 @@
snprintf(buf, len, "%d", count);
LOCAL_USER_REMOVE(lu);
+
return 0;
}
@@ -3468,15 +3442,12 @@
LOCAL_USER_ADD(lu);
AST_LIST_LOCK(&queues);
-
- /* Find the right queue */
AST_LIST_TRAVERSE(&queues, q, list) {
if (!strcasecmp(q->name, data)) {
ast_mutex_lock(&q->lock);
break;
}
}
-
AST_LIST_UNLOCK(&queues);
if (q) {
@@ -3507,19 +3478,17 @@
LOCAL_USER_ADD(u);
AST_LIST_LOCK(&queues);
-
- /* Find the right queue */
AST_LIST_TRAVERSE(&queues, q, list) {
if (!strcasecmp(q->name, data)) {
ast_mutex_lock(&q->lock);
break;
}
}
-
AST_LIST_UNLOCK(&queues);
if (q) {
int buflen = 0, count = 0;
+
for (m = q->members; m; m = m->next) {
/* strcat() is always faster than printf() */
if (count++) {
@@ -3541,6 +3510,7 @@
/* We should already be terminated, but let's make sure. */
buf[len - 1] = '\0';
LOCAL_USER_REMOVE(u);
+
return 0;
}
@@ -3593,8 +3563,7 @@
char interface[80];
int penalty;
- cfg = ast_config_load("queues.conf");
- if (!cfg) {
+ if (!(cfg = ast_config_load("queues.conf"))) {
ast_log(LOG_NOTICE, "No call queueing config file (queues.conf), so no call queues\n");
return;
}
@@ -3602,9 +3571,9 @@
AST_LIST_LOCK(&queues);
use_weight=0;
/* Mark all queues as dead for the moment */
- AST_LIST_TRAVERSE(&queues, q, list) {
+ AST_LIST_TRAVERSE(&queues, q, list)
q->dead = 1;
- }
+
/* Chug through config file */
cat = NULL;
while ((cat = ast_category_browse(cfg, cat)) ) {
@@ -3791,11 +3760,12 @@
else
ast_build_string(&max, &max_left, "unlimited");
sl = 0;
- if(q->callscompleted > 0)
- sl = 100*((float)q->callscompletedinsl/(float)q->callscompleted);
+ 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);
+ q->name, q->count, max_buf, int2strat(q->strategy), q->holdtime, q->weight,
+ q->callscompleted, q->callsabandoned,sl,q->servicelevel, term);
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);
@@ -3817,7 +3787,7 @@
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));
+ mem->calls, (long) (time(NULL) - mem->lastcall));
} else
ast_build_string(&max, &max_left, " has taken no calls yet");
if (s)
@@ -3837,11 +3807,13 @@
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);
+ 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);
+ 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);
@@ -3894,6 +3866,7 @@
static int manager_queues_show( struct mansession *s, struct message *m )
{
char *a[] = { "show", "queues" };
+
__queues_show(s, 1, -1, 2, a, 0);
astman_append(s, "\r\n\r\n"); /* Properly terminate Manager output */
@@ -3917,73 +3890,73 @@
astman_send_ack(s, m, "Queue status will follow");
time(&now);
AST_LIST_LOCK(&queues);
- if (!ast_strlen_zero(id)) {
- snprintf(idText,256,"ActionID: %s\r\n",id);
- }
+ if (!ast_strlen_zero(id))
+ snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
+
AST_LIST_TRAVERSE(&queues, q, list) {
ast_mutex_lock(&q->lock);
/* List queue properties */
if (ast_strlen_zero(queuefilter) || !strcmp(q->name, queuefilter)) {
- if(q->callscompleted > 0)
- sl = 100*((float)q->callscompletedinsl/(float)q->callscompleted);
+ if (q->callscompleted > 0)
+ sl = 100 * ((float) q->callscompletedinsl / (float) q->callscompleted);
astman_append(s, "Event: QueueParams\r\n"
- "Queue: %s\r\n"
- "Max: %d\r\n"
- "Calls: %d\r\n"
- "Holdtime: %d\r\n"
- "Completed: %d\r\n"
- "Abandoned: %d\r\n"
- "ServiceLevel: %d\r\n"
- "ServicelevelPerf: %2.1f\r\n"
- "Weight: %d\r\n"
- "%s"
- "\r\n",
- q->name, q->maxlen, q->count, q->holdtime, q->callscompleted,
- q->callsabandoned, q->servicelevel, sl, q->weight, idText);
+ "Queue: %s\r\n"
+ "Max: %d\r\n"
+ "Calls: %d\r\n"
+ "Holdtime: %d\r\n"
+ "Completed: %d\r\n"
+ "Abandoned: %d\r\n"
+ "ServiceLevel: %d\r\n"
+ "ServicelevelPerf: %2.1f\r\n"
+ "Weight: %d\r\n"
+ "%s"
+ "\r\n",
+ q->name, q->maxlen, q->count, q->holdtime, q->callscompleted,
+ q->callsabandoned, q->servicelevel, sl, q->weight, idText);
/* List Queue Members */
for (mem = q->members; mem; mem = mem->next) {
if (ast_strlen_zero(memberfilter) || !strcmp(mem->interface, memberfilter)) {
astman_append(s, "Event: QueueMember\r\n"
- "Queue: %s\r\n"
- "Location: %s\r\n"
- "Membership: %s\r\n"
- "Penalty: %d\r\n"
- "CallsTaken: %d\r\n"
- "LastCall: %d\r\n"
- "Status: %d\r\n"
- "Paused: %d\r\n"
- "%s"
- "\r\n",
- q->name, mem->interface, mem->dynamic ? "dynamic" : "static",
- mem->penalty, mem->calls, (int)mem->lastcall, mem->status, mem->paused, idText);
+ "Queue: %s\r\n"
+ "Location: %s\r\n"
+ "Membership: %s\r\n"
+ "Penalty: %d\r\n"
+ "CallsTaken: %d\r\n"
+ "LastCall: %d\r\n"
+ "Status: %d\r\n"
+ "Paused: %d\r\n"
+ "%s"
+ "\r\n",
+ q->name, mem->interface, mem->dynamic ? "dynamic" : "static",
+ mem->penalty, mem->calls, (int)mem->lastcall, mem->status, mem->paused, idText);
}
}
/* List Queue Entries */
pos = 1;
for (qe = q->head; qe; qe = qe->next) {
astman_append(s, "Event: QueueEntry\r\n"
- "Queue: %s\r\n"
- "Position: %d\r\n"
- "Channel: %s\r\n"
- "CallerID: %s\r\n"
- "CallerIDName: %s\r\n"
- "Wait: %ld\r\n"
- "%s"
- "\r\n",
- q->name, pos++, qe->chan->name,
- S_OR(qe->chan->cid.cid_num, "unknown"),
- S_OR(qe->chan->cid.cid_name, "unknown"),
- (long)(now - qe->start), idText);
+ "Queue: %s\r\n"
+ "Position: %d\r\n"
+ "Channel: %s\r\n"
+ "CallerID: %s\r\n"
+ "CallerIDName: %s\r\n"
+ "Wait: %ld\r\n"
+ "%s"
+ "\r\n",
+ q->name, pos++, qe->chan->name,
+ S_OR(qe->chan->cid.cid_num, "unknown"),
+ S_OR(qe->chan->cid.cid_name, "unknown"),
+ (long) (now - qe->start), idText);
}
}
ast_mutex_unlock(&q->lock);
}
astman_append(s,
- "Event: QueueStatusComplete\r\n"
- "%s"
- "\r\n",idText);
+ "Event: QueueStatusComplete\r\n"
+ "%s"
+ "\r\n",idText);
AST_LIST_UNLOCK(&queues);
@@ -4035,6 +4008,7 @@
astman_send_error(s, m, "Out of memory");
break;
}
+
return 0;
}
@@ -4064,6 +4038,7 @@
astman_send_error(s, m, "Out of memory");
break;
}
+
return 0;
}
@@ -4223,6 +4198,7 @@
ast_mutex_unlock(&q->lock);
}
}
+
return NULL;
}
@@ -4260,7 +4236,6 @@
{
int res;
- clear_and_free_interfaces();
res = ast_cli_unregister(&cli_show_queue);
res |= ast_cli_unregister(&cli_show_queues);
res |= ast_cli_unregister(&cli_add_queue_member);
@@ -4279,6 +4254,8 @@
res |= ast_custom_function_unregister(&queuememberlist_function);
res |= ast_custom_function_unregister(&queuewaitingcount_function);
res |= ast_unregister_application(app);
+
+ clear_and_free_interfaces();
STANDARD_HANGUP_LOCALUSERS;
More information about the asterisk-commits
mailing list