mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-04 12:12:48 +00:00
res_pjsip_mwi: unsubscribe unsolicited MWI on deleting endpoint last contact
If the endpoint's last contact is deleted unsolicited MWI has to be unsubscribed. ASTERISK-27051 #close Change-Id: I33e174e0b9dba0998927d16d6d100fda5c7254e0
This commit is contained in:
@@ -1229,10 +1229,50 @@ static void mwi_contact_added(const void *object)
|
|||||||
mwi_contact_updated(object);
|
mwi_contact_updated(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! \brief Function called when a contact is deleted */
|
||||||
|
static void mwi_contact_deleted(const void *object)
|
||||||
|
{
|
||||||
|
const struct ast_sip_contact *contact = object;
|
||||||
|
struct ao2_iterator *mwi_subs;
|
||||||
|
struct mwi_subscription *mwi_sub;
|
||||||
|
RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
|
||||||
|
RAII_VAR(struct ast_sip_contact *, found_contact, NULL, ao2_cleanup);
|
||||||
|
|
||||||
|
if (contact->endpoint) {
|
||||||
|
endpoint = ao2_bump(contact->endpoint);
|
||||||
|
} else {
|
||||||
|
if (!ast_strlen_zero(contact->endpoint_name)) {
|
||||||
|
endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", contact->endpoint_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!endpoint || ast_strlen_zero(endpoint->subscription.mwi.mailboxes)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if there is another contact */
|
||||||
|
found_contact = ast_sip_location_retrieve_contact_from_aor_list(endpoint->aors);
|
||||||
|
if (found_contact) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ao2_lock(unsolicited_mwi);
|
||||||
|
mwi_subs = ao2_find(unsolicited_mwi, contact->endpoint_name,
|
||||||
|
OBJ_SEARCH_KEY | OBJ_MULTIPLE | OBJ_NOLOCK | OBJ_UNLINK);
|
||||||
|
if (mwi_subs) {
|
||||||
|
for (; (mwi_sub = ao2_iterator_next(mwi_subs)); ao2_cleanup(mwi_sub)) {
|
||||||
|
unsubscribe(mwi_sub, NULL, 0);
|
||||||
|
}
|
||||||
|
ao2_iterator_destroy(mwi_subs);
|
||||||
|
}
|
||||||
|
ao2_unlock(unsolicited_mwi);
|
||||||
|
}
|
||||||
|
|
||||||
/*! \brief Observer for contacts so unsolicited MWI is sent when a contact changes */
|
/*! \brief Observer for contacts so unsolicited MWI is sent when a contact changes */
|
||||||
static const struct ast_sorcery_observer mwi_contact_observer = {
|
static const struct ast_sorcery_observer mwi_contact_observer = {
|
||||||
.created = mwi_contact_added,
|
.created = mwi_contact_added,
|
||||||
.updated = mwi_contact_updated,
|
.updated = mwi_contact_updated,
|
||||||
|
.deleted = mwi_contact_deleted,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! \brief Task invoked to send initial MWI NOTIFY for unsolicited */
|
/*! \brief Task invoked to send initial MWI NOTIFY for unsolicited */
|
||||||
|
Reference in New Issue
Block a user