mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-20 20:44:20 +00:00
Whitespace fix
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@37596 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
490
apps/app_queue.c
490
apps/app_queue.c
@@ -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[] =
|
||||||
|
Reference in New Issue
Block a user