Index: channels/chan_skinny.c =================================================================== --- channels/chan_skinny.c (revision 69067) +++ channels/chan_skinny.c (working copy) @@ -260,12 +267,15 @@ #define START_TONE_MESSAGE 0x0082 struct start_tone_message { uint32_t tone; - uint32_t space[3]; + uint32_t space; + uint32_t instance; + uint32_t reference; }; #define STOP_TONE_MESSAGE 0x0083 struct stop_tone_message { - uint32_t space[2]; + uint32_t instance; + uint32_t reference; }; #define SET_RINGER_MESSAGE 0x0085 @@ -1615,7 +1629,7 @@ if (!(req = req_alloc(sizeof(struct start_tone_message), START_TONE_MESSAGE))) return; } else { - if (!(req = req_alloc(sizeof(struct stop_tone_message), STOP_TONE_MESSAGE))) + if (!(req = req_alloc(0, STOP_TONE_MESSAGE))) return; } @@ -1719,17 +1733,28 @@ { struct skinny_req *req; - if (!(req = req_alloc(sizeof(struct display_prompt_status_message), DISPLAY_PROMPT_STATUS_MESSAGE))) - return; + if (text == 0) { + if (!(req = req_alloc(sizeof(struct clear_prompt_message), CLEAR_PROMPT_MESSAGE))) + return; - ast_copy_string(req->data.displaypromptstatus.promptMessage, text, sizeof(req->data.displaypromptstatus.promptMessage)); - req->data.displaypromptstatus.messageTimeout = htolel(t); - req->data.displaypromptstatus.lineInstance = htolel(instance); - req->data.displaypromptstatus.callReference = htolel(callid); + req->data.clearpromptstatus.lineInstance = htolel(instance); + req->data.clearpromptstatus.callReference = htolel(callid); - if (skinnydebug) - ast_verbose("Displaying Prompt Status '%s'\n", text); + if (skinnydebug) + ast_verbose("Clearing Prompt\n"); + } else { + if (!(req = req_alloc(sizeof(struct display_prompt_status_message), DISPLAY_PROMPT_STATUS_MESSAGE))) + return; + ast_copy_string(req->data.displaypromptstatus.promptMessage, text, sizeof(req->data.displaypromptstatus.promptMessage)); + req->data.displaypromptstatus.messageTimeout = htolel(t); + req->data.displaypromptstatus.lineInstance = htolel(instance); + req->data.displaypromptstatus.callReference = htolel(callid); + + if (skinnydebug) + ast_verbose("Displaying Prompt Status '%s'\n", text); + } + transmit_response(s, req); } @@ -3296,6 +3488,7 @@ transmit_displaymessage(s, NULL); /* clear display */ transmit_tone(s, SKINNY_DIALTONE); + transmit_selectsoftkeys(s, l->instance, sub->callid, KEYDEF_RINGOUT); if (!ast_ignore_pattern(c->context, vmexten)) { transmit_tone(s, SKINNY_SILENCE); @@ -4014,11 +4268,8 @@ ast_verbose("Attempting to Clear display on Skinny %s@%s\n", l->name, d->name); transmit_displaymessage(s, NULL); /* clear display */ transmit_tone(s, SKINNY_DIALTONE); + transmit_selectsoftkeys(s, l->instance, sub->callid, KEYDEF_RINGOUT); - if (ast_strlen_zero(l->lastnumberdialed)) { - ast_log(LOG_WARNING, "Attempted redial, but no previously dialed number found.\n"); - break; - } if (!ast_ignore_pattern(c->context, l->lastnumberdialed)) { transmit_tone(s, SKINNY_SILENCE); } @@ -4166,6 +4408,16 @@ case SOFTKEY_RESUME: if (skinnydebug) ast_verbose("Received Softkey Event: Resume(%d)\n", instance); + + if (sub) { + if (sub->onhold) { + skinny_unhold(sub); + transmit_selectsoftkeys(s, l->instance, sub->callid, KEYDEF_CONNECTED); + } else { + skinny_hold(sub); + transmit_selectsoftkeys(s, l->instance, sub->callid, KEYDEF_ONHOLD); + } + } break; case SOFTKEY_ANSWER: if (skinnydebug)