Whitespace fix

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@37596 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Tilghman Lesher 19 years ago
parent 6dd28d9670
commit d8ccfb6711

@ -23,18 +23,18 @@
* \author Mark Spencer <markster@digium.com> * \author Mark Spencer <markster@digium.com>
* *
* \arg Config in \ref Config_qu queues.conf * \arg Config in \ref Config_qu queues.conf
* *
* \par Development notes * \par Development notes
* \note 2004-11-25: Persistent Dynamic Members added by: * \note 2004-11-25: Persistent Dynamic Members added by:
* NetNation Communications (www.netnation.com) * NetNation Communications (www.netnation.com)
* Kevin Lindsay <kevinl@netnation.com> * Kevin Lindsay <kevinl@netnation.com>
* *
* Each dynamic agent in each queue is now stored in the astdb. * Each dynamic agent in each queue is now stored in the astdb.
* When asterisk is restarted, each agent will be automatically * When asterisk is restarted, each agent will be automatically
* readded into their recorded queues. This feature can be * readded into their recorded queues. This feature can be
* configured with the 'persistent_members=<1|0>' setting in the * configured with the 'persistent_members=<1|0>' setting in the
* '[general]' category in queues.conf. The default is on. * '[general]' category in queues.conf. The default is on.
* *
* \note 2004-06-04: Priorities in queues added by inAccess Networks (work funded by Hellas On Line (HOL) www.hol.gr). * \note 2004-06-04: Priorities in queues added by inAccess Networks (work funded by Hellas On Line (HOL) www.hol.gr).
* *
* \note These features added by David C. Troy <dave@toad.net>: * \note These features added by David C. Troy <dave@toad.net>:
@ -140,7 +140,7 @@ static char *descrip =
" 'h' -- allow callee to hang up by hitting *.\n" " 'h' -- allow callee to hang up by hitting *.\n"
" 'H' -- allow caller to hang up by hitting *.\n" " 'H' -- allow caller to hang up by hitting *.\n"
" 'n' -- no retries on the timeout; will exit this application and \n" " 'n' -- no retries on the timeout; will exit this application and \n"
" go to the next step.\n" " go to the next step.\n"
" 'r' -- ring instead of playing MOH\n" " 'r' -- ring instead of playing MOH\n"
" 't' -- allow the called user transfer the calling user\n" " 't' -- allow the called user transfer the calling user\n"
" 'T' -- to allow the calling user to transfer the call.\n" " 'T' -- to allow the calling user to transfer the call.\n"
@ -254,7 +254,7 @@ enum queue_result {
QUEUE_FULL = 6, QUEUE_FULL = 6,
}; };
const struct { const struct {
enum queue_result id; enum queue_result id;
char *text; char *text;
} queue_results[] = { } queue_results[] = {
@ -285,37 +285,37 @@ struct callattempt {
LOCAL_USER_DECL; LOCAL_USER_DECL;
struct queue_ent { struct queue_ent {
struct call_queue *parent; /*!< What queue is our parent */ struct call_queue *parent; /*!< What queue is our parent */
char moh[80]; /*!< Name of musiconhold to be used */ char moh[80]; /*!< Name of musiconhold to be used */
char announce[80]; /*!< Announcement to play for member when call is answered */ char announce[80]; /*!< Announcement to play for member when call is answered */
char context[AST_MAX_CONTEXT]; /*!< Context when user exits queue */ char context[AST_MAX_CONTEXT]; /*!< Context when user exits queue */
char digits[AST_MAX_EXTENSION]; /*!< Digits entered while in queue */ char digits[AST_MAX_EXTENSION]; /*!< Digits entered while in queue */
int pos; /*!< Where we are in the queue */ int pos; /*!< Where we are in the queue */
int prio; /*!< Our priority */ int prio; /*!< Our priority */
int last_pos_said; /*!< Last position we told the user */ int last_pos_said; /*!< Last position we told the user */
time_t last_periodic_announce_time; /*!< The last time we played a periodic announcement */ time_t last_periodic_announce_time; /*!< The last time we played a periodic announcement */
int last_periodic_announce_sound; /* The last periodic announcement we made */ int last_periodic_announce_sound; /*!< The last periodic announcement we made */
time_t last_pos; /*!< Last time we told the user their position */ time_t last_pos; /*!< Last time we told the user their position */
int opos; /*!< Where we started in the queue */ int opos; /*!< Where we started in the queue */
int handled; /*!< Whether our call was handled */ int handled; /*!< Whether our call was handled */
int max_penalty; /*!< Limit the members that can take this call to this penalty or lower */ int max_penalty; /*!< Limit the members that can take this call to this penalty or lower */
time_t start; /*!< When we started holding */ time_t start; /*!< When we started holding */
time_t expire; /*!< When this entry should expire (time out of queue) */ time_t expire; /*!< When this entry should expire (time out of queue) */
struct ast_channel *chan; /*!< Our channel */ struct ast_channel *chan; /*!< Our channel */
struct queue_ent *next; /*!< The next queue entry */ struct queue_ent *next; /*!< The next queue entry */
}; };
struct member { struct member {
char interface[80]; /*!< Technology/Location */ char interface[80]; /*!< Technology/Location */
int penalty; /*!< Are we a last resort? */ int penalty; /*!< Are we a last resort? */
int calls; /*!< Number of calls serviced by this member */ int calls; /*!< Number of calls serviced by this member */
int dynamic; /*!< Are we dynamically added? */ int dynamic; /*!< Are we dynamically added? */
int status; /*!< Status of queue member */ int status; /*!< Status of queue member */
int paused; /*!< Are we paused (not accepting calls)? */ int paused; /*!< Are we paused (not accepting calls)? */
time_t lastcall; /*!< When last successful call was hungup */ time_t lastcall; /*!< When last successful call was hungup */
unsigned int dead:1; /*!< Used to detect members deleted in realtime */ unsigned int dead:1; /*!< Used to detect members deleted in realtime */
unsigned int delme:1; /*!< Flag to delete entry on reload */ unsigned int delme:1; /*!< Flag to delete entry on reload */
struct member *next; /*!< Next member */ struct member *next; /*!< Next member */
}; };
struct member_interface { struct member_interface {
@ -334,10 +334,10 @@ static AST_LIST_HEAD_STATIC(interfaces, member_interface);
struct call_queue { struct call_queue {
ast_mutex_t lock; ast_mutex_t lock;
char name[80]; /*!< Name */ char name[80]; /*!< Name */
char moh[80]; /*!< Music On Hold class to be used */ char moh[80]; /*!< Music On Hold class to be used */
char announce[80]; /*!< Announcement to play when call is answered */ char announce[80]; /*!< Announcement to play when call is answered */
char context[AST_MAX_CONTEXT]; /*!< Exit context */ char context[AST_MAX_CONTEXT]; /*!< Exit context */
unsigned int monjoin:1; unsigned int monjoin:1;
unsigned int dead:1; unsigned int dead:1;
unsigned int joinempty:2; unsigned int joinempty:2;
@ -352,44 +352,44 @@ struct call_queue {
unsigned int strategy:3; unsigned int strategy:3;
unsigned int maskmemberstatus:1; unsigned int maskmemberstatus:1;
unsigned int realtime:1; unsigned int realtime:1;
int announcefrequency; /*!< How often to announce their position */ int announcefrequency; /*!< How often to announce their position */
int periodicannouncefrequency; /*!< How often to play periodic announcement */ int periodicannouncefrequency; /*!< How often to play periodic announcement */
int roundingseconds; /*!< How many seconds do we round to? */ int roundingseconds; /*!< How many seconds do we round to? */
int holdtime; /*!< Current avg holdtime, based on recursive boxcar filter */ int holdtime; /*!< Current avg holdtime, based on recursive boxcar filter */
int callscompleted; /*!< Number of queue calls completed */ int callscompleted; /*!< Number of queue calls completed */
int callsabandoned; /*!< Number of queue calls abandoned */ int callsabandoned; /*!< Number of queue calls abandoned */
int servicelevel; /*!< seconds setting for servicelevel*/ int servicelevel; /*!< seconds setting for servicelevel*/
int callscompletedinsl; /*!< Number of calls answered with servicelevel*/ int callscompletedinsl; /*!< Number of calls answered with servicelevel*/
char monfmt[8]; /*!< Format to use when recording calls */ char monfmt[8]; /*!< Format to use when recording calls */
int montype; /*!< Monitor type Monitor vs. MixMonitor */ int montype; /*!< Monitor type Monitor vs. MixMonitor */
char sound_next[80]; /*!< Sound file: "Your call is now first in line" (def. queue-youarenext) */ char sound_next[80]; /*!< Sound file: "Your call is now first in line" (def. queue-youarenext) */
char sound_thereare[80]; /*!< Sound file: "There are currently" (def. queue-thereare) */ char sound_thereare[80]; /*!< Sound file: "There are currently" (def. queue-thereare) */
char sound_calls[80]; /*!< Sound file: "calls waiting to speak to a representative." (def. queue-callswaiting)*/ char sound_calls[80]; /*!< Sound file: "calls waiting to speak to a representative." (def. queue-callswaiting)*/
char sound_holdtime[80]; /*!< Sound file: "The current estimated total holdtime is" (def. queue-holdtime) */ char sound_holdtime[80]; /*!< Sound file: "The current estimated total holdtime is" (def. queue-holdtime) */
char sound_minutes[80]; /*!< Sound file: "minutes." (def. queue-minutes) */ char sound_minutes[80]; /*!< Sound file: "minutes." (def. queue-minutes) */
char sound_lessthan[80]; /*!< Sound file: "less-than" (def. queue-lessthan) */ char sound_lessthan[80]; /*!< Sound file: "less-than" (def. queue-lessthan) */
char sound_seconds[80]; /*!< Sound file: "seconds." (def. queue-seconds) */ char sound_seconds[80]; /*!< Sound file: "seconds." (def. queue-seconds) */
char sound_thanks[80]; /*!< Sound file: "Thank you for your patience." (def. queue-thankyou) */ char sound_thanks[80]; /*!< Sound file: "Thank you for your patience." (def. queue-thankyou) */
char sound_reporthold[80]; /*!< Sound file: "Hold time" (def. queue-reporthold) */ char sound_reporthold[80]; /*!< Sound file: "Hold time" (def. queue-reporthold) */
char sound_periodicannounce[MAX_PERIODIC_ANNOUNCEMENTS][80];/* Sound files: Custom announce, no default */ char sound_periodicannounce[MAX_PERIODIC_ANNOUNCEMENTS][80];/*!< Sound files: Custom announce, no default */
int count; /*!< How many entries */ int count; /*!< How many entries */
int maxlen; /*!< Max number of entries */ int maxlen; /*!< Max number of entries */
int wrapuptime; /*!< Wrapup Time */ int wrapuptime; /*!< Wrapup Time */
int retry; /*!< Retry calling everyone after this amount of time */ int retry; /*!< Retry calling everyone after this amount of time */
int timeout; /*!< How long to wait for an answer */ int timeout; /*!< How long to wait for an answer */
int weight; /*!< Respective weight */ int weight; /*!< Respective weight */
int autopause; /*!< Auto pause queue members if they fail to answer */ int autopause; /*!< Auto pause queue members if they fail to answer */
/* Queue strategy things */ /* Queue strategy things */
int rrpos; /*!< Round Robin - position */ int rrpos; /*!< Round Robin - position */
int memberdelay; /*!< Seconds to delay connecting member to caller */ int memberdelay; /*!< Seconds to delay connecting member to caller */
int autofill; /*!< Ignore the head call status and ring an available agent */ int autofill; /*!< Ignore the head call status and ring an available agent */
struct member *members; /*!< Head of the list of members */ struct member *members; /*!< Head of the list of members */
struct queue_ent *head; /*!< Head of the list of callers */ struct queue_ent *head; /*!< Head of the list of callers */
AST_LIST_ENTRY(call_queue) list; /*!< Next call queue */ AST_LIST_ENTRY(call_queue) list; /*!< Next call queue */
}; };
static AST_LIST_HEAD_STATIC(queues, call_queue); static AST_LIST_HEAD_STATIC(queues, call_queue);
@ -520,7 +520,7 @@ static void *changethread(void *data)
AST_LIST_LOCK(&interfaces); AST_LIST_LOCK(&interfaces);
AST_LIST_TRAVERSE(&interfaces, curint, list) { AST_LIST_TRAVERSE(&interfaces, curint, list) {
if (!strcasecmp(curint->interface, sc->dev)) if (!strcasecmp(curint->interface, sc->dev))
break; break;
} }
AST_LIST_UNLOCK(&interfaces); AST_LIST_UNLOCK(&interfaces);
@ -529,7 +529,7 @@ static void *changethread(void *data)
ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s) but we don't care because they're not a member of any queue.\n", technology, loc, sc->state, devstate2str(sc->state)); ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s) but we don't care because they're not a member of any queue.\n", technology, loc, sc->state, devstate2str(sc->state));
free(sc); free(sc);
return NULL; return NULL;
} }
if (option_debug) if (option_debug)
ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s)\n", technology, loc, sc->state, devstate2str(sc->state)); ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s)\n", technology, loc, sc->state, devstate2str(sc->state));
@ -546,16 +546,16 @@ static void *changethread(void *data)
continue; continue;
manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus", manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
"Queue: %s\r\n" "Queue: %s\r\n"
"Location: %s\r\n" "Location: %s\r\n"
"Membership: %s\r\n" "Membership: %s\r\n"
"Penalty: %d\r\n" "Penalty: %d\r\n"
"CallsTaken: %d\r\n" "CallsTaken: %d\r\n"
"LastCall: %d\r\n" "LastCall: %d\r\n"
"Status: %d\r\n" "Status: %d\r\n"
"Paused: %d\r\n", "Paused: %d\r\n",
q->name, cur->interface, cur->dynamic ? "dynamic" : "static", q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused); cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
} }
} }
ast_mutex_unlock(&q->lock); ast_mutex_unlock(&q->lock);
@ -660,14 +660,14 @@ static void clear_queue(struct call_queue *q)
q->wrapuptime = 0; q->wrapuptime = 0;
} }
static int add_to_interfaces(char *interface) static int add_to_interfaces(char *interface)
{ {
struct member_interface *curint; struct member_interface *curint;
AST_LIST_LOCK(&interfaces); AST_LIST_LOCK(&interfaces);
AST_LIST_TRAVERSE(&interfaces, curint, list) { AST_LIST_TRAVERSE(&interfaces, curint, list) {
if (!strcasecmp(curint->interface, interface)) if (!strcasecmp(curint->interface, interface))
break; break;
} }
if (curint) { if (curint) {
@ -728,7 +728,7 @@ static int remove_from_interfaces(char *interface)
AST_LIST_TRAVERSE_SAFE_END; AST_LIST_TRAVERSE_SAFE_END;
AST_LIST_UNLOCK(&interfaces); AST_LIST_UNLOCK(&interfaces);
return 0; return 0;
} }
static void clear_and_free_interfaces(void) static void clear_and_free_interfaces(void)
@ -892,7 +892,7 @@ static void queue_set_param(struct call_queue *q, const char *param, const char
we will not see any effect on use_weight until next reload. */ we will not see any effect on use_weight until next reload. */
} else if (!strcasecmp(param, "timeoutrestart")) { } else if (!strcasecmp(param, "timeoutrestart")) {
q->timeoutrestart = ast_true(val); q->timeoutrestart = ast_true(val);
} else if(failunknown) { } else if (failunknown) {
if (linenum >= 0) { if (linenum >= 0) {
ast_log(LOG_WARNING, "Unknown keyword in queue '%s': %s at line %d of queues.conf\n", ast_log(LOG_WARNING, "Unknown keyword in queue '%s': %s at line %d of queues.conf\n",
q->name, param, linenum); q->name, param, linenum);
@ -915,8 +915,8 @@ static void rt_handle_member_record(struct call_queue *q, char *interface, const
/* Find the member, or the place to put a new one. */ /* Find the member, or the place to put a new one. */
for (m = q->members, prev_m = NULL; for (m = q->members, prev_m = NULL;
m && strcmp(m->interface, interface); m && strcmp(m->interface, interface);
prev_m = m, m = m->next); prev_m = m, m = m->next);
/* Create a new one if not found, else update penalty */ /* Create a new one if not found, else update penalty */
if (!m) { if (!m) {
@ -949,7 +949,7 @@ static void free_members(struct call_queue *q, int all)
q->members = next; q->members = next;
remove_from_interfaces(curm->interface); remove_from_interfaces(curm->interface);
free(curm); free(curm);
} else } else
prev = curm; prev = curm;
} }
} }
@ -1150,7 +1150,7 @@ static int join_queue(char *queuename, struct queue_ent *qe, enum queue_result *
*reason = QUEUE_FULL; *reason = QUEUE_FULL;
else { else {
/* There's space for us, put us at the right position inside /* There's space for us, put us at the right position inside
* the queue. * the queue.
* Take into account the priority of the calling user */ * Take into account the priority of the calling user */
inserted = 0; inserted = 0;
prev = NULL; prev = NULL;
@ -1175,12 +1175,12 @@ static int join_queue(char *queuename, struct queue_ent *qe, enum queue_result *
ast_copy_string(qe->context, q->context, sizeof(qe->context)); ast_copy_string(qe->context, q->context, sizeof(qe->context));
q->count++; q->count++;
res = 0; res = 0;
manager_event(EVENT_FLAG_CALL, "Join", 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", "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, qe->chan->name,
S_OR(qe->chan->cid.cid_num, "unknown"), /* XXX somewhere else it is <unknown> */ S_OR(qe->chan->cid.cid_num, "unknown"), /* XXX somewhere else it is <unknown> */
S_OR(qe->chan->cid.cid_name, "unknown"), S_OR(qe->chan->cid.cid_name, "unknown"),
q->name, qe->pos, q->count, qe->chan->uniqueid ); q->name, qe->pos, q->count, qe->chan->uniqueid );
if (option_debug) if (option_debug)
ast_log(LOG_DEBUG, "Queue '%s' Join, Channel '%s', Position '%d'\n", q->name, qe->chan->name, qe->pos ); ast_log(LOG_DEBUG, "Queue '%s' Join, Channel '%s', Position '%d'\n", q->name, qe->chan->name, qe->pos );
} }
@ -1216,7 +1216,7 @@ static int valid_exit(struct queue_ent *qe, char digit)
return 0; return 0;
} }
/* If there's no context to goto, short-circuit */ /* If there's no context to goto, short-circuit */
if (ast_strlen_zero(qe->context)) if (ast_strlen_zero(qe->context))
return 0; return 0;
@ -1285,7 +1285,7 @@ static int say_position(struct queue_ent *qe)
/* If the hold time is >1 min, if it's enabled, and if it's not /* If the hold time is >1 min, if it's enabled, and if it's not
supposed to be only once and we have already said it, say it */ supposed to be only once and we have already said it, say it */
if ((avgholdmins+avgholdsecs) > 0 && (qe->parent->announceholdtime) && if ((avgholdmins+avgholdsecs) > 0 && (qe->parent->announceholdtime) &&
(!(qe->parent->announceholdtime == ANNOUNCEHOLDTIME_ONCE) && qe->last_pos)) { (!(qe->parent->announceholdtime == ANNOUNCEHOLDTIME_ONCE) && qe->last_pos)) {
res = play_file(qe->chan, qe->parent->sound_holdtime); res = play_file(qe->chan, qe->parent->sound_holdtime);
if (res && valid_exit(qe, res)) if (res && valid_exit(qe, res))
goto playout; goto playout;
@ -1321,17 +1321,17 @@ static int say_position(struct queue_ent *qe)
} }
posout: posout:
if (option_verbose > 2) if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Told %s in %s their queue position (which was %d)\n", ast_verbose(VERBOSE_PREFIX_3 "Told %s in %s their queue position (which was %d)\n",
qe->chan->name, qe->parent->name, qe->pos); qe->chan->name, qe->parent->name, qe->pos);
res = play_file(qe->chan, qe->parent->sound_thanks); res = play_file(qe->chan, qe->parent->sound_thanks);
if (res && !valid_exit(qe, res)) if (res && !valid_exit(qe, res))
res = 0; res = 0;
playout: playout:
/* Set our last_pos indicators */ /* Set our last_pos indicators */
qe->last_pos = now; qe->last_pos = now;
qe->last_pos_said = qe->pos; qe->last_pos_said = qe->pos;
/* Don't restart music on hold if we're about to exit the caller from the queue */ /* Don't restart music on hold if we're about to exit the caller from the queue */
@ -1432,16 +1432,16 @@ static int update_status(struct call_queue *q, struct member *member, int status
cur->status = status; cur->status = status;
if (!q->maskmemberstatus) { if (!q->maskmemberstatus) {
manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus", manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
"Queue: %s\r\n" "Queue: %s\r\n"
"Location: %s\r\n" "Location: %s\r\n"
"Membership: %s\r\n" "Membership: %s\r\n"
"Penalty: %d\r\n" "Penalty: %d\r\n"
"CallsTaken: %d\r\n" "CallsTaken: %d\r\n"
"LastCall: %d\r\n" "LastCall: %d\r\n"
"Status: %d\r\n" "Status: %d\r\n"
"Paused: %d\r\n", "Paused: %d\r\n",
q->name, cur->interface, cur->dynamic ? "dynamic" : "static", q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused); cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
} }
} }
ast_mutex_unlock(&q->lock); ast_mutex_unlock(&q->lock);
@ -1473,7 +1473,7 @@ static int compare_weight(struct call_queue *rq, struct member *member)
* to solve deadlock */ * to solve deadlock */
AST_LIST_TRAVERSE(&queues, q, list) { AST_LIST_TRAVERSE(&queues, q, list) {
if (q == rq) /* don't check myself, could deadlock */ if (q == rq) /* don't check myself, could deadlock */
continue; continue;
ast_mutex_lock(&q->lock); ast_mutex_lock(&q->lock);
if (q->count && q->members) { if (q->count && q->members) {
for (mem = q->members; mem; mem = mem->next) { for (mem = q->members; mem; mem = mem->next) {
@ -1489,7 +1489,7 @@ static int compare_weight(struct call_queue *rq, struct member *member)
} }
} }
ast_mutex_unlock(&q->lock); ast_mutex_unlock(&q->lock);
if (found) if (found)
break; break;
} }
return found; return found;
@ -1597,7 +1597,7 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
update_dial_status(qe->parent, tmp->member, status); update_dial_status(qe->parent, tmp->member, status);
(*busies)++; (*busies)++;
return 0; return 0;
} else if (status != tmp->oldstatus) } else if (status != tmp->oldstatus)
update_dial_status(qe->parent, tmp->member, status); update_dial_status(qe->parent, tmp->member, status);
tmp->chan->appl = "AppQueue"; tmp->chan->appl = "AppQueue";
@ -1660,8 +1660,8 @@ static struct callattempt *find_best(struct callattempt *outgoing)
for (cur = outgoing; cur; cur = cur->q_next) { for (cur = outgoing; cur; cur = cur->q_next) {
if (cur->stillgoing && /* Not already done */ if (cur->stillgoing && /* Not already done */
!cur->chan && /* Isn't already going */ !cur->chan && /* Isn't already going */
(!best || cur->metric < best->metric)) { /* We haven't found one yet, or it's better */ (!best || cur->metric < best->metric)) { /* We haven't found one yet, or it's better */
best = cur; best = cur;
} }
} }
@ -1790,12 +1790,12 @@ static void record_abandoned(struct queue_ent *qe)
{ {
ast_mutex_lock(&qe->parent->lock); ast_mutex_lock(&qe->parent->lock);
manager_event(EVENT_FLAG_AGENT, "QueueCallerAbandon", manager_event(EVENT_FLAG_AGENT, "QueueCallerAbandon",
"Queue: %s\r\n" "Queue: %s\r\n"
"Uniqueid: %s\r\n" "Uniqueid: %s\r\n"
"Position: %d\r\n" "Position: %d\r\n"
"OriginalPosition: %d\r\n" "OriginalPosition: %d\r\n"
"HoldTime: %d\r\n", "HoldTime: %d\r\n",
qe->parent->name, qe->chan->uniqueid, qe->pos, qe->opos, (int)(time(NULL) - qe->start)); qe->parent->name, qe->chan->uniqueid, qe->pos, qe->opos, (int)(time(NULL) - qe->start));
qe->parent->callsabandoned++; qe->parent->callsabandoned++;
ast_mutex_unlock(&qe->parent->lock); ast_mutex_unlock(&qe->parent->lock);
@ -1816,8 +1816,8 @@ static void rna(int rnatime, struct queue_ent *qe, char *membername)
ast_verbose( VERBOSE_PREFIX_3 "Failed to pause Queue Member %s in queue %s!\n", membername, qe->parent->name); ast_verbose( VERBOSE_PREFIX_3 "Failed to pause Queue Member %s in queue %s!\n", membername, qe->parent->name);
} }
} }
return; return;
} }
#define AST_MAX_WATCHERS 256 #define AST_MAX_WATCHERS 256
@ -1841,7 +1841,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
starttime = (long) time(NULL); starttime = (long) time(NULL);
while(*to && !peer) { while (*to && !peer) {
int numlines, retry, pos = 1; int numlines, retry, pos = 1;
struct ast_channel *watchers[AST_MAX_WATCHERS]; struct ast_channel *watchers[AST_MAX_WATCHERS];
watchers[0] = in; watchers[0] = in;
@ -1857,7 +1857,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
numlines++; numlines++;
} }
if (pos > 1 /* found */ || !stillgoing /* nobody listening */ || if (pos > 1 /* found */ || !stillgoing /* nobody listening */ ||
(qe->parent->strategy != QUEUE_STRATEGY_RINGALL) /* ring would not be delivered */) (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) /* ring would not be delivered */)
break; break;
/* On "ringall" strategy we only move to the next penalty level /* On "ringall" strategy we only move to the next penalty level
when *all* ringing phones are done in the current penalty level */ when *all* ringing phones are done in the current penalty level */
@ -1902,7 +1902,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", in->name, tech, stuff, o->chan->name); ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", in->name, tech, stuff, o->chan->name);
/* Setup parameters */ /* Setup parameters */
o->chan = ast_request(tech, in->nativeformats, stuff, &status); o->chan = ast_request(tech, in->nativeformats, stuff, &status);
if (status != o->oldstatus) if (status != o->oldstatus)
update_dial_status(qe->parent, o->member, status); update_dial_status(qe->parent, o->member, status);
if (!o->chan) { if (!o->chan) {
ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s'\n", tech, stuff); ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s'\n", tech, stuff);
@ -1925,7 +1925,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
free(o->chan->cid.cid_ani); free(o->chan->cid.cid_ani);
o->chan->cid.cid_ani = ast_strdup(in->cid.cid_ani); o->chan->cid.cid_ani = ast_strdup(in->cid.cid_ani);
} }
if (o->chan->cid.cid_rdnis) if (o->chan->cid.cid_rdnis)
free(o->chan->cid.cid_rdnis); free(o->chan->cid.cid_rdnis);
o->chan->cid.cid_rdnis = ast_strdup(S_OR(in->macroexten, in->exten)); o->chan->cid.cid_rdnis = ast_strdup(S_OR(in->macroexten, in->exten));
if (ast_call(o->chan, tmpchan, 0)) { if (ast_call(o->chan, tmpchan, 0)) {
@ -1941,7 +1941,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
f = ast_read(winner); f = ast_read(winner);
if (f) { if (f) {
if (f->frametype == AST_FRAME_CONTROL) { if (f->frametype == AST_FRAME_CONTROL) {
switch(f->subclass) { switch (f->subclass) {
case AST_CONTROL_ANSWER: case AST_CONTROL_ANSWER:
/* This is our guy if someone answered. */ /* This is our guy if someone answered. */
if (!peer) { if (!peer) {
@ -2038,7 +2038,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
} }
ast_frfree(f); ast_frfree(f);
} }
if (!*to) if (!*to)
rna(orig, qe, on); rna(orig, qe, on);
} }
@ -2151,12 +2151,12 @@ static int wait_our_turn(struct queue_ent *qe, int ringing, enum queue_result *r
/* Make a position announcement, if enabled */ /* Make a position announcement, if enabled */
if (qe->parent->announcefrequency && !ringing && if (qe->parent->announcefrequency && !ringing &&
(res = say_position(qe))) (res = say_position(qe)))
break; break;
/* Make a periodic announcement, if enabled */ /* Make a periodic announcement, if enabled */
if (qe->parent->periodicannouncefrequency && !ringing && if (qe->parent->periodicannouncefrequency && !ringing &&
(res = say_periodic_announcement(qe))) (res = say_periodic_announcement(qe)))
break; break;
/* Wait a second before checking again */ /* Wait a second before checking again */
@ -2175,7 +2175,7 @@ static int update_queue(struct call_queue *q, struct member *member)
be sure it's still valid */ be sure it's still valid */
ast_mutex_lock(&q->lock); ast_mutex_lock(&q->lock);
cur = q->members; cur = q->members;
while(cur) { while (cur) {
if (member == cur) { if (member == cur) {
time(&cur->lastcall); time(&cur->lastcall);
cur->calls++; cur->calls++;
@ -2310,11 +2310,11 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
} }
/* Hold the lock while we setup the outgoing calls */ /* Hold the lock while we setup the outgoing calls */
if (use_weight) if (use_weight)
AST_LIST_LOCK(&queues); AST_LIST_LOCK(&queues);
ast_mutex_lock(&qe->parent->lock); ast_mutex_lock(&qe->parent->lock);
if (option_debug) if (option_debug)
ast_log(LOG_DEBUG, "%s is trying to call a queue member.\n", ast_log(LOG_DEBUG, "%s is trying to call a queue member.\n",
qe->chan->name); qe->chan->name);
ast_copy_string(queuename, qe->parent->name, sizeof(queuename)); ast_copy_string(queuename, qe->parent->name, sizeof(queuename));
cur = qe->parent->members; cur = qe->parent->members;
@ -2328,7 +2328,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if (!tmp) { if (!tmp) {
ast_mutex_unlock(&qe->parent->lock); ast_mutex_unlock(&qe->parent->lock);
if (use_weight) if (use_weight)
AST_LIST_UNLOCK(&queues); AST_LIST_UNLOCK(&queues);
goto out; goto out;
} }
@ -2340,7 +2340,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
/* Special case: If we ring everyone, go ahead and ring them, otherwise /* Special case: If we ring everyone, go ahead and ring them, otherwise
just calculate their metric for the appropriate strategy */ just calculate their metric for the appropriate strategy */
if (!calc_metric(qe->parent, cur, x++, qe, tmp)) { if (!calc_metric(qe->parent, cur, x++, qe, tmp)) {
/* Put them in the list of outgoing thingies... We're ready now. /* Put them in the list of outgoing thingies... We're ready now.
XXX If we're forcibly removed, these outgoing calls won't get XXX If we're forcibly removed, these outgoing calls won't get
hung up XXX */ hung up XXX */
tmp->q_next = outgoing; tmp->q_next = outgoing;
@ -2358,7 +2358,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1; to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1;
ring_one(qe, outgoing, &numbusies); ring_one(qe, outgoing, &numbusies);
ast_mutex_unlock(&qe->parent->lock); ast_mutex_unlock(&qe->parent->lock);
if (use_weight) if (use_weight)
AST_LIST_UNLOCK(&queues); AST_LIST_UNLOCK(&queues);
lpeer = wait_for_answer(qe, outgoing, &to, &digit, numbusies, ast_test_flag(&(bridge_config.features_caller), AST_FEATURE_DISCONNECT)); lpeer = wait_for_answer(qe, outgoing, &to, &digit, numbusies, ast_test_flag(&(bridge_config.features_caller), AST_FEATURE_DISCONNECT));
ast_mutex_lock(&qe->parent->lock); ast_mutex_lock(&qe->parent->lock);
@ -2378,7 +2378,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_log(LOG_DEBUG, "%s: Nobody answered.\n", qe->chan->name); ast_log(LOG_DEBUG, "%s: Nobody answered.\n", qe->chan->name);
} else { /* peer is valid */ } else { /* peer is valid */
/* Ah ha! Someone answered within the desired timeframe. Of course after this /* 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 we will always return with -1 so that it is hung up properly after the
conversation. */ conversation. */
qe->handled++; qe->handled++;
if (!strcmp(qe->chan->tech->type, "Zap")) if (!strcmp(qe->chan->tech->type, "Zap"))
@ -2412,7 +2412,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if (holdtime < 2) { if (holdtime < 2) {
play_file(peer, qe->parent->sound_lessthan); play_file(peer, qe->parent->sound_lessthan);
ast_say_number(peer, 2, AST_DIGIT_ANY, peer->language, NULL); ast_say_number(peer, 2, AST_DIGIT_ANY, peer->language, NULL);
} else } else
ast_say_number(peer, holdtime, AST_DIGIT_ANY, peer->language, NULL); ast_say_number(peer, holdtime, AST_DIGIT_ANY, peer->language, NULL);
play_file(peer, qe->parent->sound_minutes); play_file(peer, qe->parent->sound_minutes);
} }
@ -2470,7 +2470,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
which = peer; which = peer;
if (monitorfilename) if (monitorfilename)
ast_monitor_start(which, qe->parent->monfmt, monitorfilename, 1 ); ast_monitor_start(which, qe->parent->monfmt, monitorfilename, 1 );
else if (qe->chan->cdr) else if (qe->chan->cdr)
ast_monitor_start(which, qe->parent->monfmt, qe->chan->cdr->uniqueid, 1 ); ast_monitor_start(which, qe->parent->monfmt, qe->chan->cdr->uniqueid, 1 );
else { else {
/* Last ditch effort -- no CDR, make up something */ /* Last ditch effort -- no CDR, make up something */
@ -2486,7 +2486,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if (!monitorfilename) { if (!monitorfilename) {
if (qe->chan->cdr) if (qe->chan->cdr)
ast_copy_string(tmpid, qe->chan->cdr->uniqueid, sizeof(tmpid)-1); ast_copy_string(tmpid, qe->chan->cdr->uniqueid, sizeof(tmpid)-1);
else else
snprintf(tmpid, sizeof(tmpid), "chan-%lx", ast_random()); snprintf(tmpid, sizeof(tmpid), "chan-%lx", ast_random());
} else { } else {
ast_copy_string(tmpid2, monitorfilename, sizeof(tmpid2)-1); ast_copy_string(tmpid2, monitorfilename, sizeof(tmpid2)-1);
@ -2513,7 +2513,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
memset(meid, 0, sizeof(meid)); memset(meid, 0, sizeof(meid));
pbx_substitute_variables_helper(qe->chan, meid2, meid, sizeof(meid) - 1); pbx_substitute_variables_helper(qe->chan, meid2, meid, sizeof(meid) - 1);
} }
snprintf(tmpid2, sizeof(tmpid2)-1, "%s.%s", tmpid, qe->parent->monfmt); snprintf(tmpid2, sizeof(tmpid2)-1, "%s.%s", tmpid, qe->parent->monfmt);
@ -2533,9 +2533,9 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
} }
if (mixmonapp) { if (mixmonapp) {
if (!ast_strlen_zero(monitor_exec) && !ast_strlen_zero(monitor_options)) if (!ast_strlen_zero(monitor_exec) && !ast_strlen_zero(monitor_options))
snprintf(mixmonargs, sizeof(mixmonargs)-1, "%s|b%s|%s", tmpid2, monitor_options, monitor_exec); snprintf(mixmonargs, sizeof(mixmonargs)-1, "%s|b%s|%s", tmpid2, monitor_options, monitor_exec);
else else
snprintf(mixmonargs, sizeof(mixmonargs)-1, "%s|b%s", tmpid2, monitor_options); snprintf(mixmonargs, sizeof(mixmonargs)-1, "%s|b%s", tmpid2, monitor_options);
if (option_debug) if (option_debug)
@ -2550,11 +2550,11 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
} }
/* Drop out of the queue at this point, to prepare for next caller */ /* Drop out of the queue at this point, to prepare for next caller */
leave_queue(qe); leave_queue(qe);
if (!ast_strlen_zero(url) && ast_channel_supports_html(peer)) { if (!ast_strlen_zero(url) && ast_channel_supports_html(peer)) {
if (option_debug) if (option_debug)
ast_log(LOG_DEBUG, "app_queue: sendurl=%s.\n", url); ast_log(LOG_DEBUG, "app_queue: sendurl=%s.\n", url);
ast_channel_sendurl(peer, url); ast_channel_sendurl(peer, url);
} }
if (qe->parent->setinterfacevar) if (qe->parent->setinterfacevar)
pbx_builtin_setvar_helper(qe->chan, "MEMBERINTERFACE", member->interface); pbx_builtin_setvar_helper(qe->chan, "MEMBERINTERFACE", member->interface);
if (!ast_strlen_zero(agi)) { if (!ast_strlen_zero(agi)) {
@ -2564,7 +2564,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if (app) { if (app) {
agiexec = ast_strdupa(agi); agiexec = ast_strdupa(agi);
ret = pbx_exec(qe->chan, app, agiexec); ret = pbx_exec(qe->chan, app, agiexec);
} else } else
ast_log(LOG_WARNING, "Asked to execute an AGI on this channel, but could not find application (agi)!\n"); ast_log(LOG_WARNING, "Asked to execute an AGI on this channel, but could not find application (agi)!\n");
} }
ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "CONNECT", "%ld|%s", (long)time(NULL) - qe->start, peer->uniqueid); ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "CONNECT", "%ld|%s", (long)time(NULL) - qe->start, peer->uniqueid);
@ -2587,12 +2587,12 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
bridge = ast_bridge_call(qe->chan,peer, &bridge_config); bridge = ast_bridge_call(qe->chan,peer, &bridge_config);
if (strcasecmp(oldcontext, qe->chan->context) || strcasecmp(oldexten, qe->chan->exten)) { 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", ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "TRANSFER", "%s|%s|%ld|%ld",
qe->chan->exten, qe->chan->context, (long) (callstart - qe->start), qe->chan->exten, qe->chan->context, (long) (callstart - qe->start),
(long) (time(NULL) - callstart)); (long) (time(NULL) - callstart));
} else if (qe->chan->_softhangup) { } else if (qe->chan->_softhangup) {
ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "COMPLETECALLER", "%ld|%ld", 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) if (qe->parent->eventwhencalled)
manager_event(EVENT_FLAG_AGENT, "AgentComplete", manager_event(EVENT_FLAG_AGENT, "AgentComplete",
"Queue: %s\r\n" "Queue: %s\r\n"
@ -2608,7 +2608,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : ""); qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
} else { } else {
ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "COMPLETEAGENT", "%ld|%ld", ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "COMPLETEAGENT", "%ld|%ld",
(long) (callstart - qe->start), (long) (time(NULL) - callstart)); (long) (callstart - qe->start), (long) (time(NULL) - callstart));
if (qe->parent->eventwhencalled) if (qe->parent->eventwhencalled)
manager_event(EVENT_FLAG_AGENT, "AgentComplete", manager_event(EVENT_FLAG_AGENT, "AgentComplete",
"Queue: %s\r\n" "Queue: %s\r\n"
@ -2680,8 +2680,8 @@ static void dump_queue_members(struct call_queue *pm_queue)
continue; continue;
res = snprintf(value + value_len, sizeof(value) - value_len, "%s;%d;%d%s", res = snprintf(value + value_len, sizeof(value) - value_len, "%s;%d;%d%s",
cur_member->interface, cur_member->penalty, cur_member->paused, cur_member->interface, cur_member->penalty, cur_member->paused,
cur_member->next ? "|" : ""); cur_member->next ? "|" : "");
if (res != strlen(value + value_len)) { if (res != strlen(value + value_len)) {
ast_log(LOG_WARNING, "Could not create persistent member string, out of space\n"); ast_log(LOG_WARNING, "Could not create persistent member string, out of space\n");
break; break;
@ -2725,9 +2725,9 @@ static int remove_from_queue(char *queuename, char *interface)
} }
} }
manager_event(EVENT_FLAG_AGENT, "QueueMemberRemoved", manager_event(EVENT_FLAG_AGENT, "QueueMemberRemoved",
"Queue: %s\r\n" "Queue: %s\r\n"
"Location: %s\r\n", "Location: %s\r\n",
q->name, last_member->interface); q->name, last_member->interface);
free(last_member); free(last_member);
if (queue_persistent_members) if (queue_persistent_members)
@ -2771,17 +2771,17 @@ static int add_to_queue(char *queuename, char *interface, int penalty, int pause
new_member->next = q->members; new_member->next = q->members;
q->members = new_member; q->members = new_member;
manager_event(EVENT_FLAG_AGENT, "QueueMemberAdded", manager_event(EVENT_FLAG_AGENT, "QueueMemberAdded",
"Queue: %s\r\n" "Queue: %s\r\n"
"Location: %s\r\n" "Location: %s\r\n"
"Membership: %s\r\n" "Membership: %s\r\n"
"Penalty: %d\r\n" "Penalty: %d\r\n"
"CallsTaken: %d\r\n" "CallsTaken: %d\r\n"
"LastCall: %d\r\n" "LastCall: %d\r\n"
"Status: %d\r\n" "Status: %d\r\n"
"Paused: %d\r\n", "Paused: %d\r\n",
q->name, new_member->interface, new_member->dynamic ? "dynamic" : "static", q->name, new_member->interface, new_member->dynamic ? "dynamic" : "static",
new_member->penalty, new_member->calls, (int) new_member->lastcall, new_member->penalty, new_member->calls, (int) new_member->lastcall,
new_member->status, new_member->paused); new_member->status, new_member->paused);
if (dump) if (dump)
dump_queue_members(q); dump_queue_members(q);
@ -3077,7 +3077,7 @@ static int rqm_exec(struct ast_channel *chan, void *data)
break; break;
case RES_EXISTS: case RES_EXISTS:
ast_log(LOG_DEBUG, "Unable to remove interface '%s' from queue '%s': Not there\n", args.interface, args.queuename); ast_log(LOG_DEBUG, "Unable to remove interface '%s' from queue '%s': Not there\n", args.interface, args.queuename);
if (priority_jump || ast_opt_priority_jumping) if (priority_jump || ast_opt_priority_jumping)
ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101); ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
pbx_builtin_setvar_helper(chan, "RQMSTATUS", "NOTINQUEUE"); pbx_builtin_setvar_helper(chan, "RQMSTATUS", "NOTINQUEUE");
res = 0; res = 0;
@ -3147,7 +3147,7 @@ static int aqm_exec(struct ast_channel *chan, void *data)
break; break;
case RES_EXISTS: case RES_EXISTS:
ast_log(LOG_WARNING, "Unable to add interface '%s' to queue '%s': Already there\n", args.interface, args.queuename); ast_log(LOG_WARNING, "Unable to add interface '%s' to queue '%s': Already there\n", args.interface, args.queuename);
if (priority_jump || ast_opt_priority_jumping) if (priority_jump || ast_opt_priority_jumping)
ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101); ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
pbx_builtin_setvar_helper(chan, "AQMSTATUS", "MEMBERALREADY"); pbx_builtin_setvar_helper(chan, "AQMSTATUS", "MEMBERALREADY");
res = 0; res = 0;
@ -3181,12 +3181,12 @@ static int queue_exec(struct ast_channel *chan, void *data)
int go_on = 0; int go_on = 0;
char *parse; char *parse;
AST_DECLARE_APP_ARGS(args, AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(queuename); AST_APP_ARG(queuename);
AST_APP_ARG(options); AST_APP_ARG(options);
AST_APP_ARG(url); AST_APP_ARG(url);
AST_APP_ARG(announceoverride); AST_APP_ARG(announceoverride);
AST_APP_ARG(queuetimeoutstr); AST_APP_ARG(queuetimeoutstr);
AST_APP_ARG(agi); AST_APP_ARG(agi);
); );
/* Our queue entry */ /* Our queue entry */
struct queue_ent qe; struct queue_ent qe;
@ -3247,7 +3247,7 @@ static int queue_exec(struct ast_channel *chan, void *data)
if (args.options && (strchr(args.options, 'r'))) if (args.options && (strchr(args.options, 'r')))
ringing = 1; ringing = 1;
if (option_debug) if (option_debug)
ast_log(LOG_DEBUG, "queue: %s, options: %s, url: %s, announce: %s, expires: %ld, priority: %d\n", ast_log(LOG_DEBUG, "queue: %s, options: %s, url: %s, announce: %s, expires: %ld, priority: %d\n",
args.queuename, args.options, args.url, args.announceoverride, (long)qe.expire, prio); args.queuename, args.options, args.url, args.announceoverride, (long)qe.expire, prio);
@ -3260,7 +3260,7 @@ static int queue_exec(struct ast_channel *chan, void *data)
qe.last_periodic_announce_sound = 0; qe.last_periodic_announce_sound = 0;
if (!join_queue(args.queuename, &qe, &reason)) { if (!join_queue(args.queuename, &qe, &reason)) {
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ENTERQUEUE", "%s|%s", S_OR(args.url, ""), ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ENTERQUEUE", "%s|%s", S_OR(args.url, ""),
S_OR(chan->cid.cid_num, "")); S_OR(chan->cid.cid_num, ""));
check_turns: check_turns:
if (ringing) { if (ringing) {
ast_indicate(chan, AST_CONTROL_RINGING); ast_indicate(chan, AST_CONTROL_RINGING);
@ -3276,14 +3276,14 @@ check_turns:
/* Record this abandoned call */ /* Record this abandoned call */
record_abandoned(&qe); record_abandoned(&qe);
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON", "%d|%d|%ld", ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON", "%d|%d|%ld",
qe.pos, qe.opos, (long) time(NULL) - qe.start); qe.pos, qe.opos, (long) time(NULL) - qe.start);
if (option_verbose > 2) { if (option_verbose > 2) {
ast_verbose(VERBOSE_PREFIX_3 "User disconnected from queue %s while waiting their turn\n", args.queuename); ast_verbose(VERBOSE_PREFIX_3 "User disconnected from queue %s while waiting their turn\n", args.queuename);
} }
res = -1; res = -1;
break; break;
} }
if (!res) if (!res)
break; break;
if (valid_exit(&qe, res)) { 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);
@ -3313,8 +3313,8 @@ check_turns:
if (makeannouncement) { if (makeannouncement) {
/* Make a position announcement, if enabled */ /* Make a position announcement, if enabled */
if (qe.parent->announcefrequency && !ringing && if (qe.parent->announcefrequency && !ringing &&
(res = say_position(&qe))) { (res = say_position(&qe))) {
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; break;
} }
@ -3323,7 +3323,7 @@ check_turns:
/* Make a periodic announcement, if enabled */ /* Make a periodic announcement, if enabled */
if (qe.parent->periodicannouncefrequency && !ringing && if (qe.parent->periodicannouncefrequency && !ringing &&
(res = say_periodic_announcement(&qe))) { (res = say_periodic_announcement(&qe))) {
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHKEY", "%c|%d", res, qe.pos); ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHKEY", "%c|%d", res, qe.pos);
break; break;
} }
@ -3335,12 +3335,12 @@ check_turns:
if (!qe.handled) { if (!qe.handled) {
record_abandoned(&qe); record_abandoned(&qe);
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON", ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON",
"%d|%d|%ld", qe.pos, qe.opos, "%d|%d|%ld", qe.pos, qe.opos,
(long) time(NULL) - qe.start); (long) time(NULL) - qe.start);
} }
} else if (valid_exit(&qe, res)) { } else if (valid_exit(&qe, res)) {
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHKEY", ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHKEY",
"%s|%d", qe.digits, qe.pos); "%s|%d", qe.digits, qe.pos);
} }
break; break;
} }
@ -3397,7 +3397,7 @@ check_turns:
res = 0; res = 0;
break; break;
} }
/* Since this is a priority queue and /* Since this is a priority queue and
* it is not sure that we are still at the head * it is not sure that we are still at the head
* of the queue, go and check for our turn again. * of the queue, go and check for our turn again.
*/ */
@ -3585,7 +3585,7 @@ static struct ast_custom_function queuewaitingcount_function = {
.name = "QUEUE_WAITING_COUNT", .name = "QUEUE_WAITING_COUNT",
.synopsis = "Count number of calls currently waiting in a queue", .synopsis = "Count number of calls currently waiting in a queue",
.syntax = "QUEUE_WAITING_COUNT(<queuename>)", .syntax = "QUEUE_WAITING_COUNT(<queuename>)",
.desc = .desc =
"Returns the number of callers currently waiting in the specified queue.\n", "Returns the number of callers currently waiting in the specified queue.\n",
.read = queue_function_queuewaitingcount, .read = queue_function_queuewaitingcount,
}; };
@ -3814,8 +3814,8 @@ static int __queues_show(struct mansession *s, int manager, int fd, int argc, ch
sl = 100 * ((float) q->callscompletedinsl / (float) q->callscompleted); sl = 100 * ((float) q->callscompletedinsl / (float) q->callscompleted);
if (s) 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", 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->name, q->count, max_buf, int2strat(q->strategy), q->holdtime, q->weight,
q->callscompleted, q->callsabandoned,sl,q->servicelevel, term); q->callscompleted, q->callsabandoned,sl,q->servicelevel, term);
else 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", 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); q->name, q->count, max_buf, int2strat(q->strategy), q->holdtime, q->weight, q->callscompleted, q->callsabandoned,sl,q->servicelevel, term);
@ -3837,7 +3837,7 @@ static int __queues_show(struct mansession *s, int manager, int fd, int argc, ch
ast_build_string(&max, &max_left, " (%s)", devstate2str(mem->status)); ast_build_string(&max, &max_left, " (%s)", devstate2str(mem->status));
if (mem->calls) { if (mem->calls) {
ast_build_string(&max, &max_left, " has taken %d calls (last was %ld secs ago)", 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 } else
ast_build_string(&max, &max_left, " has taken no calls yet"); ast_build_string(&max, &max_left, " has taken no calls yet");
if (s) if (s)
@ -3858,8 +3858,8 @@ static int __queues_show(struct mansession *s, int manager, int fd, int argc, ch
for (qe = q->head; qe; qe = qe->next) { for (qe = q->head; qe; qe = qe->next) {
if (s) if (s)
astman_append(s, " %d. %s (wait: %ld:%2.2ld, prio: %d)%s", astman_append(s, " %d. %s (wait: %ld:%2.2ld, prio: %d)%s",
pos++, qe->chan->name, (long) (now - qe->start) / 60, pos++, qe->chan->name, (long) (now - qe->start) / 60,
(long) (now - qe->start) % 60, qe->prio, term); (long) (now - qe->start) % 60, qe->prio, term);
else else
ast_cli(fd, " %d. %s (wait: %ld:%2.2ld, prio: %d)%s", pos++, ast_cli(fd, " %d. %s (wait: %ld:%2.2ld, prio: %d)%s", pos++,
qe->chan->name, (long) (now - qe->start) / 60, qe->chan->name, (long) (now - qe->start) / 60,
@ -3910,8 +3910,8 @@ static char *complete_queue(const char *line, const char *word, int pos, int sta
return ret; return ret;
} }
/*!\brief callback to display queues status in manager /*!\brief callback to display queues status in manager
\addtogroup Group_AMI \addtogroup Group_AMI
*/ */
static int manager_queues_show( struct mansession *s, struct message *m ) static int manager_queues_show( struct mansession *s, struct message *m )
{ {
@ -3921,7 +3921,7 @@ static int manager_queues_show( struct mansession *s, struct message *m )
astman_append(s, "\r\n\r\n"); /* Properly terminate Manager output */ astman_append(s, "\r\n\r\n"); /* Properly terminate Manager output */
return RESULT_SUCCESS; return RESULT_SUCCESS;
} }
/* Dump queue status */ /* Dump queue status */
static int manager_queues_status( struct mansession *s, struct message *m ) static int manager_queues_status( struct mansession *s, struct message *m )
@ -3951,62 +3951,62 @@ static int manager_queues_status( struct mansession *s, struct message *m )
if (q->callscompleted > 0) if (q->callscompleted > 0)
sl = 100 * ((float) q->callscompletedinsl / (float) q->callscompleted); sl = 100 * ((float) q->callscompletedinsl / (float) q->callscompleted);
astman_append(s, "Event: QueueParams\r\n" astman_append(s, "Event: QueueParams\r\n"
"Queue: %s\r\n" "Queue: %s\r\n"
"Max: %d\r\n" "Max: %d\r\n"
"Calls: %d\r\n" "Calls: %d\r\n"
"Holdtime: %d\r\n" "Holdtime: %d\r\n"
"Completed: %d\r\n" "Completed: %d\r\n"
"Abandoned: %d\r\n" "Abandoned: %d\r\n"
"ServiceLevel: %d\r\n" "ServiceLevel: %d\r\n"
"ServicelevelPerf: %2.1f\r\n" "ServicelevelPerf: %2.1f\r\n"
"Weight: %d\r\n" "Weight: %d\r\n"
"%s" "%s"
"\r\n", "\r\n",
q->name, q->maxlen, q->count, q->holdtime, q->callscompleted, q->name, q->maxlen, q->count, q->holdtime, q->callscompleted,
q->callsabandoned, q->servicelevel, sl, q->weight, idText); q->callsabandoned, q->servicelevel, sl, q->weight, idText);
/* List Queue Members */ /* List Queue Members */
for (mem = q->members; mem; mem = mem->next) { for (mem = q->members; mem; mem = mem->next) {
if (ast_strlen_zero(memberfilter) || !strcmp(mem->interface, memberfilter)) { if (ast_strlen_zero(memberfilter) || !strcmp(mem->interface, memberfilter)) {
astman_append(s, "Event: QueueMember\r\n" astman_append(s, "Event: QueueMember\r\n"
"Queue: %s\r\n" "Queue: %s\r\n"
"Location: %s\r\n" "Location: %s\r\n"
"Membership: %s\r\n" "Membership: %s\r\n"
"Penalty: %d\r\n" "Penalty: %d\r\n"
"CallsTaken: %d\r\n" "CallsTaken: %d\r\n"
"LastCall: %d\r\n" "LastCall: %d\r\n"
"Status: %d\r\n" "Status: %d\r\n"
"Paused: %d\r\n" "Paused: %d\r\n"
"%s" "%s"
"\r\n", "\r\n",
q->name, mem->interface, mem->dynamic ? "dynamic" : "static", q->name, mem->interface, mem->dynamic ? "dynamic" : "static",
mem->penalty, mem->calls, (int)mem->lastcall, mem->status, mem->paused, idText); mem->penalty, mem->calls, (int)mem->lastcall, mem->status, mem->paused, idText);
} }
} }
/* List Queue Entries */ /* List Queue Entries */
pos = 1; pos = 1;
for (qe = q->head; qe; qe = qe->next) { for (qe = q->head; qe; qe = qe->next) {
astman_append(s, "Event: QueueEntry\r\n" astman_append(s, "Event: QueueEntry\r\n"
"Queue: %s\r\n" "Queue: %s\r\n"
"Position: %d\r\n" "Position: %d\r\n"
"Channel: %s\r\n" "Channel: %s\r\n"
"CallerID: %s\r\n" "CallerID: %s\r\n"
"CallerIDName: %s\r\n" "CallerIDName: %s\r\n"
"Wait: %ld\r\n" "Wait: %ld\r\n"
"%s" "%s"
"\r\n", "\r\n",
q->name, pos++, qe->chan->name, q->name, pos++, qe->chan->name,
S_OR(qe->chan->cid.cid_num, "unknown"), S_OR(qe->chan->cid.cid_num, "unknown"),
S_OR(qe->chan->cid.cid_name, "unknown"), S_OR(qe->chan->cid.cid_name, "unknown"),
(long) (now - qe->start), idText); (long) (now - qe->start), idText);
} }
} }
ast_mutex_unlock(&q->lock); ast_mutex_unlock(&q->lock);
} }
astman_append(s, astman_append(s,
"Event: QueueStatusComplete\r\n" "Event: QueueStatusComplete\r\n"
"%s" "%s"
"\r\n",idText); "\r\n",idText);
AST_LIST_UNLOCK(&queues); AST_LIST_UNLOCK(&queues);
@ -4252,20 +4252,20 @@ static char *complete_remove_queue_member(const char *line, const char *word, in
return NULL; return NULL;
} }
static char show_queues_usage[] = static char show_queues_usage[] =
"Usage: show queues\n" "Usage: show queues\n"
" Provides summary information on call queues.\n"; " Provides summary information on call queues.\n";
static struct ast_cli_entry cli_show_queues = { static struct ast_cli_entry cli_show_queues = {
{ "show", "queues", NULL }, queues_show, { "show", "queues", NULL }, queues_show,
"Show status of queues", show_queues_usage, NULL }; "Show status of queues", show_queues_usage, NULL };
static char show_queue_usage[] = static char show_queue_usage[] =
"Usage: show queue\n" "Usage: show queue\n"
" Provides summary information on a specified queue.\n"; " Provides summary information on a specified queue.\n";
static struct ast_cli_entry cli_show_queue = { static struct ast_cli_entry cli_show_queue = {
{ "show", "queue", NULL }, queue_show, { "show", "queue", NULL }, queue_show,
"Show status of a specified queue", show_queue_usage, complete_queue }; "Show status of a specified queue", show_queue_usage, complete_queue };
static char aqm_cmd_usage[] = static char aqm_cmd_usage[] =

Loading…
Cancel
Save