diff options
Diffstat (limited to 'channels/chan_skinny.c')
-rw-r--r-- | channels/chan_skinny.c | 63 |
1 files changed, 45 insertions, 18 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 32ad8e536..d47827d2d 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -1382,6 +1382,8 @@ struct skinny_subchannel { int aa_beep; int aa_mute; int dialer_sched; + char *origtonum; + char *origtoname; AST_LIST_ENTRY(skinny_subchannel) list; struct skinny_subchannel *related; @@ -2426,7 +2428,8 @@ static void transmit_microphone_mode(struct skinny_device *d, int mode) } //static void transmit_callinfo(struct skinny_subchannel *sub) -static void transmit_callinfo(struct skinny_device *d, int instance, int callid, char *fromname, char *fromnum, char *toname, char *tonum, int calldirection) +static void transmit_callinfo(struct skinny_device *d, int instance, int callid, + char *fromname, char *fromnum, char *toname, char *tonum, int calldirection, char *origtonum, char *origtoname) { struct skinny_req *req; @@ -2437,17 +2440,24 @@ static void transmit_callinfo(struct skinny_device *d, int instance, int callid, ast_copy_string(req->data.callinfo.callingParty, fromnum, sizeof(req->data.callinfo.callingParty)); ast_copy_string(req->data.callinfo.calledPartyName, toname, sizeof(req->data.callinfo.calledPartyName)); ast_copy_string(req->data.callinfo.calledParty, tonum, sizeof(req->data.callinfo.calledParty)); + if (origtoname) { + ast_copy_string(req->data.callinfo.originalCalledPartyName, origtoname, sizeof(req->data.callinfo.originalCalledPartyName)); + } + if (origtonum) { + ast_copy_string(req->data.callinfo.originalCalledParty, origtonum, sizeof(req->data.callinfo.originalCalledParty)); + } + req->data.callinfo.instance = htolel(instance); req->data.callinfo.reference = htolel(callid); req->data.callinfo.type = htolel(calldirection); - SKINNY_DEBUG(DEBUG_PACKET, 3, "Transmitting CALL_INFO_MESSAGE to %s, to %s(%s) from %s(%s) (dir=%d) on %s(%d)\n", - d->name, toname, tonum, fromname, fromnum, calldirection, d->name, instance); + SKINNY_DEBUG(DEBUG_PACKET, 3, "Transmitting CALL_INFO_MESSAGE to %s, to %s(%s) from %s(%s), origto %s(%s) (dir=%d) on %s(%d)\n", + d->name, toname, tonum, fromname, fromnum, origtoname, origtonum, calldirection, d->name, instance); transmit_response(d, req); } static void transmit_callinfo_variable(struct skinny_device *d, int instance, int callreference, - char *fromname, char *fromnum, char *toname, char *tonum, int calldirection) + char *fromname, char *fromnum, char *toname, char *tonum, int calldirection, char *origtonum, char *origtoname) { struct skinny_req *req; char *strptr; @@ -2472,10 +2482,11 @@ static void transmit_callinfo_variable(struct skinny_device *d, int instance, in thestrings[1] = ""; /* Appears to be origfrom */ if (calldirection == SKINNY_OUTGOING) { thestrings[2] = tonum; + thestrings[3] = origtonum; } else { thestrings[2] = ""; + thestrings[3] = ""; } - thestrings[3] = ""; thestrings[4] = ""; thestrings[5] = ""; thestrings[6] = ""; @@ -2484,21 +2495,27 @@ static void transmit_callinfo_variable(struct skinny_device *d, int instance, in thestrings[8] = ""; thestrings[9] = fromname; thestrings[10] = toname; - thestrings[11] = ""; + thestrings[11] = origtoname; thestrings[12] = ""; strptr = req->data.callinfomessagevariable.calldetails; for(i = 0; i < 13; i++) { - ast_copy_string(strptr, thestrings[i], callinfostrleft); - strptr += strlen(thestrings[i]) + 1; - callinfostrleft -= strlen(thestrings[i]) + 1; + if (thestrings[i]) { + ast_copy_string(strptr, thestrings[i], callinfostrleft); + strptr += strlen(thestrings[i]) + 1; + callinfostrleft -= strlen(thestrings[i]) + 1; + } else { + ast_copy_string(strptr, "", callinfostrleft); + strptr++; + callinfostrleft--; + } } req->len = req->len - (callinfostrleft & ~0x3); - SKINNY_DEBUG(DEBUG_PACKET, 3, "Transmitting CALL_INFO_MESSAGE_VARIABLE to %s, to %s(%s) from %s(%s) (dir=%d) on %s(%d)\n", - d->name, toname, tonum, fromname, fromnum, calldirection, d->name, instance); + SKINNY_DEBUG(DEBUG_PACKET, 3, "Transmitting CALL_INFO_MESSAGE_VARIABLE to %s, to %s(%s) from %s(%s), origto %s(%s) (dir=%d) on %s(%d)\n", + d->name, toname, tonum, fromname, fromnum, origtoname, origtonum, calldirection, d->name, instance); transmit_response(d, req); } @@ -2543,9 +2560,9 @@ static void send_callinfo(struct skinny_subchannel *sub) } if (d->protocolversion < 17) { - transmit_callinfo(d, l->instance, sub->callid, fromname, fromnum, toname, tonum, sub->calldirection); + transmit_callinfo(d, l->instance, sub->callid, fromname, fromnum, toname, tonum, sub->calldirection, sub->origtonum, sub->origtoname); } else { - transmit_callinfo_variable(d, l->instance, sub->callid, fromname, fromnum, toname, tonum, sub->calldirection); + transmit_callinfo_variable(d, l->instance, sub->callid, fromname, fromnum, toname, tonum, sub->calldirection, sub->origtonum, sub->origtoname); } } @@ -2590,9 +2607,9 @@ static void push_callinfo(struct skinny_subline *subline, struct skinny_subchann } if (d->protocolversion < 17) { - transmit_callinfo(subline->line->device, subline->line->instance, subline->callid, fromname, fromnum, toname, tonum, sub->calldirection); + transmit_callinfo(subline->line->device, subline->line->instance, subline->callid, fromname, fromnum, toname, tonum, sub->calldirection, sub->origtonum, sub->origtoname); } else { - transmit_callinfo_variable(subline->line->device, subline->line->instance, subline->callid, fromname, fromnum, toname, tonum, sub->calldirection); + transmit_callinfo_variable(subline->line->device, subline->line->instance, subline->callid, fromname, fromnum, toname, tonum, sub->calldirection, sub->origtonum, sub->origtoname); } } @@ -3471,6 +3488,14 @@ static void update_connectedline(struct skinny_subchannel *sub, const void *data return; } + if (sub->calldirection == SKINNY_OUTGOING && !sub->origtonum) { + /* Do not set origtonum before here or origtoname won't be set */ + sub->origtonum = ast_strdup(sub->exten); + if (ast_channel_connected(c)->id.name.valid) { + sub->origtoname = ast_strdup(ast_channel_connected(c)->id.name.str); + } + } + if (!ast_channel_caller(c)->id.number.valid || ast_strlen_zero(ast_channel_caller(c)->id.number.str) || !ast_channel_connected(c)->id.number.valid @@ -4940,6 +4965,8 @@ static int skinny_hangup(struct ast_channel *ast) sub->owner = NULL; ast_channel_tech_pvt_set(ast, NULL); destroy_rtp(sub); + ast_free(sub->origtonum); + ast_free(sub->origtoname); ast_mutex_unlock(&sub->lock); ast_free(sub); ast_module_unref(ast_module_info->self); @@ -5595,7 +5622,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) ast_queue_control(sub->owner, AST_CONTROL_ANSWER); } if (sub->substate == SUBSTATE_DIALING || sub->substate == SUBSTATE_RINGOUT) { - transmit_dialednumber(d, l->lastnumberdialed, l->instance, sub->callid); + transmit_dialednumber(d, sub->exten, l->instance, sub->callid); } if (ast_channel_state(sub->owner) != AST_STATE_UP) { ast_setstate(sub->owner, AST_STATE_UP); @@ -5750,7 +5777,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) transmit_start_tone(d, SKINNY_ALERT, l->instance, sub->callid); } transmit_callstate(d, l->instance, sub->callid, SKINNY_RINGOUT); - transmit_dialednumber(d, l->lastnumberdialed, l->instance, sub->callid); + transmit_dialednumber(d, sub->exten, l->instance, sub->callid); send_displaypromptstatus(d, OCTAL_RINGOUT, "", 0, l->instance, sub->callid); send_callinfo(sub); sub->substate = SUBSTATE_RINGOUT; @@ -5822,7 +5849,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state) ast_queue_control(sub->owner, AST_CONTROL_ANSWER); } if (sub->substate == SUBSTATE_DIALING || sub->substate == SUBSTATE_RINGOUT) { - transmit_dialednumber(d, l->lastnumberdialed, l->instance, sub->callid); + transmit_dialednumber(d, sub->exten, l->instance, sub->callid); } if (ast_channel_state(sub->owner) != AST_STATE_UP) { ast_setstate(sub->owner, AST_STATE_UP); |