Index: channels/chan_skinny.c =================================================================== --- channels/chan_skinny.c (revision 53778) +++ channels/chan_skinny.c (working copy) @@ -322,6 +322,17 @@ uint32_t type; char originalCalledPartyName[40]; char originalCalledParty[24]; + char lastRedirectingPartyName[40]; + char lastRedirectingParty[24]; + uint32_t originalCdpnRedirectReason; + uint32_t lastRedirectingReason; + char cgpnVoiceMailbox[24]; + char cdpnVoiceMailbox[24]; + char originalCdpnVoiceMailbox[24]; + char lastRedirectingVoiceMailbox[24]; + uint32_t callInstance; + uint32_t callSecurityStatus; + char partyPIRestrictionBits; }; #define SPEED_DIAL_STAT_RES_MESSAGE 0x0091 @@ -680,6 +691,13 @@ uint32_t callReference; }; +#define DISPLAY_PRI_NOTIFY_MESSAGE 0x0120 +struct display_pri_notify_message { + uint32_t messageTimeout; + uint32_t priority; + char notify[32]; +}; + union skinny_data { struct alarm_message alarm; struct speed_dial_stat_req_message speeddialreq; @@ -718,6 +736,7 @@ struct open_receive_channel_ack_message openreceivechannelack; struct close_receive_channel_message closereceivechannel; struct display_notify_message displaynotify; + struct display_pri_notify_message displayprinotifymessage; struct dialed_number_message dialednumber; struct soft_key_event_message softkeyeventmessage; }; @@ -1410,7 +1429,7 @@ } } - + ast_mutex_unlock(&s->lock); return 1; } @@ -1487,6 +1506,9 @@ if (!(req = req_alloc(sizeof(struct call_info_message), CALL_INFO_MESSAGE))) return; + if (skinnydebug) + ast_verbose("Setting Callinfo to %s(%s) from %s(%s) on %s(%d)\n", fromname, fromnum, toname, tonum, s->device->name, instance); + if (fromname) { ast_copy_string(req->data.callinfo.callingPartyName, fromname, sizeof(req->data.callinfo.callingPartyName)); } @@ -1502,6 +1524,7 @@ req->data.callinfo.instance = htolel(instance); req->data.callinfo.reference = htolel(callid); req->data.callinfo.type = htolel(calltype); + req->data.callinfo.callInstance = htolel(1); transmit_response(s, req); } @@ -1638,6 +1661,23 @@ transmit_response(s, req); } +static void transmit_displayprinotify(struct skinnysession *s, const char *text, int t) +{ + struct skinny_req *req; + + if (!(req = req_alloc(sizeof(struct display_pri_notify_message), DISPLAY_PRI_NOTIFY_MESSAGE))) + return; + + ast_copy_string(req->data.displayprinotifymessage.notify, text, sizeof(req->data.displaynotify.displayMessage)); + req->data.displayprinotifymessage.messageTimeout = htolel(t); + req->data.displayprinotifymessage.priority = htolel(5); + + if (skinnydebug) + ast_verbose("Displaying prinotifymessage '%s'\n", text); + + transmit_response(s, req); +} + static void transmit_displaypromptstatus(struct skinnysession *s, const char *text, int t, int instance, int callid) { struct skinny_req *req; @@ -2341,6 +2381,7 @@ struct skinny_line *l = sub->parent; struct skinny_device *d = l->parent; struct skinnysession *s = d->session; + char tempMessage[32]; if (!d->registered) { ast_log(LOG_ERROR, "Device not registered, cannot call %s\n", dest); @@ -2372,15 +2413,39 @@ break; } + transmit_callstate(s, l->instance, SKINNY_RINGIN, sub->callid); + transmit_selectsoftkeys(s, l->instance, sub->callid, KEYDEF_RINGIN); + + memset(tempMessage,0,32); + memset(tempMessage,0x80,1); + memset(tempMessage+1,0x17,1); + memcpy(tempMessage+2, ast->cid.cid_num, 30); + transmit_displaypromptstatus(s, tempMessage, 0, l->instance, sub->callid); + + memset(tempMessage,0x05,1); + memset(tempMessage+1,0x00,1); + transmit_displayprinotify(s,tempMessage,10); + + transmit_callinfo(s, ast->cid.cid_name, ast->cid.cid_num, l->cid_name, l->cid_num, l->instance, sub->callid, 1); transmit_lamp_indication(s, STIMULUS_LINE, l->instance, SKINNY_LAMP_BLINK); transmit_ringer_mode(s, SKINNY_RING_INSIDE); +/* transmit_lamp_indication(s, STIMULUS_LINE, l->instance, SKINNY_LAMP_BLINK); + transmit_ringer_mode(s, SKINNY_RING_INSIDE); + transmit_tone(s, tone); transmit_callinfo(s, ast->cid.cid_name, ast->cid.cid_num, l->cid_name, l->cid_num, l->instance, sub->callid, 1); transmit_callstate(s, l->instance, SKINNY_RINGIN, sub->callid); transmit_displaypromptstatus(s, "Ring-In", 0, l->instance, sub->callid); - transmit_selectsoftkeys(s, l->instance, sub->callid, KEYDEF_RINGIN); + memset(tempMessage,0,32); + memset(tempMessage,0x80,1); + memset(tempMessage+1,0x17,1); + memcpy(tempMessage+2, ast->cid.cid_num, 30); + + transmit_displaypromptstatus(s, tempMessage, 0, l->instance, sub->callid); + transmit_selectsoftkeys(s, l->instance, sub->callid, KEYDEF_RINGIN); */ + ast_setstate(ast, AST_STATE_RINGING); ast_queue_control(ast, AST_CONTROL_RINGING); sub->outgoing = 1;