From f7cf988a82c02d835cc4fcc7f81011319d7ef643 Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Mon, 5 Jan 2015 17:53:42 +0000 Subject: pjsip: Add 'PJSIP_AOR' and 'PJSIP_CONTACT' dialplan functions. The PJSIP_AOR dialplan function allows inspection of configured AORs including what contacts are currently bound to them. The PJSIP_CONTACT dialplan function allows inspection of contacts in existence. These can include both externally added (by way of registration) or permanent ones. ASTERISK-24341 Reported by: xrobau Review: https://reviewboard.asterisk.org/r/4308/ ........ Merged revisions 430179 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@430180 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_pjsip/location.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'res/res_pjsip/location.c') diff --git a/res/res_pjsip/location.c b/res/res_pjsip/location.c index d036ffa15..6ffb8fec3 100644 --- a/res/res_pjsip/location.c +++ b/res/res_pjsip/location.c @@ -144,30 +144,46 @@ struct ao2_container *ast_sip_location_retrieve_aor_contacts(const struct ast_si return contacts; } -struct ast_sip_contact *ast_sip_location_retrieve_contact_from_aor_list(const char *aor_list) +void ast_sip_location_retrieve_contact_and_aor_from_list(const char *aor_list, struct ast_sip_aor **aor, + struct ast_sip_contact **contact) { char *aor_name; char *rest; - struct ast_sip_contact *contact = NULL; /* If the location is still empty we have nowhere to go */ if (ast_strlen_zero(aor_list) || !(rest = ast_strdupa(aor_list))) { ast_log(LOG_WARNING, "Unable to determine contacts from empty aor list\n"); - return NULL; + return; } + *aor = NULL; + *contact = NULL; + while ((aor_name = strsep(&rest, ","))) { - RAII_VAR(struct ast_sip_aor *, aor, ast_sip_location_retrieve_aor(aor_name), ao2_cleanup); + *aor = ast_sip_location_retrieve_aor(aor_name); - if (!aor) { + if (!(*aor)) { continue; } - contact = ast_sip_location_retrieve_first_aor_contact(aor); + *contact = ast_sip_location_retrieve_first_aor_contact(*aor); /* If a valid contact is available use its URI for dialing */ - if (contact) { + if (*contact) { break; } + + ao2_ref(*aor, -1); + *aor = NULL; } +} + +struct ast_sip_contact *ast_sip_location_retrieve_contact_from_aor_list(const char *aor_list) +{ + struct ast_sip_aor *aor; + struct ast_sip_contact *contact; + + ast_sip_location_retrieve_contact_and_aor_from_list(aor_list, &aor, &contact); + + ao2_cleanup(aor); return contact; } -- cgit v1.2.3