followme: allow disabling callee prompt
authorTzafrir Cohen <tzafrir@debian.org>
Tue, 3 May 2016 16:11:20 +0000 (19:11 +0300)
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>
Thu, 26 May 2016 05:00:09 +0000 (08:00 +0300)
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 <tzafrir.cohen@xorcom.com>

CHANGES
apps/app_followme.c
configs/samples/followme.conf.sample

diff --git a/CHANGES b/CHANGES
index 281cff3..4916c50 100644 (file)
--- 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
index 1069020..7d13bb4 100644 (file)
@@ -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));
index a233948..7e1d40f 100644 (file)
@@ -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.