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

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Sep 10 14:36:14 CDT 2009


Author: mmichelson
Date: Thu Sep 10 14:36:09 2009
New Revision: 217724

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=217724
Log:
Write function for creating the cc_recall datastore.

This will be used to populate the CC_INTERFACES channel
variable which will be used to determine who to call back.


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

Modified: team/group/CCSS/include/asterisk/ccss.h
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/CCSS/include/asterisk/ccss.h?view=diff&rev=217724&r1=217723&r2=217724
==============================================================================
--- team/group/CCSS/include/asterisk/ccss.h (original)
+++ team/group/CCSS/include/asterisk/ccss.h Thu Sep 10 14:36:09 2009
@@ -750,6 +750,22 @@
 
 /*!
  * \since 1.6.4
+ * \brief Set up a CC recall datastore on a channel
+ *
+ * Implementors of protocol-specific CC agents will need to call this
+ * function in order for the channel to have the necessary interfaces
+ * to recall.
+ *
+ * This function must be called by the implementor once it has been detected
+ * that an inbound call is a cc_recall. After allocating the channel, call this
+ * function, followed by ast_cc_set_cc_interfaces. While it would be nice to
+ * be able to have the core do this automatically, it just cannot be done given
+ * the current architecture.
+ */
+int ast_setup_cc_recall_datastore(struct ast_channel *chan, struct ast_cc_agent *agent);
+
+/*!
+ * \since 1.6.4
  * \brief Initialize CCSS
  *
  * XXX This needs to be updated as more functionality is added.

Modified: team/group/CCSS/main/ccss.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/CCSS/main/ccss.c?view=diff&rev=217724&r1=217723&r2=217724
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Thu Sep 10 14:36:09 2009
@@ -771,8 +771,8 @@
 	char *target;
 	int reason;
 	struct ast_channel *chan;
-	struct ast_cc_interface *cc_interface;
-	char *full_extension;
+	struct ast_cc_interface *cc_interface = AST_LIST_FIRST(agent->interface_tree);
+	char *full_extension = ast_strdupa(cc_interface->name);
 	char *context;
 	char *exten;
 	ast_log(LOG_NOTICE, "Now we should callback %s\n", agent->interface);
@@ -781,9 +781,13 @@
 		*target++ = '\0';
 	}
 	chan = ast_request_and_dial(tech, AST_FORMAT_SLINEAR, NULL, target, 20000, &reason, NULL, NULL);
+	/* We have a channel. It's time now to set up the datastore of recalled CC interfaces.
+	 * This will be a common task for all recall functions. If it were possible, I'd have
+	 * the core do it automatically, but alas I cannot. Instead, I will provide a public
+	 * function to do so.
+	 */
+	ast_setup_cc_recall_datastore(chan, agent);
 	/* Now we can bust apart the outbound name so that the PBX will run. */
-	cc_interface = AST_LIST_FIRST(agent->interface_tree);
-	full_extension = ast_strdupa(cc_interface->name);
 	exten = full_extension;
 	if ((context = strchr(full_extension, '@'))) {
 		*context++ = '\0';
@@ -1558,6 +1562,42 @@
 	return ast_taskprocessor_push(cc_core_taskprocessor, cc_devstate_change, monitor);
 }
 
+static void *cc_recall_ds_duplicate(void *data)
+{
+	struct ast_cc_interface_tree *interface_tree = data;
+	struct ast_cc_interface_tree *output = interface_tree;
+	ao2_ref(output, +1);
+	return NULL;
+}
+
+static void cc_recall_ds_destroy(void *data)
+{
+	struct ast_cc_interface_tree *interface_tree = data;
+	ao2_ref(interface_tree, -1);
+}
+
+static struct ast_datastore_info recall_ds_info = {
+	.type = "cc_recall",
+	.duplicate = cc_recall_ds_duplicate,
+	.destroy = cc_recall_ds_destroy,
+};
+
+int ast_setup_cc_recall_datastore(struct ast_channel *chan, struct ast_cc_agent *agent)
+{
+	struct ast_datastore *recall_datastore = ast_datastore_alloc(&recall_ds_info, NULL);
+
+	if (!recall_datastore) {
+		return -1;
+	}
+	ao2_ref(agent->interface_tree, +1);
+	recall_datastore->data = agent->interface_tree;
+	recall_datastore->inheritance = DATASTORE_INHERIT_FOREVER;
+	ast_channel_lock(chan);
+	ast_channel_datastore_add(chan, recall_datastore);
+	ast_channel_unlock(chan);
+	return 0;
+}
+
 int ast_cc_init(void)
 {
 	int res;




More information about the asterisk-commits mailing list