aboutsummaryrefslogtreecommitdiffstats
path: root/funcs/func_callcompletion.c
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-04-09 15:31:32 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-04-09 15:31:32 +0000
commit0eb1e5407a6eacd46d98e134dc81e8b857c103b7 (patch)
tree0b1d16ff83df2f35441f03a082b848262b8a2557 /funcs/func_callcompletion.c
parent6c57cdc6ac82a6a6700ebdb788d690471d8fc49d (diff)
Merge Call completion support into trunk.
From Reviewboard: CCSS stands for Call Completion Supplementary Services. An admittedly out-of-date overview of the architecture can be found in the file doc/CCSS_architecture.pdf in the CCSS branch. Off the top of my head, the big differences between what is implemented and what is in the document are as follows: 1. We did not end up modifying the Hangup application at all. 2. The document states that a single call completion monitor may be used across multiple calls to the same device. This proved to not be such a good idea when implementing protocol-specific monitors, and so we ended up using one monitor per-device per-call. 3. There are some configuration options which were conceived after the document was written. These are documented in the ccss.conf.sample that is on this review request. For some basic understanding of terminology used throughout this code, see the ccss.tex document that is on this review. This implements CCBS and CCNR in several flavors. First up is a "generic" implementation, which can work over any channel technology provided that the channel technology can accurately report device state. Call completion is requested using the dialplan application CallCompletionRequest and can be canceled using CallCompletionCancel. Device state subscriptions are used in order to monitor the state of called parties. Next, there is a SIP-specific implementation of call completion. This method uses the methods outlined in draft-ietf-bliss-call-completion-06 to implement call completion using SIP signaling. There are a few things to note here: * The agent/monitor terminology used throughout Asterisk sometimes is the reverse of what is defined in the referenced draft. * Implementation of the draft required support for SIP PUBLISH. I attempted to write this in a generic-enough fashion such that if someone were to want to write PUBLISH support for other event packages, such as dialog-state or presence, most of the effort would be in writing callbacks specific to the event package. * A subportion of supporting PUBLISH reception was that we had to implement a PIDF parser. The PIDF support added is a bit minimal. I first wrote a validation routine to ensure that the PIDF document is formatted properly. The rest of the PIDF reading is done in-line in the call-completion-specific PUBLISH-handling code. In other words, while there is PIDF support here, it is not in any state where it could easily be applied to other event packages as is. Finally, there are a variety of ISDN-related call completion protocols supported. These were written by Richard Mudgett, and as such I can't really say much about their implementation. There are notes in the CHANGES file that indicate the ISDN protocols over which call completion is supported. Review: https://reviewboard.asterisk.org/r/523 git-svn-id: http://svn.digium.com/svn/asterisk/trunk@256528 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'funcs/func_callcompletion.c')
-rw-r--r--funcs/func_callcompletion.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/funcs/func_callcompletion.c b/funcs/func_callcompletion.c
new file mode 100644
index 000000000..191667bb0
--- /dev/null
+++ b/funcs/func_callcompletion.c
@@ -0,0 +1,114 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 1999 - 2010, Digium, Inc.
+ *
+ * Mark Michelson <mmichelson@digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ * \brief Call Completion Supplementary Services implementation
+ * \author Mark Michelson <mmichelson@digium.com>
+ */
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/module.h"
+#include "asterisk/channel.h"
+#include "asterisk/ccss.h"
+#include "asterisk/pbx.h"
+
+/*** DOCUMENTATION
+ <function name="CALLCOMPLETION" language="en_US">
+ <synopsis>
+ Get or set a call completion configuration parameter for a channel.
+ </synopsis>
+ <syntax>
+ <parameter name="option" required="true">
+ <para>The allowable options are:</para>
+ <enumlist>
+ <enum name="cc_agent_policy" />
+ <enum name="cc_monitor_policy" />
+ <enum name="cc_offer_timer" />
+ <enum name="ccnr_available_timer" />
+ <enum name="ccbs_available_timer" />
+ <enum name="cc_recall_timer" />
+ <enum name="cc_max_agents" />
+ <enum name="cc_max_monitors" />
+ <enum name="cc_callback_macro" />
+ <enum name="cc_agent_dialstring" />
+ </enumlist>
+ </parameter>
+ </syntax>
+ <description>
+ <para>The CALLCOMPLETION function can be used to get or set a call
+ completion configuration parameter for a channel. Note that setting
+ a configuration parameter will only change the parameter for the
+ duration of the call.</para>
+ </description>
+ </function>
+ ***/
+
+static int acf_cc_read(struct ast_channel *chan, const char *name, char *data,
+ char *buf, size_t buf_len)
+{
+ struct ast_cc_config_params *cc_params;
+ int res;
+
+ ast_channel_lock(chan);
+ if (!(cc_params = ast_channel_get_cc_config_params(chan))) {
+ ast_channel_unlock(chan);
+ return -1;
+ }
+
+ res = ast_cc_get_param(cc_params, data, buf, buf_len);
+ ast_channel_unlock(chan);
+ return res;
+}
+
+static int acf_cc_write(struct ast_channel *chan, const char *cmd, char *data,
+ const char *value)
+{
+ struct ast_cc_config_params *cc_params;
+ int res;
+
+ ast_channel_lock(chan);
+ if (!(cc_params = ast_channel_get_cc_config_params(chan))) {
+ ast_channel_unlock(chan);
+ return -1;
+ }
+
+ res = ast_cc_set_param(cc_params, data, value);
+ ast_channel_unlock(chan);
+ return res;
+}
+
+static struct ast_custom_function cc_function = {
+ .name = "CALLCOMPLETION",
+ .read = acf_cc_read,
+ .write = acf_cc_write,
+};
+
+static int unload_module(void)
+{
+ return ast_custom_function_unregister(&cc_function);
+}
+
+static int load_module(void)
+{
+ return ast_custom_function_register(&cc_function) == 0 ? AST_MODULE_LOAD_SUCCESS : AST_MODULE_LOAD_DECLINE;
+}
+
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Call Control Configuration Function");