diff options
-rw-r--r-- | res/res_pjsip_mwi.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/res/res_pjsip_mwi.c b/res/res_pjsip_mwi.c index 3dfccef86..f73f10cd6 100644 --- a/res/res_pjsip_mwi.c +++ b/res/res_pjsip_mwi.c @@ -1229,10 +1229,50 @@ static void mwi_contact_added(const void *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 */ static const struct ast_sorcery_observer mwi_contact_observer = { .created = mwi_contact_added, .updated = mwi_contact_updated, + .deleted = mwi_contact_deleted, }; /*! \brief Task invoked to send initial MWI NOTIFY for unsolicited */ |