From 5542d040a2de7e2757f080d2c3b64e8999a46ded Mon Sep 17 00:00:00 2001 From: Marc Olivier Chouinard Date: Thu, 24 Jan 2013 00:04:34 -0500 Subject: [PATCH] mod_voicemail: Add new vm_fsdb_pref_greeting_get mod_voicemail_ivr: Added the new param for API vm_fsdb_pref_greeting_get WARNING, you must add it to the config or else module will complain of missing value... With the new API, it will now playback the greeting when setting it. Will need to figure out a better way to deal with api being added in the future... Add support to auto start new message playback and made it default in the config file. mod_voicemail_ivr phrases : make value = 0 as plural (0 messages). Don't tell the option for new message if no new message present. Changes a few default key to match more closely mod_voicemail key settings. --- .../autoload_configs/voicemail_ivr.conf.xml | 17 +++-- conf/vanilla/lang/en/vm/voicemail_ivr.xml | 15 +++- .../mod_voicemail/mod_voicemail.c | 73 +++++++++++++++++++ .../applications/mod_voicemail_ivr/config.c | 7 +- .../applications/mod_voicemail_ivr/config.h | 1 + src/mod/applications/mod_voicemail_ivr/menu.c | 32 +++++++- 6 files changed, 129 insertions(+), 16 deletions(-) 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); }