static char imapfolder[64];
static char authuser[32];
static char authpassword[42];
+static int imapversion = 1;
static int expungeonhangup = 1;
static char delimiter = '\0';
char imapuser[80]; /* IMAP server login */
char imappassword[80]; /* IMAP server password if authpassword not defined */
char imapvmshareid[80]; /* Shared mailbox ID to use rather than the dialed one */
+ int imapversion; /*!< If configuration changes, use the new values */
#endif
double volgain; /*!< Volume gain for voicemails sent via email */
AST_LIST_ENTRY(ast_vm_user) list;
MAILSTREAM *mailstream;
int vmArrayIndex;
char imapuser[80]; /* IMAP server login */
+ int imapversion;
int interactive;
unsigned int quota_limit;
unsigned int quota_usage;
#ifdef IMAP_STORAGE
} else if (!strcasecmp(var, "imapuser")) {
ast_copy_string(vmu->imapuser, value, sizeof(vmu->imapuser));
+ vmu->imapversion = imapversion;
} else if (!strcasecmp(var, "imappassword") || !strcasecmp(var, "imapsecret")) {
ast_copy_string(vmu->imappassword, value, sizeof(vmu->imappassword));
+ vmu->imapversion = imapversion;
} else if (!strcasecmp(var, "imapvmshareid")) {
ast_copy_string(vmu->imapvmshareid, value, sizeof(vmu->imapvmshareid));
+ vmu->imapversion = imapversion;
#endif
} else if (!strcasecmp(var, "delete") || !strcasecmp(var, "deletevoicemail")) {
ast_set2_flag(vmu, ast_true(value), VM_DELETE);
#ifdef IMAP_STORAGE
} else if (!strcasecmp(tmp->name, "imapuser")) {
ast_copy_string(retval->imapuser, tmp->value, sizeof(retval->imapuser));
+ retval->imapversion = imapversion;
} else if (!strcasecmp(tmp->name, "imappassword") || !strcasecmp(tmp->name, "imapsecret")) {
ast_copy_string(retval->imappassword, tmp->value, sizeof(retval->imappassword));
+ retval->imapversion = imapversion;
} else if (!strcasecmp(tmp->name, "imapvmshareid")) {
ast_copy_string(retval->imapvmshareid, tmp->value, sizeof(retval->imapvmshareid));
+ retval->imapversion = imapversion;
#endif
} else
apply_option(retval, tmp->name, tmp->value);
context = "default";
AST_LIST_TRAVERSE(&users, cur, list) {
+#ifdef IMAP_STORAGE
+ if (cur->imapversion != imapversion) {
+ continue;
+ }
+#endif
if (ast_test_flag((&globalflags), VM_SEARCH) && !strcasecmp(mailbox, cur->mailbox))
break;
if (context && (!strcasecmp(context, cur->context)) && (!strcasecmp(mailbox, cur->mailbox)))
* and should have its msgArray properly set up.
*/
ast_log(LOG_ERROR, "Couldn't find a vm_state for mailbox %s!!! Oh no!\n", vmu->mailbox);
+ return -1;
}
make_file(vms->fn, sizeof(vms->fn), dir, msgnum);
int ret;
ast_copy_string(vms->imapuser,vmu->imapuser, sizeof(vms->imapuser));
+ vms->imapversion = vmu->imapversion;
+
if (option_debug > 2)
ast_log(LOG_DEBUG,"Before init_mailstream, user is %s\n",vmu->imapuser);
ret = init_mailstream(vms, box);
ast_copy_string(vms_p->username, vmu->mailbox, sizeof(vms_p->username)); /* save for access from interactive entry point */
ast_copy_string(vms_p->context, vmu->context, sizeof(vms_p->context));
vms_p->mailstream = NIL; /* save for access from interactive entry point */
+ vms_p->imapversion = vmu->imapversion;
if (option_debug > 4)
ast_log(LOG_DEBUG,"Copied %s to %s\n",vmu->imapuser,vms_p->imapuser);
vms_p->updated = 1;
ast_mutex_lock(&vmstate_lock);
vlist = vmstates;
while (vlist) {
- if (vlist->vms) {
+ if (vlist->vms && vlist->vms->imapversion == imapversion) {
if (vlist->vms->imapuser) {
if (!strcmp(vlist->vms->imapuser,user)) {
if (interactive == 2) {
ast_log(LOG_DEBUG, "Mailbox set to %s\n",mailbox);
while (vlist) {
if (vlist->vms) {
- if (vlist->vms->username && vlist->vms->context) {
+ if (vlist->vms->username && vlist->vms->context && vlist->vms->imapversion == imapversion) {
if (option_debug > 2)
ast_log(LOG_DEBUG, " comparing mailbox %s (i=%d) to vmstate mailbox %s (i=%d)\n",mailbox,interactive,vlist->vms->username,vlist->vms->interactive);
if (!strcmp(vlist->vms->username,mailbox) && !(strcmp(vlist->vms->context, local_context))) {
mail_parameters(NIL, SET_CLOSETIMEOUT, (void *) DEFAULT_IMAP_TCP_TIMEOUT);
}
+ /* Increment configuration version */
+ imapversion++;
#endif
/* External voicemail notify application */