Index: apps/app_voicemail.c =================================================================== --- apps/app_voicemail.c (revision 10407) +++ apps/app_voicemail.c (working copy) @@ -266,6 +266,28 @@ int starting; int repeats; }; + +struct vm_storage { + /* Database storage/retrieval functions */ + int (*retrieve_file)(char *dir, int msgnum); + int (*dispose_file)(char *dir, int msgnum); + int (*store_file)(char *dir, char *mailbox, char *mailboxcontext, int msgnum); + + /* File operations */ + void (*rename_file)(char *sdir, int smsg, char *mailbox, char *mailboxcontext, char *ddir, int dmsg, char *sfn, char *dfn); + void (*copy_file)(char *sdir, int smsg, char *ddir, int dmsg, char *dmailbox, char *dmailboxcontext, char *frompath, char *topath); + void (*delete_file)(char *sdir, int smsg, char *file); + + /* Message operations */ + int (*message_exists)(char *dir, int msgnum, char *filename, const char *preflang); + int (*count_messages)(struct ast_vm_user *vmu, char *dir); + int (*last_message_index)(struct ast_vm_user *vmu, char *dir); + + /* Message operations -- exported to the rest of asterisk via ast_install_vm_functions */ + int (*message_count)(const char *mailbox, int *newmsgs, int *oldmsgs); + int (*has_voicemail)(const char *mailbox, const char *folder); +}; + static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, int msg, int option, signed char record_gain); static int dialout(struct ast_channel *chan, struct ast_vm_user *vmu, char *num, char *outgoing_context); @@ -277,24 +299,11 @@ static void apply_options(struct ast_vm_user *vmu, const char *options); +static int vm_delete(char *file); + #ifdef USE_ODBC_STORAGE static char odbc_database[80]; static char odbc_table[80]; -#define RETRIEVE(a,b) retrieve_file(a,b) -#define DISPOSE(a,b) remove_file(a,b) -#define STORE(a,b,c,d) store_file(a,b,c,d) -#define EXISTS(a,b,c,d) (message_exists(a,b)) -#define RENAME(a,b,c,d,e,f,g,h) (rename_file(a,b,c,d,e,f)) -#define COPY(a,b,c,d,e,f,g,h) (copy_file(a,b,c,d,e,f)) -#define DELETE(a,b,c) (delete_file(a,b)) -#else -#define RETRIEVE(a,b) -#define DISPOSE(a,b) -#define STORE(a,b,c,d) -#define EXISTS(a,b,c,d) (ast_fileexists(c,NULL,d) > 0) -#define RENAME(a,b,c,d,e,f,g,h) (rename_file(g,h)); -#define COPY(a,b,c,d,e,f,g,h) (copy_file(g,h)); -#define DELETE(a,b,c) (vm_delete(c)) #endif static char VM_SPOOL_DIR[AST_CONFIG_MAX_PATH]; @@ -430,6 +439,8 @@ static int adsiver = 1; static char emaildateformat[32] = "%A, %B %d, %Y at %r"; +static struct vm_storage *storage = NULL; + LOCAL_USER_DECL; static void populate_defaults(struct ast_vm_user *vmu) @@ -829,7 +840,7 @@ #ifdef USE_ODBC_STORAGE -static int retrieve_file(char *dir, int msgnum) +static int odbc_retrieve_file(char *dir, int msgnum) { int x = 0; int res; @@ -971,7 +982,7 @@ return x - 1; } -static int remove_file(char *dir, int msgnum) +static int odbc_dispose_file(char *dir, int msgnum) { char fn[256]; char full_fn[256]; @@ -988,7 +999,7 @@ return 0; } -static int last_message_index(struct ast_vm_user *vmu, char *dir) +static int odbc_last_message_index(struct ast_vm_user *vmu, char *dir) { int x = 0; int res; @@ -1039,7 +1050,7 @@ return x - 1; } -static int message_exists(char *dir, int msgnum) +static int odbc_message_exists(char *dir, int msgnum, char *filename, const char *preflang) { int x = 0; int res; @@ -1093,12 +1104,12 @@ return x; } -static int count_messages(struct ast_vm_user *vmu, char *dir) +static int odbc_count_messages(struct ast_vm_user *vmu, char *dir) { - return last_message_index(vmu, dir) + 1; + return odbc_last_message_index(vmu, dir) + 1; } -static void delete_file(char *sdir, int smsg) +static void odbc_delete_file(char *sdir, int smsg, char *file) { int res; SQLHSTMT stmt; @@ -1136,7 +1147,7 @@ return; } -static void copy_file(char *sdir, int smsg, char *ddir, int dmsg, char *dmailboxuser, char *dmailboxcontext) +static void odbc_copy_file(char *sdir, int smsg, char *ddir, int dmsg, char *dmailboxuser, char *dmailboxcontext, char *frompath, char *topath) { int res; SQLHSTMT stmt; @@ -1145,7 +1156,7 @@ char msgnumd[20]; odbc_obj *obj; - delete_file(ddir, dmsg); + odbc_delete_file(ddir, dmsg, topath); obj = fetch_odbc_obj(odbc_database, 0); if (obj) { snprintf(msgnums, sizeof(msgnums), "%d", smsg); @@ -1190,7 +1201,7 @@ return; } -static int store_file(char *dir, char *mailboxuser, char *mailboxcontext, int msgnum) +static int odbc_store_file(char *dir, char *mailboxuser, char *mailboxcontext, int msgnum) { int x = 0; int res; @@ -1210,7 +1221,7 @@ struct ast_config *cfg=NULL; odbc_obj *obj; - delete_file(dir, msgnum); + odbc_delete_file(dir, msgnum, NULL); obj = fetch_odbc_obj(odbc_database, 0); if (obj) { ast_copy_string(fmt, vmfmts, sizeof(fmt)); @@ -1314,7 +1325,7 @@ return x; } -static void rename_file(char *sdir, int smsg, char *mailboxuser, char *mailboxcontext, char *ddir, int dmsg) +static void odbc_rename_file(char *sdir, int smsg, char *mailboxuser, char *mailboxcontext, char *ddir, int dmsg, char *sfn, char *dfn) { int res; SQLHSTMT stmt; @@ -1323,7 +1334,7 @@ char msgnumd[20]; odbc_obj *obj; - delete_file(ddir, dmsg); + odbc_delete_file(ddir, dmsg, dfn); obj = fetch_odbc_obj(odbc_database, 0); if (obj) { snprintf(msgnums, sizeof(msgnums), "%d", smsg); @@ -1368,10 +1379,20 @@ return; } -#else +#endif -static int count_messages(struct ast_vm_user *vmu, char *dir) +static int spool_message_exists(char *dir, int msgnum, char *filename, const char *preflang) { + return ast_fileexists(filename, NULL, preflang) > 0; +}; + +static void spool_delete_file(char *sdir, int smsg, char *file) +{ + vm_delete(file); +} + +static int spool_count_messages(struct ast_vm_user *vmu, char *dir) +{ /* Find all .txt files - even if they are not in sequence from 0000 */ int vmcount = 0; @@ -1393,7 +1414,7 @@ return vmcount; } -static void rename_file(char *sfn, char *dfn) +static void spool_rename_file(char *sdir, int smsg, char *mailboxuser, char *mailboxcontext, char *ddir, int dmsg, char *sfn, char *dfn) { char stxt[256]; char dtxt[256]; @@ -1403,7 +1424,7 @@ rename(stxt, dtxt); } -static int copy(char *infile, char *outfile) +static int spool_copy(char *infile, char *outfile) { int ifd; int ofd; @@ -1453,19 +1474,19 @@ #endif } -static void copy_file(char *frompath, char *topath) +static void spool_copy_file(char *sdir, int smsg, char *ddir, int dmsg, char *dmailboxuser, char *dmailboxcontext, char *frompath, char *topath) { char frompath2[256],topath2[256]; ast_filecopy(frompath, topath, NULL); snprintf(frompath2, sizeof(frompath2), "%s.txt", frompath); snprintf(topath2, sizeof(topath2), "%s.txt", topath); - copy(frompath2, topath2); + spool_copy(frompath2, topath2); } /* * A negative return value indicates an error. */ -static int last_message_index(struct ast_vm_user *vmu, char *dir) +static int spool_last_message_index(struct ast_vm_user *vmu, char *dir) { int x; char fn[256]; @@ -1498,8 +1519,6 @@ return ast_filedelete(file, NULL); } - -#endif static int inbuf(struct baseio *bio, FILE *fi) { @@ -1905,21 +1924,21 @@ int res; char fn[256]; snprintf(fn, sizeof(fn), "%s%s/%s/greet", VM_SPOOL_DIR, context, ext); - RETRIEVE(fn, -1); + storage->retrieve_file(fn, -1); if (ast_fileexists(fn, NULL, NULL) > 0) { res = ast_streamfile(chan, fn, chan->language); if (res) { - DISPOSE(fn, -1); + storage->dispose_file(fn, -1); return -1; } res = ast_waitstream(chan, ecodes); if (res) { - DISPOSE(fn, -1); + storage->dispose_file(fn, -1); return res; } } else { /* Dispose just in case */ - DISPOSE(fn, -1); + storage->dispose_file(fn, -1); res = ast_streamfile(chan, "vm-theperson", chan->language); if (res) return -1; @@ -1980,7 +1999,7 @@ } #ifdef USE_ODBC_STORAGE -static int messagecount(const char *mailbox, int *newmsgs, int *oldmsgs) +static int odbc_messagecount(const char *mailbox, int *newmsgs, int *oldmsgs) { int x = 0; int res; @@ -2083,7 +2102,7 @@ return x; } -static int has_voicemail(const char *mailbox, const char *folder) +static int odbc_has_voicemail(const char *mailbox, const char *folder) { int nummsgs = 0; int res; @@ -2152,9 +2171,9 @@ return 0; } -#else +#endif -static int has_voicemail(const char *mailbox, const char *folder) +static int spool_has_voicemail(const char *mailbox, const char *folder) { DIR *dir; struct dirent *de; @@ -2174,7 +2193,7 @@ ret = 0; while((cur = strsep(&mb, ","))) { if (!ast_strlen_zero(cur)) { - if (has_voicemail(cur, folder)) + if (spool_has_voicemail(cur, folder)) return 1; } } @@ -2202,7 +2221,7 @@ } -static int messagecount(const char *mailbox, int *newmsgs, int *oldmsgs) +static int spool_messagecount(const char *mailbox, int *newmsgs, int *oldmsgs) { DIR *dir; struct dirent *de; @@ -2225,7 +2244,7 @@ ret = 0; while((cur = strsep(&mb, ", "))) { if (!ast_strlen_zero(cur)) { - if (messagecount(cur, newmsgs ? &tmpnew : NULL, oldmsgs ? &tmpold : NULL)) + if (spool_messagecount(cur, newmsgs ? &tmpnew : NULL, oldmsgs ? &tmpold : NULL)) return -1; else { if (newmsgs) @@ -2273,8 +2292,6 @@ return 0; } -#endif - static int notify_new_message(struct ast_channel *chan, struct ast_vm_user *vmu, int msgnum, long duration, char *fmt, char *cidnum, char *cidname); static int copy_message(struct ast_channel *chan, struct ast_vm_user *vmu, int imbox, int msgnum, long duration, struct ast_vm_user *recip, char *fmt) @@ -2296,12 +2313,12 @@ recipmsgnum = 0; do { make_file(topath, sizeof(topath), todir, recipmsgnum); - if (!EXISTS(todir, recipmsgnum, topath, chan->language)) + if (!storage->message_exists(todir, recipmsgnum, topath, chan->language)) break; recipmsgnum++; } while (recipmsgnum < recip->maxmsg); if (recipmsgnum < recip->maxmsg) { - COPY(fromdir, msgnum, todir, recipmsgnum, recip->mailbox, recip->context, frompath, topath); + storage->copy_file(fromdir, msgnum, todir, recipmsgnum, recip->mailbox, recip->context, frompath, topath); } else { ast_log(LOG_ERROR, "Recipient mailbox %s@%s is full\n", recip->mailbox, recip->context); } @@ -2347,7 +2364,7 @@ #else if (!ast_strlen_zero(externnotify)) { #endif - if (messagecount(ext_context, &newvoicemails, &oldvoicemails)) { + if (storage->message_count(ext_context, &newvoicemails, &oldvoicemails)) { ast_log(LOG_ERROR, "Problem in calculating number of voicemail messages available for extension %s\n", extension); } else { snprintf(arguments, sizeof(arguments), "%s %s %s %d&", externnotify, context, extension, newvoicemails); @@ -2422,10 +2439,10 @@ else if (ast_test_flag(options, OPT_UNAVAIL_GREETING)) snprintf(prefile, sizeof(prefile), "%s%s/%s/unavail", VM_SPOOL_DIR, vmu->context, ext); snprintf(tempfile, sizeof(tempfile), "%s%s/%s/temp", VM_SPOOL_DIR, vmu->context, ext); - RETRIEVE(tempfile, -1); + storage->retrieve_file(tempfile, -1); if (ast_fileexists(tempfile, NULL, NULL) > 0) ast_copy_string(prefile, tempfile, sizeof(prefile)); - DISPOSE(tempfile, -1); + storage->dispose_file(tempfile, -1); /* It's easier just to try to make it than to check for its existence */ create_dirpath(dir, sizeof(dir), vmu->context, ext, "INBOX"); @@ -2452,7 +2469,7 @@ /* Play the beginning intro if desired */ if (!ast_strlen_zero(prefile)) { - RETRIEVE(prefile, -1); + storage->retrieve_file(prefile, -1); if (ast_fileexists(prefile, NULL, NULL) > 0) { if (ast_streamfile(chan, prefile, chan->language) > -1) res = ast_waitstream(chan, ecodes); @@ -2460,7 +2477,7 @@ ast_log(LOG_DEBUG, "%s doesn't exist, doing what we can\n", prefile); res = invent_message(chan, vmu->context, ext, ast_test_flag(options, OPT_BUSY_GREETING), ecodes); } - DISPOSE(prefile, -1); + storage->dispose_file(prefile, -1); if (res < 0) { ast_log(LOG_DEBUG, "Hang up during prefile playback\n"); free_user(vmu); @@ -2543,7 +2560,7 @@ */ do { make_file(fn, sizeof(fn), dir, msgnum); - if (!EXISTS(dir,msgnum,fn,chan->language)) + if (!storage->message_exists(dir,msgnum,fn,chan->language)) break; msgnum++; } while (msgnum < vmu->maxmsg); @@ -2606,7 +2623,7 @@ if (duration < vmminmessage) { if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "Recording was %d seconds long but needs to be at least %d - abandoning\n", duration, vmminmessage); - DELETE(dir,msgnum,fn); + storage->delete_file(dir,msgnum,fn); /* XXX We should really give a prompt too short/option start again, with leave_vm_out called only after a timeout XXX */ pbx_builtin_setvar_helper(chan, "VMSTATUS", "FAILED"); goto leave_vm_out; @@ -2628,9 +2645,9 @@ } } if (ast_fileexists(fn, NULL, NULL)) { - STORE(dir, vmu->mailbox, vmu->context, msgnum); + storage->store_file(dir, vmu->mailbox, vmu->context, msgnum); notify_new_message(chan, vmu, msgnum, duration, fmt, chan->cid.cid_num, chan->cid.cid_name); - DISPOSE(dir, msgnum); + storage->dispose_file(dir, msgnum); } pbx_builtin_setvar_helper(chan, "VMSTATUS", "SUCCESS"); } else { @@ -2662,11 +2679,11 @@ for (x = 0, dest = 0; x < vmu->maxmsg; x++) { make_file(sfn, sizeof(sfn), dir, x); - if (EXISTS(dir, x, sfn, NULL)) { + if (storage->message_exists(dir, x, sfn, NULL)) { if(x != dest) { make_file(dfn, sizeof(dfn), dir, dest); - RENAME(dir, x, vmu->mailbox, vmu->context, dir, dest, sfn, dfn); + storage->rename_file(dir, x, vmu->mailbox, vmu->context, dir, dest, sfn, dfn); } dest++; @@ -2700,7 +2717,7 @@ for (x = 0; x < vmu->maxmsg; x++) { make_file(dfn, sizeof(dfn), ddir, x); - if (!EXISTS(ddir, x, dfn, NULL)) + if (!storage->message_exists(ddir, x, dfn, NULL)) break; } if (x >= vmu->maxmsg) { @@ -2708,7 +2725,7 @@ return -1; } if (strcmp(sfn, dfn)) { - COPY(dir, msg, ddir, x, username, context, sfn, dfn); + storage->copy_file(dir, msg, ddir, x, username, context, sfn, dfn); } ast_unlock_path(ddir); @@ -3329,7 +3346,7 @@ } if (ast_test_flag(vmu, VM_DELETE)) { - DELETE(todir, msgnum, fn); + storage->delete_file(todir, msgnum, fn); } /* Leave voicemail for someone */ @@ -3479,7 +3496,7 @@ } else { /* Forward VoiceMail */ - RETRIEVE(dir, curmsg); + storage->retrieve_file(dir, curmsg); cmd = vm_forwardoptions(chan, sender, dir, curmsg, vmfmts, context, record_gain); if (!cmd) { AST_LIST_TRAVERSE_SAFE_BEGIN(&extensions, vmtmp, list) { @@ -3492,7 +3509,7 @@ ast_log(LOG_DEBUG, "%s", sys); ast_safe_system(sys); - res = count_messages(receiver, todir); + res = storage->count_messages(receiver, todir); if ( (res == ERROR_LOCK_PATH) || (res < 0) ) { if (res == ERROR_LOCK_PATH) @@ -3517,7 +3534,7 @@ ast_safe_system(sys); snprintf(fn, sizeof(fn), "%s/msg%04d", todir,todircount); - STORE(todir, vmtmp->mailbox, vmtmp->context, todircount); + storage->store_file(todir, vmtmp->mailbox, vmtmp->context, todircount); /* 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); @@ -3550,7 +3567,7 @@ ast_config_destroy(mif); /* or here */ } /* Leave voicemail for someone */ - manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, has_voicemail(ext_context, NULL)); + manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, storage->has_voicemail(ext_context, NULL)); run_externnotify(vmtmp->context, vmtmp->mailbox); saved_messages++; @@ -3779,7 +3796,7 @@ /* Retrieve info from VM attribute file */ make_file(vms->fn2, sizeof(vms->fn2), vms->curdir, vms->curmsg); snprintf(filename,sizeof(filename), "%s.txt", vms->fn2); - RETRIEVE(vms->curdir, vms->curmsg); + storage->retrieve_file(vms->curdir, vms->curmsg); msg_cfg = ast_config_load(filename); if (!msg_cfg) { ast_log(LOG_WARNING, "No message attribute file?!! (%s)\n", filename); @@ -3788,7 +3805,7 @@ if (!(origtime = ast_variable_retrieve(msg_cfg, "message", "origtime"))) { ast_log(LOG_WARNING, "No origtime?!\n"); - DISPOSE(vms->curdir, vms->curmsg); + storage->dispose_file(vms->curdir, vms->curmsg); ast_config_destroy(msg_cfg); return 0; } @@ -3819,7 +3836,7 @@ vms->heard[vms->curmsg] = 1; res = wait_file(chan, vms, vms->fn); } - DISPOSE(vms->curdir, vms->curmsg); + storage->dispose_file(vms->curdir, vms->curmsg); return res; } @@ -3836,7 +3853,7 @@ snprintf(vms->vmbox, sizeof(vms->vmbox), "vm-%s", vms->curbox); make_dir(vms->curdir, sizeof(vms->curdir), vmu->context, vms->username, vms->curbox); - count_msg = count_messages(vmu, vms->curdir); + count_msg = storage->count_messages(vmu, vms->curdir); if (count_msg < 0) return count_msg; else @@ -3849,7 +3866,7 @@ detected. */ - last_msg = last_message_index(vmu, vms->curdir); + last_msg = storage->last_message_index(vmu, vms->curdir); if (last_msg < 0) return last_msg; else if(vms->lastmsg != last_msg) @@ -3880,12 +3897,12 @@ if (!vms->deleted[x] && (strcasecmp(vms->curbox, "INBOX") || !vms->heard[x])) { /* Save this message. It's not in INBOX or hasn't been heard */ make_file(vms->fn, sizeof(vms->fn), vms->curdir, x); - if (!EXISTS(vms->curdir, x, vms->fn, NULL)) + if (!storage->message_exists(vms->curdir, x, vms->fn, NULL)) break; vms->curmsg++; make_file(vms->fn2, sizeof(vms->fn2), vms->curdir, vms->curmsg); if (strcmp(vms->fn, vms->fn2)) { - RENAME(vms->curdir, x, vmu->mailbox,vmu->context, vms->curdir, vms->curmsg, vms->fn, vms->fn2); + storage->rename_file(vms->curdir, x, vmu->mailbox,vmu->context, vms->curdir, vms->curmsg, vms->fn, vms->fn2); } } else if (!strcasecmp(vms->curbox, "INBOX") && vms->heard[x] && !vms->deleted[x]) { /* Move to old folder before deleting */ @@ -3903,8 +3920,8 @@ nummsg = x - 1; for (x = vms->curmsg + 1; x <= nummsg; x++) { make_file(vms->fn, sizeof(vms->fn), vms->curdir, x); - if (EXISTS(vms->curdir, x, vms->fn, NULL)) - DELETE(vms->curdir, x, vms->fn); + if (storage->message_exists(vms->curdir, x, vms->fn, NULL)) + storage->delete_file(vms->curdir, x, vms->fn); } ast_unlock_path(vms->curdir); @@ -4770,7 +4787,7 @@ while (cmd >= 0 && cmd != 't') { if (cmd) retries = 0; - RETRIEVE(prefile, -1); + storage->retrieve_file(prefile, -1); if (ast_fileexists(prefile, NULL, NULL) <= 0) { play_record_review(chan, "vm-rec-temp", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain); cmd = 't'; @@ -4780,7 +4797,7 @@ cmd = play_record_review(chan, "vm-rec-temp", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain); break; case '2': - DELETE(prefile, -1, prefile); + storage->delete_file(prefile, -1, prefile); ast_play_and_wait(chan, "vm-tempremoved"); cmd = 't'; break; @@ -4799,7 +4816,7 @@ cmd = 't'; } } - DISPOSE(prefile, -1); + storage->dispose_file(prefile, -1); } if (cmd == 't') cmd = 0; @@ -5503,7 +5520,7 @@ close_mailbox(&vms, vmu); if (valid) { snprintf(ext_context, sizeof(ext_context), "%s@%s", vms.username, vmu->context); - manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, has_voicemail(ext_context, NULL)); + manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, storage->has_voicemail(ext_context, NULL)); run_externnotify(vmu->context, vmu->mailbox); } if (vmu) @@ -5845,6 +5862,50 @@ handle_show_voicemail_zones, "List zone message formats", show_voicemail_zones_help, NULL }; +static int noop2(char *a, int b) +{ + return 0; +} + +static int noop4(char *a, char *b, char *c, int d) +{ + return 0; +} + +static struct vm_storage spool_storage = +{ + noop2, + noop2, + noop4, + spool_rename_file, + spool_copy_file, + spool_delete_file, + spool_message_exists, + spool_count_messages, + spool_last_message_index, + spool_messagecount, + spool_has_voicemail, +}; + +#ifdef USE_ODBC_STORAGE + +static struct vm_storage odbc_storage = +{ + odbc_retrieve_file, + odbc_dispose_file, + odbc_store_file, + odbc_rename_file, + odbc_copy_file, + odbc_delete_file, + odbc_message_exists, + odbc_count_messages, + odbc_last_message_index, + odbc_messagecount, + odbc_has_voicemail, +}; + +#endif + static int load_config(void) { struct ast_vm_user *cur; @@ -5882,6 +5943,12 @@ int x; int tmpadsi[4]; +#ifdef USE_ODBC_STORAGE + storage = &odbc_storage; +#else + storage = &spool_storage; +#endif + cfg = ast_config_load(VOICEMAIL_CONFIG); AST_LIST_LOCK(&users); AST_LIST_TRAVERSE_SAFE_BEGIN(&users, cur, list) { @@ -6341,7 +6408,7 @@ /* compute the location of the voicemail spool directory */ snprintf(VM_SPOOL_DIR, sizeof(VM_SPOOL_DIR), "%s/voicemail/", ast_config_AST_SPOOL_DIR); - ast_install_vm_functions(has_voicemail, messagecount); + ast_install_vm_functions(storage->has_voicemail, storage->message_count); #if defined(USE_ODBC_STORAGE) && !defined(EXTENDED_ODBC_STORAGE) ast_log(LOG_WARNING, "The current ODBC storage table format will be changed soon." @@ -6430,9 +6497,9 @@ make_file(vms->fn2, sizeof(vms->fn2), vms->curdir, vms->curmsg); snprintf(filename,sizeof(filename), "%s.txt", vms->fn2); - RETRIEVE(vms->curdir, vms->curmsg); + storage->retrieve_file(vms->curdir, vms->curmsg); msg_cfg = ast_config_load(filename); - DISPOSE(vms->curdir, vms->curmsg); + storage->dispose_file(vms->curdir, vms->curmsg); if (!msg_cfg) { ast_log(LOG_WARNING, "No message attribute file?!! (%s)\n", filename); return 0; @@ -6612,8 +6679,8 @@ ast_verbose(VERBOSE_PREFIX_3 "Saving message as is\n"); ast_streamfile(chan, "vm-msgsaved", chan->language); ast_waitstream(chan, ""); - STORE(recordfile, vmu->mailbox, vmu->context, -1); - DISPOSE(recordfile, -1); + storage->store_file(recordfile, vmu->mailbox, vmu->context, -1); + storage->dispose_file(recordfile, -1); cmd = 't'; return res; } @@ -6708,7 +6775,7 @@ cmd = '0'; } else { ast_play_and_wait(chan, "vm-deleted"); - DELETE(recordfile, -1, recordfile); + storage->delete_file(recordfile, -1, recordfile); cmd = '0'; } }