Merge MOG's first serious patch (new message patch) (bug #2071)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3612 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.0
Mark Spencer 21 years ago
parent 02ffc0eec8
commit e1c9ebc5b9

@ -143,6 +143,7 @@ struct ast_vm_user {
int delete; int delete;
int alloced; int alloced;
int saycid; int saycid;
int svmail;
int review; int review;
int operator; int operator;
int envelope; int envelope;
@ -262,6 +263,7 @@ static int maxlogins;
static int reviewvm; static int reviewvm;
static int calloper; static int calloper;
static int saycidinfo; static int saycidinfo;
static int svmailinfo;
static int hearenv; static int hearenv;
static int skipaftercmd; static int skipaftercmd;
static char dialcontext[80]; static char dialcontext[80];
@ -293,6 +295,8 @@ static void populate_defaults(struct ast_vm_user *vmu)
vmu->operator = 1; vmu->operator = 1;
if (saycidinfo) if (saycidinfo)
vmu->saycid = 1; vmu->saycid = 1;
if (svmailinfo)
vmu->svmail = 1;
if (hearenv) if (hearenv)
vmu->envelope = 1; vmu->envelope = 1;
if (callcontext) if (callcontext)
@ -331,6 +335,11 @@ static void apply_options(struct ast_vm_user *vmu, char *options)
vmu->saycid = 1; vmu->saycid = 1;
else else
vmu->saycid = 0; vmu->saycid = 0;
} else if (!strcasecmp(var,"sendvoicemail")){
if(ast_true(value))
vmu->svmail =1;
else
vmu->svmail =0;
} else if (!strcasecmp(var, "review")){ } else if (!strcasecmp(var, "review")){
if(ast_true(value)) if(ast_true(value))
vmu->review = 1; vmu->review = 1;
@ -2609,7 +2618,7 @@ static int notify_new_message(struct ast_channel *chan, struct ast_vm_user *vmu,
return 0; return 0;
} }
static int forward_message(struct ast_channel *chan, char *context, char *dir, int curmsg, struct ast_vm_user *sender, char *fmt) 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 sys[256];
@ -2666,90 +2675,97 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
if (!extensions || !valid_extensions) if (!extensions || !valid_extensions)
return res; return res;
vmtmp = extensions; vmtmp = extensions;
cmd = vm_forwardoptions(chan, sender, dir, curmsg, vmfmts, context); if(flag==1)/*Send VoiceMail*/
if (!cmd) { {
while(!res && vmtmp) { cmd=leave_voicemail(chan,username,0,0,0);
/* if (play_and_wait(chan, "vm-savedto")) }
break;
*/
snprintf(todir, sizeof(todir), "%s/voicemail/%s/%s/INBOX", (char *)ast_config_AST_SPOOL_DIR, vmtmp->context, vmtmp->mailbox);
snprintf(sys, sizeof(sys), "mkdir -p %s\n", todir);
snprintf(ext_context, sizeof(ext_context), "%s@%s", vmtmp->mailbox, vmtmp->context);
ast_log(LOG_DEBUG, sys);
ast_safe_system(sys);
todircount = count_messages(todir); else /*Forward VoiceMail*/
strncpy(tmp, fmt, sizeof(tmp) - 1); {
stringp = tmp; cmd = vm_forwardoptions(chan, sender, dir, curmsg, vmfmts, context);
while((s = strsep(&stringp, "|"))) { if (!cmd) {
/* XXX This is a hack -- we should use build_filename or similar XXX */ while(!res && vmtmp) {
if (!strcasecmp(s, "wav49")) /* if (play_and_wait(chan, "vm-savedto"))
s = "WAV"; break;
snprintf(sys, sizeof(sys), "cp %s/msg%04d.%s %s/msg%04d.%s\n", dir, curmsg, s, todir, todircount, s); */
snprintf(todir, sizeof(todir), "%s/voicemail/%s/%s/INBOX", (char *)ast_config_AST_SPOOL_DIR, vmtmp->context, vmtmp->mailbox);
snprintf(sys, sizeof(sys), "mkdir -p %s\n", todir);
snprintf(ext_context, sizeof(ext_context), "%s@%s", vmtmp->mailbox, vmtmp->context);
ast_log(LOG_DEBUG, sys); ast_log(LOG_DEBUG, sys);
ast_safe_system(sys); ast_safe_system(sys);
}
snprintf(sys, sizeof(sys), "cp %s/msg%04d.txt %s/msg%04d.txt\n", dir, curmsg, todir, todircount); todircount = count_messages(todir);
ast_log(LOG_DEBUG, sys); strncpy(tmp, fmt, sizeof(tmp) - 1);
ast_safe_system(sys); stringp = tmp;
snprintf(fn, sizeof(fn), "%s/msg%04d", todir,todircount); while((s = strsep(&stringp, "|"))) {
/* XXX This is a hack -- we should use build_filename or similar XXX */
if (!strcasecmp(s, "wav49"))
s = "WAV";
snprintf(sys, sizeof(sys), "cp %s/msg%04d.%s %s/msg%04d.%s\n", dir, curmsg, s, todir, todircount, s);
ast_log(LOG_DEBUG, sys);
ast_safe_system(sys);
}
snprintf(sys, sizeof(sys), "cp %s/msg%04d.txt %s/msg%04d.txt\n", dir, curmsg, todir, todircount);
ast_log(LOG_DEBUG, sys);
ast_safe_system(sys);
snprintf(fn, sizeof(fn), "%s/msg%04d", todir,todircount);
/* load the information on the source message so we can send an e-mail like a new message */ /* load the information on the source message so we can send an e-mail like a new message */
snprintf(miffile, sizeof(miffile), "%s/msg%04d.txt", dir, curmsg); snprintf(miffile, sizeof(miffile), "%s/msg%04d.txt", dir, curmsg);
if ((mif=ast_load(miffile))) { if ((mif=ast_load(miffile))) {
/* set callerid and duration variables */ /* set callerid and duration variables */
snprintf(callerid, sizeof(callerid), "FWD from: %s from %s", sender->fullname, ast_variable_retrieve(mif, NULL, "callerid")); snprintf(callerid, sizeof(callerid), "FWD from: %s from %s", sender->fullname, ast_variable_retrieve(mif, NULL, "callerid"));
s = ast_variable_retrieve(mif, NULL, "duration"); s = ast_variable_retrieve(mif, NULL, "duration");
if (s) if (s)
duration = atoi(s); duration = atoi(s);
else else
duration = 0; duration = 0;
if (!ast_strlen_zero(vmtmp->email)) { if (!ast_strlen_zero(vmtmp->email)) {
int attach_user_voicemail = attach_voicemail; int attach_user_voicemail = attach_voicemail;
char *myserveremail = serveremail; char *myserveremail = serveremail;
if (vmtmp->attach > -1) if (vmtmp->attach > -1)
attach_user_voicemail = vmtmp->attach; attach_user_voicemail = vmtmp->attach;
if (!ast_strlen_zero(vmtmp->serveremail)) if (!ast_strlen_zero(vmtmp->serveremail))
myserveremail = vmtmp->serveremail; myserveremail = vmtmp->serveremail;
sendmail(myserveremail, vmtmp, todircount, vmtmp->mailbox, callerid, fn, tmp, duration, attach_user_voicemail); sendmail(myserveremail, vmtmp, todircount, vmtmp->mailbox, callerid, fn, tmp, duration, attach_user_voicemail);
} }
if (!ast_strlen_zero(vmtmp->pager)) { if (!ast_strlen_zero(vmtmp->pager)) {
char *myserveremail = serveremail; char *myserveremail = serveremail;
if (!ast_strlen_zero(vmtmp->serveremail)) if (!ast_strlen_zero(vmtmp->serveremail))
myserveremail = vmtmp->serveremail; myserveremail = vmtmp->serveremail;
sendpage(myserveremail, vmtmp->pager, todircount, vmtmp->mailbox, callerid, duration, vmtmp); sendpage(myserveremail, vmtmp->pager, todircount, vmtmp->mailbox, callerid, duration, vmtmp);
} }
ast_destroy(mif); /* or here */ ast_destroy(mif); /* or here */
} }
/* Leave voicemail for someone */ /* Leave voicemail for someone */
manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, ast_app_has_voicemail(ext_context)); manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, ast_app_has_voicemail(ext_context));
run_externnotify(chan->context, ext_context); run_externnotify(chan->context, ext_context);
saved_messages++; saved_messages++;
vmfree = vmtmp; vmfree = vmtmp;
vmtmp = vmtmp->next; vmtmp = vmtmp->next;
free_user(vmfree); free_user(vmfree);
} }
if (saved_messages > 0) { if (saved_messages > 0) {
/* give confirmation that the message was saved */ /* give confirmation that the message was saved */
/* commented out since we can't forward batches yet /* commented out since we can't forward batches yet
if (saved_messages == 1) if (saved_messages == 1)
res = play_and_wait(chan, "vm-message"); res = play_and_wait(chan, "vm-message");
else else
res = play_and_wait(chan, "vm-messages"); res = play_and_wait(chan, "vm-messages");
if (!res) if (!res)
res = play_and_wait(chan, "vm-saved"); */ res = play_and_wait(chan, "vm-saved"); */
if (!res) if (!res)
res = play_and_wait(chan, "vm-msgsaved"); res = play_and_wait(chan, "vm-msgsaved");
}
} }
} }
return res ? res : cmd; return res ? res : cmd;
} }
static int wait_file2(struct ast_channel *chan, struct vm_state *vms, char *file) static int wait_file2(struct ast_channel *chan, struct vm_state *vms, char *file)
{ {
int res; int res;
@ -3733,6 +3749,14 @@ static int vm_execmain(struct ast_channel *chan, void *data)
cmd = 't'; cmd = 't';
break; break;
case '5': /* Leave VoiceMail */
if(vmu->svmail)
cmd = forward_message(chan, context, vms.curdir, vms.curmsg, vmu, vmfmts,1);
else
cmd = play_and_wait(chan,"vm-sorry");
cmd='t';
break;
case '*': /* Return to main menu */ case '*': /* Return to main menu */
cmd = 't'; cmd = 't';
break; break;
@ -3752,6 +3776,8 @@ static int vm_execmain(struct ast_channel *chan, void *data)
if (!ast_strlen_zero(vmu->dialout) && !cmd) { if (!ast_strlen_zero(vmu->dialout) && !cmd) {
cmd = play_and_wait(chan, "vm-tomakecall"); cmd = play_and_wait(chan, "vm-tomakecall");
} }
if(vmu->svmail&&!cmd)
cmd=play_and_wait(chan, "vm-leavemsg");
if (!cmd) if (!cmd)
cmd = play_and_wait(chan, "vm-starmain"); cmd = play_and_wait(chan, "vm-starmain");
if (!cmd) if (!cmd)
@ -3808,7 +3834,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
case '8': case '8':
if(vms.lastmsg > -1) if(vms.lastmsg > -1)
cmd = forward_message(chan, context, vms.curdir, vms.curmsg, vmu, vmfmts); cmd = forward_message(chan, context, vms.curdir, vms.curmsg, vmu, vmfmts,0);
else else
cmd = play_and_wait(chan, "vm-nomore"); cmd = play_and_wait(chan, "vm-nomore");
break; break;
@ -4172,6 +4198,7 @@ static int load_config(void)
char *notifystr = NULL; char *notifystr = NULL;
char *astattach; char *astattach;
char *astsaycid; char *astsaycid;
char *send_voicemail;
char *astcallop; char *astcallop;
char *astreview; char *astreview;
char *astskipcmd; char *astskipcmd;
@ -4329,6 +4356,13 @@ static int load_config(void)
} }
saycidinfo = ast_true(astsaycid); saycidinfo = ast_true(astsaycid);
svmailinfo =0;
if (!(send_voicemail = ast_variable_retrieve(cfg,"general", "sendvoicemail"))){
ast_log(LOG_DEBUG,"Send Voicemail msg disabled globally\n");
send_voicemail = "no";
}
svmailinfo=ast_true(send_voicemail);
hearenv = 1; hearenv = 1;
if (!(asthearenv = ast_variable_retrieve(cfg, "general", "envelope"))) { if (!(asthearenv = ast_variable_retrieve(cfg, "general", "envelope"))) {
ast_log(LOG_DEBUG,"ENVELOPE before msg enabled globally\n"); ast_log(LOG_DEBUG,"ENVELOPE before msg enabled globally\n");
@ -4347,9 +4381,9 @@ static int load_config(void)
strncpy(dialcontext, dialoutcxt, sizeof(dialcontext) - 1); strncpy(dialcontext, dialoutcxt, sizeof(dialcontext) - 1);
ast_log(LOG_DEBUG, "found dialout context: %s\n", dialcontext); ast_log(LOG_DEBUG, "found dialout context: %s\n", dialcontext);
} else { } else {
dialcontext[0] = '\0'; dialcontext[0] = '\0';
} }
if ((callbackcxt = ast_variable_retrieve(cfg, "general", "callback"))) { if ((callbackcxt = ast_variable_retrieve(cfg, "general", "callback"))) {
strncpy(callcontext, callbackcxt, sizeof(callcontext) -1); strncpy(callcontext, callbackcxt, sizeof(callcontext) -1);
ast_log(LOG_DEBUG, "found callback context: %s\n", callcontext); ast_log(LOG_DEBUG, "found callback context: %s\n", callcontext);
@ -4966,9 +5000,3 @@ char *key()
{ {
return ASTERISK_GPL_KEY; return ASTERISK_GPL_KEY;
} }

@ -98,6 +98,9 @@ maxlogins=3
; or set to no, it will be in the envelope ; or set to no, it will be in the envelope
; dialout=fromvm ; Context to dial out from [option 4 from the advanced menu] ; dialout=fromvm ; Context to dial out from [option 4 from the advanced menu]
; if not listed, dialing out will not be permitted ; if not listed, dialing out will not be permitted
sendvoicemail=yes ; Context to Send voicemail from [option 5 from the advanced menu]
; if not listed, sending messages from inside voicemail will not be
; permitted
; callback=fromvm ; Context to call back from ; callback=fromvm ; Context to call back from
; if not listed, calling the sender back will not be permitted ; if not listed, calling the sender back will not be permitted
; review=yes ; Allow sender to review/rerecord their message before saving it [OFF by default ; review=yes ; Allow sender to review/rerecord their message before saving it [OFF by default

@ -636,3 +636,5 @@
%conf-lockednow.gsm%The conference is now locked %conf-lockednow.gsm%The conference is now locked
%conf-unlockednow.gsm%The conference is now unlocked %conf-unlockednow.gsm%The conference is now unlocked
%vm-leavemsg.gsm% Press 5 to send a voicemail message

Binary file not shown.
Loading…
Cancel
Save