ast_sockaddr_split_hostport(*hostport, hostport, &dont_care, PARSE_PORT_IGNORE);
}
+/*! \internal \brief Helper function to update a peer's lastmsgssent value
+ */
+static void update_peer_lastmsgssent(struct sip_peer *peer, int value, int locked)
+{
+ if (!locked) {
+ ao2_lock(peer);
+ }
+ peer->lastmsgssent = value;
+ if (!locked) {
+ ao2_unlock(peer);
+ }
+}
+
+
/*! \brief Verify registration of user
- Registration is done in several steps, first a REGISTER without auth
to get a challenge (nonce) then a second one with auth
char tmp[256];
char *c, *name, *unused_password, *domain;
char *uri2 = ast_strdupa(uri);
+ int send_mwi = 0;
terminate_uri(uri2);
case PARSE_REGISTER_DENIED:
ast_log(LOG_WARNING, "Registration denied because of contact ACL\n");
transmit_response_with_date(p, "603 Denied", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_FAILED:
ast_log(LOG_WARNING, "Failed to parse contact info\n");
transmit_response_with_date(p, "400 Bad Request", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_QUERY:
ast_string_field_set(p, fullcontact, peer->fullcontact);
transmit_response_with_date(p, "200 OK", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_UPDATE:
update_peer(peer, p->expiry);
/* Say OK and ask subsystem to retransmit msg counter */
transmit_response_with_date(p, "200 OK", req);
- if (!ast_test_flag((&peer->flags[1]), SIP_PAGE2_SUBSCRIBEMWIONLY))
- peer->lastmsgssent = -1;
+ send_mwi = 1;
res = 0;
break;
}
case PARSE_REGISTER_DENIED:
ast_log(LOG_WARNING, "Registration denied because of contact ACL\n");
transmit_response_with_date(p, "403 Forbidden (ACL)", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_FAILED:
ast_log(LOG_WARNING, "Failed to parse contact info\n");
transmit_response_with_date(p, "400 Bad Request", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_QUERY:
ast_string_field_set(p, fullcontact, peer->fullcontact);
transmit_response_with_date(p, "200 OK", req);
- peer->lastmsgssent = -1;
+ send_mwi = 1;
res = 0;
break;
case PARSE_REGISTER_UPDATE:
/* Say OK and ask subsystem to retransmit msg counter */
transmit_response_with_date(p, "200 OK", req);
manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: Registered\r\nAddress: %s\r\n", peer->name, ast_sockaddr_stringify(addr));
- peer->lastmsgssent = -1;
+ send_mwi = 1;
res = 0;
break;
}
}
}
if (!res) {
+ if (send_mwi) {
+ sip_send_mwi_to_peer(peer, 0);
+ } else {
+ update_peer_lastmsgssent(peer, -1, 0);
+ }
ast_devstate_changed(AST_DEVICE_UNKNOWN, "SIP/%s", peer->name);
}
if (res < 0) {
}
if (ast_test_flag((&peer->flags[1]), SIP_PAGE2_SUBSCRIBEMWIONLY) && !peer->mwipvt) {
+ update_peer_lastmsgssent(peer, -1, 1);
ao2_unlock(peer);
return 0;
}
/* Do we have an IP address? If not, skip this peer */
if (ast_sockaddr_isnull(&peer->addr) && ast_sockaddr_isnull(&peer->defaddr)) {
+ update_peer_lastmsgssent(peer, -1, 1);
ao2_unlock(peer);
return 0;
}
struct ast_str *mailbox_str = ast_str_alloca(512);
peer_mailboxes_to_str(&mailbox_str, peer);
ao2_unlock(peer);
+ /* If there is no mailbox do nothing */
+ if (ast_strlen_zero(mailbox_str->str)) {
+ update_peer_lastmsgssent(peer, -1, 0);
+ return 0;
+ }
ast_app_inboxcount(mailbox_str->str, &newmsgs, &oldmsgs);
ao2_lock(peer);
}
ao2_unlock(peer);
/* Build temporary dialog for this message */
if (!(p = sip_alloc(NULL, NULL, 0, SIP_NOTIFY, NULL))) {
+ update_peer_lastmsgssent(peer, -1, 0);
return -1;
}
/* Maybe they're not registered, etc. */
dialog_unlink_all(p);
dialog_unref(p, "unref dialog p just created via sip_alloc");
- /* sip_destroy(p); */
+ update_peer_lastmsgssent(peer, -1, 0);
return 0;
}
/* Recalculate our side, and recalculate Call ID */
sip_pvt_unlock(p);
dialog_unref(p, "unref dialog ptr p just before it goes out of scope at the end of sip_send_mwi_to_peer.");
+ update_peer_lastmsgssent(peer, ((newmsgs > 0x7fff ? 0x7fff0000 : (newmsgs << 16)) | (oldmsgs > 0xffff ? 0xffff : oldmsgs)), 0);
+
return 0;
}