summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2015-11-02 16:02:18 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2015-11-02 16:02:18 -0600
commit0071a993f0561664d074d461759fc3259bd9c926 (patch)
tree8a88795b43758b4a89588023035f31c6c78e486a
parent118d628e084311af0096178b096e3959ac603edd (diff)
parent11e54b1932b62a084722cb547a51a5fc2ca4d423 (diff)
Merge "pjsip_options: Schedule/unschedule qualifies on AoR creation/destruction" into 13
-rw-r--r--res/res_pjsip/pjsip_options.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c
index f888cc451..32ee401ea 100644
--- a/res/res_pjsip/pjsip_options.c
+++ b/res/res_pjsip/pjsip_options.c
@@ -1026,6 +1026,7 @@ static int qualify_and_schedule_cb(void *obj, void *arg, int flags)
initial_interval = (int)((initial_interval * 1000) * ast_random_double());
+ unschedule_qualify(contact);
if (contact->qualify_frequency) {
schedule_qualify(contact, initial_interval);
} else {
@@ -1155,6 +1156,43 @@ static struct ast_sip_endpoint_formatter contact_status_formatter = {
.format_ami = format_ami_contact_status
};
+static void aor_observer_modified(const void *obj)
+{
+ struct ast_sip_aor *aor = (void *)obj;
+ struct ao2_container *contacts;
+
+ contacts = ast_sip_location_retrieve_aor_contacts(aor);
+ if (contacts) {
+ ao2_callback(contacts, OBJ_NODATA, qualify_and_schedule_cb, aor);
+ ao2_ref(contacts, -1);
+ }
+}
+
+static int unschedule_contact_cb(void *obj, void *arg, int flags)
+{
+ unschedule_qualify(obj);
+
+ return CMP_MATCH;
+}
+
+static void aor_observer_deleted(const void *obj)
+{
+ const 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, unschedule_contact_cb, NULL);
+ ao2_ref(contacts, -1);
+ }
+}
+
+static const struct ast_sorcery_observer observer_callbacks_options = {
+ .created = aor_observer_modified,
+ .updated = aor_observer_modified,
+ .deleted = aor_observer_deleted
+};
+
int ast_res_pjsip_init_options_handling(int reload)
{
static const pj_str_t STR_OPTIONS = { "OPTIONS", 7 };
@@ -1185,6 +1223,13 @@ int ast_res_pjsip_init_options_handling(int reload)
return -1;
}
+ if (ast_sorcery_observer_add(ast_sip_get_sorcery(), "aor", &observer_callbacks_options)) {
+ pjsip_endpt_unregister_module(ast_sip_get_pjsip_endpoint(), &options_module);
+ ao2_cleanup(sched_qualifies);
+ sched_qualifies = NULL;
+ return -1;
+ }
+
internal_sip_register_endpoint_formatter(&contact_status_formatter);
ast_manager_register2("PJSIPQualify", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, ami_sip_qualify, NULL, NULL, NULL);
ast_cli_register_multiple(cli_options, ARRAY_LEN(cli_options));
@@ -1200,6 +1245,7 @@ void ast_res_pjsip_cleanup_options_handling(void)
ast_manager_unregister("PJSIPQualify");
internal_sip_unregister_endpoint_formatter(&contact_status_formatter);
+ ast_sorcery_observer_remove(ast_sip_get_sorcery(), "aor", &observer_callbacks_options);
pjsip_endpt_unregister_module(ast_sip_get_pjsip_endpoint(), &options_module);
ao2_cleanup(sched_qualifies);
sched_qualifies = NULL;