|
|
|
@ -2295,6 +2295,21 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
|
|
|
|
|
ast_copy_string(tmp->chan->exten, macroexten, sizeof(tmp->chan->exten));
|
|
|
|
|
else
|
|
|
|
|
ast_copy_string(tmp->chan->exten, qe->chan->exten, sizeof(tmp->chan->exten));
|
|
|
|
|
if (ast_cdr_isset_unanswered()) {
|
|
|
|
|
/* they want to see the unanswered dial attempts! */
|
|
|
|
|
/* set up the CDR fields on all the CDRs to give sensical information */
|
|
|
|
|
ast_cdr_setdestchan(tmp->chan->cdr, tmp->chan->name);
|
|
|
|
|
strcpy(tmp->chan->cdr->clid, qe->chan->cdr->clid);
|
|
|
|
|
strcpy(tmp->chan->cdr->channel, qe->chan->cdr->channel);
|
|
|
|
|
strcpy(tmp->chan->cdr->src, qe->chan->cdr->src);
|
|
|
|
|
strcpy(tmp->chan->cdr->dst, qe->chan->exten);
|
|
|
|
|
strcpy(tmp->chan->cdr->dcontext, qe->chan->context);
|
|
|
|
|
strcpy(tmp->chan->cdr->lastapp, qe->chan->cdr->lastapp);
|
|
|
|
|
strcpy(tmp->chan->cdr->lastdata, qe->chan->cdr->lastdata);
|
|
|
|
|
tmp->chan->cdr->amaflags = qe->chan->cdr->amaflags;
|
|
|
|
|
strcpy(tmp->chan->cdr->accountcode, qe->chan->cdr->accountcode);
|
|
|
|
|
strcpy(tmp->chan->cdr->userfield, qe->chan->cdr->userfield);
|
|
|
|
|
}
|
|
|
|
|
ast_channel_unlock(qe->chan);
|
|
|
|
|
|
|
|
|
|
/* Place the call, but don't wait on the answer */
|
|
|
|
@ -3522,6 +3537,20 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
|
|
|
|
|
}
|
|
|
|
|
if (res == -1)
|
|
|
|
|
ast_debug(1, "%s: Nobody answered.\n", qe->chan->name);
|
|
|
|
|
if (ast_cdr_isset_unanswered()) {
|
|
|
|
|
/* channel contains the name of one of the outgoing channels
|
|
|
|
|
in its CDR; zero out this CDR to avoid a dual-posting */
|
|
|
|
|
struct callattempt *o;
|
|
|
|
|
for (o = outgoing; o; o = o->q_next) {
|
|
|
|
|
if (!o->chan) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (strcmp(o->chan->cdr->dstchannel, qe->chan->cdr->dstchannel) == 0) {
|
|
|
|
|
ast_set_flag(o->chan->cdr, AST_CDR_FLAG_POST_DISABLED);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else { /* peer is valid */
|
|
|
|
|
/* 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
|
|
|
|
@ -3597,6 +3626,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
|
|
|
|
|
ast_log(LOG_NOTICE, "Caller was about to talk to agent on %s but the caller hungup.\n", peer->name);
|
|
|
|
|
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "ABANDON", "%d|%d|%ld", qe->pos, qe->opos, (long) time(NULL) - qe->start);
|
|
|
|
|
record_abandoned(qe);
|
|
|
|
|
ast_cdr_noanswer(qe->chan->cdr);
|
|
|
|
|
ast_hangup(peer);
|
|
|
|
|
ao2_ref(member, -1);
|
|
|
|
|
return -1;
|
|
|
|
@ -3616,6 +3646,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
|
|
|
|
|
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "SYSCOMPAT", "%s", "");
|
|
|
|
|
ast_log(LOG_WARNING, "Had to drop call because I couldn't make %s compatible with %s\n", qe->chan->name, peer->name);
|
|
|
|
|
record_abandoned(qe);
|
|
|
|
|
ast_cdr_failed(qe->chan->cdr);
|
|
|
|
|
ast_hangup(peer);
|
|
|
|
|
ao2_ref(member, -1);
|
|
|
|
|
return -1;
|
|
|
|
@ -4805,6 +4836,7 @@ check_turns:
|
|
|
|
|
/* Leave if we have exceeded our queuetimeout */
|
|
|
|
|
if (qe.expire && (time(NULL) >= qe.expire)) {
|
|
|
|
|
record_abandoned(&qe);
|
|
|
|
|
ast_cdr_noanswer(qe.chan->cdr);
|
|
|
|
|
reason = QUEUE_TIMEOUT;
|
|
|
|
|
res = 0;
|
|
|
|
|
ast_queue_log(args.queuename, chan->uniqueid,"NONE", "EXITWITHTIMEOUT", "%d|%d|%ld",
|
|
|
|
@ -4828,6 +4860,7 @@ check_turns:
|
|
|
|
|
/* Leave if we have exceeded our queuetimeout */
|
|
|
|
|
if (qe.expire && (time(NULL) >= qe.expire)) {
|
|
|
|
|
record_abandoned(&qe);
|
|
|
|
|
ast_cdr_noanswer(qe.chan->cdr);
|
|
|
|
|
reason = QUEUE_TIMEOUT;
|
|
|
|
|
res = 0;
|
|
|
|
|
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
|
|
|
|
@ -4850,6 +4883,7 @@ check_turns:
|
|
|
|
|
ast_verb(3, "Exiting on time-out cycle\n");
|
|
|
|
|
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
|
|
|
|
|
record_abandoned(&qe);
|
|
|
|
|
ast_cdr_noanswer(qe.chan->cdr);
|
|
|
|
|
reason = QUEUE_TIMEOUT;
|
|
|
|
|
res = 0;
|
|
|
|
|
break;
|
|
|
|
@ -4898,6 +4932,7 @@ check_turns:
|
|
|
|
|
/* Leave if we have exceeded our queuetimeout */
|
|
|
|
|
if (qe.expire && (time(NULL) >= qe.expire)) {
|
|
|
|
|
record_abandoned(&qe);
|
|
|
|
|
ast_cdr_noanswer(qe.chan->cdr);
|
|
|
|
|
reason = QUEUE_TIMEOUT;
|
|
|
|
|
res = 0;
|
|
|
|
|
ast_queue_log(qe.parent->name, qe.chan->uniqueid,"NONE", "EXITWITHTIMEOUT", "%d|%d|%ld", qe.pos, qe.opos, (long) time(NULL) - qe.start);
|
|
|
|
@ -4926,6 +4961,7 @@ stop:
|
|
|
|
|
if (res < 0) {
|
|
|
|
|
if (!qe.handled) {
|
|
|
|
|
record_abandoned(&qe);
|
|
|
|
|
ast_cdr_noanswer(qe.chan->cdr);
|
|
|
|
|
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON",
|
|
|
|
|
"%d|%d|%ld", qe.pos, qe.opos,
|
|
|
|
|
(long) time(NULL) - qe.start);
|
|
|
|
|