[asterisk-commits] mmichelson: branch group/CCSS r221758 - in /team/group/CCSS: include/asterisk...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Oct 1 16:42:25 CDT 2009


Author: mmichelson
Date: Thu Oct  1 16:42:22 2009
New Revision: 221758

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=221758
Log:
Change when core_id is allocated and write API call to retrieve it.

So, let's say that you operate a channel driver, and you decide
that you can queue an AST_CONTROL_CC frame because the outbound
channel can handle CC requests. Well, when the time comes to
start monitoring that device, all you'll be given to identify
the call is a core_id. So, now at the time that you queue
the CC frame, the channel driver may use the API call to store
the core_id which will be used when monitoring time comes.


Modified:
    team/group/CCSS/include/asterisk/ccss.h
    team/group/CCSS/main/ccss.c

Modified: team/group/CCSS/include/asterisk/ccss.h
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/include/asterisk/ccss.h?view=diff&rev=221758&r1=221757&r2=221758
==============================================================================
--- team/group/CCSS/include/asterisk/ccss.h (original)
+++ team/group/CCSS/include/asterisk/ccss.h Thu Oct  1 16:42:22 2009
@@ -982,6 +982,26 @@
 
 /*!
  * \since 1.6.4
+ * \brief Get the core id for the current call
+ *
+ * The main use of this function is for channel drivers
+ * who queue an AST_CONTROL_CC frame. A channel driver may
+ * call this function in order to get the core_id for what
+ * may become a CC request. This way, when monitor functions
+ * are called which use a core_id as a means of identification,
+ * the channel driver will have saved this information.
+ *
+ * The channel given to this function may be an inbound or outbound
+ * channel. Both will have the necessary info on it.
+ *
+ * \param chan The channel from which to get the core_id.
+ * \retval 0 Success
+ * \retval -1 Failure
+ */
+int ast_cc_get_current_core_id(struct ast_channel *chan);
+
+/*!
+ * \since 1.6.4
  * \brief Set the CC_INTERFACES channel variable for a channel
  *
  * Implementors of protocol-specific CC agents should call this function after

Modified: team/group/CCSS/main/ccss.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/main/ccss.c?view=diff&rev=221758&r1=221757&r2=221758
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Thu Oct  1 16:42:22 2009
@@ -509,6 +509,15 @@
 	 */
 	unsigned int dial_parent_id;
 	/*!
+	 * Identifier for the potential CC request that may be made
+	 * based on this call. Even though an instance of the core may
+	 * not be made (since the caller may not request CC), we allocate
+	 * a new core_id at the beginning of the call so that recipient
+	 * channel drivers can have the information handy just in case
+	 * the caller does end up requesting CC.
+	 */
+	int core_id;
+	/*!
 	 * When a new Dial application is started, and the datastore
 	 * already exists on the channel, we can determine if we
 	 * should be adding any new interface information to tree.
@@ -672,6 +681,8 @@
 	return tree_item;
 }
 
+static int core_id_counter;
+
 /*!
  * \brief allocate dialed_cc_interfaces datastore and initialize fields
  *
@@ -721,6 +732,7 @@
 	dial_cc_datastore->data = interfaces;
 	dial_cc_datastore->inheritance = DATASTORE_INHERIT_FOREVER;
 	interfaces->dial_parent_id = tree_item->id;
+	interfaces->core_id = ast_atomic_fetchadd_int(&core_id_counter, +1);
 	ast_channel_lock(chan);
 	ast_channel_datastore_add(chan, dial_cc_datastore);
 	ast_channel_unlock(chan);
@@ -959,7 +971,6 @@
 	interfaces->dial_parent_id = tree_item->id;
 	return 0;
 }
-static int core_id_counter;
 
 struct ao2_container *cc_core_instances;
 struct ao2_container *cc_monitors;
@@ -1161,6 +1172,7 @@
 	char *caller = ast_strdupa(caller_chan->name);
 	char *dash = strrchr(caller, '-');
 	struct cc_core_instance *core_instance;
+	int core_id;
 
 	if (dash) {
 		*dash = '\0';
@@ -1180,12 +1192,16 @@
 		}
 	}
 
+	if ((core_id = ast_cc_get_current_core_id(caller_chan)) == -1) {
+		return -1;
+	}
+	
 	/* Next, we need to create the core instance for this call */
 	if (!(core_instance = ao2_t_alloc(sizeof(*core_instance), cc_core_instance_destructor, "Creating core instance for CC"))) {
 		return -1;
 	}
 
-	core_instance->core_id = ast_atomic_fetchadd_int(&core_id_counter, +1);
+	core_instance->core_id = core_id;
 	if (!(core_instance->agent = cc_agent_init(caller_chan, caller, core_instance->core_id, called_tree))) {
 		cc_unref(core_instance, "Couldn't allocate agent, unref core_instance");
 		return -1;
@@ -2393,6 +2409,25 @@
 	return core_id_return;
 }
 
+int ast_cc_get_current_core_id(struct ast_channel *chan)
+{
+	struct ast_datastore *datastore;
+	struct dialed_cc_interfaces *cc_interfaces;
+	int core_id_return;
+
+	ast_channel_lock(chan);
+	if (!(datastore = ast_channel_datastore_find(chan, &dialed_cc_interfaces_info, NULL))) {
+		ast_channel_unlock(chan);
+		return -1;
+	}
+
+	cc_interfaces = datastore->data;
+	core_id_return = cc_interfaces->core_id;
+	ast_channel_unlock(chan);
+	return core_id_return;
+
+}
+
 int ast_set_cc_interfaces_chanvar(struct ast_channel *chan, const char * const extension)
 {
 	struct ast_datastore *recall_datastore;




More information about the asterisk-commits mailing list