From 1d60bfcdf1ad7a265177fa35a9d2a55468bbe78f Mon Sep 17 00:00:00 2001 From: Tzafrir Cohen Date: Tue, 3 May 2016 19:11:20 +0300 Subject: followme: allow disabling callee prompt Add the option 'enable_callee_prompt' to followme.conf. Enabled by default. If disabled, a callee is not prompted to accept or reject the forwarded call. ASTERISK-26064 #close Change-Id: I0a8b19d4cf95c86a07c992813babb9e4a4acfff5 Signed-off-by: Tzafrir Cohen --- CHANGES | 5 ++ apps/app_followme.c | 90 ++++++++++++++++++++++++------------ configs/samples/followme.conf.sample | 8 ++++ 3 files changed, 73 insertions(+), 30 deletions(-) diff --git a/CHANGES b/CHANGES index 281cff393..4916c5015 100644 --- a/CHANGES +++ b/CHANGES @@ -68,6 +68,11 @@ ControlPlayback * Remote files can now be retrieved and played back. See the Playback dialplan application for more details. +FollowMe +------------------ + * It is now possible to disable the prompt from a callee by setting + 'enable_callee_prompt = no' in followme.conf. + Playback ------------------ * Remote files can now be retrieved and played back via the Playback and other diff --git a/apps/app_followme.c b/apps/app_followme.c index 106902043..7d13bb4b4 100644 --- a/apps/app_followme.c +++ b/apps/app_followme.c @@ -168,6 +168,8 @@ struct call_followme { char context[AST_MAX_CONTEXT]; /*!< Context to dial from */ unsigned int active; /*!< Profile is active (1), or disabled (0). */ int realtime; /*!< Cached from realtime */ + /*! Allow callees to accept/reject the forwarded call */ + unsigned int enable_callee_prompt:1; char takecall[MAX_YN_STRING]; /*!< Digit mapping to take a call */ char nextindp[MAX_YN_STRING]; /*!< Digit mapping to decline a call */ char callfromprompt[PATH_MAX]; /*!< Sound prompt name and path */ @@ -198,6 +200,8 @@ struct fm_args { unsigned int pending_out_connected_update:1; /*! TRUE if caller has a pending hold request for the winning call. */ unsigned int pending_hold:1; + /*! TRUE if callees will be prompted to answer */ + unsigned int enable_callee_prompt:1; /*! Music On Hold Class suggested by caller hold for winning call. */ char suggested_moh[MAX_MUSICCLASS]; char context[AST_MAX_CONTEXT]; @@ -268,6 +272,7 @@ static const char *defaultmoh = "default"; /*!< Default Music-On-Hold Class static char takecall[MAX_YN_STRING] = "1"; static char nextindp[MAX_YN_STRING] = "2"; +static int enable_callee_prompt = 1; static char callfromprompt[PATH_MAX] = "followme/call-from"; static char norecordingprompt[PATH_MAX] = "followme/no-recording"; static char optionsprompt[PATH_MAX] = "followme/options"; @@ -313,6 +318,7 @@ static struct call_followme *alloc_profile(const char *fmname) ast_copy_string(f->name, fmname, sizeof(f->name)); f->moh[0] = '\0'; f->context[0] = '\0'; + f->enable_callee_prompt = enable_callee_prompt; ast_copy_string(f->takecall, takecall, sizeof(f->takecall)); ast_copy_string(f->nextindp, nextindp, sizeof(f->nextindp)); ast_copy_string(f->callfromprompt, callfromprompt, sizeof(f->callfromprompt)); @@ -343,6 +349,8 @@ static void profile_set_param(struct call_followme *f, const char *param, const ast_copy_string(f->moh, val, sizeof(f->moh)); else if (!strcasecmp(param, "context")) ast_copy_string(f->context, val, sizeof(f->context)); + else if (!strcasecmp(param, "enable_callee_prompt")) + f->enable_callee_prompt = ast_true(val); else if (!strcasecmp(param, "takecall")) ast_copy_string(f->takecall, val, sizeof(f->takecall)); else if (!strcasecmp(param, "declinecall")) @@ -398,6 +406,7 @@ static int reload_followme(int reload) char *numberstr; int timeout; int numorder; + const char* enable_callee_prompt_str; const char *takecallstr; const char *declinecallstr; const char *tmpstr; @@ -430,6 +439,12 @@ static int reload_followme(int reload) featuredigittimeout = 5000; } + if ((enable_callee_prompt_str = ast_variable_retrieve(cfg, "general", + "enable_callee_prompt")) && + !ast_strlen_zero(enable_callee_prompt_str)) { + enable_callee_prompt = ast_true(enable_callee_prompt_str); + } + if ((takecallstr = ast_variable_retrieve(cfg, "general", "takecall")) && !ast_strlen_zero(takecallstr)) { ast_copy_string(takecall, takecallstr, sizeof(takecall)); } @@ -651,26 +666,30 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us if (tmpuser->digts && (tmpuser->digts > featuredigittimeout)) { ast_verb(3, "<%s> We've been waiting for digits longer than we should have.\n", ast_channel_name(tmpuser->ochan)); - if (!ast_strlen_zero(tpargs->namerecloc)) { - tmpuser->state = 1; - tmpuser->digts = 0; - if (!ast_streamfile(tmpuser->ochan, callfromname, ast_channel_language(tmpuser->ochan))) { - ast_sched_runq(ast_channel_sched(tmpuser->ochan)); + if (tpargs->enable_callee_prompt) { + if (!ast_strlen_zero(tpargs->namerecloc)) { + tmpuser->state = 1; + tmpuser->digts = 0; + if (!ast_streamfile(tmpuser->ochan, callfromname, ast_channel_language(tmpuser->ochan))) { + ast_sched_runq(ast_channel_sched(tmpuser->ochan)); + } else { + ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname); + clear_caller(tmpuser); + continue; + } } else { - ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname); - clear_caller(tmpuser); - continue; + tmpuser->state = 2; + tmpuser->digts = 0; + if (!ast_streamfile(tmpuser->ochan, tpargs->norecordingprompt, ast_channel_language(tmpuser->ochan))) + ast_sched_runq(ast_channel_sched(tmpuser->ochan)); + else { + ast_log(LOG_WARNING, "Unable to playback %s.\n", tpargs->norecordingprompt); + clear_caller(tmpuser); + continue; + } } } else { - tmpuser->state = 2; - tmpuser->digts = 0; - if (!ast_streamfile(tmpuser->ochan, tpargs->norecordingprompt, ast_channel_language(tmpuser->ochan))) - ast_sched_runq(ast_channel_sched(tmpuser->ochan)); - else { - ast_log(LOG_WARNING, "Unable to playback %s.\n", tpargs->norecordingprompt); - clear_caller(tmpuser); - continue; - } + tmpuser->state = 3; } } if (ast_channel_stream(tmpuser->ochan)) { @@ -787,23 +806,28 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us /* If call has been answered, then the eventual hangup is likely to be normal hangup */ ast_channel_hangupcause_set(winner, AST_CAUSE_NORMAL_CLEARING); ast_channel_hangupcause_set(caller, AST_CAUSE_NORMAL_CLEARING); - ast_verb(3, "Starting playback of %s\n", callfromname); - if (!ast_strlen_zero(tpargs->namerecloc)) { - if (!ast_streamfile(winner, callfromname, ast_channel_language(winner))) { - ast_sched_runq(ast_channel_sched(winner)); - tmpuser->state = 1; + if (tpargs->enable_callee_prompt) { + ast_verb(3, "Starting playback of %s\n", callfromname); + if (!ast_strlen_zero(tpargs->namerecloc)) { + if (!ast_streamfile(winner, callfromname, ast_channel_language(winner))) { + ast_sched_runq(ast_channel_sched(winner)); + tmpuser->state = 1; + } else { + ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname); + clear_caller(tmpuser); + } } else { - ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname); - clear_caller(tmpuser); + tmpuser->state = 2; + if (!ast_streamfile(tmpuser->ochan, tpargs->norecordingprompt, ast_channel_language(tmpuser->ochan))) + ast_sched_runq(ast_channel_sched(tmpuser->ochan)); + else { + ast_log(LOG_WARNING, "Unable to playback %s.\n", tpargs->norecordingprompt); + clear_caller(tmpuser); + } } } else { + ast_verb(3, "Skip playback of caller name / norecording\n"); tmpuser->state = 2; - if (!ast_streamfile(tmpuser->ochan, tpargs->norecordingprompt, ast_channel_language(tmpuser->ochan))) - ast_sched_runq(ast_channel_sched(tmpuser->ochan)); - else { - ast_log(LOG_WARNING, "Unable to playback %s.\n", tpargs->norecordingprompt); - clear_caller(tmpuser); - } } break; case AST_CONTROL_BUSY: @@ -927,6 +951,11 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us break; } } + if (!tpargs->enable_callee_prompt && tmpuser) { + ast_debug(1, "Taking call with no prompt\n"); + ast_frfree(f); + return tmpuser->ochan; + } if (tmpuser && tmpuser->state == 3 && f->frametype == AST_FRAME_DTMF) { int cmp_len; @@ -1365,6 +1394,7 @@ static int app_exec(struct ast_channel *chan, const char *data) /* Lock the profile lock and copy out everything we need to run with before unlocking it again */ ast_mutex_lock(&f->lock); + targs->enable_callee_prompt = f->enable_callee_prompt; targs->mohclass = ast_strdupa(f->moh); ast_copy_string(targs->context, f->context, sizeof(targs->context)); ast_copy_string(targs->takecall, f->takecall, sizeof(targs->takecall)); diff --git a/configs/samples/followme.conf.sample b/configs/samples/followme.conf.sample index a233948bf..7e1d40ff4 100644 --- a/configs/samples/followme.conf.sample +++ b/configs/samples/followme.conf.sample @@ -5,6 +5,11 @@ featuredigittimeout=>5000 ; The number of ms to wait for a digit input for the callee on whether to take the call or ; not before we consider them "done" entering digits. ; +enable_callee_prompt=>true +; Enable prompting a callee to either accept or reject the forwarded call. +; If disabled, the optional prompting for caller name (option 'a') is +; likewise disabled. Enabled by default. +; takecall=>1 ; The global default keypress for the callee to take taking the current call. This can be ; a single digit or multiple digits. Default is "1". @@ -54,6 +59,9 @@ number=>01233456,25 ; step to make a choice on whether to take the call or not. That being the case, ; you may want to make the timeout on the last step longer to give enough time to ; make the choice to accept or not. +enable_callee_prompt=>true +; Enable prompting the callee to accept the forwarded call. The default +; is the global value. takecall=>1 ; The keypress for the callee to take taking the current call. This can be ; a single digit or multiple digits. Default is the global default. -- cgit v1.2.3