[svn-commits] mmichelson: branch group/CCSS r233278 - /team/group/CCSS/channels/chan_sip.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Dec 4 15:48:59 CST 2009


Author: mmichelson
Date: Fri Dec  4 15:48:55 2009
New Revision: 233278

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=233278
Log:
Add some XML parsing code to the CC ESC initial handler.

I need to look up what the appropriate response code to
send is when the body of the PUBLISH does not have the
requisite information.


Modified:
    team/group/CCSS/channels/chan_sip.c

Modified: team/group/CCSS/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/channels/chan_sip.c?view=diff&rev=233278&r1=233277&r2=233278
==============================================================================
--- team/group/CCSS/channels/chan_sip.c (original)
+++ team/group/CCSS/channels/chan_sip.c Fri Dec  4 15:48:55 2009
@@ -23480,6 +23480,11 @@
 	struct ast_cc_agent *agent = find_sip_cc_agent_by_notify_uri(uri);
 	struct sip_cc_agent_pvt *agent_pvt;
 	struct ast_xml_doc *pidf_doc;
+	const char *basic_status;
+	struct ast_xml_node *presence_node;
+	struct ast_xml_node *tuple_node;
+	struct ast_xml_node *status_node;
+	struct ast_xml_node *basic_node;
 	
 	if (!agent) {
 		ast_log(LOG_WARNING, "Could not find agent using uri '%s'\n", uri);
@@ -23499,8 +23504,34 @@
 	 * element contained within. While not violating the PIDF spec, these are
 	 * insufficient for our needs in this situation
 	 */
-
-	agent_pvt->is_available = FALSE;
+	presence_node = ast_xml_get_root(pidf_doc);
+	tuple_node = ast_xml_find_element(presence_node, "tuple", NULL, NULL);
+
+	if (!tuple_node) {
+		/*XXX send an error response, yo! */
+	}
+
+	status_node = ast_xml_find_element(tuple_node, "status", NULL, NULL);
+	/* We already made sure that the tuple has a status node when we validated the PIDF
+	 * document earlier.
+	 */
+	basic_node = ast_xml_find_element(status_node, "basic", NULL, NULL);
+	if (!basic_node) {
+		/* XXX send an error response */
+	}
+
+	basic_status = ast_xml_get_text(basic_node);
+
+	if (!strcmp(basic_status, "open")) {
+		agent_pvt->is_available = TRUE;
+	} else if (!strcmp(basic_status, "closed")) {
+		agent_pvt->is_available = FALSE;
+	} else {
+		/* XXX send an error response */
+	}
+
+	ast_xml_free_text(basic_status);
+
 	/* It's possible to get a PUBLISH before we have sent a NOTIFY that a callee is
 	 * available. If that is the case, this call to ast_cc_agent_caller_busy will not
 	 * have any effect. We handle that case properly, though, in the SIP agent's recall




More information about the svn-commits mailing list