diff --git a/conf/vanilla/autoload_configs/voicemail_ivr.conf.xml b/conf/vanilla/autoload_configs/voicemail_ivr.conf.xml index 502578ee64..1cdf3c222e 100644 --- a/conf/vanilla/autoload_configs/voicemail_ivr.conf.xml +++ b/conf/vanilla/autoload_configs/voicemail_ivr.conf.xml @@ -26,6 +26,7 @@ + @@ -57,6 +58,9 @@ + + + @@ -89,9 +93,8 @@ - - - + + @@ -105,7 +108,7 @@ - + @@ -117,7 +120,7 @@ - + @@ -132,7 +135,7 @@ - + @@ -146,7 +149,7 @@ - + diff --git a/conf/vanilla/lang/en/vm/voicemail_ivr.xml b/conf/vanilla/lang/en/vm/voicemail_ivr.xml index 7ccd73260b..1c48299430 100644 --- a/conf/vanilla/lang/en/vm/voicemail_ivr.xml +++ b/conf/vanilla/lang/en/vm/voicemail_ivr.xml @@ -12,7 +12,7 @@ - + @@ -111,10 +111,18 @@ - - + + + + + + + + + + @@ -264,6 +272,7 @@ + diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c index 195ac3170f..17a8b546e5 100644 --- a/src/mod/applications/mod_voicemail/mod_voicemail.c +++ b/src/mod/applications/mod_voicemail/mod_voicemail.c @@ -4975,6 +4975,78 @@ done: return SWITCH_STATUS_SUCCESS; } +#define VM_FSDB_PREF_GREETING_GET_USAGE " [slot]" +SWITCH_STANDARD_API(vm_fsdb_pref_greeting_get_function) +{ + int slot = -1; + char *sql = NULL; + char res[254] = ""; + + char *id = NULL, *domain = NULL, *profile_name = NULL; + vm_profile_t *profile = NULL; + + char *argv[6] = { 0 }; + char *mycmd = NULL; + + switch_memory_pool_t *pool; + + switch_core_new_memory_pool(&pool); + + if (!zstr(cmd)) { + mycmd = switch_core_strdup(pool, cmd); + switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + } + + if (argv[1]) + profile_name = argv[1]; + if (argv[2]) + domain = argv[2]; + if (argv[3]) + id = argv[3]; + if (argv[4]) + slot = atoi(argv[4]); + + if (!profile_name || !domain || !id) { + stream->write_function(stream, "-ERR Missing Arguments\n"); + goto done; + } + + if (!(profile = get_profile(profile_name))) { + stream->write_function(stream, "-ERR Profile not found\n"); + goto done; + } + sql = switch_mprintf("select greeting_path from voicemail_prefs WHERE domain = '%q' AND username = '%q'", domain, id); + + vm_execute_sql2str(profile, profile->mutex, sql, res, sizeof(res)); + + switch_safe_free(sql); + + profile_rwunlock(profile); + + /* TODO If no slot requested, returned currently selected and figure out the slot number from the file name. + * IF slot provided, check if file exist, check if it currently selected */ + if (zstr(res)) { + stream->write_function(stream, "-ERR No greeting found\n"); + } else { + switch_event_t *my_params = NULL; + char *ebuf = NULL; + + switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS); + switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Preference-Greeting-File-Path", "%s", res); + switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Preference-Greeting-Slot", "%s", "Not Implemented yet"); + switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Preference-Greeting-Selected", "%s", "True"); + switch_event_serialize_json(my_params, &ebuf); + switch_event_destroy(&my_params); + + stream->write_function(stream, "%s", ebuf); + switch_safe_free(ebuf); + + } +done: + switch_core_destroy_memory_pool(&pool); + return SWITCH_STATUS_SUCCESS; +} + #define VM_FSDB_PREF_RECNAME_SET_USAGE " " SWITCH_STANDARD_API(vm_fsdb_pref_recname_set_function) { @@ -5961,6 +6033,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load) /* Preferences */ SWITCH_ADD_API(commands_api_interface, "vm_fsdb_pref_greeting_set", "vm_fsdb_pref_greeting_set", vm_fsdb_pref_greeting_set_function, VM_FSDB_PREF_GREETING_SET_USAGE); + SWITCH_ADD_API(commands_api_interface, "vm_fsdb_pref_greeting_get", "vm_fsdb_pref_greeting_get", vm_fsdb_pref_greeting_get_function, VM_FSDB_PREF_GREETING_GET_USAGE); SWITCH_ADD_API(commands_api_interface, "vm_fsdb_pref_recname_set", "vm_fsdb_pref_recname_set", vm_fsdb_pref_recname_set_function, VM_FSDB_PREF_RECNAME_SET_USAGE); SWITCH_ADD_API(commands_api_interface, "vm_fsdb_pref_password_set", "vm_fsdb_pref_password_set", vm_fsdb_pref_password_set_function, VM_FSDB_PREF_PASSWORD_SET_USAGE); diff --git a/src/mod/applications/mod_voicemail_ivr/config.c b/src/mod/applications/mod_voicemail_ivr/config.c index 1066a5c6ce..3561c9edc5 100644 --- a/src/mod/applications/mod_voicemail_ivr/config.c +++ b/src/mod/applications/mod_voicemail_ivr/config.c @@ -86,7 +86,7 @@ void menu_init(vmivr_profile_t *profile, vmivr_menu_t *menu) { if ((x_phrases = switch_xml_child(x_menu, "phrases"))) { switch_event_import_xml(switch_xml_child(x_phrases, "phrase"), "name", "value", &menu->event_phrases); } - if ((x_settings = switch_xml_child(x_profile, "settings"))) { + if ((x_settings = switch_xml_child(x_menu, "settings"))) { switch_event_import_xml(switch_xml_child(x_settings, "param"), "name", "value", &menu->event_settings); } @@ -114,6 +114,7 @@ void menu_instance_init(vmivr_menu_t *menu) { void menu_instance_free(vmivr_menu_t *menu) { if (menu->phrase_params) { switch_event_destroy(&menu->phrase_params); + menu->phrase_params = NULL; } memset(&menu->ivre_d, 0, sizeof(menu->ivre_d)); } @@ -244,6 +245,8 @@ vmivr_profile_t *get_profile(switch_core_session_t *session, const char *profile profile->api_msg_forward = switch_core_session_strdup(session, val); else if (!strcasecmp(var, "pref_greeting_set") && !profile->api_pref_greeting_set) profile->api_pref_greeting_set = switch_core_session_strdup(session, val); + else if (!strcasecmp(var, "pref_greeting_get") && !profile->api_pref_greeting_get) + profile->api_pref_greeting_get = switch_core_session_strdup(session, val); else if (!strcasecmp(var, "pref_recname_set") && !profile->api_pref_recname_set) profile->api_pref_recname_set = switch_core_session_strdup(session, val); else if (!strcasecmp(var, "pref_password_set") && !profile->api_pref_password_set) @@ -255,7 +258,7 @@ vmivr_profile_t *get_profile(switch_core_session_t *session, const char *profile total_options++; } } - if (total_options - total_invalid_options != 12) { + if (total_options - total_invalid_options != 13) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing api definition for profile '%s'\n", profile_name); profile = NULL; } diff --git a/src/mod/applications/mod_voicemail_ivr/config.h b/src/mod/applications/mod_voicemail_ivr/config.h index 9d3b63d584..fbd5803b3b 100644 --- a/src/mod/applications/mod_voicemail_ivr/config.h +++ b/src/mod/applications/mod_voicemail_ivr/config.h @@ -70,6 +70,7 @@ struct vmivr_profile { const char *api_msg_get; const char *api_msg_forward; const char *api_pref_greeting_set; + const char *api_pref_greeting_get; const char *api_pref_recname_set; const char *api_pref_password_set; diff --git a/src/mod/applications/mod_voicemail_ivr/menu.c b/src/mod/applications/mod_voicemail_ivr/menu.c index 4442b23e53..f307899b95 100644 --- a/src/mod/applications/mod_voicemail_ivr/menu.c +++ b/src/mod/applications/mod_voicemail_ivr/menu.c @@ -73,6 +73,7 @@ void vmivr_menu_main(switch_core_session_t *session, vmivr_profile_t *profile) { switch_channel_t *channel = switch_core_session_get_channel(session); vmivr_menu_t menu = { "std_main_menu" }; int retry; + switch_bool_t action_on_new_message_occured = SWITCH_FALSE; /* Initialize Menu Configs */ menu_init(profile, &menu); @@ -84,6 +85,8 @@ void vmivr_menu_main(switch_core_session_t *session, vmivr_profile_t *profile) { for (retry = menu.ivr_maximum_attempts; switch_channel_ready(channel) && retry > 0; retry--) { char *cmd = NULL; + const char *action = NULL; + const char *action_on_new_message = switch_event_get_header(menu.event_settings, "Action-On-New-Message"); menu_instance_init(&menu); @@ -93,17 +96,26 @@ void vmivr_menu_main(switch_core_session_t *session, vmivr_profile_t *profile) { cmd = switch_core_session_sprintf(session, "json %s %s %s %s", profile->api_profile, profile->domain, profile->id, profile->folder_name); jsonapi2event(session, menu.phrase_params, profile->api_msg_count, cmd); - //initial_count_played = SWITCH_TRUE; + ivre_playback(session, &menu.ivre_d, switch_event_get_header(menu.event_phrases, "msg_count"), NULL, menu.phrase_params, NULL, 0); - ivre_playback(session, &menu.ivre_d, switch_event_get_header(menu.event_phrases, "menu_options"), NULL, menu.phrase_params, NULL, menu.ivr_entry_timeout); + if (atoi(switch_event_get_header(menu.phrase_params, "VM-Total-New-Messages")) > 0 && menu.ivre_d.result == RES_WAITFORMORE && !action_on_new_message_occured && action_on_new_message) { + menu.ivre_d.result = RES_FOUND; + action = action_on_new_message; + action_on_new_message_occured = SWITCH_TRUE; + + } else { + ivre_playback(session, &menu.ivre_d, switch_event_get_header(menu.event_phrases, "menu_options"), NULL, menu.phrase_params, NULL, menu.ivr_entry_timeout); + } if (menu.ivre_d.result == RES_TIMEOUT) { ivre_playback_dtmf_buffered(session, switch_event_get_header(menu.event_phrases, "timeout"), NULL, NULL, NULL, 0); } else if (menu.ivre_d.result == RES_INVALID) { ivre_playback_dtmf_buffered(session, switch_event_get_header(menu.event_phrases, "invalid"), NULL, NULL, NULL, 0); } else if (menu.ivre_d.result == RES_FOUND) { /* Matching DTMF Key Pressed */ - const char *action = switch_event_get_header(menu.event_keys_dtmf, menu.ivre_d.dtmf_stored); + if (!action) { + action = switch_event_get_header(menu.event_keys_dtmf, menu.ivre_d.dtmf_stored); + } /* Reset the try count */ retry = menu.ivr_maximum_attempts; @@ -577,7 +589,19 @@ void vmivr_menu_select_greeting_slot(switch_core_session_t *session, vmivr_profi char * cmd = switch_core_session_sprintf(session, "%s %s %s %d", profile->api_profile, profile->domain, profile->id, gnum); if (vmivr_api_execute(session, profile->api_pref_greeting_set, cmd) == SWITCH_STATUS_SUCCESS) { char *str_num = switch_core_session_sprintf(session, "%d", gnum); - ivre_playback_dtmf_buffered(session, switch_event_get_header(menu.event_phrases, "selected_slot"), str_num, NULL, NULL, 0); + char *cmd = switch_core_session_sprintf(session, "json %s %s %s %d %s", profile->api_profile, profile->domain, profile->id); + switch_event_t *phrases = jsonapi2event(session, NULL, profile->api_pref_greeting_get, cmd); + + ivre_playback_dtmf_buffered(session, switch_event_get_header(menu.event_phrases, "selected_slot"), str_num, phrases, NULL, 0); + + if (switch_true(switch_event_get_header(phrases, "VM-Message-Private-Local-Copy"))) { + const char *file_path = switch_event_get_header(phrases, "VM-Preference-Greeting-File-Path"); + if (file_path && unlink(file_path) != 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to delete temp file [%s]\n", file_path); + } + } + + switch_event_destroy(&phrases); } else { ivre_playback_dtmf_buffered(session, switch_event_get_header(menu.event_phrases, "invalid_slot"), NULL, NULL, NULL, 0); }