@ -1915,25 +1915,28 @@ static void free_user(struct ast_vm_user *vmu)
static int vm_allocate_dh ( struct vm_state * vms , struct ast_vm_user * vmu , int count_msg ) {
static int vm_allocate_dh ( struct vm_state * vms , struct ast_vm_user * vmu , int count_msg ) {
int arraysize = ( vmu - > maxmsg > count_msg ? vmu - > maxmsg : count_msg ) ;
int arraysize = ( vmu - > maxmsg > count_msg ? vmu - > maxmsg : count_msg ) ;
if ( ! vms - > dh_arraysize ) {
/* initial allocation */
/* remove old allocation */
if ( vms - > deleted ) {
ast_free ( vms - > deleted ) ;
vms - > deleted = NULL ;
}
if ( vms - > heard ) {
ast_free ( vms - > heard ) ;
vms - > heard = NULL ;
}
vms - > dh_arraysize = 0 ;
if ( arraysize > 0 ) {
if ( ! ( vms - > deleted = ast_calloc ( arraysize , sizeof ( int ) ) ) ) {
if ( ! ( vms - > deleted = ast_calloc ( arraysize , sizeof ( int ) ) ) ) {
return - 1 ;
return - 1 ;
}
}
if ( ! ( vms - > heard = ast_calloc ( arraysize , sizeof ( int ) ) ) ) {
if ( ! ( vms - > heard = ast_calloc ( arraysize , sizeof ( int ) ) ) ) {
ast_free ( vms - > deleted ) ;
vms - > deleted = NULL ;
return - 1 ;
return - 1 ;
}
}
vms - > dh_arraysize = arraysize ;
vms - > dh_arraysize = arraysize ;
} else if ( vms - > dh_arraysize < arraysize ) {
if ( ! ( vms - > deleted = ast_realloc ( vms - > deleted , arraysize * sizeof ( int ) ) ) ) {
return - 1 ;
}
if ( ! ( vms - > heard = ast_realloc ( vms - > heard , arraysize * sizeof ( int ) ) ) ) {
return - 1 ;
}
memset ( vms - > deleted , 0 , arraysize * sizeof ( int ) ) ;
memset ( vms - > heard , 0 , arraysize * sizeof ( int ) ) ;
vms - > dh_arraysize = arraysize ;
}
}
return 0 ;
return 0 ;
@ -7192,13 +7195,20 @@ static void adsi_message(struct ast_channel *chan, struct vm_state *vms)
ast_callerid_parse ( cid , & name , & num ) ;
ast_callerid_parse ( cid , & name , & num ) ;
if ( ! name )
if ( ! name )
name = num ;
name = num ;
} else
} else {
name = " Unknown Caller " ;
name = " Unknown Caller " ;
}
/* If deleted, show "undeleted" */
/* If deleted, show "undeleted" */
# ifdef IMAP_STORAGE
if ( vms - > deleted [ vms - > curmsg ] )
ast_mutex_lock ( & vms - > lock ) ;
# endif
if ( vms - > deleted [ vms - > curmsg ] ) {
keys [ 1 ] = ADSI_KEY_SKT | ( ADSI_KEY_APPS + 11 ) ;
keys [ 1 ] = ADSI_KEY_SKT | ( ADSI_KEY_APPS + 11 ) ;
}
# ifdef IMAP_STORAGE
ast_mutex_unlock ( & vms - > lock ) ;
# endif
/* Except "Exit" */
/* Except "Exit" */
keys [ 5 ] = ADSI_KEY_SKT | ( ADSI_KEY_APPS + 5 ) ;
keys [ 5 ] = ADSI_KEY_SKT | ( ADSI_KEY_APPS + 5 ) ;
@ -7251,8 +7261,15 @@ static void adsi_delete(struct ast_channel *chan, struct vm_state *vms)
}
}
/* If deleted, show "undeleted" */
/* If deleted, show "undeleted" */
if ( vms - > deleted [ vms - > curmsg ] )
# ifdef IMAP_STORAGE
ast_mutex_lock ( & vms - > lock ) ;
# endif
if ( vms - > deleted [ vms - > curmsg ] ) {
keys [ 1 ] = ADSI_KEY_SKT | ( ADSI_KEY_APPS + 11 ) ;
keys [ 1 ] = ADSI_KEY_SKT | ( ADSI_KEY_APPS + 11 ) ;
}
# ifdef IMAP_STORAGE
ast_mutex_unlock ( & vms - > lock ) ;
# endif
/* Except "Exit" */
/* Except "Exit" */
keys [ 5 ] = ADSI_KEY_SKT | ( ADSI_KEY_APPS + 5 ) ;
keys [ 5 ] = ADSI_KEY_SKT | ( ADSI_KEY_APPS + 5 ) ;
@ -8503,8 +8520,12 @@ static int play_message(struct ast_channel *chan, struct ast_vm_user *vmu, struc
if ( ! res ) {
if ( ! res ) {
make_file ( vms - > fn , sizeof ( vms - > fn ) , vms - > curdir , vms - > curmsg ) ;
make_file ( vms - > fn , sizeof ( vms - > fn ) , vms - > curdir , vms - > curmsg ) ;
# ifdef IMAP_STORAGE
ast_mutex_lock ( & vms - > lock ) ;
# endif
vms - > heard [ vms - > curmsg ] = 1 ;
vms - > heard [ vms - > curmsg ] = 1 ;
# ifdef IMAP_STORAGE
# ifdef IMAP_STORAGE
ast_mutex_unlock ( & vms - > lock ) ;
/*IMAP storage stores any prepended message from a forward
/*IMAP storage stores any prepended message from a forward
* as a separate file from the rest of the message
* as a separate file from the rest of the message
*/
*/
@ -8719,6 +8740,7 @@ static int close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
}
}
ast_unlock_path ( vms - > curdir ) ;
ast_unlock_path ( vms - > curdir ) ;
# else /* defined(IMAP_STORAGE) */
# else /* defined(IMAP_STORAGE) */
ast_mutex_lock ( & vms - > lock ) ;
if ( vms - > deleted ) {
if ( vms - > deleted ) {
/* Since we now expunge after each delete, deleting in reverse order
/* Since we now expunge after each delete, deleting in reverse order
* ensures that no reordering occurs between each step . */
* ensures that no reordering occurs between each step . */
@ -8733,12 +8755,18 @@ static int close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
# endif
# endif
done :
done :
if ( vms - > deleted & & last_msg_idx ) {
if ( vms - > deleted ) {
ast_free ( vms - > deleted ) ;
ast_free ( vms - > deleted ) ;
vms - > deleted = NULL ;
}
}
if ( vms - > heard & & last_msg_idx ) {
if ( vms - > heard ) {
ast_free ( vms - > heard ) ;
ast_free ( vms - > heard ) ;
vms - > heard = NULL ;
}
}
vms - > dh_arraysize = 0 ;
# ifdef IMAP_STORAGE
ast_mutex_unlock ( & vms - > lock ) ;
# endif
return 0 ;
return 0 ;
}
}
@ -9833,14 +9861,25 @@ static int vm_instructions_en(struct ast_channel *chan, struct ast_vm_user *vmu,
res = ast_play_and_wait ( chan , " vm-next " ) ;
res = ast_play_and_wait ( chan , " vm-next " ) ;
}
}
if ( ! res ) {
if ( ! res ) {
if ( ! vms - > deleted [ vms - > curmsg ] )
int curmsg_deleted ;
# ifdef IMAP_STORAGE
ast_mutex_lock ( & vms - > lock ) ;
# endif
curmsg_deleted = vms - > deleted [ vms - > curmsg ] ;
# ifdef IMAP_STORAGE
ast_mutex_unlock ( & vms - > lock ) ;
# endif
if ( ! curmsg_deleted ) {
res = ast_play_and_wait ( chan , " vm-delete " ) ;
res = ast_play_and_wait ( chan , " vm-delete " ) ;
else
} else {
res = ast_play_and_wait ( chan , " vm-undelete " ) ;
res = ast_play_and_wait ( chan , " vm-undelete " ) ;
if ( ! res )
}
if ( ! res ) {
res = ast_play_and_wait ( chan , " vm-toforward " ) ;
res = ast_play_and_wait ( chan , " vm-toforward " ) ;
if ( ! res )
}
if ( ! res ) {
res = ast_play_and_wait ( chan , " vm-savemessage " ) ;
res = ast_play_and_wait ( chan , " vm-savemessage " ) ;
}
}
}
}
}
if ( ! res ) {
if ( ! res ) {
@ -10591,7 +10630,13 @@ static int play_message_by_id_helper(struct ast_channel *chan,
if ( ( wait_file ( chan , vms , vms - > fn ) ) < 0 ) {
if ( ( wait_file ( chan , vms , vms - > fn ) ) < 0 ) {
ast_log ( AST_LOG_WARNING , " Playback of message %s failed \n " , vms - > fn ) ;
ast_log ( AST_LOG_WARNING , " Playback of message %s failed \n " , vms - > fn ) ;
} else {
} else {
# ifdef IMAP_STORAGE
ast_mutex_lock ( & vms - > lock ) ;
# endif
vms - > heard [ vms - > curmsg ] = 1 ;
vms - > heard [ vms - > curmsg ] = 1 ;
# ifdef IMAP_STORAGE
ast_mutex_unlock ( & vms - > lock ) ;
# endif
}
}
return 0 ;
return 0 ;
@ -11012,6 +11057,7 @@ static int vm_execmain(struct ast_channel *chan, const char *data)
}
}
vms . starting = 1 ;
vms . starting = 1 ;
vms . curmsg = 0 ;
break ;
break ;
case ' 3 ' : /* Advanced options */
case ' 3 ' : /* Advanced options */
ast_test_suite_event_notify ( " ADVOPTIONS " , " Message: entering advanced options menu " ) ;
ast_test_suite_event_notify ( " ADVOPTIONS " , " Message: entering advanced options menu " ) ;