[asterisk-commits] mmichelson: branch group/CCSS r236754 - /team/group/CCSS/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Dec 28 16:47:16 CST 2009


Author: mmichelson
Date: Mon Dec 28 16:47:14 2009
New Revision: 236754

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=236754
Log:
Finish the handle_cc_notify function.


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=236754&r1=236753&r2=236754
==============================================================================
--- team/group/CCSS/channels/chan_sip.c (original)
+++ team/group/CCSS/channels/chan_sip.c Mon Dec 28 16:47:14 2009
@@ -21283,23 +21283,44 @@
 
 static int handle_cc_notify(struct sip_pvt *pvt, struct sip_request *req)
 {
-	/* Let's map this out
-	 *
-	 * We need to find the appropriate sip_monitor_instance. Unfortunately, we don't have
-	 * a core_id. We'll have to do a bit of an ao2_callback using the sip_pvt in order
-	 * to do this correctly.
-	 *
-	 * After finding the sip_monitor_instance, we can then check the body to find whether
-	 * the status is "queued" or "ready" and act accordingly
-	 */
 	struct sip_monitor_instance *monitor_instance = ao2_callback(sip_monitor_instances, 0,
 			find_sip_monitor_instance_by_subscription_pvt, pvt);
+	const char *status = get_body(req, "status", ':');
+	char *uri;
 
 	if (!monitor_instance) {
+		transmit_response(pvt, "400 Bad Request", req);
 		return -1;
 	}
-	
-	/* XXX STUB */
+
+	if (ast_strlen_zero(status)) {
+		ao2_ref(monitor_instance, -1);
+		transmit_response(pvt, "400 Bad Request", req);
+		return -1;
+	}
+
+	if (!strcmp(status, "queued")) {
+		/* We've been told that we're queued. This is the endpoint's way of telling
+		 * us that it has accepted our CC request. We need to alert the core of this
+		 * development
+		 */
+		ast_cc_monitor_request_acked(monitor_instance->core_id, "SIP endpoint accepted request");
+		transmit_response(pvt, "200 OK", req);
+		ao2_ref(monitor_instance, -1);
+		return 0;
+	}
+
+	/* It's open! Yay! */
+	uri = get_body(req, "URI", ':');
+	if (ast_strlen_zero(uri)) {
+		uri = get_in_brackets((char *)get_header(req, "From"));
+	}
+
+	ast_copy_string(monitor_instance->notify_uri, uri, sizeof(monitor_instance->notify_uri));
+	ast_cc_monitor_callee_available(monitor_instance->monitor);
+	ao2_ref(monitor_instance, -1);
+	transmit_response(pvt, "200 OK", req);
+
 	return 0;
 }
 




More information about the asterisk-commits mailing list