summaryrefslogtreecommitdiff
path: root/apps/app_queue.c
diff options
context:
space:
mode:
authorMartin Tomec <tomec.martin@gmail.com>2016-12-22 11:07:33 +0100
committerMartin Tomec <tomec.martin@gmail.com>2017-01-20 13:37:32 +0100
commit40b9766a3149158cb3f8c3478af64b5615b01215 (patch)
treeca0698173e42f917cd9553ed96a58014c041b1d7 /apps/app_queue.c
parent059a54202c43ed19c802efb153f0da4962e5b75c (diff)
app_queue: add RINGCANCELED log event on caller hang up
QueueLog did not log ringnoanswer when the caller abandoned call before first timeout. It was impossible to get agent membername and ringing duration for this short calls. After some discusions it seems that the best way is to add new event RINGCANCELED, which is generated after caller hangup during ringing. ASTERISK-26665 Change-Id: Ic70f7b0f32fc95c9378e5bcf63865519014805d3
Diffstat (limited to 'apps/app_queue.c')
-rw-r--r--apps/app_queue.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 9176f9360..5874a49f6 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -4760,6 +4760,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
#endif
char *inchan_name;
struct timeval start_time_tv = ast_tvnow();
+ int canceled_by_caller = 0; /* 1 when caller hangs up or press digit or press * */
ast_channel_lock(qe->chan);
inchan_name = ast_strdupa(ast_channel_name(qe->chan));
@@ -5198,29 +5199,33 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass.integer == AST_CONTROL_HANGUP))) {
/* Got hung up */
*to = -1;
- publish_dial_end_event(in, outgoing, NULL, "CANCEL");
if (f) {
if (f->data.uint32) {
ast_channel_hangupcause_set(in, f->data.uint32);
}
ast_frfree(f);
}
- return NULL;
- }
-
- if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass.integer == '*')) {
+ canceled_by_caller = 1;
+ } else if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass.integer == '*')) {
ast_verb(3, "User hit %c to disconnect call.\n", f->subclass.integer);
*to = 0;
- publish_dial_end_event(in, outgoing, NULL, "CANCEL");
ast_frfree(f);
- return NULL;
- }
- if ((f->frametype == AST_FRAME_DTMF) && valid_exit(qe, f->subclass.integer)) {
+ canceled_by_caller = 1;
+ } else if ((f->frametype == AST_FRAME_DTMF) && valid_exit(qe, f->subclass.integer)) {
ast_verb(3, "User pressed digit: %c\n", f->subclass.integer);
*to = 0;
- publish_dial_end_event(in, outgoing, NULL, "CANCEL");
*digit = f->subclass.integer;
ast_frfree(f);
+ canceled_by_caller = 1;
+ }
+ /* When caller hung up or pressed * or digit. */
+ if (canceled_by_caller) {
+ publish_dial_end_event(in, outgoing, NULL, "CANCEL");
+ for (o = start; o; o = o->call_next) {
+ if (o->chan) {
+ ast_queue_log(qe->parent->name, ast_channel_uniqueid(qe->chan), o->member->membername, "RINGCANCELED", "%d", (int) ast_tvdiff_ms(ast_tvnow(), start_time_tv));
+ }
+ }
return NULL;
}