[svn-commits] mmichelson: branch group/CCSS r214516 - /team/group/CCSS/main/ccss.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Aug 27 16:41:48 CDT 2009


Author: mmichelson
Date: Thu Aug 27 16:41:45 2009
New Revision: 214516

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=214516
Log:
Add validation to state change function


Modified:
    team/group/CCSS/main/ccss.c

Modified: team/group/CCSS/main/ccss.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/CCSS/main/ccss.c?view=diff&rev=214516&r1=214515&r2=214516
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Thu Aug 27 16:41:45 2009
@@ -440,12 +440,16 @@
 
 struct cc_core_instance {
 	/*!
-	 * unique identifier for this instance of the CC core. There will
+	 * Unique identifier for this instance of the CC core. There will
 	 * be a corresponding core_pending_cc_offer structure with the
 	 * same core_id, up until this instance of the core creates
 	 * a monitor structure
 	 */
 	int core_id;
+	/*!
+	 * The current state for this instance of the CC core.
+	 */
+	enum ast_cc_state current_state;
 	/*!
 	 * The CC agent in use for this call
 	 */
@@ -650,7 +654,9 @@
 
 static void cc_generic_agent_ack(struct ast_cc_agent *agent)
 {
-	/* STUB */
+	/* The generic agent doesn't have to do anything special to
+	 * acknowledge a CC request. Just return.
+	 */
 	return;
 }
 
@@ -692,7 +698,6 @@
 
 static int cc_do_state_change(void *datap)
 {
-	/* STUB */
 	struct cc_state_change_args *args = datap;
 	struct cc_core_instance *core_instance;
 	struct cc_core_instance finder = { .core_id = args->core_id };
@@ -710,9 +715,14 @@
 		ast_log(LOG_WARNING, "Someone requested to change to CC_AVAILABLE? Ignoring.\n");
 		break;
 	case CC_CALLER_OFFERED:
-		/* We offered CC to the caller. This is when the agent needs
-		 * to start its offer_timer
-		 */
+		if (core_instance->state != CC_AVAILABLE) {
+			ast_log(LOG_NOTICE, "Invalid state change request. Cannot go from %d to %d\n", core_instance->state, args->state);
+			break;
+		}
+
+		if (core_instance->agent->callbacks->start_offer_timer(core_instance->agent)) {
+			ast_cc_request_state_change(CC_FAILED, core_instance->core_id, "Failed to start the offer timer\n");
+		}
 		break;
 	case CC_CALLER_REQUESTED:
 		/* Caller requested CC to the caller, so we need to initialize
@@ -725,22 +735,41 @@
 		 * 2. Caller became available, call agent's stop_monitoring callback and
 		 *    call monitor's unsuspend callback.
 		 */
+		if (core_instance->state == CC_CALLER_REQUESTED) {
+			/* Do 1 */
+		} else if (core_instance->state == CC_CALLER_BUSY) {
+			/* Do 2 */
+		} else {
+			ast_log(LOG_NOTICE, "Invalid state change request. Cannot go from %d to %d\n", core_instance->state, args->state);
+		}
 		break;
 	case CC_CALLEE_READY:
 		/* Callee has become available, call agent's status request callback
 		 */
+		if (core_instance->state != CC_ACTIVE) {
+			ast_log(LOG_NOTICE, "Invalid state change request. Cannot go from %d to %d\n", core_instance->state, args->state);
+		}
 	case CC_CALLER_BUSY:
 		/* Callee was available, but caller was busy, call agent's begin_monitoring callback
 		 * and call monitor's suspend callback.
 		 */
+		if (core_instance->state != CC_CALLEE_READY) {
+			ast_log(LOG_NOTICE, "Invalid state change request. Cannot go from %d to %d\n", core_instance->state, args->state);
+		}
 		break;
 	case CC_RECALLING:
 		/* Both caller and callee are available, call agent's recall callback
 		 */
+		if (core_instance->state != CC_CALLEE_READY) {
+			ast_log(LOG_NOTICE, "Invalid state change request. Cannot go from %d to %d\n", core_instance->state, args->state);
+		}
 		break;
 	case CC_COMPLETE:
 		/* Recall has made progress, call agent and monitor destructor functions
 		 */
+		if (core_instance->state != CC_RECALLING) {
+			ast_log(LOG_NOTICE, "Invalid state change request. Cannot go from %d to %d\n", core_instance->state, args->state);
+		}
 		break;
 	case CC_FAILED:
 		/* Something along the way failed, call agent and monitor destructor functions
@@ -752,6 +781,7 @@
 	}
 
 	ast_free(args);
+	ao2_ref(core_instance, -1); /* From ao2_find */
 	return 0;
 }
 




More information about the svn-commits mailing list