[asterisk-commits] mmichelson: branch group/CCSS r227048 - /team/group/CCSS/main/ccss.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Nov 2 16:14:50 CST 2009
Author: mmichelson
Date: Mon Nov 2 16:14:46 2009
New Revision: 227048
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=227048
Log:
Add a "done" flag to the cc_recall_ds_data struct.
Now, like the original datastore used for CC, the recall
datastore also has an indicator for when CC is valid or not
for a particular interface.
There are some compile errors that I need to fix next.
Modified:
team/group/CCSS/main/ccss.c
Modified: team/group/CCSS/main/ccss.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/main/ccss.c?view=diff&rev=227048&r1=227047&r2=227048
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Mon Nov 2 16:14:46 2009
@@ -1370,10 +1370,13 @@
};
/*!
- * \brief Routine to set the done flag on the dialed_cc_interfaces datastore
+ * \brief Routine to set the ignore flag on all CC datastores
*
* When we determine that further calls to Dial in a particular thread should
* not pay attention to any new CC offers, we set this flag as an indicator.
+ *
+ * The same also applies for recall purposes. If a call is forwarded or a second
+ * Dial is invoked, then the target cannot be a purposeful target of a CC recall.
*
* \param chan The calling channel with teh dial_cc_interfaaces datastore on it
* \return void
@@ -1381,12 +1384,19 @@
void ast_ignore_cc(struct ast_channel *chan)
{
struct ast_datastore *cc_datastore;
+ struct ast_datastore *cc_recall_datastore;
struct dialed_cc_interfaces *cc_interfaces;
+ struct cc_recall_ds_data *recall_cc_data;
ast_channel_lock(chan);
if ((cc_datastore = ast_channel_datastore_find(chan, &dialed_cc_interfaces_info, NULL))) {
cc_interfaces = cc_datastore->data;
cc_interfaces->done = 1;
+ }
+
+ if ((cc_recall_datastore = ast_channel_datastore_find(chan, &cc_recall_ds_info, NULL))) {
+ recall_cc_data = cc_recall_datastore->data;
+ recall_cc_data->done = 1;
}
ast_channel_unlock(chan);
}
@@ -2786,6 +2796,7 @@
struct cc_recall_ds_data {
int core_id;
+ char done;
struct ast_cc_interface_tree *interface_tree;
};
@@ -2869,6 +2880,16 @@
}
recall_data = recall_datastore->data;
+
+ if (recall_data->done) {
+ /* Though this is a recall, the call to this particular interface is not part of the
+ * recall either because this is a call forward or because this is not the first
+ * invocation of Dial during this call
+ */
+ ast_channel_unlock(chan);
+ return 0;
+ }
+
interface_tree = cc_ref(recall_data->interface_tree, "Bump refcount for tree while we search for specific channel");
ast_channel_get_device_name(chan, device_name, sizeof(device_name));
ast_str_set(&extencontext, 0, "%s@%s", S_OR(chan->macroexten, chan->exten), S_OR(chan->macrocontext, chan->context));
More information about the asterisk-commits
mailing list