mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-18 07:48:14 +00:00
Make sure two voicemails can't take the same message space (bug #3394)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4881 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -185,7 +185,7 @@ struct vm_state {
|
||||
};
|
||||
static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, int msg, int option);
|
||||
static int dialout(struct ast_channel *chan, struct ast_vm_user *vmu, char *num, char *outgoing_context);
|
||||
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration);
|
||||
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration, const char *unlockdir);
|
||||
static int vm_tempgreeting(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, char *fmtc);
|
||||
static int vm_play_folder_name(struct ast_channel *chan, char *mbox);
|
||||
|
||||
@@ -1299,11 +1299,13 @@ static int last_message_index(char *dir)
|
||||
{
|
||||
int x;
|
||||
char fn[256];
|
||||
ast_lock_path(dir);
|
||||
for (x=0;x<MAXMSG;x++) {
|
||||
make_file(fn, sizeof(fn), dir, x);
|
||||
if (ast_fileexists(fn, NULL, NULL) < 1)
|
||||
break;
|
||||
}
|
||||
ast_unlock_path(dir);
|
||||
return x-1;
|
||||
}
|
||||
|
||||
@@ -1934,6 +1936,7 @@ static void copy_message(struct ast_channel *chan, struct ast_vm_user *vmu, int
|
||||
|
||||
make_dir(fromdir, sizeof(fromdir), vmu->context, vmu->mailbox, frombox);
|
||||
make_file(frompath, sizeof(frompath), fromdir, msgnum);
|
||||
ast_lock_path(topath);
|
||||
recipmsgnum = 0;
|
||||
do {
|
||||
make_file(topath, sizeof(topath), todir, recipmsgnum);
|
||||
@@ -1946,7 +1949,7 @@ static void copy_message(struct ast_channel *chan, struct ast_vm_user *vmu, int
|
||||
} else {
|
||||
ast_log(LOG_ERROR, "Recipient mailbox %s@%s is full\n", recip->mailbox, recip->context);
|
||||
}
|
||||
|
||||
ast_unlock_path(topath);
|
||||
notify_new_message(chan, recip, recipmsgnum, duration, fmt, chan->cid.cid_num, chan->cid.cid_name);
|
||||
}
|
||||
|
||||
@@ -2132,18 +2135,19 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
||||
strncpy(fmt, vmfmts, sizeof(fmt) - 1);
|
||||
if (!ast_strlen_zero(fmt)) {
|
||||
msgnum = 0;
|
||||
do {
|
||||
make_file(fn, sizeof(fn), dir, msgnum);
|
||||
if (!EXISTS(dir,msgnum,fn,chan->language))
|
||||
break;
|
||||
msgnum++;
|
||||
} while (msgnum < MAXMSG);
|
||||
if (res >= 0) {
|
||||
/* Unless we're *really* silent, try to send the beep */
|
||||
res = ast_streamfile(chan, "beep", chan->language);
|
||||
if (!res)
|
||||
res = ast_waitstream(chan, "");
|
||||
}
|
||||
ast_lock_path(dir);
|
||||
do {
|
||||
make_file(fn, sizeof(fn), dir, msgnum);
|
||||
if (!EXISTS(dir,msgnum,fn,chan->language))
|
||||
break;
|
||||
msgnum++;
|
||||
} while (msgnum < MAXMSG);
|
||||
if (msgnum < MAXMSG) {
|
||||
/* Store information */
|
||||
snprintf(txtfile, sizeof(txtfile), "%s.txt", fn);
|
||||
@@ -2177,7 +2181,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
||||
fclose(txt);
|
||||
} else
|
||||
ast_log(LOG_WARNING, "Error opening text file for output\n");
|
||||
res = play_record_review(chan, NULL, fn, vmmaxmessage, fmt, 1, vmu, &duration);
|
||||
res = play_record_review(chan, NULL, fn, vmmaxmessage, fmt, 1, vmu, &duration, dir);
|
||||
if (res == '0')
|
||||
goto transfer;
|
||||
if (res > 0)
|
||||
@@ -2220,6 +2224,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
||||
DISPOSE(dir, msgnum);
|
||||
}
|
||||
} else {
|
||||
ast_unlock_path(dir);
|
||||
res = ast_streamfile(chan, "vm-mailboxfull", chan->language);
|
||||
if (!res)
|
||||
res = ast_waitstream(chan, "");
|
||||
@@ -2248,6 +2253,7 @@ static void resequence_mailbox(char * dir)
|
||||
char sfn[256];
|
||||
char dfn[256];
|
||||
|
||||
ast_lock_path(dir);
|
||||
for (x=0,dest=0;x<MAXMSG;x++) {
|
||||
make_file(sfn, sizeof(sfn), dir, x);
|
||||
if (EXISTS(dir, x, sfn, NULL)) {
|
||||
@@ -2260,6 +2266,7 @@ static void resequence_mailbox(char * dir)
|
||||
dest++;
|
||||
}
|
||||
}
|
||||
ast_unlock_path(dir);
|
||||
}
|
||||
|
||||
|
||||
@@ -2280,16 +2287,20 @@ static int save_to_folder(char *dir, int msg, char *context, char *username, int
|
||||
make_file(sfn, sizeof(sfn), dir, msg);
|
||||
make_dir(ddir, sizeof(ddir), context, username, dbox);
|
||||
mkdir(ddir, 0700);
|
||||
ast_lock_path(ddir);
|
||||
for (x=0;x<MAXMSG;x++) {
|
||||
make_file(dfn, sizeof(dfn), ddir, x);
|
||||
if (!EXISTS(ddir, x, dfn, NULL))
|
||||
break;
|
||||
}
|
||||
if (x >= MAXMSG)
|
||||
if (x >= MAXMSG) {
|
||||
ast_unlock_path(ddir);
|
||||
return -1;
|
||||
}
|
||||
if (strcmp(sfn, dfn)) {
|
||||
COPY(dir, msg, ddir, x, sfn, dfn);
|
||||
}
|
||||
ast_unlock_path(ddir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3403,6 +3414,7 @@ static void close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
|
||||
int x;
|
||||
if (vms->lastmsg > -1) {
|
||||
/* Get the deleted messages fixed */
|
||||
ast_lock_path(vms->curdir);
|
||||
vms->curmsg = -1;
|
||||
for (x=0;x < MAXMSG;x++) {
|
||||
if (!vms->deleted[x] && (strcasecmp(vms->curbox, "INBOX") || !vms->heard[x])) {
|
||||
@@ -3426,6 +3438,7 @@ static void close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
|
||||
break;
|
||||
DELETE(vms->curdir, x, vms->fn);
|
||||
}
|
||||
ast_unlock_path(vms->curdir);
|
||||
}
|
||||
memset(vms->deleted, 0, sizeof(vms->deleted));
|
||||
memset(vms->heard, 0, sizeof(vms->heard));
|
||||
@@ -4067,7 +4080,7 @@ static int vm_newuser(struct ast_channel *chan, struct ast_vm_user *vmu, struct
|
||||
/* If forcename is set, have the user record their name */
|
||||
if (ast_test_flag(vmu, VM_FORCENAME)) {
|
||||
snprintf(prefile,sizeof(prefile), "%s%s/%s/greet", VM_SPOOL_DIR, vmu->context, vms->username);
|
||||
cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration);
|
||||
cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
|
||||
if (cmd < 0 || cmd == 't' || cmd == '#')
|
||||
return cmd;
|
||||
}
|
||||
@@ -4075,11 +4088,11 @@ static int vm_newuser(struct ast_channel *chan, struct ast_vm_user *vmu, struct
|
||||
/* If forcegreetings is set, have the user record their greetings */
|
||||
if (ast_test_flag(vmu, VM_FORCEGREET)) {
|
||||
snprintf(prefile,sizeof(prefile), "%s%s/%s/unavail", VM_SPOOL_DIR, vmu->context, vms->username);
|
||||
cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration);
|
||||
cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
|
||||
if (cmd < 0 || cmd == 't' || cmd == '#')
|
||||
return cmd;
|
||||
snprintf(prefile,sizeof(prefile), "%s%s/%s/busy", VM_SPOOL_DIR, vmu->context, vms->username);
|
||||
cmd = play_record_review(chan,"vm-rec-busy",prefile, maxgreet, fmtc, 0, vmu, &duration);
|
||||
cmd = play_record_review(chan,"vm-rec-busy",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
|
||||
if (cmd < 0 || cmd == 't' || cmd == '#')
|
||||
return cmd;
|
||||
}
|
||||
@@ -4113,15 +4126,15 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct
|
||||
switch (cmd) {
|
||||
case '1':
|
||||
snprintf(prefile,sizeof(prefile), "%s%s/%s/unavail", VM_SPOOL_DIR, vmu->context, vms->username);
|
||||
cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration);
|
||||
cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
|
||||
break;
|
||||
case '2':
|
||||
snprintf(prefile,sizeof(prefile), "%s%s/%s/busy", VM_SPOOL_DIR, vmu->context, vms->username);
|
||||
cmd = play_record_review(chan,"vm-rec-busy",prefile, maxgreet, fmtc, 0, vmu, &duration);
|
||||
cmd = play_record_review(chan,"vm-rec-busy",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
|
||||
break;
|
||||
case '3':
|
||||
snprintf(prefile,sizeof(prefile), "%s%s/%s/greet", VM_SPOOL_DIR, vmu->context, vms->username);
|
||||
cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration);
|
||||
cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
|
||||
break;
|
||||
case '4':
|
||||
cmd = vm_tempgreeting(chan, vmu, vms, fmtc);
|
||||
@@ -4209,7 +4222,7 @@ static int vm_tempgreeting(struct ast_channel *chan, struct ast_vm_user *vmu, st
|
||||
if (ast_fileexists(prefile, NULL, NULL) > 0) {
|
||||
switch (cmd) {
|
||||
case '1':
|
||||
cmd = play_record_review(chan,"vm-rec-temp",prefile, maxgreet, fmtc, 0, vmu, &duration);
|
||||
cmd = play_record_review(chan,"vm-rec-temp",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
|
||||
break;
|
||||
case '2':
|
||||
ast_filedelete(prefile, NULL);
|
||||
@@ -4233,7 +4246,7 @@ static int vm_tempgreeting(struct ast_channel *chan, struct ast_vm_user *vmu, st
|
||||
}
|
||||
}
|
||||
} else {
|
||||
play_record_review(chan,"vm-rec-temp",prefile, maxgreet, fmtc, 0, vmu, &duration);
|
||||
play_record_review(chan,"vm-rec-temp",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
|
||||
cmd = 't';
|
||||
}
|
||||
}
|
||||
@@ -4908,7 +4921,8 @@ static int append_mailbox(char *context, char *mbox, char *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vm_box_exists(struct ast_channel *chan, void *data) {
|
||||
static int vm_box_exists(struct ast_channel *chan, void *data)
|
||||
{
|
||||
struct localuser *u;
|
||||
struct ast_vm_user svm;
|
||||
char *context, *box;
|
||||
@@ -5738,7 +5752,7 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s
|
||||
|
||||
|
||||
|
||||
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration)
|
||||
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration, const char *unlockdir)
|
||||
{
|
||||
/* Record message & let caller review or re-record it, or set options if applicable */
|
||||
int res = 0;
|
||||
@@ -5793,7 +5807,7 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
|
||||
}
|
||||
recorded = 1;
|
||||
/* After an attempt has been made to record message, we have to take care of INTRO and beep for incoming messages, but not for greetings */
|
||||
cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, silencethreshold, maxsilence);
|
||||
cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, silencethreshold, maxsilence, unlockdir);
|
||||
if (cmd == -1) {
|
||||
/* User has hung up, no options to give */
|
||||
return cmd;
|
||||
|
||||
Reference in New Issue
Block a user