diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index d4a5e96566..e5cb58cd51 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -688,6 +688,7 @@ static AST_LIST_HEAD_STATIC(vmstates, vmstate); #define VM_MESSAGEWRAP (1 << 17) /*!< Wrap around from the last message to the first, and vice-versa */ #define VM_FWDURGAUTO (1 << 18) /*!< Autoset of Urgent flag on forwarded Urgent messages set globally */ #define VM_EMAIL_EXT_RECS (1 << 19) /*!< Send voicemail emails when an external recording is added to a mailbox */ +#define VM_MARK_URGENT (1 << 20) /*!< After recording, permit the caller to mark the message as urgent */ #define ERROR_LOCK_PATH -100 #define ERROR_MAX_MSGS -101 #define OPERATOR_EXIT 300 @@ -1426,6 +1427,8 @@ static void apply_option(struct ast_vm_user *vmu, const char *var, const char *v ast_set2_flag(vmu, ast_true(value), VM_SVMAIL); } else if (!strcasecmp(var, "review")){ ast_set2_flag(vmu, ast_true(value), VM_REVIEW); + } else if (!strcasecmp(var, "leaveurgent")){ + ast_set2_flag(vmu, ast_true(value), VM_MARK_URGENT); } else if (!strcasecmp(var, "tempgreetwarn")){ ast_set2_flag(vmu, ast_true(value), VM_TEMPGREETWARN); } else if (!strcasecmp(var, "messagewrap")){ @@ -12921,7 +12924,7 @@ AST_TEST_DEFINE(test_voicemail_vmuser) /* language parameter seems to only be used for display in manager action */ static const char options_string[] = "attach=yes|attachfmt=wav49|" "serveremail=someguy@digium.com|fromstring=Voicemail System|tz=central|delete=yes|saycid=yes|" - "sendvoicemail=yes|review=yes|tempgreetwarn=yes|messagewrap=yes|operator=yes|" + "sendvoicemail=yes|review=yes|tempgreetwarn=yes|messagewrap=yes|operator=yes|leaveurgent=yes|" "envelope=yes|moveheard=yes|sayduration=yes|saydurationm=5|forcename=yes|" "forcegreetings=yes|callback=somecontext|dialout=somecontext2|" "exitcontext=somecontext3|minsecs=10|maxsecs=100|nextaftercmd=yes|" @@ -12997,6 +13000,10 @@ AST_TEST_DEFINE(test_voicemail_vmuser) ast_test_status_update(test, "Parse failure for review option\n"); res = 1; } + if (!ast_test_flag(vmu, VM_MARK_URGENT)) { + ast_test_status_update(test, "Parse failure for leaveurgent option\n"); + res = 1; + } if (!ast_test_flag(vmu, VM_TEMPGREETWARN)) { ast_test_status_update(test, "Parse failure for tempgreetwarm option\n"); res = 1; @@ -13727,6 +13734,7 @@ static int append_vmu_info_astman( "DeleteMessage: %s\r\n" "VolumeGain: %.2f\r\n" "CanReview: %s\r\n" + "CanMarkUrgent: %s\r\n" "CallOperator: %s\r\n" "MaxMessageCount: %d\r\n" "MaxMessageLength: %d\r\n" @@ -13764,6 +13772,7 @@ static int append_vmu_info_astman( ast_test_flag(vmu, VM_DELETE) ? "Yes" : "No", vmu->volgain, ast_test_flag(vmu, VM_REVIEW) ? "Yes" : "No", + ast_test_flag(vmu, VM_MARK_URGENT) ? "Yes" : "No", ast_test_flag(vmu, VM_OPERATOR) ? "Yes" : "No", vmu->maxmsg, vmu->maxsecs, @@ -14728,6 +14737,14 @@ static int actual_load_config(int reload, struct ast_config *cfg, struct ast_con } ast_set2_flag((&globalflags), ast_true(val), VM_REVIEW); + if (!(val = ast_variable_retrieve(cfg, "general", "leaveurgent"))){ + val = "yes"; + } else if (ast_false(val)) { + ast_debug(1, "VM leave urgent messages disabled globally\n"); + val = "no"; + } + ast_set2_flag((&globalflags), ast_true(val), VM_MARK_URGENT); + /* Temporary greeting reminder */ if (!(val = ast_variable_retrieve(cfg, "general", "tempgreetwarn"))) { ast_debug(1, "VM Temporary Greeting Reminder Option disabled globally\n"); @@ -16295,7 +16312,7 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re } break; case '4': - if (outsidecaller) { /* only mark vm messages */ + if (outsidecaller && ast_test_flag(vmu, VM_MARK_URGENT)) { /* only mark vm messages */ /* Mark Urgent */ if ((flag && ast_strlen_zero(flag)) || (!ast_strlen_zero(flag) && strcmp(flag, "Urgent"))) { ast_verb(3, "marking message as Urgent\n"); @@ -16372,7 +16389,7 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re return cmd; if (msg_exists) { cmd = ast_play_and_wait(chan, "vm-review"); - if (!cmd && outsidecaller) { + if (!cmd && outsidecaller && ast_test_flag(vmu, VM_MARK_URGENT)) { if ((flag && ast_strlen_zero(flag)) || (!ast_strlen_zero(flag) && strcmp(flag, "Urgent"))) { cmd = ast_play_and_wait(chan, "vm-review-urgent"); } else if (flag) { diff --git a/configs/samples/voicemail.conf.sample b/configs/samples/voicemail.conf.sample index 8771bea1e0..4aaa68c456 100644 --- a/configs/samples/voicemail.conf.sample +++ b/configs/samples/voicemail.conf.sample @@ -293,7 +293,8 @@ sendvoicemail=yes ; Allow the user to compose and send a voicemail while inside ; if not listed, calling the sender back will not be permitted ; exitcontext=fromvm ; Context to go to on user exit such as * or 0 ; The default is the current context. -; 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] +; leaveurgent=yes ; Allow senders to leave messages that are marked as 'Urgent' [ON by default] ; operator=yes ; Allow sender to hit 0 before/after/during leaving a voicemail to ; reach an operator. This option REQUIRES an 'o' extension in the ; same context (or in exitcontext, if set), as that is where the