Merged revisions 337840 via svnmerge from
authorGregory Nietsky <gregory@distrotech.co.za>
Fri, 23 Sep 2011 09:35:32 +0000 (09:35 +0000)
committerGregory Nietsky <gregory@distrotech.co.za>
Fri, 23 Sep 2011 09:35:32 +0000 (09:35 +0000)
https://origsvn.digium.com/svn/asterisk/branches/10

................
  r337840 | irroot | 2011-09-23 10:39:22 +0200 (Fri, 23 Sep 2011) | 17 lines

  Merged revisions 337839 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.8

  ........
    r337839 | irroot | 2011-09-23 10:34:03 +0200 (Fri, 23 Sep 2011) | 11 lines

    Make sure a CDR is on the stack for call in the Queue.
    Only let update_cdr act on the last CDR in the stack.

    In some circumstances [Attended transfer to queue] a
    CDR record is not inserted for this call where it should.

    (closes issue ASTERISK-18567)

    Review: https://reviewboard.asterisk.org/r/1266
  ........
................

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@337855 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c

index 3a72b5f..7930ca3 100644 (file)
@@ -5077,8 +5077,34 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                qe->handled++;
                ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "CONNECT", "%ld|%s|%ld", (long) time(NULL) - qe->start, peer->uniqueid,
                                                                                                        (long)(orig - to > 0 ? (orig - to) / 1000 : 0));
-               if (update_cdr && qe->chan->cdr) 
-                       ast_copy_string(qe->chan->cdr->dstchannel, member->membername, sizeof(qe->chan->cdr->dstchannel));
+
+               if (qe->chan->cdr) {
+                       struct ast_cdr *cdr;
+                       struct ast_cdr *newcdr;
+
+                       /* Only work with the last CDR in the stack*/
+                       cdr = qe->chan->cdr;
+                       while (cdr->next) {
+                               cdr = cdr->next;
+                       }
+
+                       /* If this CDR is not related to us add new one*/
+                       if ((strcasecmp(cdr->uniqueid, qe->chan->uniqueid)) &&
+                           (strcasecmp(cdr->linkedid, qe->chan->uniqueid)) &&
+                           (newcdr = ast_cdr_dup(cdr))) {
+                               ast_cdr_init(newcdr, qe->chan);
+                               ast_cdr_reset(newcdr, 0);
+                               ast_channel_lock(qe->chan);
+                               cdr = ast_cdr_append(cdr, newcdr);
+                               cdr = cdr->next;
+                               ast_channel_unlock(qe->chan);
+                       }
+
+                       if (update_cdr) {
+                               ast_copy_string(cdr->dstchannel, member->membername, sizeof(cdr->dstchannel));
+                       }
+               }
+
                if (qe->parent->eventwhencalled)
                        manager_event(EVENT_FLAG_AGENT, "AgentConnect",
                                        "Queue: %s\r\n"