<p>Dennis has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/14696">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">app_followme: Allow disabling FollowMe prompt<br><br>Add the option 'enable_callee_prompt to followme.conf. Enabled by<br>default. If disabled, the callee is not prompted to accept or reject<br>the call.<br><br>ASTERISK-29010 #close<br><br>Change-Id: Ic15a2bac4f16d0fce7a1b5e7b375f9bafee37aa4<br>---<br>M apps/app_followme.c<br>M configs/samples/followme.conf.sample<br>2 files changed, 72 insertions(+), 30 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/96/14696/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/app_followme.c b/apps/app_followme.c</span><br><span>index 21b9a19..5210721 100644</span><br><span>--- a/apps/app_followme.c</span><br><span>+++ b/apps/app_followme.c</span><br><span>@@ -168,6 +168,7 @@</span><br><span>  char context[AST_MAX_CONTEXT];  /*!< Context to dial from */</span><br><span>      unsigned int active;            /*!< Profile is active (1), or disabled (0). */</span><br><span>   int realtime;           /*!< Cached from realtime */</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int enable_callee_prompt:1;</span><br><span>         char takecall[MAX_YN_STRING];   /*!< Digit mapping to take a call */</span><br><span>      char nextindp[MAX_YN_STRING];   /*!< Digit mapping to decline a call */</span><br><span>   char callfromprompt[PATH_MAX];  /*!< Sound prompt name and path */</span><br><span>@@ -199,6 +200,8 @@</span><br><span>  unsigned int pending_out_connected_update:1;</span><br><span>         /*! TRUE if caller has a pending hold request for the winning call. */</span><br><span>       unsigned int pending_hold:1;</span><br><span style="color: hsl(120, 100%, 40%);">+  /*! TRUE if callees will be prompted to answer */</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int enable_callee_prompt:1;</span><br><span>         /*! Music On Hold Class suggested by caller hold for winning call. */</span><br><span>        char suggested_moh[MAX_MUSICCLASS];</span><br><span>  char context[AST_MAX_CONTEXT];</span><br><span>@@ -270,6 +273,7 @@</span><br><span> </span><br><span> static char takecall[MAX_YN_STRING] = "1";</span><br><span> static char nextindp[MAX_YN_STRING] = "2";</span><br><span style="color: hsl(120, 100%, 40%);">+static int enable_callee_prompt = 1;</span><br><span> static char callfromprompt[PATH_MAX] = "followme/call-from";</span><br><span> static char norecordingprompt[PATH_MAX] = "followme/no-recording";</span><br><span> static char optionsprompt[PATH_MAX] = "followme/options";</span><br><span>@@ -324,6 +328,7 @@</span><br><span> {</span><br><span>   f->context[0] = '\0';</span><br><span>     ast_copy_string(f->moh, defaultmoh, sizeof(f->moh));</span><br><span style="color: hsl(120, 100%, 40%);">+    f->enable_callee_prompt = enable_callee_prompt;</span><br><span>   ast_copy_string(f->takecall, takecall, sizeof(f->takecall));</span><br><span>   ast_copy_string(f->nextindp, nextindp, sizeof(f->nextindp));</span><br><span>   ast_copy_string(f->callfromprompt, callfromprompt, sizeof(f->callfromprompt));</span><br><span>@@ -348,6 +353,8 @@</span><br><span>           ast_copy_string(f->moh, val, sizeof(f->moh));</span><br><span>  else if (!strcasecmp(param, "context"))</span><br><span>            ast_copy_string(f->context, val, sizeof(f->context));</span><br><span style="color: hsl(120, 100%, 40%);">+   else if (!strcasecmp(param, "enable_callee_prompt"))</span><br><span style="color: hsl(120, 100%, 40%);">+                f->enable_callee_prompt = ast_true(val);</span><br><span>  else if (!strcasecmp(param, "takecall"))</span><br><span>           ast_copy_string(f->takecall, val, sizeof(f->takecall));</span><br><span>        else if (!strcasecmp(param, "declinecall"))</span><br><span>@@ -404,6 +411,7 @@</span><br><span>  struct number *cur, *nm;</span><br><span>     int timeout;</span><br><span>         int numorder;</span><br><span style="color: hsl(120, 100%, 40%);">+ const char* enable_callee_prompt_str;</span><br><span>        const char *takecallstr;</span><br><span>     const char *declinecallstr;</span><br><span>  const char *tmpstr;</span><br><span>@@ -436,6 +444,12 @@</span><br><span>                   featuredigittimeout = 5000;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if ((enable_callee_prompt_str = ast_variable_retrieve(cfg, "general",</span><br><span style="color: hsl(120, 100%, 40%);">+                                       "enable_callee_prompt")) &&</span><br><span style="color: hsl(120, 100%, 40%);">+                 !ast_strlen_zero(enable_callee_prompt_str)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         enable_callee_prompt = ast_true(enable_callee_prompt_str);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if ((takecallstr = ast_variable_retrieve(cfg, "general", "takecall")) && !ast_strlen_zero(takecallstr)) {</span><br><span>                ast_copy_string(takecall, takecallstr, sizeof(takecall));</span><br><span>    }</span><br><span>@@ -667,26 +681,30 @@</span><br><span>                    if (tmpuser->digts && (tmpuser->digts > featuredigittimeout)) {</span><br><span>                             ast_verb(3, "<%s> We've been waiting for digits longer than we should have.\n",</span><br><span>                                  ast_channel_name(tmpuser->ochan));</span><br><span style="color: hsl(0, 100%, 40%);">-                           if (!ast_strlen_zero(tpargs->namerecloc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  tmpuser->state = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                  tmpuser->digts = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                  if (!ast_streamfile(tmpuser->ochan, callfromname, ast_channel_language(tmpuser->ochan))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                ast_sched_runq(ast_channel_sched(tmpuser->ochan));</span><br><span style="color: hsl(120, 100%, 40%);">+                         if (tpargs->enable_callee_prompt) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        if (!ast_strlen_zero(tpargs->namerecloc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                tmpuser->state = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                tmpuser->digts = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                if (!ast_streamfile(tmpuser->ochan, callfromname, ast_channel_language(tmpuser->ochan))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      ast_sched_runq(ast_channel_sched(tmpuser->ochan));</span><br><span style="color: hsl(120, 100%, 40%);">+                                         } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     clear_caller(tmpuser);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                                             }</span><br><span>                                    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname);</span><br><span style="color: hsl(0, 100%, 40%);">-                                               clear_caller(tmpuser);</span><br><span style="color: hsl(0, 100%, 40%);">-                                          continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                                             tmpuser->state = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                tmpuser->digts = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                if (!ast_streamfile(tmpuser->ochan, tpargs->norecordingprompt, ast_channel_language(tmpuser->ochan)))</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        ast_sched_runq(ast_channel_sched(tmpuser->ochan));</span><br><span style="color: hsl(120, 100%, 40%);">+                                         else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        ast_log(LOG_WARNING, "Unable to playback %s.\n", tpargs->norecordingprompt);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     clear_caller(tmpuser);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                                             }</span><br><span>                                    }</span><br><span>                            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        tmpuser->state = 2;</span><br><span style="color: hsl(0, 100%, 40%);">-                                  tmpuser->digts = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                  if (!ast_streamfile(tmpuser->ochan, tpargs->norecordingprompt, ast_channel_language(tmpuser->ochan)))</span><br><span style="color: hsl(0, 100%, 40%);">-                                          ast_sched_runq(ast_channel_sched(tmpuser->ochan));</span><br><span style="color: hsl(0, 100%, 40%);">-                                   else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                          ast_log(LOG_WARNING, "Unable to playback %s.\n", tpargs->norecordingprompt);</span><br><span style="color: hsl(0, 100%, 40%);">-                                               clear_caller(tmpuser);</span><br><span style="color: hsl(0, 100%, 40%);">-                                          continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     tmpuser->state = 3;</span><br><span>                               }</span><br><span>                    }</span><br><span>                    if (ast_channel_stream(tmpuser->ochan)) {</span><br><span>@@ -799,23 +817,28 @@</span><br><span>                                                 /* If call has been answered, then the eventual hangup is likely to be normal hangup */</span><br><span>                                              ast_channel_hangupcause_set(winner, AST_CAUSE_NORMAL_CLEARING);</span><br><span>                                              ast_channel_hangupcause_set(caller, AST_CAUSE_NORMAL_CLEARING);</span><br><span style="color: hsl(0, 100%, 40%);">-                                         ast_verb(3, "Starting playback of %s\n", callfromname);</span><br><span style="color: hsl(0, 100%, 40%);">-                                               if (!ast_strlen_zero(tpargs->namerecloc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  if (!ast_streamfile(winner, callfromname, ast_channel_language(winner))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                              ast_sched_runq(ast_channel_sched(winner));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                              tmpuser->state = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                if (tpargs->enable_callee_prompt) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        ast_verb(3, "Starting playback of %s\n", callfromname);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     if (!ast_strlen_zero(tpargs->namerecloc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                if (!ast_streamfile(winner, callfromname, ast_channel_language(winner))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    ast_sched_runq(ast_channel_sched(winner));</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    tmpuser->state = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     clear_caller(tmpuser);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                }</span><br><span>                                                    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               clear_caller(tmpuser);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                tmpuser->state = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                if (!ast_streamfile(tmpuser->ochan, tpargs->norecordingprompt, ast_channel_language(tmpuser->ochan)))</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        ast_sched_runq(ast_channel_sched(tmpuser->ochan));</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        ast_log(LOG_WARNING, "Unable to playback %s.\n", tpargs->norecordingprompt);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     clear_caller(tmpuser);</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                }</span><br><span>                                                    }</span><br><span>                                            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      ast_verb(3, "Skip playback of caller name / norecording\n");</span><br><span>                                                       tmpuser->state = 2;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  if (!ast_streamfile(tmpuser->ochan, tpargs->norecordingprompt, ast_channel_language(tmpuser->ochan)))</span><br><span style="color: hsl(0, 100%, 40%);">-                                                          ast_sched_runq(ast_channel_sched(tmpuser->ochan));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                          ast_log(LOG_WARNING, "Unable to playback %s.\n", tpargs->norecordingprompt);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               clear_caller(tmpuser);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  }</span><br><span>                                            }</span><br><span>                                            break;</span><br><span>                                       case AST_CONTROL_BUSY:</span><br><span>@@ -939,6 +962,18 @@</span><br><span>                                                break;</span><br><span>                                       }</span><br><span>                            }</span><br><span style="color: hsl(120, 100%, 40%);">+                             // if no callee prompt enabled</span><br><span style="color: hsl(120, 100%, 40%);">+                                if(tmpuser &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                 !tpargs->enable_callee_prompt &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                   f->frametype == AST_FRAME_CONTROL &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                       f->subclass.integer == AST_CONTROL_ANSWER</span><br><span style="color: hsl(120, 100%, 40%);">+                          ) { // make sure to perform all actions as if prompt is enabled</span><br><span style="color: hsl(120, 100%, 40%);">+                                       ast_debug(1, "Taking call with no prompt\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                       ast_stopstream(winner);</span><br><span style="color: hsl(120, 100%, 40%);">+                                       tmpuser->yn[tmpuser->ynidx++] = 1; // force 1???</span><br><span style="color: hsl(120, 100%, 40%);">+                                        ast_frfree(f);</span><br><span style="color: hsl(120, 100%, 40%);">+                                        return tmpuser->ochan;</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span>                            if (tmpuser && tmpuser->state == 3 && f->frametype == AST_FRAME_DTMF) {</span><br><span>                                        int cmp_len;</span><br><span> </span><br><span>@@ -1378,6 +1413,7 @@</span><br><span> </span><br><span>         /* Lock the profile lock and copy out everything we need to run with before unlocking it again */</span><br><span>    ast_mutex_lock(&f->lock);</span><br><span style="color: hsl(120, 100%, 40%);">+      targs->enable_callee_prompt = f->enable_callee_prompt;</span><br><span>         targs->mohclass = ast_strdupa(f->moh);</span><br><span>         ast_copy_string(targs->context, f->context, sizeof(targs->context));</span><br><span>        ast_copy_string(targs->takecall, f->takecall, sizeof(targs->takecall));</span><br><span>diff --git a/configs/samples/followme.conf.sample b/configs/samples/followme.conf.sample</span><br><span>index eb12cbd..8776e3a 100644</span><br><span>--- a/configs/samples/followme.conf.sample</span><br><span>+++ b/configs/samples/followme.conf.sample</span><br><span>@@ -5,6 +5,9 @@</span><br><span> ; The number of ms to wait for a digit input for the callee on whether to take the call or</span><br><span> ; not before we consider them "done" entering digits.</span><br><span> ;</span><br><span style="color: hsl(120, 100%, 40%);">+enable_callee_prompt=>true</span><br><span style="color: hsl(120, 100%, 40%);">+; Enable prompting the callee to accept the forwarded call. Enabled by default.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> takecall=>1</span><br><span> ; The global default keypress for the callee to take taking the current call. This can be</span><br><span> ; a single digit or multiple digits. Default is "1".</span><br><span>@@ -58,6 +61,9 @@</span><br><span> ; step to make a choice on whether to take the call or not.  That being the case,</span><br><span> ; you may want to make the timeout on the last step longer to give enough time to</span><br><span> ; make the choice to accept or not.</span><br><span style="color: hsl(120, 100%, 40%);">+enable_callee_prompt=>true</span><br><span style="color: hsl(120, 100%, 40%);">+; Enable prompting the callee to accept the forwarded call. The default</span><br><span style="color: hsl(120, 100%, 40%);">+; is the global value.</span><br><span> takecall=>1</span><br><span> ; The keypress for the callee to take taking the current call. This can be</span><br><span> ; a single digit or multiple digits. Default is the global default.</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/14696">change 14696</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/14696"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 13 </div>
<div style="display:none"> Gerrit-Change-Id: Ic15a2bac4f16d0fce7a1b5e7b375f9bafee37aa4 </div>
<div style="display:none"> Gerrit-Change-Number: 14696 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Dennis <dennis.buteyn@xorcom.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>