Bug 6589 - option to display channel variables in queue events

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@35504 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Tilghman Lesher
2006-06-22 15:43:02 +00:00
parent 48ae9f0d4f
commit 89f6ffe1e5
2 changed files with 102 additions and 51 deletions

View File

@@ -330,6 +330,7 @@ static AST_LIST_HEAD_STATIC(interfaces, member_interface);
#define QUEUE_EMPTY_STRICT 2 #define QUEUE_EMPTY_STRICT 2
#define ANNOUNCEHOLDTIME_ALWAYS 1 #define ANNOUNCEHOLDTIME_ALWAYS 1
#define ANNOUNCEHOLDTIME_ONCE 2 #define ANNOUNCEHOLDTIME_ONCE 2
#define QUEUE_EVENT_VARIABLES 3
struct call_queue { struct call_queue {
ast_mutex_t lock; ast_mutex_t lock;
@@ -340,7 +341,7 @@ struct call_queue {
unsigned int monjoin:1; unsigned int monjoin:1;
unsigned int dead:1; unsigned int dead:1;
unsigned int joinempty:2; unsigned int joinempty:2;
unsigned int eventwhencalled:1; unsigned int eventwhencalled:2;
unsigned int leavewhenempty:2; unsigned int leavewhenempty:2;
unsigned int ringinuse:1; unsigned int ringinuse:1;
unsigned int setinterfacevar:1; unsigned int setinterfacevar:1;
@@ -874,7 +875,11 @@ static void queue_set_param(struct call_queue *q, const char *param, const char
} else if (!strcasecmp(param, "eventmemberstatus")) { } else if (!strcasecmp(param, "eventmemberstatus")) {
q->maskmemberstatus = !ast_true(val); q->maskmemberstatus = !ast_true(val);
} else if (!strcasecmp(param, "eventwhencalled")) { } else if (!strcasecmp(param, "eventwhencalled")) {
if (strcasecmp(val, "vars")) {
q->eventwhencalled = QUEUE_EVENT_VARIABLES;
} else {
q->eventwhencalled = ast_true(val); q->eventwhencalled = ast_true(val);
}
} else if (!strcasecmp(param, "reportholdtime")) { } else if (!strcasecmp(param, "reportholdtime")) {
q->reportholdtime = ast_true(val); q->reportholdtime = ast_true(val);
} else if (!strcasecmp(param, "memberdelay")) { } else if (!strcasecmp(param, "memberdelay")) {
@@ -1498,6 +1503,41 @@ static void do_hang(struct callattempt *o)
o->chan = NULL; o->chan = NULL;
} }
static char *vars2manager(struct ast_channel *chan, char *vars, size_t len)
{
char *tmp = alloca(len);
if (pbx_builtin_serialize_variables(chan, tmp, len)) {
int i, j;
/* convert "\n" to "\nVariable: " */
strcpy(vars, "Variable: ");
for (i = 0, j = 10; (i < len - 1) && (j < len - 1); i++, j++) {
vars[j] = tmp[i];
if (tmp[i + 1] == '\0')
break;
if (tmp[i] == '\n') {
vars[j] = '\r';
vars[++j] = '\n';
ast_copy_string(&(vars[j]), "Variable: ", len - j);
j += 9;
}
}
if (j > len - 1)
j = len - 1;
vars[j - 2] = '\r';
vars[j - 1] = '\n';
vars[j] = '\0';
} else {
/* there are no channel variables; leave it blank */
*vars = '\0';
}
return vars;
}
static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies) static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies)
{ {
int res; int res;
@@ -1589,8 +1629,9 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
do_hang(tmp); do_hang(tmp);
(*busies)++; (*busies)++;
return 0; return 0;
} else { } else if (qe->parent->eventwhencalled) {
if (qe->parent->eventwhencalled) { char vars[2048];
manager_event(EVENT_FLAG_AGENT, "AgentCalled", manager_event(EVENT_FLAG_AGENT, "AgentCalled",
"AgentCalled: %s\r\n" "AgentCalled: %s\r\n"
"ChannelCalling: %s\r\n" "ChannelCalling: %s\r\n"
@@ -1598,12 +1639,13 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
"CallerIDName: %s\r\n" "CallerIDName: %s\r\n"
"Context: %s\r\n" "Context: %s\r\n"
"Extension: %s\r\n" "Extension: %s\r\n"
"Priority: %d\r\n", "Priority: %d\r\n"
"%s",
tmp->interface, qe->chan->name, tmp->interface, qe->chan->name,
S_OR(tmp->chan->cid.cid_num, "unknown"), tmp->chan->cid.cid_num ? tmp->chan->cid.cid_num : "unknown",
S_OR(tmp->chan->cid.cid_name, "unknown"), tmp->chan->cid.cid_name ? tmp->chan->cid.cid_name : "unknown",
qe->chan->context, qe->chan->exten, qe->chan->priority); qe->chan->context, qe->chan->exten, qe->chan->priority,
} qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
if (option_verbose > 2) if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Called %s\n", tmp->interface); ast_verbose(VERBOSE_PREFIX_3 "Called %s\n", tmp->interface);
} }
@@ -2233,6 +2275,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
char mixmonargs[1512]; char mixmonargs[1512];
struct ast_app *mixmonapp = NULL; struct ast_app *mixmonapp = NULL;
char *p; char *p;
char vars[2048];
memset(&bridge_config, 0, sizeof(bridge_config)); memset(&bridge_config, 0, sizeof(bridge_config));
time(&now); time(&now);
@@ -2381,14 +2424,15 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_log(LOG_WARNING, "Agent on %s hungup on the customer. They're going to be pissed.\n", peer->name); ast_log(LOG_WARNING, "Agent on %s hungup on the customer. They're going to be pissed.\n", peer->name);
ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "AGENTDUMP", "%s", ""); ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "AGENTDUMP", "%s", "");
record_abandoned(qe); record_abandoned(qe);
if (qe->parent->eventwhencalled) { if (qe->parent->eventwhencalled)
manager_event(EVENT_FLAG_AGENT, "AgentDump", manager_event(EVENT_FLAG_AGENT, "AgentDump",
"Queue: %s\r\n" "Queue: %s\r\n"
"Uniqueid: %s\r\n" "Uniqueid: %s\r\n"
"Channel: %s\r\n" "Channel: %s\r\n"
"Member: %s\r\n", "Member: %s\r\n"
queuename, qe->chan->uniqueid, peer->name, member->interface); "%s",
} queuename, qe->chan->uniqueid, peer->name, member->interface,
qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
ast_hangup(peer); ast_hangup(peer);
goto out; goto out;
} else if (res2) { } else if (res2) {
@@ -2531,9 +2575,11 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
"Channel: %s\r\n" "Channel: %s\r\n"
"Member: %s\r\n" "Member: %s\r\n"
"Holdtime: %ld\r\n" "Holdtime: %ld\r\n"
"BridgedChannel: %s\r\n", "BridgedChannel: %s\r\n"
"%s",
queuename, qe->chan->uniqueid, peer->name, member->interface, queuename, qe->chan->uniqueid, peer->name, member->interface,
(long) time(NULL) - qe->start,peer->uniqueid); (long)time(NULL) - qe->start, peer->uniqueid,
qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
ast_copy_string(oldcontext, qe->chan->context, sizeof(oldcontext)); ast_copy_string(oldcontext, qe->chan->context, sizeof(oldcontext));
ast_copy_string(oldexten, qe->chan->exten, sizeof(oldexten)); ast_copy_string(oldexten, qe->chan->exten, sizeof(oldexten));
time(&callstart); time(&callstart);
@@ -2555,9 +2601,11 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
"Member: %s\r\n" "Member: %s\r\n"
"HoldTime: %ld\r\n" "HoldTime: %ld\r\n"
"TalkTime: %ld\r\n" "TalkTime: %ld\r\n"
"Reason: caller\r\n", "Reason: caller\r\n"
"%s",
queuename, qe->chan->uniqueid, peer->name, member->interface, queuename, qe->chan->uniqueid, peer->name, member->interface,
(long) (callstart - qe->start), (long) (time(NULL) - callstart)); (long)(callstart - qe->start), (long)(time(NULL) - callstart),
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));
@@ -2568,9 +2616,11 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
"Channel: %s\r\n" "Channel: %s\r\n"
"HoldTime: %ld\r\n" "HoldTime: %ld\r\n"
"TalkTime: %ld\r\n" "TalkTime: %ld\r\n"
"Reason: agent\r\n", "Reason: agent\r\n"
"%s",
queuename, qe->chan->uniqueid, peer->name, (long)(callstart - qe->start), queuename, qe->chan->uniqueid, peer->name, (long)(callstart - qe->start),
(long) (time(NULL) - callstart)); (long)(time(NULL) - callstart),
qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
} }
if (bridge != AST_PBX_NO_HANGUP_PEER) if (bridge != AST_PBX_NO_HANGUP_PEER)

View File

@@ -250,10 +250,11 @@ monitor-type = MixMonitor
; ;
; ;
; If this is set to yes, the following manager events will be generated: ; If this is set to yes, the following manager events will be generated:
; AgentCalled, AgentDump, AgentConnect, AgentComplete ; AgentCalled, AgentDump, AgentConnect, AgentComplete; setting this to
; vars also sends all channel variables with the event.
; (may generate some extra manager events, but probably ones you want) ; (may generate some extra manager events, but probably ones you want)
; ;
; eventwhencalled = yes ; eventwhencalled = yes|no|vars
; ;
; If this is set to no, the following manager events will be generated: ; If this is set to no, the following manager events will be generated:
; QueueMemberStatus ; QueueMemberStatus