Add option to use directory for forward/compose (bug #2025)
authorMark Spencer <markster@digium.com>
Fri, 19 Nov 2004 05:47:21 +0000 (05:47 +0000)
committerMark Spencer <markster@digium.com>
Fri, 19 Nov 2004 05:47:21 +0000 (05:47 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4294 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_voicemail.c
configs/voicemail.conf.sample
sounds.txt
sounds/vm-forward.gsm [new file with mode: 0755]

index 5e6ea02..4035f45 100755 (executable)
@@ -290,11 +290,11 @@ static char pagerfromstring[100];
 static char emailtitle[100];
 static char charset[32] = "ISO-8859-1";
 
+static int directory_forward;
 static char adsifdn[4] = "\x00\x00\x00\x0F";
 static char adsisec[4] = "\x9B\xDB\xF7\xAC";
 static int adsiver = 1;
 
-
 STANDARD_LOCAL_USER;
 
 LOCAL_USER_DECL;
@@ -2218,7 +2218,7 @@ static int notify_new_message(struct ast_channel *chan, struct ast_vm_user *vmu,
 
 static int forward_message(struct ast_channel *chan, char *context, char *dir, int curmsg, struct ast_vm_user *sender, char *fmt,int flag)
 {
-       char username[70];
+       char username[70]="";
        char sys[256];
        char todir[256];
        int todircount=0;
@@ -2234,12 +2234,88 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
        char *stringp, *s;
        int saved_messages = 0, found = 0;
        int valid_extensions = 0;
+       
        while (!res && !valid_extensions) {
-               res = ast_streamfile(chan, "vm-extension", chan->language);     /* "extension" */
-               if (res)
-                       break;
-               if ((res = ast_readstring(chan, username, sizeof(username) - 1, 2000, 10000, "#") < 0))
-                       break;
+               
+               int use_directory = 0;
+               if( directory_forward ) {
+                       int done = 0;
+                       int retries = 0;
+                       cmd=0;
+                       while((cmd >= 0) && !done ){
+                               if (cmd)
+                                       retries = 0;
+                               switch (cmd) {
+                               case '1': 
+                                       use_directory = 0;
+                                       done = 1;
+                                       break;
+                               case '2': 
+                                       use_directory = 1;
+                                       done=1;
+                                       break;
+                               case '*': 
+                                       cmd = 't';
+                                       done = 1;
+                                       break;
+                               default: 
+                                       /* Press 1 to enter an extension press 2 to use the directory */
+                                       cmd = ast_play_and_wait(chan,"vm-forward");
+                                       if (!cmd)
+                                               cmd = ast_waitfordigit(chan,3000);
+                                       if (!cmd)
+                                               retries++;
+                                       if (retries > 3)
+                                       {
+                                               cmd = 't';
+                                               done = 1;
+                                       }
+                                       
+                                }
+                       }
+                       if( cmd<0 || cmd=='t' )
+                               break;
+               }
+               
+               if( use_directory ) {
+                       /* use app_directory */
+                       
+                       char old_context[sizeof(chan->context)];
+                       char old_exten[sizeof(chan->exten)];
+                       int old_priority;
+                       struct ast_app* app;
+
+                       
+                       app = pbx_findapp("Directory");
+                       if (app) {
+                               /* make mackup copies */
+                               memcpy(old_context, chan->context, sizeof(chan->context));
+                               memcpy(old_exten, chan->exten, sizeof(chan->exten));
+                               old_priority = chan->priority;
+                               
+                               /* call the the Directory, changes the channel */
+                               res = pbx_exec(chan, app, ((context)?context:chan->context), 1);
+                               
+                               strncpy(username, chan->exten, sizeof(username)-1);
+                               
+                               /* restore the old context, exten, and priority */
+                               memcpy(chan->context, old_context, sizeof(chan->context));
+                               memcpy(chan->exten, old_exten, sizeof(chan->exten));
+                               chan->priority = old_priority;
+                               
+                       } else {
+                               ast_log(LOG_WARNING, "Could not find the Directory application, disabling directory_forward\n");
+                               directory_forward = 0;
+                       }
+               } else  {
+                       /* Ask for an extension */
+                       res = ast_streamfile(chan, "vm-extension", chan->language);     /* "extension" */
+                       if (res)
+                               break;
+                       if ((res = ast_readstring(chan, username, sizeof(username) - 1, 2000, 10000, "#") < 0))
+                               break;
+               }
+               
                /* start all over if no username */
                if (ast_strlen_zero(username))
                        continue;
@@ -4150,6 +4226,7 @@ static int load_config(void)
        char *astsaydurationinfo;
        char *astsaydurationminfo;
        char *silencestr;
+       char *astdirfwd;
        char *thresholdstr;
        char *fmt;
        char *astemail;
@@ -4382,6 +4459,10 @@ static int load_config(void)
                        exitcontext[0] = '\0';
                }
 
+               directory_forward = 0;
+               if (!(astdirfwd = ast_variable_retrieve(cfg, "general", "usedirectory"))) 
+                       astdirfwd = "no";
+               directory_forward = ast_true(astdirfwd);
 
                cat = ast_category_browse(cfg, NULL);
                while (cat) {
index 2713a79..8503a88 100755 (executable)
@@ -46,6 +46,8 @@ maxlogins=3
 ;pbxskip=yes
 ; Change the From: string
 ;fromstring=The Asterisk PBX
+; Permit finding entries for forward/compose from the directory
+;usedirectory=yes
 ;
 ;Change the From: string for pager messages
 ;pagerfromstring=The Asterisk PBX
index b6fcb77..ff4adba 100755 (executable)
@@ -98,6 +98,8 @@
 
 %transfer.gsm%Please hold while I try that extension.
 
+%vm-forward.gsm%Press 1 to enter an extension, press 2 to use the directory
+
 %vm-Cust1.gsm%folder 5
 
 %vm-Cust2.gsm%folder 6
diff --git a/sounds/vm-forward.gsm b/sounds/vm-forward.gsm
new file mode 100755 (executable)
index 0000000..af5367e
Binary files /dev/null and b/sounds/vm-forward.gsm differ