[svn-commits] file: branch file/pimp_sip_location r381520 - in /team/file/pimp_sip_location...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Feb 14 18:02:20 CST 2013


Author: file
Date: Thu Feb 14 18:02:16 2013
New Revision: 381520

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=381520
Log:
Dial all provided AORs with contacts, and also all provided explicit SIP URIs when creating an outgoing session.

Modified:
    team/file/pimp_sip_location/include/asterisk/res_sip.h
    team/file/pimp_sip_location/res/res_sip.exports.in
    team/file/pimp_sip_location/res/res_sip/sip_configuration.c
    team/file/pimp_sip_location/res/res_sip_session.c

Modified: team/file/pimp_sip_location/include/asterisk/res_sip.h
URL: http://svnview.digium.com/svn/asterisk/team/file/pimp_sip_location/include/asterisk/res_sip.h?view=diff&rev=381520&r1=381519&r2=381520
==============================================================================
--- team/file/pimp_sip_location/include/asterisk/res_sip.h (original)
+++ team/file/pimp_sip_location/include/asterisk/res_sip.h Thu Feb 14 18:02:16 2013
@@ -183,6 +183,8 @@
         AST_STRING_FIELD(transport);
         /*! Outbound proxy to use */
         AST_STRING_FIELD(outbound_proxy);
+        /*! Explicit AORs to dial if none are specified */
+        AST_STRING_FIELD(aors);
 	);
 	/*! Identification information for this endpoint */
 	struct ast_party_id id;

Modified: team/file/pimp_sip_location/res/res_sip.exports.in
URL: http://svnview.digium.com/svn/asterisk/team/file/pimp_sip_location/res/res_sip.exports.in?view=diff&rev=381520&r1=381519&r2=381520
==============================================================================
--- team/file/pimp_sip_location/res/res_sip.exports.in (original)
+++ team/file/pimp_sip_location/res/res_sip.exports.in Thu Feb 14 18:02:16 2013
@@ -25,6 +25,12 @@
 		LINKER_SYMBOL_PREFIXast_copy_pj_str;
 		LINKER_SYMBOL_PREFIXast_sip_get_sorcery;
 		LINKER_SYMBOL_PREFIXast_sip_create_dialog;
+		LINKER_SYMBOL_PREFIXast_sip_location_retrieve_aor;
+		LINKER_SYMBOL_PREFIXast_sip_location_retrieve_aor_contacts;
+		LINKER_SYMBOL_PREFIXast_sip_location_retrieve_contact;
+		LINKER_SYMBOL_PREFIXast_sip_location_add_contact;
+		LINKER_SYMBOL_PREFIXast_sip_location_update_contact;
+		LINKER_SYMBOL_PREFIXast_sip_location_delete_contact;
 		LINKER_SYMBOL_PREFIXpj_*;
 		LINKER_SYMBOL_PREFIXpjsip_*;
 		LINKER_SYMBOL_PREFIXpjmedia_*;

Modified: team/file/pimp_sip_location/res/res_sip/sip_configuration.c
URL: http://svnview.digium.com/svn/asterisk/team/file/pimp_sip_location/res/res_sip/sip_configuration.c?view=diff&rev=381520&r1=381519&r2=381520
==============================================================================
--- team/file/pimp_sip_location/res/res_sip/sip_configuration.c (original)
+++ team/file/pimp_sip_location/res/res_sip/sip_configuration.c Thu Feb 14 18:02:16 2013
@@ -150,6 +150,7 @@
 	ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "timers", "yes", timers_handler, NULL, 0, 0);
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "timers_min_se", "90", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, min_se));
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "timers_sess_expires", "1800", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, sess_expires));
+	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "aors", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, aors));
 
 	if (ast_sip_initialize_sorcery_transport(sip_sorcery)) {
 		ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");

Modified: team/file/pimp_sip_location/res/res_sip_session.c
URL: http://svnview.digium.com/svn/asterisk/team/file/pimp_sip_location/res/res_sip_session.c?view=diff&rev=381520&r1=381519&r2=381520
==============================================================================
--- team/file/pimp_sip_location/res/res_sip_session.c (original)
+++ team/file/pimp_sip_location/res/res_sip_session.c Thu Feb 14 18:02:16 2013
@@ -556,11 +556,35 @@
 	return 0;
 }
 
+/*! \brief Internal function which adds an AOR with container of contacts as outgoing legs on a session */
+static int sip_session_leg_add_aor(struct ast_sip_endpoint *endpoint, struct ast_sip_session *session, pjsip_timer_setting *timer, const char *aor_name)
+{
+	RAII_VAR(struct ast_sip_aor *, aor, ast_sip_location_retrieve_aor(aor_name), ao2_cleanup);
+	RAII_VAR(struct ao2_container *, contacts, NULL, ao2_cleanup);
+	struct ao2_iterator it_contacts;
+	struct ast_sip_contact *contact;
+
+	if (!aor) {
+		return -1;
+	} else if (!(contacts = ast_sip_location_retrieve_aor_contacts(aor))) {
+		/* The AOR is valid so we don't want to try this as a straight up URI */
+		return 0;
+	}
+
+	it_contacts = ao2_iterator_init(contacts, 0);
+	for (; (contact = ao2_iterator_next(&it_contacts)); ao2_ref(contact, -1)) {
+		sip_session_create_leg(endpoint, session, contact->uri, timer);
+	}
+	ao2_iterator_destroy(&it_contacts);
+
+	return 0;
+}
+
 struct ast_sip_session *ast_sip_session_create_outgoing(struct ast_sip_endpoint *endpoint, const char *location, const char *request_user)
 {
 	struct ast_sip_session *session;
 	pjsip_timer_setting timer;
-	RAII_VAR(struct ast_sip_aor *, aor, NULL, ao2_cleanup);
+	char *aor_name, *rest;
 
 	/* Create an outgoing session with no default inv_session, multiple may get added later */
 	if (!(session = ast_sip_session_alloc(endpoint, NULL))) {
@@ -571,9 +595,23 @@
 	timer.min_se = endpoint->min_se;
 	timer.sess_expires = endpoint->sess_expires;
 
-	sip_session_create_leg(endpoint, session, location, &timer);
-	sip_session_create_leg(endpoint, session, "sip:meh at 172.16.1.13", &timer);
-	sip_session_create_leg(endpoint, session, "sip:2000 at labs.asterisk.org", &timer);
+	/* If no location has been provided use the AOR list from the endpoint itself */
+	if (ast_strlen_zero(location)) {
+		location = endpoint->aors;
+	}
+
+	/* If the location is still empty we have nowhere to go */
+	if (ast_strlen_zero(location) || !(rest = ast_strdupa(location))) {
+		ao2_ref(session, -1);
+		return NULL;
+	}
+
+	while ((aor_name = strsep(&rest, ","))) {
+		/* If adding based on AOR fails try adding it straight up as a URI */
+		if (sip_session_leg_add_aor(endpoint, session, &timer, aor_name)) {
+			sip_session_create_leg(endpoint, session, aor_name, &timer);
+		}
+	}
 
 	/* If the end result of this attempt is no outgoing legs then kill the session */
 	if (!ao2_container_count(session->legs)) {




More information about the svn-commits mailing list