/*!
* \brief Check if the contact qualify options are different than local aor qualify options
*/
-static int has_qualify_changed (struct ast_sip_contact *contact, struct sip_options_aor *aor_options)
+static int has_qualify_changed (const struct ast_sip_contact *contact, const struct sip_options_aor *aor_options)
{
if (!contact) {
return 0;
sip_options_contact_add_management_task, (void *) obj);
}
-/*!
- * \brief Task which updates a dynamic contact to an AOR
- * \note Run by aor_options->serializer
- */
-static int sip_options_contact_update_task(void *obj)
-{
- struct sip_options_contact_observer_task_data *task_data = obj;
- struct ast_sip_contact_status *contact_status;
-
- contact_status = ast_sip_get_contact_status(task_data->contact);
- if (contact_status) {
- switch (contact_status->status) {
- case CREATED:
- case UNAVAILABLE:
- case AVAILABLE:
- case UNKNOWN:
- /* Refresh the ContactStatus AMI events. */
- sip_options_contact_status_update(contact_status);
- break;
- case REMOVED:
- break;
- }
- ao2_ref(contact_status, -1);
- }
-
- ao2_ref(task_data->contact, -1);
- ao2_ref(task_data->aor_options, -1);
- ast_free(task_data);
- return 0;
-}
-
/*! \brief Observer callback invoked on contact update */
static void contact_observer_updated(const void *obj)
{
- struct sip_options_contact_observer_task_data *task_data;
-
- task_data = ast_malloc(sizeof(*task_data));
- if (!task_data) {
- return;
- }
+ const struct ast_sip_contact *contact = obj;
+ struct sip_options_aor *aor_options = ao2_find(sip_options_aors, contact->aor, OBJ_SEARCH_KEY);
- task_data->contact = (struct ast_sip_contact *) obj;
- task_data->aor_options = ao2_find(sip_options_aors, task_data->contact->aor,
- OBJ_SEARCH_KEY);
-
- if (has_qualify_changed(task_data->contact, task_data->aor_options)) {
+ if (has_qualify_changed(contact, aor_options)) {
struct ast_sip_aor *aor;
aor = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "aor",
- task_data->contact->aor);
+ contact->aor);
if (aor) {
ast_debug(3, "AOR '%s' qualify options have been modified. Synchronize an AOR local state\n",
- task_data->contact->aor);
+ contact->aor);
ast_sip_push_task_wait_serializer(management_serializer,
sip_options_aor_observer_modified_task, aor);
ao2_ref(aor, -1);
}
}
- if (!task_data->aor_options) {
- ast_free(task_data);
- return;
- }
-
- ao2_ref(task_data->contact, +1);
- if (ast_sip_push_task(task_data->aor_options->serializer,
- sip_options_contact_update_task, task_data)) {
- ao2_ref(task_data->contact, -1);
- ao2_ref(task_data->aor_options, -1);
- ast_free(task_data);
- }
+ ao2_cleanup(aor_options);
}
/*!