Index: channels/chan_skinny.c =================================================================== --- channels/chan_skinny.c (revision 280158) +++ channels/chan_skinny.c (working copy) @@ -443,7 +443,8 @@ char calledPartyVoiceMailbox[24]; char originalCalledPartyVoiceMailbox[24]; char lastRedirectingVoiceMailbox[24]; - uint32_t space[3]; + uint32_t callnumber; + uint32_t space[2]; }; #define FORWARD_STAT_MESSAGE 0x0090 @@ -1318,7 +1319,8 @@ int callwaiting; \ int mwiblink; \ int dnd; \ - int prune; + int prune; \ + uint32_t callnumber[16]; struct skinny_device { SKINNY_DEVICE_OPTIONS @@ -2168,6 +2170,7 @@ static void transmit_callinfo(struct skinny_device *d, const char *fromname, const char *fromnum, const char *toname, const char *tonum, int instance, int callid, int calltype) { struct skinny_req *req; + int count; /* We should not be able to get here without a device */ if (!d) @@ -2194,6 +2197,25 @@ req->data.callinfo.instance = htolel(instance); req->data.callinfo.reference = htolel(callid); req->data.callinfo.type = htolel(calltype); + + for (count = 0; count < 16; count++) { + if (d->callnumber[count] == 0){ + d->callnumber[count] = callid; + count++; + break; + } else { + if (d->callnumber[count] == callid){ + count++; + break; + } + } + } + + if (skinnydebug) + ast_verb(1, "transmit_callinfor setting device callnumber to %d\n", d->callnumber[count-1]); + + req->data.callinfo.callnumber = htolel(count); + transmit_response(d, req); } @@ -3970,6 +4000,7 @@ struct skinny_line *l; struct skinny_device *d; struct skinnysession *s; + int count; if (!sub) { ast_debug(1, "Asked to hangup channel not connected\n"); @@ -4004,7 +4035,7 @@ l->activesub = AST_LIST_FIRST(&l->sub); } } - //transmit_callstate(d, l->instance, SKINNY_ONHOOK, sub->callid); + transmit_callstate(d, l->instance, SKINNY_ONHOOK, sub->callid); transmit_activatecallplane(d, l); transmit_closereceivechannel(d, sub); transmit_stopmediatransmission(d, sub); @@ -4017,6 +4048,7 @@ } else { transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_ON); } + transmit_callstate(d, l->instance, SKINNY_ONHOOK, sub->callid); } } else { /* no more subs on line so make idle */ ast_verb(4,"Killing only sub %d\n", sub->callid); @@ -4042,6 +4074,14 @@ } } } + + for (count = 0; count < 16; count++) { + if (d->callnumber[count] == sub->callid) { + d->callnumber[count] = 0; + break; + } + } + ast_mutex_lock(&sub->lock); sub->owner = NULL; ast->tech_pvt = NULL; @@ -4702,7 +4742,7 @@ sub->related = newsub; newsub->xferor = 1; l->activesub = newsub; - transmit_callstate(d, l->instance, sub->callid, SKINNY_OFFHOOK); + transmit_callstate(d, l->instance, newsub->callid, SKINNY_OFFHOOK); transmit_activatecallplane(d, l); transmit_clear_display_message(d, l->instance, newsub->callid); transmit_start_tone(d, SKINNY_DIALTONE, l->instance, newsub->callid);