[svn-commits] file: branch file/stasis_peerevent r390424 - /team/file/stasis_peerevent/res/...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Jun 4 12:18:50 CDT 2013


Author: file
Date: Tue Jun  4 12:18:49 2013
New Revision: 390424

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=390424
Log:
Add progress for endpoint state. An observer now responds to contact changes and determines the new state for any endpoint impacted.

Modified:
    team/file/stasis_peerevent/res/res_sip/sip_configuration.c

Modified: team/file/stasis_peerevent/res/res_sip/sip_configuration.c
URL: http://svnview.digium.com/svn/asterisk/team/file/stasis_peerevent/res/res_sip/sip_configuration.c?view=diff&rev=390424&r1=390423&r2=390424
==============================================================================
--- team/file/stasis_peerevent/res/res_sip/sip_configuration.c (original)
+++ team/file/stasis_peerevent/res/res_sip/sip_configuration.c Tue Jun  4 12:18:49 2013
@@ -53,6 +53,42 @@
 
 	return !strcmp(ast_endpoint_get_resource(persistent1->endpoint), id) ? CMP_MATCH | CMP_STOP : 0;
 }
+
+/*! \brief Callback function for changing the state of an endpoint */
+static int persistent_endpoint_update_state(void *obj, void *arg, int flags)
+{
+	struct sip_persistent_endpoint *persistent = obj;
+	char *aor = arg;
+	RAII_VAR(struct ast_sip_contact *, contact, NULL, ao2_cleanup);
+
+	if (!ast_strlen_zero(aor) && !strstr(persistent->aors, aor)) {
+		return 0;
+	}
+
+	if ((contact = ast_sip_location_retrieve_contact_from_aor_list(persistent->aors))) {
+		ast_endpoint_set_state(persistent->endpoint, AST_ENDPOINT_ONLINE);
+	} else {
+		ast_endpoint_set_state(persistent->endpoint, AST_ENDPOINT_OFFLINE);
+	}
+
+	return 0;
+}
+
+/*! \brief Function called when stuff relating to a contact happens (created/deleted) */
+static void persistent_endpoint_contact_observer(const void *object)
+{
+	char *id = ast_strdupa(ast_sorcery_object_get_id(object)), *aor = NULL;
+
+	aor = strsep(&id, ";@");
+
+	ao2_callback(persistent_endpoints, OBJ_NODATA, persistent_endpoint_update_state, aor);
+}
+
+/*! \brief Observer for contacts so state can be updated on respective endpoints */
+static struct ast_sorcery_observer state_contact_observer = {
+	.created = persistent_endpoint_contact_observer,
+	.deleted = persistent_endpoint_contact_observer,
+};
 
 static char *handle_cli_show_endpoints(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
@@ -339,11 +375,16 @@
 			return NULL;
 		}
 
+		persistent->aors = ast_strdup(endpoint->aors);
+
+		if (ast_strlen_zero(persistent->aors)) {
+			ast_endpoint_set_state(persistent->endpoint, AST_ENDPOINT_UNKNOWN);
+		} else {
+			persistent_endpoint_update_state(persistent, NULL, 0);
+		}
+
 		ao2_link_flags(persistent_endpoints, persistent, OBJ_NOLOCK);
 	}
-
-	ast_free(persistent->aors);
-	persistent->aors = ast_strdup(endpoint->aors);
 
 	ao2_ref(persistent->endpoint, +1);
 	return persistent->endpoint;
@@ -450,6 +491,8 @@
 		return -1;
 	}
 
+	ast_sorcery_observer_add(sip_sorcery, "contact", &state_contact_observer);
+
 	if (ast_sip_initialize_sorcery_domain_alias(sip_sorcery)) {
 		ast_log(LOG_ERROR, "Failed to register SIP domain aliases support with sorcery\n");
 		ast_sorcery_unref(sip_sorcery);




More information about the svn-commits mailing list