aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-02-17 20:04:10 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-02-17 20:04:10 +0000
commit4281545da55159af56a9200a2e3e19ba2b9c750d (patch)
tree86d226b36a870beee93cc75780efc71543be8b8b
parent9b334db0b459c1bc16e658d9b18c93564dbc915d (diff)
Add atxfer fix (bug #3592)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5045 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xapp.c12
-rwxr-xr-xinclude/asterisk/app.h2
-rwxr-xr-xres/res_features.c20
3 files changed, 20 insertions, 14 deletions
diff --git a/app.c b/app.c
index c1a02914d..ebda3f765 100755
--- a/app.c
+++ b/app.c
@@ -37,11 +37,20 @@
#define MAX_OTHER_FORMATS 10
+/*
+This function presents a dialtone and reads an extension into 'collect'
+which must be a pointer to a **pre-initilized** array of char having a
+size of 'size' suitable for writing to. It will collect no more than the smaller
+of 'maxlen' or 'size' minus the original strlen() of collect digits.
+*/
int ast_app_dtget(struct ast_channel *chan, const char *context, char *collect, size_t size, int maxlen, int timeout)
{
struct tone_zone_sound *ts;
int res=0, x=0;
+ if(maxlen > size)
+ maxlen = size;
+
if(!timeout && chan->pbx)
timeout = chan->pbx->dtimeout;
else if(!timeout)
@@ -53,8 +62,7 @@ int ast_app_dtget(struct ast_channel *chan, const char *context, char *collect,
} else
ast_log(LOG_NOTICE,"Huh....? no dial for indications?\n");
- memset(collect, 0, size);
- for (x=0; strlen(collect) < size; ) {
+ for (x = strlen(collect); strlen(collect) < maxlen; ) {
res = ast_waitfordigit(chan, timeout);
if (!ast_ignore_pattern(context, collect))
ast_playtones_stop(chan);
diff --git a/include/asterisk/app.h b/include/asterisk/app.h
index f94d75348..3eb87c399 100755
--- a/include/asterisk/app.h
+++ b/include/asterisk/app.h
@@ -144,7 +144,7 @@ int ast_app_group_match_get_count(char *groupmatch, char *category);
/*! Create an argc argv type structure for app args */
int ast_separate_app_args(char *buf, char delim, char **array, int arraylen);
-/*! Present a dialtone and collect a certain length extension. Returns 1 on valid extension entered, -1 on hangup, or 0 on invalid extension. */
+/*! Present a dialtone and collect a certain length extension. Returns 1 on valid extension entered, -1 on hangup, or 0 on invalid extension. Note that if 'collect' holds digits already, new digits will be appended, so be sure it's initialized properly */
int ast_app_dtget(struct ast_channel *chan, const char *context, char *collect, size_t size, int maxlen, int timeout);
/*! Allow to record message and have a review option */
diff --git a/res/res_features.c b/res/res_features.c
index a5b8f905d..2979ba87f 100755
--- a/res/res_features.c
+++ b/res/res_features.c
@@ -458,9 +458,8 @@ static int builtin_blindtransfer(struct ast_channel *chan, struct ast_channel *p
struct ast_channel *transferer;
struct ast_channel *transferee;
char *transferer_real_context;
- char newext[256], *ptr;
+ char newext[256];
int res;
- int len;
if (sense == FEATURE_SENSE_PEER) {
transferer = peer;
@@ -484,8 +483,7 @@ static int builtin_blindtransfer(struct ast_channel *chan, struct ast_channel *p
ast_moh_start(transferee, NULL);
memset(newext, 0, sizeof(newext));
- ptr = newext;
-
+
/* Transfer */
if ((res=ast_streamfile(transferer, "pbx-transfer", transferer->language))) {
ast_moh_stop(transferee);
@@ -498,15 +496,12 @@ static int builtin_blindtransfer(struct ast_channel *chan, struct ast_channel *p
ast_autoservice_stop(transferee);
ast_indicate(transferee, AST_CONTROL_UNHOLD);
return res;
- }
- ast_stopstream(transferer);
- if (res > 0) {
+ } else if (res > 0) {
/* If they've typed a digit already, handle it */
- newext[0] = res;
- ptr++;
- len--;
+ newext[0] = (char) res;
}
+ ast_stopstream(transferer);
res = ast_app_dtget(transferer, transferer_real_context, newext, sizeof(newext), 100, transferdigittimeout);
if (res < 0) {
ast_moh_stop(transferee);
@@ -619,7 +614,7 @@ static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, st
ast_indicate(transferee, AST_CONTROL_HOLD);
ast_autoservice_start(transferee);
ast_moh_start(transferee, NULL);
-
+ memset(xferto, 0, sizeof(xferto));
/* Transfer */
if ((res=ast_streamfile(transferer, "pbx-transfer", transferer->language))) {
ast_moh_stop(transferee);
@@ -632,6 +627,9 @@ static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, st
ast_autoservice_stop(transferee);
ast_indicate(transferee, AST_CONTROL_UNHOLD);
return res;
+ } else if(res > 0) {
+ /* If they've typed a digit already, handle it */
+ xferto[0] = (char) res;
}
if ((ast_app_dtget(transferer, transferer_real_context, xferto, sizeof(xferto), 100, transferdigittimeout))) {
cid_num = transferer->cid.cid_num;