]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_queue: add RINGCANCELED log event on caller hang up 49/4649/3
authorMartin Tomec <tomec.martin@gmail.com>
Thu, 22 Dec 2016 10:07:33 +0000 (11:07 +0100)
committerMartin Tomec <tomec.martin@gmail.com>
Fri, 20 Jan 2017 12:37:32 +0000 (13:37 +0100)
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

UPGRADE.txt
apps/app_queue.c

index 6cb61480726d7d719896152c2f61adf896bb2bb0..569cc9222742998769991f804db2b2eaeb26c7db 100644 (file)
@@ -33,6 +33,10 @@ Queue:
    their ringinuse value updated to the value of the queue. Previously, the
    ringinuse value for dynamic members was not updated on reload.
 
+Queue log:
+ - New RINGCANCELED event is logged when the caller hangs up while ringing.
+   The data1 field contains number of miliseconds since start of ringing.
+
 Channel Drivers:
 
 chan_dahdi:
index 9176f936093f186a39fa92a7193ea53adfbda9d6..5874a49f62b983e2f17680842d5d4347c2221e18 100644 (file)
@@ -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;
                        }