aboutsummaryrefslogtreecommitdiffstats
path: root/main/asterisk/201-incomplete.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/asterisk/201-incomplete.patch')
-rw-r--r--main/asterisk/201-incomplete.patch121
1 files changed, 0 insertions, 121 deletions
diff --git a/main/asterisk/201-incomplete.patch b/main/asterisk/201-incomplete.patch
deleted file mode 100644
index 2566134f38..0000000000
--- a/main/asterisk/201-incomplete.patch
+++ /dev/null
@@ -1,121 +0,0 @@
-Index: include/asterisk/pbx.h
-===================================================================
---- a/include/asterisk/pbx.h (revision 112598)
-+++ b/include/asterisk/pbx.h (working copy)
-@@ -42,6 +42,7 @@
-
- /*! \brief Special return values from applications to the PBX { */
- #define AST_PBX_ERROR 1 /*!< Jump to the 'e' exten */
-+#define AST_PBX_INCOMPLETE 12 /*!< Return to PBX matching, allowing more digits for the extension */
- /*! } */
-
- #define PRIORITY_HINT -1 /*!< Special Priority for a hint */
-Index: main/pbx.c
-===================================================================
---- a/main/pbx.c (revision 112598)
-+++ b/main/pbx.c (working copy)
-@@ -302,6 +302,7 @@
- static int pbx_builtin_background(struct ast_channel *, void *);
- static int pbx_builtin_wait(struct ast_channel *, void *);
- static int pbx_builtin_waitexten(struct ast_channel *, void *);
-+static int pbx_builtin_incomplete(struct ast_channel *, void *);
- static int pbx_builtin_resetcdr(struct ast_channel *, void *);
- static int pbx_builtin_setamaflags(struct ast_channel *, void *);
- static int pbx_builtin_ringing(struct ast_channel *, void *);
-@@ -579,6 +580,16 @@
- "value.\n"
- },
-
-+ { "Incomplete", pbx_builtin_incomplete,
-+ "returns AST_PBX_INCOMPLETE value",
-+ " Incomplete([n]): Signals the PBX routines that the previous matched extension\n"
-+ "is incomplete and that further input should be allowed before matching can\n"
-+ "be considered to be complete. Can be used within a pattern match when\n"
-+ "certain criteria warrants a longer match.\n"
-+ " If the 'n' option is specified, then Incomplete will not attempt to answer\n"
-+ "the channel first. Note that most channel types need to be in Answer state\n"
-+ "in order to receive DTMF.\n"
-+ },
- { "NoOp", pbx_builtin_noop,
- "Do Nothing (No Operation)",
- " NoOp(): This application does nothing. However, it is useful for debugging\n"
-@@ -3539,6 +3551,8 @@
- char dst_exten[256]; /* buffer to accumulate digits */
- int pos = 0; /* XXX should check bounds */
- int digit = 0;
-+ int invalid = 0;
-+ int timeout = 0;
-
- /* loop on priorities in this context/exten */
- while ( !(res = ast_spawn_extension(c, c->context, c->exten, c->priority, c->cid.cid_num, &found,1))) {
-@@ -3574,6 +3588,18 @@
- pos = 0;
- dst_exten[pos++] = digit = res;
- dst_exten[pos] = '\0';
-+ } else if (res == AST_PBX_INCOMPLETE) {
-+ ast_debug(1, "Spawn extension (%s,%s,%d) exited INCOMPLETE on '%s'\n", c->context, c->exten, c->priority, c->name);
-+ ast_verb(2, "Spawn extension (%s, %s, %d) exited INCOMPLETE on '%s'\n", c->context, c->exten, c->priority, c->name);
-+
-+ /* Don't cycle on incomplete - this will happen if the only extension that matches is our "incomplete" extension */
-+ if (!ast_matchmore_extension(c, c->context, c->exten, c->priority, c->cid.cid_num)) {
-+ invalid = 1;
-+ } else {
-+ ast_copy_string(dst_exten, c->exten, sizeof(dst_exten));
-+ digit = 1;
-+ pos = strlen(dst_exten);
-+ }
- } else {
- ast_debug(1, "Spawn extension (%s,%s,%d) exited non-zero on '%s'\n", c->context, c->exten, c->priority, c->name);
- ast_verb(2, "Spawn extension (%s, %s, %d) exited non-zero on '%s'\n", c->context, c->exten, c->priority, c->name);
-@@ -3610,7 +3636,7 @@
- * hangup. We have options, here. We can either catch the failure
- * and continue, or we can drop out entirely. */
-
-- if (!ast_exists_extension(c, c->context, c->exten, 1, c->cid.cid_num)) {
-+ if (invalid || !ast_exists_extension(c, c->context, c->exten, 1, c->cid.cid_num)) {
- /*!\note
- * If there is no match at priority 1, it is not a valid extension anymore.
- * Try to continue at "i" (for invalid) or "e" (for exception) or exit if
-@@ -3654,11 +3680,13 @@
-
- if (collect_digits(c, waittime, dst_exten, sizeof(dst_exten), pos))
- break;
-- if (ast_exists_extension(c, c->context, dst_exten, 1, c->cid.cid_num)) /* Prepare the next cycle */
-+ if (res == AST_PBX_INCOMPLETE && ast_strlen_zero(&dst_exten[pos]))
-+ timeout = 1;
-+ if (!timeout && ast_exists_extension(c, c->context, dst_exten, 1, c->cid.cid_num)) /* Prepare the next cycle */
- set_ext_pri(c, dst_exten, 1);
- else {
- /* No such extension */
-- if (!ast_strlen_zero(dst_exten)) {
-+ if (!timeout && !ast_strlen_zero(dst_exten)) {
- /* An invalid extension */
- if (ast_exists_extension(c, c->context, "i", 1, c->cid.cid_num)) {
- ast_verb(3, "Invalid extension '%s' in context '%s' on %s\n", dst_exten, c->context, c->name);
-@@ -7315,6 +7343,26 @@
- return AST_PBX_KEEPALIVE;
- }
-
-+static int pbx_builtin_incomplete(struct ast_channel *chan, void *data)
-+{
-+ char *options = data;
-+ int answer = 1;
-+
-+ /* Some channels can receive DTMF in unanswered state; some cannot */
-+ if (!ast_strlen_zero(options) && strchr(options, 'n')) {
-+ answer = 0;
-+ }
-+
-+ /* If the channel is hungup, stop waiting */
-+ if (ast_check_hangup(chan)) {
-+ return -1;
-+ } else if (chan->_state != AST_STATE_UP && answer) {
-+ __ast_answer(chan, 0, 1);
-+ }
-+
-+ return AST_PBX_INCOMPLETE;
-+}
-+
- AST_APP_OPTIONS(resetcdr_opts, {
- AST_APP_OPTION('w', AST_CDR_FLAG_POSTED),
- AST_APP_OPTION('a', AST_CDR_FLAG_LOCKED),