summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_skinny.c63
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);