mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	res_pjsip_mwi: update unsolicited MWI subscriptions on updating contact
Do not need to unsubscribe/subscribe on creating the ednpoint's contact. The modified function create_mwi_subscriptions_for_endpoint adds the subscription only if it does not exist. The subscriptions aren't added for active contacts which are retrieved on startup from realtime if mwi_disable_initial_unsolicited=yes. Because the mwi_contact_added is not called. So the subscriptions also should be created on updating contact. ASTERISK-26230 #close Change-Id: I47e265af9296ca09aa42a316fdacac104148cee4
This commit is contained in:
		
				
					committed by
					
						 Richard Mudgett
						Richard Mudgett
					
				
			
			
				
	
			
			
			
						parent
						
							bd9d72793d
						
					
				
				
					commit
					0f6a9617eb
				
			| @@ -1102,6 +1102,13 @@ static int create_mwi_subscriptions_for_endpoint(void *obj, void *arg, int flags | ||||
| 	} | ||||
|  | ||||
| 	if (endpoint->subscription.mwi.aggregate) { | ||||
| 		const char *endpoint_id = ast_sorcery_object_get_id(endpoint); | ||||
|  | ||||
| 		/* Check if subscription exists */ | ||||
| 		aggregate_sub = ao2_find(unsolicited_mwi, endpoint_id, OBJ_SEARCH_KEY | OBJ_NOLOCK); | ||||
| 		if (aggregate_sub) { | ||||
| 			return 0; | ||||
| 		} | ||||
| 		aggregate_sub = mwi_subscription_alloc(endpoint, 0, NULL); | ||||
| 		if (!aggregate_sub) { | ||||
| 			return 0; | ||||
| @@ -1113,7 +1120,9 @@ static int create_mwi_subscriptions_for_endpoint(void *obj, void *arg, int flags | ||||
| 		struct mwi_subscription *sub; | ||||
| 		struct mwi_stasis_subscription *mwi_stasis_sub; | ||||
|  | ||||
| 		if (ast_strlen_zero(mailbox)) { | ||||
| 		/* check if subscription exists */ | ||||
| 		if (ast_strlen_zero(mailbox) || | ||||
| 			(!aggregate_sub && endpoint_receives_unsolicited_mwi_for_mailbox(endpoint, mailbox))) { | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| @@ -1189,44 +1198,45 @@ static int send_contact_notify(void *obj, void *arg, int flags) | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /*! \brief Create mwi subscriptions and notify */ | ||||
| static void mwi_contact_changed(const struct ast_sip_contact *contact) | ||||
| { | ||||
| 	char *id = ast_strdupa(ast_sorcery_object_get_id(contact)); | ||||
| 	char *aor = NULL; | ||||
| 	struct ast_sip_endpoint *endpoint = NULL; | ||||
|  | ||||
| 	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)) { | ||||
| 		ao2_cleanup(endpoint); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	ao2_lock(unsolicited_mwi); | ||||
| 	create_mwi_subscriptions_for_endpoint(endpoint, NULL, 0); | ||||
| 	ao2_unlock(unsolicited_mwi); | ||||
| 	ao2_cleanup(endpoint); | ||||
|  | ||||
| 	aor = strsep(&id, ";@"); | ||||
| 	ao2_callback(unsolicited_mwi, OBJ_NODATA, send_contact_notify, aor); | ||||
| } | ||||
|  | ||||
| /*! \brief Function called when a contact is updated */ | ||||
| static void mwi_contact_updated(const void *object) | ||||
| { | ||||
| 	char *id = ast_strdupa(ast_sorcery_object_get_id(object)), *aor = NULL; | ||||
|  | ||||
| 	aor = strsep(&id, ";@"); | ||||
|  | ||||
| 	ao2_callback(unsolicited_mwi, OBJ_NODATA, send_contact_notify, aor); | ||||
| 	mwi_contact_changed(object); | ||||
| } | ||||
|  | ||||
| /*! \brief Function called when a contact is added */ | ||||
| static void mwi_contact_added(const void *object) | ||||
| { | ||||
| 	const struct ast_sip_contact *contact = object; | ||||
| 	struct ao2_iterator *mwi_subs; | ||||
| 	struct mwi_subscription *mwi_sub; | ||||
| 	const char *endpoint_id = ast_sorcery_object_get_id(contact->endpoint); | ||||
|  | ||||
| 	if (ast_strlen_zero(contact->endpoint->subscription.mwi.mailboxes)) { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	ao2_lock(unsolicited_mwi); | ||||
|  | ||||
| 	mwi_subs = ao2_find(unsolicited_mwi, endpoint_id, | ||||
| 		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); | ||||
| 	} | ||||
|  | ||||
| 	create_mwi_subscriptions_for_endpoint(contact->endpoint, NULL, 0); | ||||
|  | ||||
| 	ao2_unlock(unsolicited_mwi); | ||||
|  | ||||
| 	mwi_contact_updated(object); | ||||
| 	mwi_contact_changed(object); | ||||
| } | ||||
|  | ||||
| /*! \brief Function called when a contact is deleted */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user