diff -urB asterisk_orig//channels/chan_sip.c asterisk//channels/chan_sip.c --- asterisk_orig//channels/chan_sip.c 2011-10-17 17:46:26.000000000 +0000 +++ asterisk//channels/chan_sip.c 2011-11-21 16:00:21.495571861 +0000 @@ -21124,6 +21125,8 @@ /* Mostly created to return proper answers on notifications on outbound REFER's */ int res = 0; const char *event = get_header(req, "Event"); + const char *subscription_state = get_header(req, "Subscription-State"); char *sep; if( (sep = strchr(event, ';')) ) { /* XXX bug here - overwriting string ? */ @@ -21242,37 +21245,58 @@ /* Confirm that we received this packet */ transmit_response(p, "200 OK", req); } else if (!strcmp(event, "message-summary")) { - const char *mailbox = NULL; - char *c = ast_strdupa(get_body(req, "Voice-Message", ':')); - - if (!p->mwi) { - struct sip_peer *peer = find_peer(NULL, &p->recv, TRUE, FINDPEERS, FALSE, p->socket.type); - - if (peer) { - mailbox = ast_strdupa(peer->unsolicited_mailbox); - unref_peer(peer, "removing unsolicited mwi ref"); - } + if(strstr(subscription_state, "terminated")) { + transmit_response(p, "200 OK", req); } else { - mailbox = p->mwi->mailbox; - } + const char *mailbox = NULL; + char *c = ast_strdupa(get_body(req, "Voice-Message", ':')); + char *mw = ast_strdupa(get_body(req, "Messages-Waiting", ':')); - if (!ast_strlen_zero(mailbox) && !ast_strlen_zero(c)) { - char *old = strsep(&c, " "); - char *new = strsep(&old, "/"); - struct ast_event *event; - if ((event = ast_event_new(AST_EVENT_MWI, - AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox, - AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, "SIP_Remote", - AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, atoi(new), - AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, atoi(old), - AST_EVENT_IE_END))) { - ast_event_queue_and_cache(event); - } - transmit_response(p, "200 OK", req); - } else { - transmit_response(p, "489 Bad event", req); - res = -1; + + if (!p->mwi) { + struct sip_peer *peer = find_peer(NULL, &p->recv, TRUE, FINDPEERS, FALSE, p->socket.type); + + if (peer) { + mailbox = ast_strdupa(peer->unsolicited_mailbox); + unref_peer(peer, "removing unsolicited mwi ref"); + } + } else { + mailbox = p->mwi->mailbox; + } + + if (!ast_strlen_zero(mailbox) && !ast_strlen_zero(c)) { + char *old = strsep(&c, " "); + char *new = strsep(&old, "/"); + struct ast_event *event; + + if ((event = ast_event_new(AST_EVENT_MWI, + AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox, + AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, "SIP_Remote", + AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, atoi(new), + AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, atoi(old), + AST_EVENT_IE_END))) { + ast_event_queue_and_cache(event); + } + transmit_response(p, "200 OK", req); + } else if (!ast_strlen_zero(mailbox) && !ast_strlen_zero(mw)) { + struct ast_event *event; + mw = ast_skip_blanks(mw); + + if ((event = ast_event_new(AST_EVENT_MWI, + AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox, + AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, "SIP_Remote", + AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, strncmp(mw, "no", 2)?0:1, + AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, 0, + AST_EVENT_IE_END))) { + ast_event_queue_and_cache(event); + } + transmit_response(p, "200 OK", req); + } else { + transmit_response(p, "489 Bad event", req); + res = -1; + } } } else if (!strcmp(event, "keep-alive")) { /* Used by Sipura/Linksys for NAT pinhole,