From: <abe...@us...> - 2017-03-31 16:30:33
|
Revision: 8252 http://sourceforge.net/p/astlinux/code/8252 Author: abelbeck Date: 2017-03-31 16:30:31 +0000 (Fri, 31 Mar 2017) Log Message: ----------- asterisk, backport Asterisk 14 'followme: allow disabling callee prompt' feature. Requested by Michael Keuter. Ref: http://git.asterisk.org/gitweb/?p=asterisk/asterisk.git;a=commit;h=1d60bfcdf1ad7a265177fa35a9d2a55468bbe78f Added Paths: ----------- branches/1.0/package/asterisk/asterisk-11-followme-callee-prompt-control.patch branches/1.0/package/asterisk/asterisk-13-followme-callee-prompt-control.patch Added: branches/1.0/package/asterisk/asterisk-11-followme-callee-prompt-control.patch =================================================================== --- branches/1.0/package/asterisk/asterisk-11-followme-callee-prompt-control.patch (rev 0) +++ branches/1.0/package/asterisk/asterisk-11-followme-callee-prompt-control.patch 2017-03-31 16:30:31 UTC (rev 8252) @@ -0,0 +1,205 @@ +diff --git a/apps/app_followme.c b/apps/app_followme.c +index 1069020..7d13bb4 100644 +--- a/apps/app_followme.c ++++ b/apps/app_followme.c +@@ -160,6 +160,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 */ +@@ -190,6 +192,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]; +@@ -260,6 +264,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"; +@@ -312,6 +317,7 @@ + static void init_profile(struct call_followme *f, int activate) + { + f->context[0] = '\0'; ++ f->enable_callee_prompt = enable_callee_prompt; + ast_copy_string(f->moh, defaultmoh, sizeof(f->moh)); + ast_copy_string(f->takecall, takecall, sizeof(f->takecall)); + ast_copy_string(f->nextindp, nextindp, sizeof(f->nextindp)); +@@ -336,6 +342,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")) +@@ -391,6 +399,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; +@@ -423,6 +432,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)); + } +@@ -656,26 +671,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)) { +@@ -789,23 +808,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 a233948..7e1d40f 100644 +--- a/configs/followme.conf.sample ++++ b/configs/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. Added: branches/1.0/package/asterisk/asterisk-13-followme-callee-prompt-control.patch =================================================================== --- branches/1.0/package/asterisk/asterisk-13-followme-callee-prompt-control.patch (rev 0) +++ branches/1.0/package/asterisk/asterisk-13-followme-callee-prompt-control.patch 2017-03-31 16:30:31 UTC (rev 8252) @@ -0,0 +1,205 @@ +diff --git a/apps/app_followme.c b/apps/app_followme.c +index 1069020..7d13bb4 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"; +@@ -320,6 +325,7 @@ + static void init_profile(struct call_followme *f, int activate) + { + f->context[0] = '\0'; ++ f->enable_callee_prompt = enable_callee_prompt; + ast_copy_string(f->moh, defaultmoh, sizeof(f->moh)); + ast_copy_string(f->takecall, takecall, sizeof(f->takecall)); + ast_copy_string(f->nextindp, nextindp, sizeof(f->nextindp)); +@@ -344,6 +350,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")) +@@ -399,6 +407,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; +@@ -431,6 +440,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)); + } +@@ -652,26 +667,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)) { +@@ -788,23 +807,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: +@@ -928,6 +952,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; + +@@ -1367,6 +1396,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 a233948..7e1d40f 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. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |