summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Jordan <mjordan@digium.com>2015-11-04 07:44:26 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2015-11-04 07:44:26 -0600
commit0aef8e058fe7a21eb29136afab2fa600eef01bf6 (patch)
tree1e2c1f3faa4c7240a5cb148deedb15e2151c2000
parent7d1c0c61cebbdded65738f4e231b7c8066d2a77c (diff)
parentd33a1682e37a87a3940e0d96958fcc2af4d60fc7 (diff)
Merge "res_pjsip/location: Destroy contact_status objects on contact deletion"
-rw-r--r--res/res_pjsip/location.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/res/res_pjsip/location.c b/res/res_pjsip/location.c
index b6f88d20d..eef1d43d2 100644
--- a/res/res_pjsip/location.c
+++ b/res/res_pjsip/location.c
@@ -59,17 +59,20 @@ static int destroy_contact(void *obj, void *arg, int flags)
static void aor_deleted_observer(const void *object)
{
+ const struct ast_sip_aor *aor = object;
const char *aor_id = ast_sorcery_object_get_id(object);
/* Give enough space for ^ at the beginning and ;@ at the end, since that is our object naming scheme */
char regex[strlen(aor_id) + 4];
struct ao2_container *contacts;
- snprintf(regex, sizeof(regex), "^%s;@", aor_id);
+ if (aor->permanent_contacts) {
+ ao2_callback(aor->permanent_contacts, OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK, destroy_contact, NULL);
+ }
+ snprintf(regex, sizeof(regex), "^%s;@", aor_id);
if (!(contacts = ast_sorcery_retrieve_by_regex(ast_sip_get_sorcery(), "contact", regex))) {
return;
}
-
/* Destroy any contacts that may still exist that were made for this AoR */
ao2_callback(contacts, OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK, destroy_contact, NULL);
@@ -302,6 +305,14 @@ int ast_sip_location_update_contact(struct ast_sip_contact *contact)
int ast_sip_location_delete_contact(struct ast_sip_contact *contact)
{
+ void *contact_status_obj;
+
+ contact_status_obj = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), CONTACT_STATUS, ast_sorcery_object_get_id(contact));
+ if (contact_status_obj) {
+ ast_sorcery_delete(ast_sip_get_sorcery(), contact_status_obj);
+ ao2_ref(contact_status_obj, -1);
+ }
+
return ast_sorcery_delete(ast_sip_get_sorcery(), contact);
}