diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 5e6ea023c4f3f548a1697ffe0a749e165326d32d..4035f45699900f2f3e7cb2c3d29f5466f08f77f7 100755 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -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) { diff --git a/configs/voicemail.conf.sample b/configs/voicemail.conf.sample index 2713a79ede87f754a1a7d3991d4659fcaada9a47..8503a8817095f560a2577093b6a81bccdd762432 100755 --- a/configs/voicemail.conf.sample +++ b/configs/voicemail.conf.sample @@ -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 diff --git a/sounds.txt b/sounds.txt index b6fcb7781f4974df564eaee4330e8249c792a9e8..ff4adba4cc5917f6605bd953420d33f705c4649c 100755 --- a/sounds.txt +++ b/sounds.txt @@ -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 index 0000000000000000000000000000000000000000..af5367eb69abc2cdae1db6042547e1975b3bbad5 Binary files /dev/null and b/sounds/vm-forward.gsm differ