diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 6a8b36483d..9f833dac18 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -1082,6 +1082,20 @@ struct dialed_number_message { uint32_t callReference; }; +#define MAXCALLINFOSTR 256 +#define CALL_INFO_MESSAGE_VARIABLE 0x014A +struct call_info_message_variable { + uint32_t instance; + uint32_t callreference; + uint32_t calldirection; + uint32_t unknown1; + uint32_t unknown2; + uint32_t unknown3; + uint32_t unknown4; + uint32_t unknown5; + char calldetails[MAXCALLINFOSTR]; +}; + union skinny_data { struct alarm_message alarm; struct speed_dial_stat_req_message speeddialreq; @@ -1130,6 +1144,7 @@ union skinny_data { struct enbloc_call_message enbloccallmessage; struct forward_stat_message forwardstat; struct bksp_req_message bkspmessage; + struct call_info_message_variable callinfomessagevariable; }; /* packet composition */ @@ -2375,6 +2390,57 @@ static void transmit_callinfo(struct skinny_device *d, int instance, int callid, 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) +{ + struct skinny_req *req; + char *strptr; + char *thestrings[12]; + int i; + int callinfostrleft = MAXCALLINFOSTR; + + if (!(req = req_alloc(sizeof(struct call_info_message_variable), CALL_INFO_MESSAGE_VARIABLE))) + return; + + req->data.callinfomessagevariable.instance = htolel(instance); + req->data.callinfomessagevariable.callreference = htolel(callreference); + req->data.callinfomessagevariable.calldirection = htolel(calldirection); + + req->data.callinfomessagevariable.unknown1 = htolel(0x00); + req->data.callinfomessagevariable.unknown2 = htolel(0x00); + req->data.callinfomessagevariable.unknown3 = htolel(0x00); + req->data.callinfomessagevariable.unknown4 = htolel(0x00); + req->data.callinfomessagevariable.unknown5 = htolel(0x00); + + thestrings[0] = fromnum; + thestrings[1] = ""; /* Appears to be origfrom */ + thestrings[2] = tonum; + thestrings[3] = ""; + thestrings[4] = ""; + thestrings[5] = ""; + thestrings[6] = ""; + thestrings[7] = ""; + + thestrings[8] = ""; + thestrings[9] = fromname; + thestrings[10] = toname; + thestrings[11] = ""; + + strptr = req->data.callinfomessagevariable.calldetails; + + for(i = 0; i < 12; i++) { + ast_copy_string(strptr, thestrings[i], callinfostrleft); + strptr += strlen(thestrings[i]) + 1; + callinfostrleft -= strlen(thestrings[i]) + 1; + } + + 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); + transmit_response(d, req); +} + static void send_callinfo(struct skinny_subchannel *sub) { struct ast_channel *ast; @@ -2407,7 +2473,12 @@ static void send_callinfo(struct skinny_subchannel *sub) ast_verb(1, "Error sending Callinfo to %s(%d) - No call direction in sub\n", d->name, l->instance); return; } - transmit_callinfo(d, l->instance, sub->callid, fromname, fromnum, toname, tonum, sub->calldirection); + + if (d->protocolversion < 17) { + transmit_callinfo(d, l->instance, sub->callid, fromname, fromnum, toname, tonum, sub->calldirection); + } else { + transmit_callinfo_variable(d, l->instance, sub->callid, fromname, fromnum, toname, tonum, sub->calldirection); + } } static void push_callinfo(struct skinny_subline *subline, struct skinny_subchannel *sub) @@ -2442,7 +2513,12 @@ static void push_callinfo(struct skinny_subline *subline, struct skinny_subchann ast_verb(1, "Error sending Callinfo to %s(%d) - No call direction in sub\n", d->name, l->instance); return; } - transmit_callinfo(subline->line->device, subline->line->instance, subline->callid, fromname, fromnum, toname, tonum, sub->calldirection); + + if (d->protocolversion < 17) { + transmit_callinfo(subline->line->device, subline->line->instance, subline->callid, fromname, fromnum, toname, tonum, sub->calldirection); + } else { + transmit_callinfo_variable(subline->line->device, subline->line->instance, subline->callid, fromname, fromnum, toname, tonum, sub->calldirection); + } } static void transmit_connect(struct skinny_device *d, struct skinny_subchannel *sub)