*/
int ast_res_pjsip_init_options_handling(int reload);
-/*!
- * \internal
- * \brief Indicate OPTIONS handling for this AOR needs updating.
- *
- * When AOR configuration is retrieved, it is possible that the
- * qualify frequency has changed. The OPTIONs code needs to update
- * its qualifies to reflect these changes.
- *
- * \param aor The AOR that has been retrieved
- */
-void ast_res_pjsip_update_options(struct ast_sip_aor *aor);
-
/*!
* \internal Initialize message IP updating handling.
*
return status ? 0 : -1;
}
-static int aor_apply_handler(const struct ast_sorcery *sorcery, void *object)
-{
- ast_res_pjsip_update_options(object);
- return 0;
-}
-
/*! \brief Initialize sorcery with location support */
int ast_sip_initialize_sorcery_location(void)
{
ast_sorcery_apply_default(sorcery, "aor", "config", "pjsip.conf,criteria=type=aor");
if (ast_sorcery_object_register(sorcery, "contact", contact_alloc, NULL, contact_apply_handler) ||
- ast_sorcery_object_register(sorcery, "aor", aor_alloc, NULL, aor_apply_handler)) {
+ ast_sorcery_object_register(sorcery, "aor", aor_alloc, NULL, NULL)) {
return -1;
}
static int qualify_contact_sched(const void *obj)
{
struct sched_data *data = (struct sched_data *) obj;
- struct ast_sip_aor *aor;
-
- /* This helps us to determine if an AOR has been removed
- * from configuration, and if so, stop qualifying the
- * contact
- */
- aor = ast_sip_location_retrieve_aor(data->contact->aor);
- if (!aor) {
- ao2_ref(data, -1);
- return 0;
- }
- ao2_ref(aor, -1);
ao2_ref(data->contact, +1);
if (ast_sip_push_task(NULL, qualify_contact_task, data->contact)) {
struct ast_sip_aor *aor = obj;
struct ao2_container *contacts;
- contacts = ast_sip_location_retrieve_aor_contacts(aor);
- if (contacts) {
- ao2_callback(contacts, OBJ_NODATA, qualify_and_schedule_cb_with_aor, aor);
- ao2_ref(contacts, -1);
+ if (aor->permanent_contacts) {
+ contacts = ast_sip_location_retrieve_aor_contacts(aor);
+ if (contacts) {
+ ao2_callback(contacts, OBJ_NODATA, qualify_and_schedule_cb_with_aor, aor);
+ ao2_ref(contacts, -1);
+ }
}
return 0;
return 0;
}
-static int unschedule_for_aor_cb(void *obj, void *arg, int flags)
-{
- struct sched_data *data = obj;
- struct ast_sip_aor *aor = arg;
-
- if (!strcmp(ast_sorcery_object_get_id(aor), data->contact->aor)) {
- AST_SCHED_DEL_UNREF(sched, data->id, ao2_ref(data, -1));
- }
-
- return 0;
-}
-
-void ast_res_pjsip_update_options(struct ast_sip_aor *aor)
-{
- /* This can happen if an AOR is created and applied before OPTIONs code has been initialized */
- if (!sched_qualifies) {
- return;
- }
-
- ao2_callback(sched_qualifies, OBJ_NODATA | OBJ_UNLINK, unschedule_for_aor_cb, aor);
- qualify_and_schedule_all_cb(aor, NULL, 0);
-}
-
void ast_res_pjsip_cleanup_options_handling(void)
{
ast_cli_unregister_multiple(cli_options, ARRAY_LEN(cli_options));