diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-02-17 20:04:10 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-02-17 20:04:10 +0000 |
commit | 4281545da55159af56a9200a2e3e19ba2b9c750d (patch) | |
tree | 86d226b36a870beee93cc75780efc71543be8b8b | |
parent | 9b334db0b459c1bc16e658d9b18c93564dbc915d (diff) |
Add atxfer fix (bug #3592)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5045 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | app.c | 12 | ||||
-rwxr-xr-x | include/asterisk/app.h | 2 | ||||
-rwxr-xr-x | res/res_features.c | 20 |
3 files changed, 20 insertions, 14 deletions
@@ -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; |