From 87eaf2b892d0a17911a960b3b66cf891392313c9 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Wed, 26 Dec 2007 17:37:13 +0000 Subject: [PATCH] reformat code. git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6984 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- .../mod_voicemail/mod_voicemail.c | 4046 ++++++++--------- 1 file changed, 2023 insertions(+), 2023 deletions(-) diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c index 5a1b0adc26..e1ebc44a88 100644 --- a/src/mod/applications/mod_voicemail/mod_voicemail.c +++ b/src/mod/applications/mod_voicemail/mod_voicemail.c @@ -46,61 +46,61 @@ SWITCH_MODULE_DEFINITION(mod_voicemail, mod_voicemail_load, NULL, NULL); static struct { switch_hash_t *profile_hash; - int debug; - switch_memory_pool_t *pool; + int debug; + switch_memory_pool_t *pool; } globals; struct vm_profile { - char *name; - char *dbname; + char *name; + char *dbname; char *odbc_dsn; char *odbc_user; char *odbc_pass; - char terminator_key[2]; - char play_new_messages_key[2]; - char play_saved_messages_key[2]; + char terminator_key[2]; + char play_new_messages_key[2]; + char play_saved_messages_key[2]; - char main_menu_key[2]; - char config_menu_key[2]; - char record_greeting_key[2]; - char choose_greeting_key[2]; - char record_name_key[2]; - - char record_file_key[2]; - char listen_file_key[2]; - char save_file_key[2]; - char delete_file_key[2]; - char undelete_file_key[2]; - char email_key[2]; - char callback_key[2]; - char pause_key[2]; - char restart_key[2]; - char ff_key[2]; - char rew_key[2]; - char urgent_key[2]; - char operator_key[2]; - char file_ext[10]; - char *record_title; - char *record_comment; - char *record_copyright; - char *operator_ext; - char *tone_spec; - char *storage_dir; - char *callback_dialplan; - char *callback_context; - char *email_body; - char *email_headers; - char *web_head; - char *web_tail; - char *email_from; - char *date_fmt; - uint32_t digit_timeout; - uint32_t max_login_attempts; - uint32_t max_record_len; - switch_mutex_t *mutex; - uint32_t record_threshold; - uint32_t record_silence_hits; - uint32_t record_sample_rate; + char main_menu_key[2]; + char config_menu_key[2]; + char record_greeting_key[2]; + char choose_greeting_key[2]; + char record_name_key[2]; + + char record_file_key[2]; + char listen_file_key[2]; + char save_file_key[2]; + char delete_file_key[2]; + char undelete_file_key[2]; + char email_key[2]; + char callback_key[2]; + char pause_key[2]; + char restart_key[2]; + char ff_key[2]; + char rew_key[2]; + char urgent_key[2]; + char operator_key[2]; + char file_ext[10]; + char *record_title; + char *record_comment; + char *record_copyright; + char *operator_ext; + char *tone_spec; + char *storage_dir; + char *callback_dialplan; + char *callback_context; + char *email_body; + char *email_headers; + char *web_head; + char *web_tail; + char *email_from; + char *date_fmt; + uint32_t digit_timeout; + uint32_t max_login_attempts; + uint32_t max_record_len; + switch_mutex_t *mutex; + uint32_t record_threshold; + uint32_t record_silence_hits; + uint32_t record_sample_rate; switch_odbc_handle_t *master_odbc; }; typedef struct vm_profile vm_profile_t; @@ -108,13 +108,13 @@ typedef struct vm_profile vm_profile_t; static switch_status_t vm_execute_sql(vm_profile_t *profile, char *sql, switch_mutex_t *mutex) { switch_core_db_t *db; - switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_status_t status = SWITCH_STATUS_SUCCESS; if (mutex) { switch_mutex_lock(mutex); } - if (profile->odbc_dsn) { + if (profile->odbc_dsn) { #ifdef SWITCH_HAVE_ODBC SQLHSTMT stmt; if (switch_odbc_handle_exec(profile->master_odbc, sql, &stmt) != SWITCH_ODBC_SUCCESS) { @@ -122,43 +122,43 @@ static switch_status_t vm_execute_sql(vm_profile_t *profile, char *sql, switch_m err_str = switch_odbc_handle_get_error(profile->master_odbc, stmt); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERR: [%s]\n[%s]\n", sql, switch_str_nil(err_str)); switch_safe_free(err_str); - status = SWITCH_STATUS_FALSE; + status = SWITCH_STATUS_FALSE; } SQLFreeHandle(SQL_HANDLE_STMT, stmt); #endif } else { if (!(db = switch_core_db_open_file(profile->dbname))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", profile->dbname); - status = SWITCH_STATUS_FALSE; + status = SWITCH_STATUS_FALSE; goto end; } status = switch_core_db_persistant_execute(db, sql, 1); switch_core_db_close(db); - } + } - end: +end: if (mutex) { switch_mutex_unlock(mutex); } - return status; + return status; } static switch_bool_t vm_execute_sql_callback(vm_profile_t *profile, - switch_mutex_t *mutex, - char *sql, - switch_core_db_callback_func_t callback, - void *pdata) + switch_mutex_t *mutex, + char *sql, + switch_core_db_callback_func_t callback, + void *pdata) { switch_bool_t ret = SWITCH_FALSE; switch_core_db_t *db; char *errmsg = NULL; - - if (mutex) { - switch_mutex_lock(mutex); - } - if (profile->odbc_dsn) { + if (mutex) { + switch_mutex_lock(mutex); + } + + if (profile->odbc_dsn) { #ifdef SWITCH_HAVE_ODBC switch_odbc_handle_callback_exec(profile->master_odbc, sql, callback, pdata); #endif @@ -178,12 +178,12 @@ static switch_bool_t vm_execute_sql_callback(vm_profile_t *profile, if (db) { switch_core_db_close(db); } - } + } - end: +end: if (mutex) { - switch_mutex_unlock(mutex); - } + switch_mutex_unlock(mutex); + } return ret; } @@ -219,19 +219,19 @@ static switch_status_t load_config(void) switch_xml_t cfg, xml, settings, param, x_profile, x_profiles, x_email; memset(&globals, 0, sizeof(globals)); - switch_core_new_memory_pool(&globals.pool); + switch_core_new_memory_pool(&globals.pool); switch_core_hash_init(&globals.profile_hash, globals.pool); if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } - + if ((settings = switch_xml_child(cfg, "settings"))) { for (param = switch_xml_child(settings, "param"); param; param = param->next) { char *var = (char *) switch_xml_attr_soft(param, "name"); char *val = (char *) switch_xml_attr_soft(param, "value"); - + if (!strcasecmp(var, "debug")) { globals.debug = atoi(val); } @@ -239,307 +239,307 @@ static switch_status_t load_config(void) } if (!(x_profiles = switch_xml_child(cfg, "profiles"))) { - goto end; - } + goto end; + } - for (x_profile = switch_xml_child(x_profiles, "profile"); x_profile; x_profile = x_profile->next) { - char *name = (char *) switch_xml_attr_soft(x_profile, "name"); - char *odbc_dsn = NULL, *odbc_user = NULL, *odbc_pass = NULL; - char *terminator_key = "#"; - char *play_new_messages_key = "1"; - char *play_saved_messages_key = "2"; - - char *main_menu_key = "0"; - char *config_menu_key = "5"; - char *record_greeting_key = "1"; - char *choose_greeting_key = "2"; - char *record_name_key = "3"; - - char *record_file_key = "3"; - char *listen_file_key = "1"; - char *save_file_key = "2"; - char *delete_file_key = "7"; - char *undelete_file_key = "8"; - char *email_key = "4"; - char *callback_key = "5"; - char *pause_key = "0"; - char *restart_key = "1"; - char *ff_key = "6"; - char *rew_key = "4"; - char *urgent_key = "*"; - char *operator_key = ""; - char *operator_ext = ""; - char *tone_spec = "%(1000, 0, 640)"; - char *file_ext = "wav"; - char *storage_dir = ""; - char *callback_dialplan = "XML"; - char *callback_context = "default"; - char *email_body = NULL; - char *email_headers = NULL; - char *email_from = ""; - char *date_fmt = "%A, %B %d %Y, %I %M %p"; - char *web_head = NULL; - char *web_tail = NULL; - uint32_t record_threshold = 200; - uint32_t record_silence_hits = 2; - uint32_t record_sample_rate = 0; + for (x_profile = switch_xml_child(x_profiles, "profile"); x_profile; x_profile = x_profile->next) { + char *name = (char *) switch_xml_attr_soft(x_profile, "name"); + char *odbc_dsn = NULL, *odbc_user = NULL, *odbc_pass = NULL; + char *terminator_key = "#"; + char *play_new_messages_key = "1"; + char *play_saved_messages_key = "2"; + + char *main_menu_key = "0"; + char *config_menu_key = "5"; + char *record_greeting_key = "1"; + char *choose_greeting_key = "2"; + char *record_name_key = "3"; + + char *record_file_key = "3"; + char *listen_file_key = "1"; + char *save_file_key = "2"; + char *delete_file_key = "7"; + char *undelete_file_key = "8"; + char *email_key = "4"; + char *callback_key = "5"; + char *pause_key = "0"; + char *restart_key = "1"; + char *ff_key = "6"; + char *rew_key = "4"; + char *urgent_key = "*"; + char *operator_key = ""; + char *operator_ext = ""; + char *tone_spec = "%(1000, 0, 640)"; + char *file_ext = "wav"; + char *storage_dir = ""; + char *callback_dialplan = "XML"; + char *callback_context = "default"; + char *email_body = NULL; + char *email_headers = NULL; + char *email_from = ""; + char *date_fmt = "%A, %B %d %Y, %I %M %p"; + char *web_head = NULL; + char *web_tail = NULL; + uint32_t record_threshold = 200; + uint32_t record_silence_hits = 2; + uint32_t record_sample_rate = 0; char *record_title = "FreeSWITCH Voicemail"; char *record_comment = "FreeSWITCH Voicemail"; char *record_copyright = "http://www.freeswitch.org"; - switch_core_db_t *db; - uint32_t timeout = 10000, max_login_attempts = 3, max_record_len = 300; - - db = NULL; + switch_core_db_t *db; + uint32_t timeout = 10000, max_login_attempts = 3, max_record_len = 300; - if ((x_email = switch_xml_child(x_profile, "email"))) { - if ((param = switch_xml_child(x_email, "body"))) { - email_body = switch_core_strdup(globals.pool, param->txt); - } + db = NULL; - if ((param = switch_xml_child(x_email, "headers"))) { - email_headers = switch_core_strdup(globals.pool, param->txt); - } + if ((x_email = switch_xml_child(x_profile, "email"))) { + if ((param = switch_xml_child(x_email, "body"))) { + email_body = switch_core_strdup(globals.pool, param->txt); + } + + if ((param = switch_xml_child(x_email, "headers"))) { + email_headers = switch_core_strdup(globals.pool, param->txt); + } for (param = switch_xml_child(x_email, "param"); param; param = param->next) { - char *var, *val; + char *var, *val; - var = (char *) switch_xml_attr_soft(param, "name"); - val = (char *) switch_xml_attr_soft(param, "value"); + var = (char *) switch_xml_attr_soft(param, "name"); + val = (char *) switch_xml_attr_soft(param, "value"); - if (!strcasecmp(var, "date-fmt") && !switch_strlen_zero(val)) { - date_fmt = val; - } else if (!strcasecmp(var, "email-from") && !switch_strlen_zero(val)) { - email_from = val; - } else if (!strcasecmp(var, "template-file") && !switch_strlen_zero(val)) { - switch_stream_handle_t stream = { 0 }; - int fd; - char *dpath = NULL; - char *path; - - if (switch_is_file_path(val)) { - path = val; - } else { - dpath = switch_mprintf("%s%s%s", - SWITCH_GLOBAL_dirs.conf_dir, - SWITCH_PATH_SEPARATOR, - val); - path = dpath; - } - - if ((fd = open(path, O_RDONLY)) > -1) { - char buf[2048]; - SWITCH_STANDARD_STREAM(stream); - while(switch_fd_read_line(fd, buf, sizeof(buf))) { - stream.write_function(&stream, "%s", buf); - } - close(fd); - email_headers = stream.data; - if ((email_body = strstr(email_headers, "\n\n"))) { - *email_body = '\0'; - email_body += 2; - } else if ((email_body = strstr(email_headers, "\r\n\r\n"))) { - *email_body = '\0'; - email_body += 4; - } - } - switch_safe_free(dpath); - } - } - } + if (!strcasecmp(var, "date-fmt") && !switch_strlen_zero(val)) { + date_fmt = val; + } else if (!strcasecmp(var, "email-from") && !switch_strlen_zero(val)) { + email_from = val; + } else if (!strcasecmp(var, "template-file") && !switch_strlen_zero(val)) { + switch_stream_handle_t stream = { 0 }; + int fd; + char *dpath = NULL; + char *path; + + if (switch_is_file_path(val)) { + path = val; + } else { + dpath = switch_mprintf("%s%s%s", + SWITCH_GLOBAL_dirs.conf_dir, + SWITCH_PATH_SEPARATOR, + val); + path = dpath; + } + + if ((fd = open(path, O_RDONLY)) > -1) { + char buf[2048]; + SWITCH_STANDARD_STREAM(stream); + while(switch_fd_read_line(fd, buf, sizeof(buf))) { + stream.write_function(&stream, "%s", buf); + } + close(fd); + email_headers = stream.data; + if ((email_body = strstr(email_headers, "\n\n"))) { + *email_body = '\0'; + email_body += 2; + } else if ((email_body = strstr(email_headers, "\r\n\r\n"))) { + *email_body = '\0'; + email_body += 4; + } + } + switch_safe_free(dpath); + } + } + } for (param = switch_xml_child(x_profile, "param"); param; param = param->next) { - char *var, *val; + char *var, *val; - var = (char *) switch_xml_attr_soft(param, "name"); - val = (char *) switch_xml_attr_soft(param, "value"); + var = (char *) switch_xml_attr_soft(param, "name"); + val = (char *) switch_xml_attr_soft(param, "value"); - if (!strcasecmp(var, "terminator-key") && !switch_strlen_zero(val)) { - terminator_key = val; - } else if (!strcasecmp(var, "web-template-file") && !switch_strlen_zero(val)) { - switch_stream_handle_t stream = { 0 }; - int fd; - char *dpath = NULL; - char *path; - - if (switch_is_file_path(val)) { - path = val; - } else { - dpath = switch_mprintf("%s%s%s", - SWITCH_GLOBAL_dirs.conf_dir, - SWITCH_PATH_SEPARATOR, - val); - path = dpath; - } - - if ((fd = open(path, O_RDONLY)) > -1) { - char buf[2048]; - SWITCH_STANDARD_STREAM(stream); - while(switch_fd_read_line(fd, buf, sizeof(buf))) { - stream.write_function(&stream, "%s", buf); - } - close(fd); - web_head = stream.data; - if ((web_tail = strstr(web_head, "\n"))) { - *web_tail = '\0'; - web_tail += 9; - } else if ((web_tail = strstr(web_head, "\r\n"))) { - *web_tail = '\0'; - web_tail += 10; - } - } - switch_safe_free(dpath); - } else if (!strcasecmp(var, "play-new-messages-key") && !switch_strlen_zero(val)) { - play_new_messages_key = val; - } else if (!strcasecmp(var, "play-saved-messages-key") && !switch_strlen_zero(val)) { - play_saved_messages_key = val; - } else if (!strcasecmp(var, "main-menu-key") && !switch_strlen_zero(val)) { - main_menu_key = val; - } else if (!strcasecmp(var, "config-menu-key") && !switch_strlen_zero(val)) { - config_menu_key = val; - } else if (!strcasecmp(var, "record-greeting-key") && !switch_strlen_zero(val)) { - record_greeting_key = val; - } else if (!strcasecmp(var, "choose-greeting-key") && !switch_strlen_zero(val)) { - choose_greeting_key = val; - } else if (!strcasecmp(var, "record-name-key") && !switch_strlen_zero(val)) { - record_name_key = val; - } else if (!strcasecmp(var, "listen-file-key") && !switch_strlen_zero(val)) { - listen_file_key = val; - } else if (!strcasecmp(var, "save-file-key") && !switch_strlen_zero(val)) { - save_file_key = val; - } else if (!strcasecmp(var, "delete-file-key") && !switch_strlen_zero(val)) { - delete_file_key = val; - } else if (!strcasecmp(var, "undelete-file-key") && !switch_strlen_zero(val)) { - undelete_file_key = val; - } else if (!strcasecmp(var, "email-key") && !switch_strlen_zero(val)) { - email_key = val; - } else if (!strcasecmp(var, "callback-key") && !switch_strlen_zero(val)) { - callback_key = val; - } else if (!strcasecmp(var, "pause-key") && !switch_strlen_zero(val)) { - pause_key = val; - } else if (!strcasecmp(var, "restart-key") && !switch_strlen_zero(val)) { - restart_key = val; - } else if (!strcasecmp(var, "ff-key") && !switch_strlen_zero(val)) { - ff_key = val; - } else if (!strcasecmp(var, "rew-key") && !switch_strlen_zero(val)) { - rew_key = val; - } else if (!strcasecmp(var, "urgent-key") && !switch_strlen_zero(val)) { - urgent_key = val; - } else if (!strcasecmp(var, "operator-key") && !switch_strlen_zero(val)) { - operator_key = val; - } else if (!strcasecmp(var, "operator-extension") && !switch_strlen_zero(val)) { - operator_ext = val; - } else if (!strcasecmp(var, "storage-dir") && !switch_strlen_zero(val)) { - storage_dir = val; - } else if (!strcasecmp(var, "callback-dialplan") && !switch_strlen_zero(val)) { - callback_dialplan = val; - } else if (!strcasecmp(var, "callback-context") && !switch_strlen_zero(val)) { - callback_context = val; - } else if (!strcasecmp(var, "file-extension")) { - file_ext = val; - } else if (!strcasecmp(var, "record-title") && !switch_strlen_zero(val)) { - record_title = val; - } else if (!strcasecmp(var, "record-comment") && !switch_strlen_zero(val)) { - record_comment = val; - } else if (!strcasecmp(var, "record-copyright") && !switch_strlen_zero(val)) { - record_copyright = val; - } else if (!strcasecmp(var, "record-silence-threshold")) { - int tmp = 0; - if (!switch_strlen_zero(val)) { - tmp = atoi(val); - } - if (tmp >= 0 && tmp <= 10000) { - record_threshold = tmp; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid threshold value [%s] must be between 0 and 10000 ms\n", val); - } - } else if (!strcasecmp(var, "record-sample-rate")) { - int tmp = 0; - if (!switch_strlen_zero(val)) { - tmp = atoi(val); - } - if (tmp == 8000 || tmp == 16000 || tmp == 32000 || tmp == 11025 || tmp == 22050 || tmp == 44100) { - record_sample_rate = tmp; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid samplerate %s\n", val); - } - } else if (!strcasecmp(var, "record-silence-hits")) { - int tmp = 0; - if (!switch_strlen_zero(val)) { - tmp = atoi(val); - } - if (tmp >= 0 && tmp <= 1000) { - record_silence_hits = tmp; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid threshold value [%s] must be between 0 and 1000 ms\n", val); - } - } else if (!strcasecmp(var, "tone-spec") && !switch_strlen_zero(val)) { - tone_spec = val; - } else if (!strcasecmp(var, "digit-timeout")) { - int tmp = 0; - if (!switch_strlen_zero(val)) { - tmp = atoi(val); - } - if (tmp >= 1000 && tmp <= 30000) { - timeout = tmp; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid timeout value [%s] must be between 1000 and 30000 ms\n", val); - } - } else if (!strcasecmp(var, "max-login-attempts")) { - int tmp = 0; - if (!switch_strlen_zero(val)) { - tmp = atoi(val); - } - if (tmp > 0 && tmp < 11) { - max_login_attempts = tmp; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid attempts [%s] must be between 1 and 10 ms\n", val); - } - } else if (!strcasecmp(var, "max-record-len")) { - int tmp = 0; - if (!switch_strlen_zero(val)) { - tmp = atoi(val); - } - if (tmp > 0 && tmp < 10000) { - max_record_len = tmp; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid attempts [%s] must be between 1 and 10000s\n", val); - } - } else if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) { + if (!strcasecmp(var, "terminator-key") && !switch_strlen_zero(val)) { + terminator_key = val; + } else if (!strcasecmp(var, "web-template-file") && !switch_strlen_zero(val)) { + switch_stream_handle_t stream = { 0 }; + int fd; + char *dpath = NULL; + char *path; + + if (switch_is_file_path(val)) { + path = val; + } else { + dpath = switch_mprintf("%s%s%s", + SWITCH_GLOBAL_dirs.conf_dir, + SWITCH_PATH_SEPARATOR, + val); + path = dpath; + } + + if ((fd = open(path, O_RDONLY)) > -1) { + char buf[2048]; + SWITCH_STANDARD_STREAM(stream); + while(switch_fd_read_line(fd, buf, sizeof(buf))) { + stream.write_function(&stream, "%s", buf); + } + close(fd); + web_head = stream.data; + if ((web_tail = strstr(web_head, "\n"))) { + *web_tail = '\0'; + web_tail += 9; + } else if ((web_tail = strstr(web_head, "\r\n"))) { + *web_tail = '\0'; + web_tail += 10; + } + } + switch_safe_free(dpath); + } else if (!strcasecmp(var, "play-new-messages-key") && !switch_strlen_zero(val)) { + play_new_messages_key = val; + } else if (!strcasecmp(var, "play-saved-messages-key") && !switch_strlen_zero(val)) { + play_saved_messages_key = val; + } else if (!strcasecmp(var, "main-menu-key") && !switch_strlen_zero(val)) { + main_menu_key = val; + } else if (!strcasecmp(var, "config-menu-key") && !switch_strlen_zero(val)) { + config_menu_key = val; + } else if (!strcasecmp(var, "record-greeting-key") && !switch_strlen_zero(val)) { + record_greeting_key = val; + } else if (!strcasecmp(var, "choose-greeting-key") && !switch_strlen_zero(val)) { + choose_greeting_key = val; + } else if (!strcasecmp(var, "record-name-key") && !switch_strlen_zero(val)) { + record_name_key = val; + } else if (!strcasecmp(var, "listen-file-key") && !switch_strlen_zero(val)) { + listen_file_key = val; + } else if (!strcasecmp(var, "save-file-key") && !switch_strlen_zero(val)) { + save_file_key = val; + } else if (!strcasecmp(var, "delete-file-key") && !switch_strlen_zero(val)) { + delete_file_key = val; + } else if (!strcasecmp(var, "undelete-file-key") && !switch_strlen_zero(val)) { + undelete_file_key = val; + } else if (!strcasecmp(var, "email-key") && !switch_strlen_zero(val)) { + email_key = val; + } else if (!strcasecmp(var, "callback-key") && !switch_strlen_zero(val)) { + callback_key = val; + } else if (!strcasecmp(var, "pause-key") && !switch_strlen_zero(val)) { + pause_key = val; + } else if (!strcasecmp(var, "restart-key") && !switch_strlen_zero(val)) { + restart_key = val; + } else if (!strcasecmp(var, "ff-key") && !switch_strlen_zero(val)) { + ff_key = val; + } else if (!strcasecmp(var, "rew-key") && !switch_strlen_zero(val)) { + rew_key = val; + } else if (!strcasecmp(var, "urgent-key") && !switch_strlen_zero(val)) { + urgent_key = val; + } else if (!strcasecmp(var, "operator-key") && !switch_strlen_zero(val)) { + operator_key = val; + } else if (!strcasecmp(var, "operator-extension") && !switch_strlen_zero(val)) { + operator_ext = val; + } else if (!strcasecmp(var, "storage-dir") && !switch_strlen_zero(val)) { + storage_dir = val; + } else if (!strcasecmp(var, "callback-dialplan") && !switch_strlen_zero(val)) { + callback_dialplan = val; + } else if (!strcasecmp(var, "callback-context") && !switch_strlen_zero(val)) { + callback_context = val; + } else if (!strcasecmp(var, "file-extension")) { + file_ext = val; + } else if (!strcasecmp(var, "record-title") && !switch_strlen_zero(val)) { + record_title = val; + } else if (!strcasecmp(var, "record-comment") && !switch_strlen_zero(val)) { + record_comment = val; + } else if (!strcasecmp(var, "record-copyright") && !switch_strlen_zero(val)) { + record_copyright = val; + } else if (!strcasecmp(var, "record-silence-threshold")) { + int tmp = 0; + if (!switch_strlen_zero(val)) { + tmp = atoi(val); + } + if (tmp >= 0 && tmp <= 10000) { + record_threshold = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid threshold value [%s] must be between 0 and 10000 ms\n", val); + } + } else if (!strcasecmp(var, "record-sample-rate")) { + int tmp = 0; + if (!switch_strlen_zero(val)) { + tmp = atoi(val); + } + if (tmp == 8000 || tmp == 16000 || tmp == 32000 || tmp == 11025 || tmp == 22050 || tmp == 44100) { + record_sample_rate = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid samplerate %s\n", val); + } + } else if (!strcasecmp(var, "record-silence-hits")) { + int tmp = 0; + if (!switch_strlen_zero(val)) { + tmp = atoi(val); + } + if (tmp >= 0 && tmp <= 1000) { + record_silence_hits = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid threshold value [%s] must be between 0 and 1000 ms\n", val); + } + } else if (!strcasecmp(var, "tone-spec") && !switch_strlen_zero(val)) { + tone_spec = val; + } else if (!strcasecmp(var, "digit-timeout")) { + int tmp = 0; + if (!switch_strlen_zero(val)) { + tmp = atoi(val); + } + if (tmp >= 1000 && tmp <= 30000) { + timeout = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid timeout value [%s] must be between 1000 and 30000 ms\n", val); + } + } else if (!strcasecmp(var, "max-login-attempts")) { + int tmp = 0; + if (!switch_strlen_zero(val)) { + tmp = atoi(val); + } + if (tmp > 0 && tmp < 11) { + max_login_attempts = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid attempts [%s] must be between 1 and 10 ms\n", val); + } + } else if (!strcasecmp(var, "max-record-len")) { + int tmp = 0; + if (!switch_strlen_zero(val)) { + tmp = atoi(val); + } + if (tmp > 0 && tmp < 10000) { + max_record_len = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid attempts [%s] must be between 1 and 10000s\n", val); + } + } else if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) { #ifdef SWITCH_HAVE_ODBC - odbc_dsn = switch_core_strdup(globals.pool, val); - if ((odbc_user = strchr(odbc_dsn, ':'))) { - *odbc_user++ = '\0'; - if ((odbc_pass = strchr(odbc_user, ':'))) { - *odbc_pass++ = '\0'; - } - } + odbc_dsn = switch_core_strdup(globals.pool, val); + if ((odbc_user = strchr(odbc_dsn, ':'))) { + *odbc_user++ = '\0'; + if ((odbc_pass = strchr(odbc_user, ':'))) { + *odbc_pass++ = '\0'; + } + } #else - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n"); #endif - } - } - - if (switch_strlen_zero(name)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No name specified.\n"); - } else { - profile = switch_core_alloc(globals.pool, sizeof(*profile)); - profile->name = switch_core_strdup(globals.pool, name); + } + } - if (!switch_strlen_zero(odbc_dsn) && !switch_strlen_zero(odbc_user) && !switch_strlen_zero(odbc_pass)) { - profile->odbc_dsn = odbc_dsn; - profile->odbc_user = odbc_user; - profile->odbc_pass = odbc_pass; - } else { - profile->dbname = switch_core_sprintf(globals.pool, "voicemail_%s", name); - } + if (switch_strlen_zero(name)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No name specified.\n"); + } else { + profile = switch_core_alloc(globals.pool, sizeof(*profile)); + profile->name = switch_core_strdup(globals.pool, name); + + if (!switch_strlen_zero(odbc_dsn) && !switch_strlen_zero(odbc_user) && !switch_strlen_zero(odbc_pass)) { + profile->odbc_dsn = odbc_dsn; + profile->odbc_user = odbc_user; + profile->odbc_pass = odbc_pass; + } else { + profile->dbname = switch_core_sprintf(globals.pool, "voicemail_%s", name); + } if (profile->odbc_dsn) { #ifdef SWITCH_HAVE_ODBC if (!(profile->master_odbc = switch_odbc_handle_new(profile->odbc_dsn, profile->odbc_user, profile->odbc_pass))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n"); continue; - + } if (switch_odbc_handle_connect(profile->master_odbc) != SWITCH_ODBC_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n"); @@ -548,14 +548,14 @@ static switch_status_t load_config(void) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected ODBC DSN: %s\n", profile->odbc_dsn); if (switch_odbc_handle_exec(profile->master_odbc, "select count(message_len) from voicemail_data", NULL) != SWITCH_ODBC_SUCCESS) { - switch_odbc_handle_exec(profile->master_odbc, "drop table voicemail_data", NULL); - switch_odbc_handle_exec(profile->master_odbc, vm_sql, NULL); - } + switch_odbc_handle_exec(profile->master_odbc, "drop table voicemail_data", NULL); + switch_odbc_handle_exec(profile->master_odbc, vm_sql, NULL); + } if (switch_odbc_handle_exec(profile->master_odbc, "select count(user) from voicemail_prefs", NULL) != SWITCH_ODBC_SUCCESS) { - switch_odbc_handle_exec(profile->master_odbc, "drop table voicemail_data", NULL); - switch_odbc_handle_exec(profile->master_odbc, vm_pref_sql, NULL); - } + switch_odbc_handle_exec(profile->master_odbc, "drop table voicemail_data", NULL); + switch_odbc_handle_exec(profile->master_odbc, vm_pref_sql, NULL); + } #endif } else { if ((db = switch_core_db_open_file(profile->dbname))) { @@ -568,61 +568,61 @@ static switch_status_t load_config(void) switch_core_db_close(db); } - profile->web_head = web_head; - profile->web_tail = web_tail; + profile->web_head = web_head; + profile->web_tail = web_tail; - profile->email_body = email_body; - profile->email_headers = email_headers; - profile->email_from = email_from; - profile->date_fmt = date_fmt; + profile->email_body = email_body; + profile->email_headers = email_headers; + profile->email_from = email_from; + profile->date_fmt = date_fmt; - profile->digit_timeout = timeout; - profile->max_login_attempts = max_login_attempts; - profile->max_record_len = max_record_len; - *profile->terminator_key = *terminator_key; - *profile->play_new_messages_key = *play_new_messages_key; - *profile->play_saved_messages_key = *play_saved_messages_key; - *profile->main_menu_key = *main_menu_key; - *profile->config_menu_key = *config_menu_key; - *profile->record_greeting_key = *record_greeting_key; - *profile->choose_greeting_key = *choose_greeting_key; - *profile->record_name_key = *record_name_key; - *profile->record_file_key = *record_file_key; - *profile->listen_file_key = *listen_file_key; - *profile->save_file_key = *save_file_key; - *profile->delete_file_key = *delete_file_key; - *profile->undelete_file_key = *undelete_file_key; - *profile->email_key = *email_key; - *profile->callback_key = *callback_key; - *profile->pause_key = *pause_key; - *profile->restart_key = *restart_key; - *profile->ff_key = *ff_key; - *profile->rew_key = *rew_key; - *profile->urgent_key = *urgent_key; - *profile->operator_key = *operator_key; - profile->record_threshold = record_threshold; - profile->record_silence_hits = record_silence_hits; - profile->record_sample_rate = record_sample_rate; + profile->digit_timeout = timeout; + profile->max_login_attempts = max_login_attempts; + profile->max_record_len = max_record_len; + *profile->terminator_key = *terminator_key; + *profile->play_new_messages_key = *play_new_messages_key; + *profile->play_saved_messages_key = *play_saved_messages_key; + *profile->main_menu_key = *main_menu_key; + *profile->config_menu_key = *config_menu_key; + *profile->record_greeting_key = *record_greeting_key; + *profile->choose_greeting_key = *choose_greeting_key; + *profile->record_name_key = *record_name_key; + *profile->record_file_key = *record_file_key; + *profile->listen_file_key = *listen_file_key; + *profile->save_file_key = *save_file_key; + *profile->delete_file_key = *delete_file_key; + *profile->undelete_file_key = *undelete_file_key; + *profile->email_key = *email_key; + *profile->callback_key = *callback_key; + *profile->pause_key = *pause_key; + *profile->restart_key = *restart_key; + *profile->ff_key = *ff_key; + *profile->rew_key = *rew_key; + *profile->urgent_key = *urgent_key; + *profile->operator_key = *operator_key; + profile->record_threshold = record_threshold; + profile->record_silence_hits = record_silence_hits; + profile->record_sample_rate = record_sample_rate; - profile->operator_ext = switch_core_strdup(globals.pool, operator_ext); - profile->storage_dir = switch_core_strdup(globals.pool, storage_dir); - profile->tone_spec = switch_core_strdup(globals.pool, tone_spec); - profile->callback_dialplan = switch_core_strdup(globals.pool, callback_dialplan); - profile->callback_context = switch_core_strdup(globals.pool, callback_context); + profile->operator_ext = switch_core_strdup(globals.pool, operator_ext); + profile->storage_dir = switch_core_strdup(globals.pool, storage_dir); + profile->tone_spec = switch_core_strdup(globals.pool, tone_spec); + profile->callback_dialplan = switch_core_strdup(globals.pool, callback_dialplan); + profile->callback_context = switch_core_strdup(globals.pool, callback_context); - profile->record_title = switch_core_strdup(globals.pool, record_title); - profile->record_comment = switch_core_strdup(globals.pool, record_comment); - profile->record_copyright = switch_core_strdup(globals.pool, record_copyright); + profile->record_title = switch_core_strdup(globals.pool, record_title); + profile->record_comment = switch_core_strdup(globals.pool, record_comment); + profile->record_copyright = switch_core_strdup(globals.pool, record_copyright); - switch_copy_string(profile->file_ext, file_ext, sizeof(profile->file_ext)); - switch_mutex_init(&profile->mutex, SWITCH_MUTEX_NESTED, globals.pool); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added Profile %s\n", profile->name); - switch_core_hash_insert(globals.profile_hash, profile->name, profile); - } - } - - end: + switch_copy_string(profile->file_ext, file_ext, sizeof(profile->file_ext)); + switch_mutex_init(&profile->mutex, SWITCH_MUTEX_NESTED, globals.pool); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added Profile %s\n", profile->name); + switch_core_hash_insert(globals.profile_hash, profile->name, profile); + } + } + +end: switch_xml_free(xml); return SWITCH_STATUS_SUCCESS; } @@ -632,15 +632,15 @@ static switch_status_t cancel_on_dtmf(switch_core_session_t *session, void *inpu { switch (itype) { case SWITCH_INPUT_TYPE_DTMF: - { - switch_dtmf_t *dtmf = (switch_dtmf_t *) input; - if (buf && buflen) { - char *bp = (char *) buf; - bp[0] = dtmf->digit; - bp[1] = '\0'; - } - return SWITCH_STATUS_BREAK; - } + { + switch_dtmf_t *dtmf = (switch_dtmf_t *) input; + if (buf && buflen) { + char *bp = (char *) buf; + bp[0] = dtmf->digit; + bp[1] = '\0'; + } + return SWITCH_STATUS_BREAK; + } break; default: break; @@ -651,10 +651,10 @@ static switch_status_t cancel_on_dtmf(switch_core_session_t *session, void *inpu struct call_control { - vm_profile_t *profile; - switch_file_handle_t *fh; - char buf[4]; - int noexit; + vm_profile_t *profile; + switch_file_handle_t *fh; + char buf[4]; + int noexit; }; typedef struct call_control cc_t; @@ -662,60 +662,60 @@ static switch_status_t control_playback(switch_core_session_t *session, void *in { switch (itype) { case SWITCH_INPUT_TYPE_DTMF: - { - switch_dtmf_t *dtmf = (switch_dtmf_t *) input; - cc_t *cc = (cc_t *) buf; - switch_file_handle_t *fh = cc->fh; - uint32_t pos = 0; + { + switch_dtmf_t *dtmf = (switch_dtmf_t *) input; + cc_t *cc = (cc_t *) buf; + switch_file_handle_t *fh = cc->fh; + uint32_t pos = 0; - if (!cc->noexit && (dtmf->digit == *cc->profile->delete_file_key || dtmf->digit == *cc->profile->save_file_key || dtmf->digit == *cc->profile->terminator_key)) { - *cc->buf = dtmf->digit; - return SWITCH_STATUS_BREAK; - } + if (!cc->noexit && (dtmf->digit == *cc->profile->delete_file_key || dtmf->digit == *cc->profile->save_file_key || dtmf->digit == *cc->profile->terminator_key)) { + *cc->buf = dtmf->digit; + return SWITCH_STATUS_BREAK; + } - if (!(fh && fh->file_interface && switch_test_flag(fh, SWITCH_FILE_OPEN))) { - return SWITCH_STATUS_SUCCESS; - } + if (!(fh && fh->file_interface && switch_test_flag(fh, SWITCH_FILE_OPEN))) { + return SWITCH_STATUS_SUCCESS; + } - if (dtmf->digit == *cc->profile->pause_key) { - if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) { - switch_clear_flag(fh, SWITCH_FILE_PAUSE); - } else { - switch_set_flag(fh, SWITCH_FILE_PAUSE); - } - return SWITCH_STATUS_SUCCESS; - } + if (dtmf->digit == *cc->profile->pause_key) { + if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) { + switch_clear_flag(fh, SWITCH_FILE_PAUSE); + } else { + switch_set_flag(fh, SWITCH_FILE_PAUSE); + } + return SWITCH_STATUS_SUCCESS; + } - if (dtmf->digit == *cc->profile->restart_key) { - unsigned int seekpos = 0; - fh->speed = 0; - switch_core_file_seek(fh, &seekpos, 0, SEEK_SET); - return SWITCH_STATUS_SUCCESS; - } + if (dtmf->digit == *cc->profile->restart_key) { + unsigned int seekpos = 0; + fh->speed = 0; + switch_core_file_seek(fh, &seekpos, 0, SEEK_SET); + return SWITCH_STATUS_SUCCESS; + } - if (dtmf->digit == *cc->profile->ff_key) { - int samps = 24000; - switch_core_file_seek(fh, &pos, samps, SEEK_CUR); - return SWITCH_STATUS_SUCCESS; - } + if (dtmf->digit == *cc->profile->ff_key) { + int samps = 24000; + switch_core_file_seek(fh, &pos, samps, SEEK_CUR); + return SWITCH_STATUS_SUCCESS; + } - if (dtmf->digit == *cc->profile->rew_key) { - int samps = 24000; - switch_core_file_seek(fh, &pos, fh->pos - samps, SEEK_SET); - return SWITCH_STATUS_SUCCESS; - } - } + if (dtmf->digit == *cc->profile->rew_key) { + int samps = 24000; + switch_core_file_seek(fh, &pos, fh->pos - samps, SEEK_SET); + return SWITCH_STATUS_SUCCESS; + } + } break; default: break; - } + } return SWITCH_STATUS_SUCCESS; } struct prefs_callback { - char name_path[255]; - char greeting_path[255]; + char name_path[255]; + char greeting_path[255]; }; typedef struct prefs_callback prefs_callback_t; @@ -725,19 +725,19 @@ static int prefs_callback(void *pArg, int argc, char **argv, char **columnNames) switch_copy_string(cbt->name_path, argv[2], sizeof(cbt->name_path)); switch_copy_string(cbt->greeting_path, argv[3], sizeof(cbt->greeting_path)); - + return 0; } typedef enum { - VM_CHECK_START, - VM_CHECK_AUTH, - VM_CHECK_MENU, - VM_CHECK_CONFIG, - VM_CHECK_PLAY_MESSAGES, - VM_CHECK_FOLDER_SUMMARY, - VM_CHECK_LISTEN + VM_CHECK_START, + VM_CHECK_AUTH, + VM_CHECK_MENU, + VM_CHECK_CONFIG, + VM_CHECK_PLAY_MESSAGES, + VM_CHECK_FOLDER_SUMMARY, + VM_CHECK_LISTEN } vm_check_state_t; #define VM_ACK_MACRO "voicemail_ack" @@ -770,60 +770,60 @@ typedef enum { #define NORMAL_FLAG_STRING "B_NORMAL" static switch_status_t vm_macro_get(switch_core_session_t *session, - char *macro, - char *macro_arg, - char *buf, - switch_size_t buflen, - switch_size_t maxlen, - char *term_chars, - char *terminator_key, - uint32_t timeout) + char *macro, + char *macro_arg, + char *buf, + switch_size_t buflen, + switch_size_t maxlen, + char *term_chars, + char *terminator_key, + uint32_t timeout) { - switch_input_args_t args = { 0 }, *ap = NULL; - switch_channel_t *channel; - switch_status_t status = SWITCH_STATUS_SUCCESS; - switch_size_t bslen; + switch_input_args_t args = { 0 }, *ap = NULL; + switch_channel_t *channel; + switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_size_t bslen; - channel = switch_core_session_get_channel(session); - switch_assert(channel != NULL); - - if (buf && buflen) { - memset(buf, 0, buflen); - args.input_callback = cancel_on_dtmf; - args.buf = buf; - args.buflen = (uint32_t)buflen; - ap = &args; - } + channel = switch_core_session_get_channel(session); + switch_assert(channel != NULL); - status = switch_ivr_phrase_macro(session, macro, macro_arg, NULL, ap); - - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - if (buf) { - memset(buf, 0, buflen); - } - return status; - } + if (buf && buflen) { + memset(buf, 0, buflen); + args.input_callback = cancel_on_dtmf; + args.buf = buf; + args.buflen = (uint32_t)buflen; + ap = &args; + } - if (!buf) { - return status; - } + status = switch_ivr_phrase_macro(session, macro, macro_arg, NULL, ap); - bslen = strlen(buf); + if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { + if (buf) { + memset(buf, 0, buflen); + } + return status; + } - if (maxlen == 0 || maxlen > buflen - 1) { - maxlen = buflen -1; - } - if (bslen < maxlen) { - status = switch_ivr_collect_digits_count(session, buf + bslen, buflen, maxlen - bslen, term_chars, terminator_key, timeout); - } + if (!buf) { + return status; + } - return status; + bslen = strlen(buf); + + if (maxlen == 0 || maxlen > buflen - 1) { + maxlen = buflen -1; + } + if (bslen < maxlen) { + status = switch_ivr_collect_digits_count(session, buf + bslen, buflen, maxlen - bslen, term_chars, terminator_key, timeout); + } + + return status; } struct callback { - char *buf; - size_t len; - int matches; + char *buf; + size_t len; + int matches; }; typedef struct callback callback_t; @@ -839,110 +839,110 @@ static int sql2str_callback(void *pArg, int argc, char **argv, char **columnName static int unlink_callback(void *pArg, int argc, char **argv, char **columnNames) { - if (argv[0]) { + if (argv[0]) { if (unlink(argv[0]) != 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "failed to delete file [%s]\n", argv[0]); } - } + } return 0; } typedef enum { - MSG_NONE, - MSG_NEW, - MSG_SAVED + MSG_NONE, + MSG_NEW, + MSG_SAVED } msg_type_t; static switch_status_t create_file(switch_core_session_t *session, vm_profile_t *profile, char *macro_name, char *file_path, switch_size_t *message_len) { - switch_channel_t *channel; - switch_status_t status = SWITCH_STATUS_SUCCESS; - switch_file_handle_t fh = { 0 }; - switch_input_args_t args = { 0 }; - char term; - char input[10] = "" , key_buf[80] = ""; - cc_t cc = { 0 }; - switch_codec_t *read_codec; - channel = switch_core_session_get_channel(session); - switch_assert(channel != NULL); - - read_codec = switch_core_session_get_read_codec(session); + switch_channel_t *channel; + switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_file_handle_t fh = { 0 }; + switch_input_args_t args = { 0 }; + char term; + char input[10] = "" , key_buf[80] = ""; + cc_t cc = { 0 }; + switch_codec_t *read_codec; + channel = switch_core_session_get_channel(session); + switch_assert(channel != NULL); - while(switch_channel_ready(channel)) { - - switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s", - profile->listen_file_key, - profile->save_file_key, - profile->record_file_key); + read_codec = switch_core_session_get_read_codec(session); - record_file: - args.input_callback = cancel_on_dtmf; - TRY_CODE(switch_ivr_phrase_macro(session, macro_name, NULL, NULL, NULL)); - TRY_CODE(switch_ivr_gentones(session, profile->tone_spec, 0, NULL)); + while(switch_channel_ready(channel)) { - memset(&fh, 0, sizeof(fh)); - fh.thresh = profile->record_threshold; - fh.silence_hits = profile->record_silence_hits; - fh.samplerate = profile->record_sample_rate; - switch_ivr_record_file(session, &fh, file_path, &args, profile->max_record_len); - *message_len = fh.sample_count / read_codec->implementation->actual_samples_per_second; - status = SWITCH_STATUS_SUCCESS; + switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s", + profile->listen_file_key, + profile->save_file_key, + profile->record_file_key); - play_file: - memset(&fh, 0, sizeof(fh)); - args.input_callback = control_playback; - memset(&cc, 0, sizeof(cc)); - cc.profile = profile; - cc.fh = &fh; - args.buf = &cc; - switch_ivr_play_file(session, &fh, file_path, &args); +record_file: + args.input_callback = cancel_on_dtmf; + TRY_CODE(switch_ivr_phrase_macro(session, macro_name, NULL, NULL, NULL)); + TRY_CODE(switch_ivr_gentones(session, profile->tone_spec, 0, NULL)); + + memset(&fh, 0, sizeof(fh)); + fh.thresh = profile->record_threshold; + fh.silence_hits = profile->record_silence_hits; + fh.samplerate = profile->record_sample_rate; + switch_ivr_record_file(session, &fh, file_path, &args, profile->max_record_len); + *message_len = fh.sample_count / read_codec->implementation->actual_samples_per_second; + status = SWITCH_STATUS_SUCCESS; + +play_file: + memset(&fh, 0, sizeof(fh)); + args.input_callback = control_playback; + memset(&cc, 0, sizeof(cc)); + cc.profile = profile; + cc.fh = &fh; + args.buf = &cc; + switch_ivr_play_file(session, &fh, file_path, &args); while(switch_channel_ready(channel)) { - if (*cc.buf) { - *input = *cc.buf; - *(input+1) = '\0'; - status = SWITCH_STATUS_SUCCESS; - *cc.buf = '\0'; - } else { - status = vm_macro_get(session, VM_RECORD_FILE_CHECK_MACRO, - key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); - } + if (*cc.buf) { + *input = *cc.buf; + *(input+1) = '\0'; + status = SWITCH_STATUS_SUCCESS; + *cc.buf = '\0'; + } else { + status = vm_macro_get(session, VM_RECORD_FILE_CHECK_MACRO, + key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); + } - if (!strcmp(input, profile->listen_file_key)) { - goto play_file; - } else if (!strcmp(input, profile->record_file_key)) { - goto record_file; - } else { - TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)); - goto end; - } - } - } - - end: - return status; + if (!strcmp(input, profile->listen_file_key)) { + goto play_file; + } else if (!strcmp(input, profile->record_file_key)) { + goto record_file; + } else { + TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)); + goto end; + } + } + } + +end: + return status; } struct listen_callback { - char created_epoch[255]; - char read_epoch[255]; - char user[255]; - char domain[255]; - char uuid[255]; - char cid_name[255]; - char cid_number[255]; - char in_folder[255]; - char file_path[255]; - char message_len[255]; - char flags[255]; - char read_flags[255]; - char *email; - int index; - int want; - msg_type_t type; + char created_epoch[255]; + char read_epoch[255]; + char user[255]; + char domain[255]; + char uuid[255]; + char cid_name[255]; + char cid_number[255]; + char in_folder[255]; + char file_path[255]; + char message_len[255]; + char flags[255]; + char read_flags[255]; + char *email; + int index; + int want; + msg_type_t type; }; typedef struct listen_callback listen_callback_t; @@ -950,11 +950,11 @@ static int listen_callback(void *pArg, int argc, char **argv, char **columnNames { listen_callback_t *cbt = (listen_callback_t *) pArg; - if (cbt->index++ != cbt->want) { - return 0; - } + if (cbt->index++ != cbt->want) { + return 0; + } - switch_copy_string(cbt->created_epoch, argv[0], 255); + switch_copy_string(cbt->created_epoch, argv[0], 255); switch_copy_string(cbt->read_epoch, argv[1], 255); switch_copy_string(cbt->user, argv[2], 255); switch_copy_string(cbt->domain, argv[3], 255); @@ -972,1049 +972,1049 @@ static int listen_callback(void *pArg, int argc, char **argv, char **columnNames static void message_count(vm_profile_t *profile, const char *myid, const char *domain_name, char *myfolder, - int *total_new_messages, int *total_saved_messages, int *total_new_urgent_messages, int *total_saved_urgent_messages) + int *total_new_messages, int *total_saved_messages, int *total_new_urgent_messages, int *total_saved_urgent_messages) { - char msg_count[80] = ""; - callback_t cbt = { 0 }; - char sql[256]; - - cbt.buf = msg_count; - cbt.len = sizeof(msg_count); + char msg_count[80] = ""; + callback_t cbt = { 0 }; + char sql[256]; + + cbt.buf = msg_count; + cbt.len = sizeof(msg_count); switch_snprintf(sql, sizeof(sql), - "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch=0", - myid, - domain_name, - myfolder); - vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); - *total_new_messages = atoi(msg_count); - - switch_snprintf(sql, sizeof(sql), - "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch=0 and read_flags='%s'", - myid, - domain_name, - myfolder, - URGENT_FLAG_STRING); - vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); - *total_new_urgent_messages = atoi(msg_count); - - switch_snprintf(sql, sizeof(sql), - "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0", - myid, - domain_name, - myfolder); - vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); - *total_saved_messages = atoi(msg_count); + "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch=0", + myid, + domain_name, + myfolder); + vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); + *total_new_messages = atoi(msg_count); switch_snprintf(sql, sizeof(sql), - "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0 and read_flags='%s'", - myid, - domain_name, - myfolder, - URGENT_FLAG_STRING); - vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); - *total_saved_urgent_messages = atoi(msg_count); + "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch=0 and read_flags='%s'", + myid, + domain_name, + myfolder, + URGENT_FLAG_STRING); + vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); + *total_new_urgent_messages = atoi(msg_count); + + switch_snprintf(sql, sizeof(sql), + "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0", + myid, + domain_name, + myfolder); + vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); + *total_saved_messages = atoi(msg_count); + + switch_snprintf(sql, sizeof(sql), + "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0 and read_flags='%s'", + myid, + domain_name, + myfolder, + URGENT_FLAG_STRING); + vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); + *total_saved_urgent_messages = atoi(msg_count); } static switch_status_t listen_file(switch_core_session_t *session, vm_profile_t *profile, listen_callback_t *cbt) { - switch_channel_t *channel; - switch_status_t status = SWITCH_STATUS_SUCCESS; - switch_input_args_t args = { 0 }; - char term; - char input[10] = "" , key_buf[80] = ""; - switch_file_handle_t fh = { 0 }; - cc_t cc = { 0 }; - channel = switch_core_session_get_channel(session); - switch_assert(channel != NULL); + switch_channel_t *channel; + switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_input_args_t args = { 0 }; + char term; + char input[10] = "" , key_buf[80] = ""; + switch_file_handle_t fh = { 0 }; + cc_t cc = { 0 }; + channel = switch_core_session_get_channel(session); + switch_assert(channel != NULL); if(switch_channel_ready(channel)) { - - args.input_callback = cancel_on_dtmf; + + args.input_callback = cancel_on_dtmf; switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s:%s", - profile->listen_file_key, - profile->save_file_key, - profile->delete_file_key, - profile->email_key, - profile->callback_key); + profile->listen_file_key, + profile->save_file_key, + profile->delete_file_key, + profile->email_key, + profile->callback_key); switch_snprintf(input, sizeof(input), "%s:%d", cbt->type == MSG_NEW ? "new" : "saved", cbt->want+1); - memset(&cc, 0, sizeof(cc)); - cc.profile = profile; - args.buf = &cc; - args.input_callback = control_playback; - TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_MESSAGE_NUMBER_MACRO, input, NULL, &args)); - if (!*cc.buf) { - TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_DATE_MACRO, cbt->created_epoch, NULL, &args)); - } - play_file: + memset(&cc, 0, sizeof(cc)); + cc.profile = profile; + args.buf = &cc; + args.input_callback = control_playback; + TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_MESSAGE_NUMBER_MACRO, input, NULL, &args)); + if (!*cc.buf) { + TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_DATE_MACRO, cbt->created_epoch, NULL, &args)); + } +play_file: - if (!*cc.buf) { - memset(&fh, 0, sizeof(fh)); - args.input_callback = control_playback; - memset(&cc, 0, sizeof(cc)); - cc.profile = profile; - cc.fh = &fh; - args.buf = &cc; - TRY_CODE(switch_ivr_play_file(session, NULL, cbt->file_path, &args)); - } + if (!*cc.buf) { + memset(&fh, 0, sizeof(fh)); + args.input_callback = control_playback; + memset(&cc, 0, sizeof(cc)); + cc.profile = profile; + cc.fh = &fh; + args.buf = &cc; + TRY_CODE(switch_ivr_play_file(session, NULL, cbt->file_path, &args)); + } - if (switch_channel_ready(channel)) { - if (*cc.buf) { - *input = *cc.buf; - *(input+1) = '\0'; - status = SWITCH_STATUS_SUCCESS; - *cc.buf = '\0'; - } else { - status = vm_macro_get(session, VM_LISTEN_FILE_CHECK_MACRO, - key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); - } - if (!strcmp(input, profile->listen_file_key)) { - goto play_file; - } else if (!strcmp(input, profile->callback_key)) { - switch_core_session_execute_exten(session, cbt->cid_number, profile->callback_dialplan, profile->callback_context); - } else if (!strcmp(input, profile->delete_file_key) || !strcmp(input, profile->email_key)) { - char *sql = switch_mprintf("update voicemail_data set flags='delete' where uuid='%s'", cbt->uuid); - vm_execute_sql(profile, sql, profile->mutex); - switch_safe_free(sql); - if (!strcmp(input, profile->email_key) && !switch_strlen_zero(cbt->email)) { - switch_event_t *event; - char *from; - char *headers, *header_string; - char *body; - int priority = 3; - switch_size_t retsize; - switch_time_exp_t tm; - char date[80] = ""; - char tmp[50]=""; - int total_new_messages = 0; - int total_saved_messages = 0; - int total_new_urgent_messages = 0; - int total_saved_urgent_messages = 0; - int32_t message_len = 0; - char *p; - long l_duration = 0; - switch_core_time_duration_t duration; - char duration_str[80]; - - if (!strcasecmp(cbt->read_flags, URGENT_FLAG_STRING)) { - priority = 1; - } + if (switch_channel_ready(channel)) { + if (*cc.buf) { + *input = *cc.buf; + *(input+1) = '\0'; + status = SWITCH_STATUS_SUCCESS; + *cc.buf = '\0'; + } else { + status = vm_macro_get(session, VM_LISTEN_FILE_CHECK_MACRO, + key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); + } + if (!strcmp(input, profile->listen_file_key)) { + goto play_file; + } else if (!strcmp(input, profile->callback_key)) { + switch_core_session_execute_exten(session, cbt->cid_number, profile->callback_dialplan, profile->callback_context); + } else if (!strcmp(input, profile->delete_file_key) || !strcmp(input, profile->email_key)) { + char *sql = switch_mprintf("update voicemail_data set flags='delete' where uuid='%s'", cbt->uuid); + vm_execute_sql(profile, sql, profile->mutex); + switch_safe_free(sql); + if (!strcmp(input, profile->email_key) && !switch_strlen_zero(cbt->email)) { + switch_event_t *event; + char *from; + char *headers, *header_string; + char *body; + int priority = 3; + switch_size_t retsize; + switch_time_exp_t tm; + char date[80] = ""; + char tmp[50]=""; + int total_new_messages = 0; + int total_saved_messages = 0; + int total_new_urgent_messages = 0; + int total_saved_urgent_messages = 0; + int32_t message_len = 0; + char *p; + long l_duration = 0; + switch_core_time_duration_t duration; + char duration_str[80]; + + if (!strcasecmp(cbt->read_flags, URGENT_FLAG_STRING)) { + priority = 1; + } message_count(profile, cbt->user, cbt->domain, cbt->in_folder, &total_new_messages, &total_saved_messages, - &total_new_urgent_messages, &total_saved_urgent_messages); + &total_new_urgent_messages, &total_saved_urgent_messages); - switch_time_exp_lt(&tm, atoi(cbt->created_epoch) * 1000000); - switch_strftime(date, &retsize, sizeof(date), profile->date_fmt, &tm); + switch_time_exp_lt(&tm, atoi(cbt->created_epoch) * 1000000); + switch_strftime(date, &retsize, sizeof(date), profile->date_fmt, &tm); - switch_snprintf(tmp,sizeof(tmp), "%d", total_new_messages); - switch_channel_set_variable(channel, "voicemail_total_new_messages", tmp); - switch_snprintf(tmp,sizeof(tmp), "%d", total_saved_messages); - switch_channel_set_variable(channel, "voicemail_total_saved_messages", tmp); - switch_snprintf(tmp,sizeof(tmp), "%d", total_new_urgent_messages); - switch_channel_set_variable(channel, "voicemail_urgent_new_messages", tmp); - switch_snprintf(tmp,sizeof(tmp), "%d", total_saved_urgent_messages); - switch_channel_set_variable(channel, "voicemail_urgent_saved_messages", tmp); - switch_channel_set_variable(channel, "voicemail_current_folder", cbt->in_folder); - switch_channel_set_variable(channel, "voicemail_account", cbt->user); - switch_channel_set_variable(channel, "voicemail_domain", cbt->domain); - switch_channel_set_variable(channel, "voicemail_caller_id_number", cbt->cid_number); - switch_channel_set_variable(channel, "voicemail_caller_id_name", cbt->cid_name); - switch_channel_set_variable(channel, "voicemail_file_path", cbt->file_path); - switch_channel_set_variable(channel, "voicemail_read_flags", cbt->read_flags); - switch_channel_set_variable(channel, "voicemail_time", date); - switch_snprintf(tmp,sizeof(tmp), "%d", priority); - switch_channel_set_variable(channel, "voicemail_priority", tmp); - message_len = atoi(cbt->message_len); + switch_snprintf(tmp,sizeof(tmp), "%d", total_new_messages); + switch_channel_set_variable(channel, "voicemail_total_new_messages", tmp); + switch_snprintf(tmp,sizeof(tmp), "%d", total_saved_messages); + switch_channel_set_variable(channel, "voicemail_total_saved_messages", tmp); + switch_snprintf(tmp,sizeof(tmp), "%d", total_new_urgent_messages); + switch_channel_set_variable(channel, "voicemail_urgent_new_messages", tmp); + switch_snprintf(tmp,sizeof(tmp), "%d", total_saved_urgent_messages); + switch_channel_set_variable(channel, "voicemail_urgent_saved_messages", tmp); + switch_channel_set_variable(channel, "voicemail_current_folder", cbt->in_folder); + switch_channel_set_variable(channel, "voicemail_account", cbt->user); + switch_channel_set_variable(channel, "voicemail_domain", cbt->domain); + switch_channel_set_variable(channel, "voicemail_caller_id_number", cbt->cid_number); + switch_channel_set_variable(channel, "voicemail_caller_id_name", cbt->cid_name); + switch_channel_set_variable(channel, "voicemail_file_path", cbt->file_path); + switch_channel_set_variable(channel, "voicemail_read_flags", cbt->read_flags); + switch_channel_set_variable(channel, "voicemail_time", date); + switch_snprintf(tmp,sizeof(tmp), "%d", priority); + switch_channel_set_variable(channel, "voicemail_priority", tmp); + message_len = atoi(cbt->message_len); - l_duration = atol(cbt->message_len) * 1000000; - switch_core_measure_time(l_duration, &duration); - duration.day += duration.yr * 365; - duration.hr += duration.day * 24; - - switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", - duration.hr, - duration.min, - duration.sec - ); + l_duration = atol(cbt->message_len) * 1000000; + switch_core_measure_time(l_duration, &duration); + duration.day += duration.yr * 365; + duration.hr += duration.day * 24; - switch_channel_set_variable(channel, "voicemail_message_len", duration_str); - switch_channel_set_variable(channel, "voicemail_email", cbt->email); - - if(switch_strlen_zero(profile->email_headers)) { - from = switch_core_session_sprintf(session, "%s@%s", cbt->user, cbt->domain); - } else { - from = switch_channel_expand_variables(channel,profile->email_from); - } + switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", + duration.hr, + duration.min, + duration.sec + ); - if(switch_strlen_zero(profile->email_headers)) { - headers = switch_core_session_sprintf(session, - "From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s\nX-Priority: %d", - cbt->user, cbt->domain, cbt->cid_name, cbt->cid_number, priority); - } else { - headers = switch_channel_expand_variables(channel,profile->email_headers); - } + switch_channel_set_variable(channel, "voicemail_message_len", duration_str); + switch_channel_set_variable(channel, "voicemail_email", cbt->email); - p = headers + (strlen(headers) - 1); - if (*p == '\n') { - if (*(p-1) == '\r') { - p--; - } - *p = '\0'; - } + if(switch_strlen_zero(profile->email_headers)) { + from = switch_core_session_sprintf(session, "%s@%s", cbt->user, cbt->domain); + } else { + from = switch_channel_expand_variables(channel,profile->email_from); + } - header_string = switch_core_session_sprintf(session, "%s\nX-Voicemail-Length: %u", headers, message_len); - - if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) { - /* this isnt done? it was in the other place - * switch_channel_event_set_data(channel, event); - */ - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Type", "forwarded-voicemail"); - switch_event_fire(&event); - } + if(switch_strlen_zero(profile->email_headers)) { + headers = switch_core_session_sprintf(session, + "From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s\nX-Priority: %d", + cbt->user, cbt->domain, cbt->cid_name, cbt->cid_number, priority); + } else { + headers = switch_channel_expand_variables(channel,profile->email_headers); + } - if (profile->email_body) { - body = switch_channel_expand_variables(channel, profile->email_body); - } else { - body = switch_mprintf("%u second Voicemail from %s %s", message_len, - cbt->cid_name, cbt->cid_number); - } + p = headers + (strlen(headers) - 1); + if (*p == '\n') { + if (*(p-1) == '\r') { + p--; + } + *p = '\0'; + } - switch_simple_email(cbt->email, from, header_string, body, cbt->file_path); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", cbt->email); - switch_safe_free(body); - TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "emailed", NULL, NULL)); - } else { - TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "deleted", NULL, NULL)); - } - } else { - char *sql = switch_mprintf("update voicemail_data set flags='save' where uuid='%s'", cbt->uuid); - vm_execute_sql(profile, sql, profile->mutex); - switch_safe_free(sql); - TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)); - } - } - } - - end: + header_string = switch_core_session_sprintf(session, "%s\nX-Voicemail-Length: %u", headers, message_len); - return status; + if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) { + /* this isnt done? it was in the other place + * switch_channel_event_set_data(channel, event); + */ + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Type", "forwarded-voicemail"); + switch_event_fire(&event); + } + + if (profile->email_body) { + body = switch_channel_expand_variables(channel, profile->email_body); + } else { + body = switch_mprintf("%u second Voicemail from %s %s", message_len, + cbt->cid_name, cbt->cid_number); + } + + switch_simple_email(cbt->email, from, header_string, body, cbt->file_path); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", cbt->email); + switch_safe_free(body); + TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "emailed", NULL, NULL)); + } else { + TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "deleted", NULL, NULL)); + } + } else { + char *sql = switch_mprintf("update voicemail_data set flags='save' where uuid='%s'", cbt->uuid); + vm_execute_sql(profile, sql, profile->mutex); + switch_safe_free(sql); + TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)); + } + } + } + +end: + + return status; } static void voicemail_check_main(switch_core_session_t *session, const char *profile_name, const char *domain_name, const char *id, int auth) { - vm_check_state_t vm_check_state = VM_CHECK_START; - switch_channel_t *channel; - switch_caller_profile_t *caller_profile; - vm_profile_t *profile; - switch_xml_t x_domain, x_domain_root, x_user, x_params, x_param; - switch_status_t status; - char pass_buf[80] = "", *mypass = NULL, id_buf[80] = "", *myfolder = NULL; - const char *thepass = NULL, *myid = id; - char term = 0; - uint32_t timeout, attempts = 0; - int failed = 0; - msg_type_t play_msg_type = MSG_NONE; - char *dir_path = NULL, *file_path = NULL; - int total_new_messages = 0; - int total_saved_messages = 0; - int total_new_urgent_messages = 0; - int total_saved_urgent_messages = 0; - int heard_auto_saved = 0, heard_auto_new = 0; - char *email_vm = NULL; + vm_check_state_t vm_check_state = VM_CHECK_START; + switch_channel_t *channel; + switch_caller_profile_t *caller_profile; + vm_profile_t *profile; + switch_xml_t x_domain, x_domain_root, x_user, x_params, x_param; + switch_status_t status; + char pass_buf[80] = "", *mypass = NULL, id_buf[80] = "", *myfolder = NULL; + const char *thepass = NULL, *myid = id; + char term = 0; + uint32_t timeout, attempts = 0; + int failed = 0; + msg_type_t play_msg_type = MSG_NONE; + char *dir_path = NULL, *file_path = NULL; + int total_new_messages = 0; + int total_saved_messages = 0; + int total_new_urgent_messages = 0; + int total_saved_urgent_messages = 0; + int heard_auto_saved = 0, heard_auto_new = 0; + char *email_vm = NULL; - channel = switch_core_session_get_channel(session); - switch_assert(channel != NULL); + channel = switch_core_session_get_channel(session); + switch_assert(channel != NULL); if (!(profile = switch_core_hash_find(globals.profile_hash, profile_name))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error invalid profile %s\n", profile_name); - return; - } - - x_user = x_domain = x_domain_root = NULL; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error invalid profile %s\n", profile_name); + return; + } - timeout = profile->digit_timeout; - attempts = profile->max_login_attempts; - - status = switch_ivr_phrase_macro(session, VM_HELLO_MACRO, NULL, NULL, NULL); + x_user = x_domain = x_domain_root = NULL; - while(switch_channel_ready(channel)) { - switch_ivr_sleep(session, 100); - - switch(vm_check_state) { - case VM_CHECK_START: - { - total_new_messages = 0; - total_saved_messages = 0; - total_new_urgent_messages = 0; - total_saved_urgent_messages = 0; - heard_auto_saved = 0; - heard_auto_new = 0; - play_msg_type = MSG_NONE; - attempts = profile->max_login_attempts; - myid = id; - mypass = NULL; - myfolder = "inbox"; - vm_check_state = VM_CHECK_AUTH; - if (x_domain_root) { - switch_xml_free(x_domain_root); - } - x_user = x_domain = x_domain_root = NULL; - } - break; - case VM_CHECK_FOLDER_SUMMARY: - { - int informed = 0; - char msg_count[80] = ""; + timeout = profile->digit_timeout; + attempts = profile->max_login_attempts; - switch_channel_set_variable(channel, "voicemail_current_folder", myfolder); - message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages, - &total_new_urgent_messages, &total_saved_urgent_messages); + status = switch_ivr_phrase_macro(session, VM_HELLO_MACRO, NULL, NULL, NULL); - if (total_new_urgent_messages > 0) { - switch_snprintf(msg_count, sizeof(msg_count), "%d:urgent-new", total_new_urgent_messages); - TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); - informed++; - } - if (total_new_messages > 0 && total_new_messages != total_new_urgent_messages) { - switch_snprintf(msg_count, sizeof(msg_count), "%d:new", total_new_messages); - TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); - informed++; - } - - if (!heard_auto_new && total_new_messages + total_new_urgent_messages> 0) { - heard_auto_new = 1; - play_msg_type = MSG_NEW; - vm_check_state = VM_CHECK_PLAY_MESSAGES; - continue; - } - - if (total_saved_urgent_messages > 0) { - switch_snprintf(msg_count, sizeof(msg_count), "%d:urgent-saved", total_saved_urgent_messages); - TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); - informed++; - } + while(switch_channel_ready(channel)) { + switch_ivr_sleep(session, 100); - if (total_saved_messages > 0 && total_saved_messages != total_saved_urgent_messages) { - switch_snprintf(msg_count, sizeof(msg_count), "%d:saved", total_saved_messages); - TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); - informed++; - } - - if (!heard_auto_saved && total_saved_messages + total_saved_urgent_messages> 0) { - heard_auto_saved = 1; - play_msg_type = MSG_SAVED; - vm_check_state = VM_CHECK_PLAY_MESSAGES; - continue; - } - - if (!informed) { - switch_snprintf(msg_count, sizeof(msg_count), "0:new"); - TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); - informed++; - } + switch(vm_check_state) { +case VM_CHECK_START: + { + total_new_messages = 0; + total_saved_messages = 0; + total_new_urgent_messages = 0; + total_saved_urgent_messages = 0; + heard_auto_saved = 0; + heard_auto_new = 0; + play_msg_type = MSG_NONE; + attempts = profile->max_login_attempts; + myid = id; + mypass = NULL; + myfolder = "inbox"; + vm_check_state = VM_CHECK_AUTH; + if (x_domain_root) { + switch_xml_free(x_domain_root); + } + x_user = x_domain = x_domain_root = NULL; + } + break; +case VM_CHECK_FOLDER_SUMMARY: + { + int informed = 0; + char msg_count[80] = ""; - vm_check_state = VM_CHECK_MENU; - } - break; - case VM_CHECK_PLAY_MESSAGES: - { - listen_callback_t cbt; - char sql[256]; - int cur_message, total_messages; - switch_event_t *event; - - message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages, - &total_new_urgent_messages, &total_saved_urgent_messages); - memset(&cbt, 0, sizeof(cbt)); - cbt.email = email_vm; - switch(play_msg_type) { - case MSG_NEW: - { - switch_snprintf(sql, sizeof(sql), - "select * from voicemail_data where user='%s' and domain='%s' and read_epoch=0 order by read_flags", myid, domain_name); - total_messages = total_new_messages; - heard_auto_new = heard_auto_saved = 1; - } - break; - case MSG_SAVED: - default: - { - switch_snprintf(sql, sizeof(sql), - "select * from voicemail_data where user='%s' and domain='%s' and read_epoch !=0 order by read_flags", myid, domain_name); - total_messages = total_saved_messages; - heard_auto_new = heard_auto_saved = 1; - } - break; - } - for (cur_message = 0; cur_message < total_messages; cur_message++) { - cbt.index = 0; - cbt.want = cur_message; - cbt.type = play_msg_type; - vm_execute_sql_callback(profile, profile->mutex, sql, listen_callback, &cbt); - status = listen_file(session, profile, &cbt); - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - break; - } - } - switch_snprintf(sql, sizeof(sql), "update voicemail_data set read_epoch=%ld where user='%s' and domain='%s' and flags='save'", - (long)time(NULL), myid, domain_name); - vm_execute_sql(profile, sql, profile->mutex); - switch_snprintf(sql, sizeof(sql), "select file_path from voicemail_data where user='%s' and domain='%s' and flags='delete'", myid, domain_name); - vm_execute_sql_callback(profile, profile->mutex, sql, unlink_callback, NULL); - switch_snprintf(sql, sizeof(sql), "delete from voicemail_data where user='%s' and domain='%s' and flags='delete'", myid, domain_name); - vm_execute_sql(profile, sql, profile->mutex); - vm_check_state = VM_CHECK_FOLDER_SUMMARY; + switch_channel_set_variable(channel, "voicemail_current_folder", myfolder); + message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages, + &total_new_urgent_messages, &total_saved_urgent_messages); - message_count(profile, id, domain_name, myfolder, &total_new_messages, &total_saved_messages, - &total_new_urgent_messages, &total_saved_urgent_messages); + if (total_new_urgent_messages > 0) { + switch_snprintf(msg_count, sizeof(msg_count), "%d:urgent-new", total_new_urgent_messages); + TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); + informed++; + } + if (total_new_messages > 0 && total_new_messages != total_new_urgent_messages) { + switch_snprintf(msg_count, sizeof(msg_count), "%d:new", total_new_messages); + TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); + informed++; + } - if (switch_event_create(&event, SWITCH_EVENT_MESSAGE_WAITING) == SWITCH_STATUS_SUCCESS) { - char *mwi_id; - const char *yn = "no"; - if (total_new_messages || total_saved_messages || total_new_urgent_messages || total_saved_urgent_messages) { - yn = "yes"; - } - mwi_id = switch_mprintf("%s@%s", myid, domain_name); - switch_assert(mwi_id); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", "%s", yn); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", mwi_id); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d (%d/%d)", - total_new_messages, total_saved_messages, total_new_urgent_messages, total_saved_urgent_messages); - switch_event_fire(&event); - switch_safe_free(mwi_id); - } - } - break; - case VM_CHECK_CONFIG: - { - char *sql = NULL; - char input[10] = ""; - char key_buf[80] = ""; - callback_t cbt = { 0 }; - char msg_count[80] = ""; - cc_t cc = { 0 }; - switch_size_t message_len = 0; + if (!heard_auto_new && total_new_messages + total_new_urgent_messages> 0) { + heard_auto_new = 1; + play_msg_type = MSG_NEW; + vm_check_state = VM_CHECK_PLAY_MESSAGES; + continue; + } - cbt.buf = msg_count; - cbt.len = sizeof(msg_count); - sql = switch_mprintf("select count(*) from voicemail_prefs where user='%q' and domain = '%q'", myid, domain_name); - vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); - switch_safe_free(sql); - if (*msg_count == '\0' || !atoi(msg_count)) { - sql = switch_mprintf("insert into voicemail_prefs values('%q','%q','','')", myid, domain_name); - vm_execute_sql(profile, sql, profile->mutex); - switch_safe_free(sql); - } + if (total_saved_urgent_messages > 0) { + switch_snprintf(msg_count, sizeof(msg_count), "%d:urgent-saved", total_saved_urgent_messages); + TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); + informed++; + } - switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s", - profile->record_greeting_key, - profile->choose_greeting_key, - profile->record_name_key, - profile->main_menu_key); - + if (total_saved_messages > 0 && total_saved_messages != total_saved_urgent_messages) { + switch_snprintf(msg_count, sizeof(msg_count), "%d:saved", total_saved_messages); + TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); + informed++; + } - TRY_CODE(vm_macro_get(session, VM_CONFIG_MENU_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout)); - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - goto end; - } - - if (!strcmp(input, profile->main_menu_key)) { - vm_check_state = VM_CHECK_MENU; - } else if (!strcmp(input, profile->choose_greeting_key)) { - int num; - switch_input_args_t args = { 0 }; - args.input_callback = cancel_on_dtmf; - - TRY_CODE(vm_macro_get(session, VM_CHOOSE_GREETING_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout)); - - - num = atoi(input); - file_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, num, profile->file_ext); - if (num < 1 || num > 3) { - status = SWITCH_STATUS_FALSE; - } else { - switch_file_handle_t fh = { 0 }; - memset(&fh, 0, sizeof(fh)); - args.input_callback = control_playback; - memset(&cc, 0, sizeof(cc)); - cc.profile = profile; - cc.fh = &fh; - cc.noexit = 1; - args.buf = &cc; - status = switch_ivr_play_file(session, NULL, file_path, &args); - } - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL)); - } else { - TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_SELECTED_MACRO, input, NULL, NULL)); - sql = switch_mprintf("update voicemail_prefs set greeting_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name); - vm_execute_sql(profile, sql, profile->mutex); - switch_safe_free(sql); - } - switch_safe_free(file_path); - } else if (!strcmp(input, profile->record_greeting_key)) { - int num; - TRY_CODE(vm_macro_get(session, VM_CHOOSE_GREETING_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout)); + if (!heard_auto_saved && total_saved_messages + total_saved_urgent_messages> 0) { + heard_auto_saved = 1; + play_msg_type = MSG_SAVED; + vm_check_state = VM_CHECK_PLAY_MESSAGES; + continue; + } - num = atoi(input); - if (num < 1 || num > 3) { - TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL)); - } else { - file_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, num, profile->file_ext); - TRY_CODE(create_file(session, profile, VM_RECORD_GREETING_MACRO, file_path, &message_len)); - sql = switch_mprintf("update voicemail_prefs set greeting_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name); - vm_execute_sql(profile, sql, profile->mutex); - switch_safe_free(sql); - switch_safe_free(file_path); - } + if (!informed) { + switch_snprintf(msg_count, sizeof(msg_count), "0:new"); + TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)); + informed++; + } - } else if (!strcmp(input, profile->record_name_key)) { - file_path = switch_mprintf("%s%srecorded_name.%s", dir_path, SWITCH_PATH_SEPARATOR, profile->file_ext); - TRY_CODE(create_file(session, profile, VM_RECORD_NAME_MACRO, file_path, &message_len)); - sql = switch_mprintf("update voicemail_prefs set name_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name); - vm_execute_sql(profile, sql, profile->mutex); - switch_safe_free(file_path); - switch_safe_free(sql); - } - continue; - } - break; - case VM_CHECK_MENU: - { - char input[10] = ""; - char key_buf[80] = ""; - play_msg_type = MSG_NONE; - - switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s", - profile->play_new_messages_key, - profile->play_saved_messages_key, - profile->config_menu_key, - profile->terminator_key); - - status = vm_macro_get(session, VM_MENU_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout); - - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - goto end; - } - - if (!strcmp(input, profile->play_new_messages_key)) { - play_msg_type = MSG_NEW; - } else if (!strcmp(input, profile->play_saved_messages_key)) { - play_msg_type = MSG_SAVED; - } else if (!strcmp(input, profile->terminator_key)) { - goto end; - } else if (!strcmp(input, profile->config_menu_key)) { - vm_check_state = VM_CHECK_CONFIG; - } - - if (play_msg_type) { - vm_check_state = VM_CHECK_PLAY_MESSAGES; - } + vm_check_state = VM_CHECK_MENU; + } + break; +case VM_CHECK_PLAY_MESSAGES: + { + listen_callback_t cbt; + char sql[256]; + int cur_message, total_messages; + switch_event_t *event; + message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages, + &total_new_urgent_messages, &total_saved_urgent_messages); + memset(&cbt, 0, sizeof(cbt)); + cbt.email = email_vm; + switch(play_msg_type) { +case MSG_NEW: + { + switch_snprintf(sql, sizeof(sql), + "select * from voicemail_data where user='%s' and domain='%s' and read_epoch=0 order by read_flags", myid, domain_name); + total_messages = total_new_messages; + heard_auto_new = heard_auto_saved = 1; + } + break; +case MSG_SAVED: +default: + { + switch_snprintf(sql, sizeof(sql), + "select * from voicemail_data where user='%s' and domain='%s' and read_epoch !=0 order by read_flags", myid, domain_name); + total_messages = total_saved_messages; + heard_auto_new = heard_auto_saved = 1; + } + break; + } + for (cur_message = 0; cur_message < total_messages; cur_message++) { + cbt.index = 0; + cbt.want = cur_message; + cbt.type = play_msg_type; + vm_execute_sql_callback(profile, profile->mutex, sql, listen_callback, &cbt); + status = listen_file(session, profile, &cbt); + if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { + break; + } + } + switch_snprintf(sql, sizeof(sql), "update voicemail_data set read_epoch=%ld where user='%s' and domain='%s' and flags='save'", + (long)time(NULL), myid, domain_name); + vm_execute_sql(profile, sql, profile->mutex); + switch_snprintf(sql, sizeof(sql), "select file_path from voicemail_data where user='%s' and domain='%s' and flags='delete'", myid, domain_name); + vm_execute_sql_callback(profile, profile->mutex, sql, unlink_callback, NULL); + switch_snprintf(sql, sizeof(sql), "delete from voicemail_data where user='%s' and domain='%s' and flags='delete'", myid, domain_name); + vm_execute_sql(profile, sql, profile->mutex); + vm_check_state = VM_CHECK_FOLDER_SUMMARY; + + message_count(profile, id, domain_name, myfolder, &total_new_messages, &total_saved_messages, + &total_new_urgent_messages, &total_saved_urgent_messages); + + if (switch_event_create(&event, SWITCH_EVENT_MESSAGE_WAITING) == SWITCH_STATUS_SUCCESS) { + char *mwi_id; + const char *yn = "no"; + if (total_new_messages || total_saved_messages || total_new_urgent_messages || total_saved_urgent_messages) { + yn = "yes"; + } + mwi_id = switch_mprintf("%s@%s", myid, domain_name); + switch_assert(mwi_id); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", "%s", yn); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", mwi_id); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d (%d/%d)", + total_new_messages, total_saved_messages, total_new_urgent_messages, total_saved_urgent_messages); + switch_event_fire(&event); + switch_safe_free(mwi_id); + } + } + break; +case VM_CHECK_CONFIG: + { + char *sql = NULL; + char input[10] = ""; + char key_buf[80] = ""; + callback_t cbt = { 0 }; + char msg_count[80] = ""; + cc_t cc = { 0 }; + switch_size_t message_len = 0; + + cbt.buf = msg_count; + cbt.len = sizeof(msg_count); + sql = switch_mprintf("select count(*) from voicemail_prefs where user='%q' and domain = '%q'", myid, domain_name); + vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); + switch_safe_free(sql); + if (*msg_count == '\0' || !atoi(msg_count)) { + sql = switch_mprintf("insert into voicemail_prefs values('%q','%q','','')", myid, domain_name); + vm_execute_sql(profile, sql, profile->mutex); + switch_safe_free(sql); + } + + switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s", + profile->record_greeting_key, + profile->choose_greeting_key, + profile->record_name_key, + profile->main_menu_key); + + + TRY_CODE(vm_macro_get(session, VM_CONFIG_MENU_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout)); + if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { + goto end; + } + + if (!strcmp(input, profile->main_menu_key)) { + vm_check_state = VM_CHECK_MENU; + } else if (!strcmp(input, profile->choose_greeting_key)) { + int num; + switch_input_args_t args = { 0 }; + args.input_callback = cancel_on_dtmf; + + TRY_CODE(vm_macro_get(session, VM_CHOOSE_GREETING_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout)); + + + num = atoi(input); + file_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, num, profile->file_ext); + if (num < 1 || num > 3) { + status = SWITCH_STATUS_FALSE; + } else { + switch_file_handle_t fh = { 0 }; + memset(&fh, 0, sizeof(fh)); + args.input_callback = control_playback; + memset(&cc, 0, sizeof(cc)); + cc.profile = profile; + cc.fh = &fh; + cc.noexit = 1; + args.buf = &cc; + status = switch_ivr_play_file(session, NULL, file_path, &args); + } + if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { + TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL)); + } else { + TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_SELECTED_MACRO, input, NULL, NULL)); + sql = switch_mprintf("update voicemail_prefs set greeting_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name); + vm_execute_sql(profile, sql, profile->mutex); + switch_safe_free(sql); + } + switch_safe_free(file_path); + } else if (!strcmp(input, profile->record_greeting_key)) { + int num; + TRY_CODE(vm_macro_get(session, VM_CHOOSE_GREETING_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout)); + + num = atoi(input); + if (num < 1 || num > 3) { + TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL)); + } else { + file_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, num, profile->file_ext); + TRY_CODE(create_file(session, profile, VM_RECORD_GREETING_MACRO, file_path, &message_len)); + sql = switch_mprintf("update voicemail_prefs set greeting_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name); + vm_execute_sql(profile, sql, profile->mutex); + switch_safe_free(sql); + switch_safe_free(file_path); + } + + } else if (!strcmp(input, profile->record_name_key)) { + file_path = switch_mprintf("%s%srecorded_name.%s", dir_path, SWITCH_PATH_SEPARATOR, profile->file_ext); + TRY_CODE(create_file(session, profile, VM_RECORD_NAME_MACRO, file_path, &message_len)); + sql = switch_mprintf("update voicemail_prefs set name_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name); + vm_execute_sql(profile, sql, profile->mutex); + switch_safe_free(file_path); + switch_safe_free(sql); + } + continue; + } + break; +case VM_CHECK_MENU: + { + char input[10] = ""; + char key_buf[80] = ""; + play_msg_type = MSG_NONE; + + switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s", + profile->play_new_messages_key, + profile->play_saved_messages_key, + profile->config_menu_key, + profile->terminator_key); + + status = vm_macro_get(session, VM_MENU_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout); + + if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { + goto end; + } + + if (!strcmp(input, profile->play_new_messages_key)) { + play_msg_type = MSG_NEW; + } else if (!strcmp(input, profile->play_saved_messages_key)) { + play_msg_type = MSG_SAVED; + } else if (!strcmp(input, profile->terminator_key)) { + goto end; + } else if (!strcmp(input, profile->config_menu_key)) { + vm_check_state = VM_CHECK_CONFIG; + } + + if (play_msg_type) { + vm_check_state = VM_CHECK_PLAY_MESSAGES; + } + + continue; + } + break; +case VM_CHECK_AUTH: + { + if (!attempts) { + failed = 1; + goto end; + } + + attempts--; + + if (!myid) { + status = vm_macro_get(session, VM_ENTER_ID_MACRO, profile->terminator_key, id_buf, sizeof(id_buf), 0, + profile->terminator_key, &term, timeout); + if (status != SWITCH_STATUS_SUCCESS) { + goto end; + } + + if (*id_buf == '\0') { continue; - } - break; - case VM_CHECK_AUTH: - { - if (!attempts) { - failed = 1; - goto end; - } + } else { + myid = id_buf; + } + } - attempts--; + if (!x_user) { + char *xtra; + int ok = 1; + caller_profile = switch_channel_get_caller_profile(channel); + xtra = switch_mprintf("mailbox=%s&destination_number=%s&caller_id_number=%s", + myid,caller_profile->destination_number,caller_profile->caller_id_number); + switch_assert(xtra); - if (!myid) { - status = vm_macro_get(session, VM_ENTER_ID_MACRO, profile->terminator_key, id_buf, sizeof(id_buf), 0, - profile->terminator_key, &term, timeout); - if (status != SWITCH_STATUS_SUCCESS) { - goto end; - } + if (switch_xml_locate_user("id", myid, domain_name, switch_channel_get_variable(channel, "network_addr"), + &x_domain_root, &x_domain, &x_user, xtra) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", myid, domain_name); + ok = 0; + } - if (*id_buf == '\0') { - continue; - } else { - myid = id_buf; - } - } + switch_safe_free(xtra); - if (!x_user) { - char *xtra; - int ok = 1; - caller_profile = switch_channel_get_caller_profile(channel); - xtra = switch_mprintf("mailbox=%s&destination_number=%s&caller_id_number=%s", - myid,caller_profile->destination_number,caller_profile->caller_id_number); - switch_assert(xtra); + if (!ok) { + goto failed; + } + } - if (switch_xml_locate_user("id", myid, domain_name, switch_channel_get_variable(channel, "network_addr"), - &x_domain_root, &x_domain, &x_user, xtra) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", myid, domain_name); - ok = 0; - } + if (!mypass) { + if (auth) { + mypass = "OK"; + } else { + status = vm_macro_get(session, VM_ENTER_PASS_MACRO, profile->terminator_key, + pass_buf, sizeof(pass_buf), 0, profile->terminator_key, &term, timeout); + if (status != SWITCH_STATUS_SUCCESS) { + goto end; + } + if (*pass_buf == '\0') { + continue; + } else { + mypass = pass_buf; + } + } + } - switch_safe_free(xtra); + if (!(x_params = switch_xml_child(x_user, "params"))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find params for user [%s@%s]\n", myid, domain_name); + goto failed; + } - if (!ok) { - goto failed; - } - } - - if (!mypass) { - if (auth) { - mypass = "OK"; - } else { - status = vm_macro_get(session, VM_ENTER_PASS_MACRO, profile->terminator_key, - pass_buf, sizeof(pass_buf), 0, profile->terminator_key, &term, timeout); - if (status != SWITCH_STATUS_SUCCESS) { - goto end; - } - if (*pass_buf == '\0') { - continue; - } else { - mypass = pass_buf; - } - } - } - - if (!(x_params = switch_xml_child(x_user, "params"))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find params for user [%s@%s]\n", myid, domain_name); - goto failed; - } - - thepass = NULL; - for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) { - const char *var = switch_xml_attr_soft(x_param, "name"); - const char *val = switch_xml_attr_soft(x_param, "value"); - - if (!strcasecmp(var, "password")) { - thepass = val; - } else if (!strcasecmp(var, "vm-password")) { - thepass = val; - } else if (!strcasecmp(var, "vm-mailto")) { - email_vm = switch_core_session_strdup(session, val); - } - } - switch_xml_free(x_domain_root); - x_domain_root = NULL; + thepass = NULL; + for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) { + const char *var = switch_xml_attr_soft(x_param, "name"); + const char *val = switch_xml_attr_soft(x_param, "value"); - if (auth || !thepass || (thepass && mypass && !strcmp(thepass, mypass))) { - if (!dir_path) { - if(switch_strlen_zero(profile->storage_dir)) { - dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, - SWITCH_PATH_SEPARATOR, - SWITCH_PATH_SEPARATOR, - profile->name, - SWITCH_PATH_SEPARATOR, - domain_name, - SWITCH_PATH_SEPARATOR, - myid); - } else { - dir_path = switch_core_session_sprintf(session, "%s%s%s", - profile->storage_dir, - SWITCH_PATH_SEPARATOR, - myid); - } + if (!strcasecmp(var, "password")) { + thepass = val; + } else if (!strcasecmp(var, "vm-password")) { + thepass = val; + } else if (!strcasecmp(var, "vm-mailto")) { + email_vm = switch_core_session_strdup(session, val); + } + } + switch_xml_free(x_domain_root); + x_domain_root = NULL; - if (switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", dir_path); - return; - } - } + if (auth || !thepass || (thepass && mypass && !strcmp(thepass, mypass))) { + if (!dir_path) { + if(switch_strlen_zero(profile->storage_dir)) { + dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, + SWITCH_PATH_SEPARATOR, + SWITCH_PATH_SEPARATOR, + profile->name, + SWITCH_PATH_SEPARATOR, + domain_name, + SWITCH_PATH_SEPARATOR, + myid); + } else { + dir_path = switch_core_session_sprintf(session, "%s%s%s", + profile->storage_dir, + SWITCH_PATH_SEPARATOR, + myid); + } - vm_check_state = VM_CHECK_FOLDER_SUMMARY; - } else { - goto failed; - } - - continue; - - failed: - status = switch_ivr_phrase_macro(session, VM_FAIL_AUTH_MACRO, NULL, NULL, NULL); - myid = id; - mypass = NULL; - continue; - } - break; - default: - break; - } - } - - end: + if (switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", dir_path); + return; + } + } - if (switch_channel_ready(channel)) { - if (failed) { - status = switch_ivr_phrase_macro(session, VM_ABORT_MACRO, NULL, NULL, NULL); - } - status = switch_ivr_phrase_macro(session, VM_GOODBYE_MACRO, NULL, NULL, NULL); - } + vm_check_state = VM_CHECK_FOLDER_SUMMARY; + } else { + goto failed; + } - if (x_domain_root) { - switch_xml_free(x_domain_root); - } + continue; + +failed: + status = switch_ivr_phrase_macro(session, VM_FAIL_AUTH_MACRO, NULL, NULL, NULL); + myid = id; + mypass = NULL; + continue; + } + break; +default: + break; + } + } + +end: + + if (switch_channel_ready(channel)) { + if (failed) { + status = switch_ivr_phrase_macro(session, VM_ABORT_MACRO, NULL, NULL, NULL); + } + status = switch_ivr_phrase_macro(session, VM_GOODBYE_MACRO, NULL, NULL, NULL); + } + + if (x_domain_root) { + switch_xml_free(x_domain_root); + } } - + static switch_status_t voicemail_leave_main(switch_core_session_t *session, const char *profile_name, const char *domain_name, const char *id) { - switch_channel_t *channel; - char *myfolder = "inbox"; - char sql[256]; - prefs_callback_t cbt; - vm_profile_t *profile; - char *uuid = switch_core_session_get_uuid(session); - char *file_path = NULL; - char *dir_path = NULL; - switch_status_t status = SWITCH_STATUS_SUCCESS; - switch_caller_profile_t *caller_profile; - switch_file_handle_t fh = { 0 }; - switch_input_args_t args = { 0 }; - char *email_vm = NULL; - int send_mail = 0; - cc_t cc = { 0 }; - char *read_flags = NORMAL_FLAG_STRING; - int priority = 3; - int email_attach = 1; - int email_delete = 1; - char buf[2]; - char *greet_path = NULL; + switch_channel_t *channel; + char *myfolder = "inbox"; + char sql[256]; + prefs_callback_t cbt; + vm_profile_t *profile; + char *uuid = switch_core_session_get_uuid(session); + char *file_path = NULL; + char *dir_path = NULL; + switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_caller_profile_t *caller_profile; + switch_file_handle_t fh = { 0 }; + switch_input_args_t args = { 0 }; + char *email_vm = NULL; + int send_mail = 0; + cc_t cc = { 0 }; + char *read_flags = NORMAL_FLAG_STRING; + int priority = 3; + int email_attach = 1; + int email_delete = 1; + char buf[2]; + char *greet_path = NULL; const char *voicemail_greeting_number = NULL; - switch_size_t message_len = 0; + switch_size_t message_len = 0; switch_time_exp_t tm; char date[80] = ""; switch_size_t retsize; switch_time_t ts = switch_timestamp_now(); - char *dbuf = NULL; + char *dbuf = NULL; - memset(&cbt, 0, sizeof(cbt)); - if (!(profile = switch_core_hash_find(globals.profile_hash, profile_name))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error invalid profile %s\n", profile_name); - return SWITCH_STATUS_FALSE; - } + memset(&cbt, 0, sizeof(cbt)); + if (!(profile = switch_core_hash_find(globals.profile_hash, profile_name))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error invalid profile %s\n", profile_name); + return SWITCH_STATUS_FALSE; + } - channel = switch_core_session_get_channel(session); - switch_assert(channel != NULL); - - caller_profile = switch_channel_get_caller_profile(channel); - if(switch_strlen_zero(profile->storage_dir)) { - dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, - SWITCH_PATH_SEPARATOR, - SWITCH_PATH_SEPARATOR, - profile->name, - SWITCH_PATH_SEPARATOR, - domain_name, - SWITCH_PATH_SEPARATOR, - id); - } else { - dir_path = switch_core_session_sprintf(session, "%s%s%s", - profile->storage_dir, - SWITCH_PATH_SEPARATOR, - id); - } + channel = switch_core_session_get_channel(session); + switch_assert(channel != NULL); - if (switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", dir_path); - goto end; - } + caller_profile = switch_channel_get_caller_profile(channel); + if(switch_strlen_zero(profile->storage_dir)) { + dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, + SWITCH_PATH_SEPARATOR, + SWITCH_PATH_SEPARATOR, + profile->name, + SWITCH_PATH_SEPARATOR, + domain_name, + SWITCH_PATH_SEPARATOR, + id); + } else { + dir_path = switch_core_session_sprintf(session, "%s%s%s", + profile->storage_dir, + SWITCH_PATH_SEPARATOR, + id); + } + + if (switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", dir_path); + goto end; + } if (id) { - int ok = 1; - char *xtra = switch_mprintf("mailbox=%s", id); - switch_xml_t x_domain, x_domain_root, x_user, x_params, x_param; - const char *email_addr = NULL; - - switch_assert(xtra); - x_user = x_domain = x_domain_root = NULL; - if (switch_xml_locate_user("id", id, domain_name, switch_channel_get_variable(channel, "network_addr"), - &x_domain_root, &x_domain, &x_user, xtra) == SWITCH_STATUS_SUCCESS) { - if ((x_params = switch_xml_child(x_user, "params"))) { - for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) { - const char *var = switch_xml_attr_soft(x_param, "name"); - const char *val = switch_xml_attr_soft(x_param, "value"); - - if (!strcasecmp(var, "vm-mailto")) { - email_vm = switch_core_session_strdup(session, val); - } else if (!strcasecmp(var, "email-addr")) { - email_addr = val; - } else if (!strcasecmp(var, "vm-email-all-messages")) { - send_mail = switch_true(val); - } else if (!strcasecmp(var, "vm-delete-file")) { - email_delete = switch_true(val); - } else if (!strcasecmp(var, "vm-attach-file")) { - email_attach = switch_true(val); - } - } - } + int ok = 1; + char *xtra = switch_mprintf("mailbox=%s", id); + switch_xml_t x_domain, x_domain_root, x_user, x_params, x_param; + const char *email_addr = NULL; - if (send_mail && switch_strlen_zero(email_vm) && !switch_strlen_zero(email_addr)) { - email_vm = switch_core_session_strdup(session, email_addr); - } + switch_assert(xtra); + x_user = x_domain = x_domain_root = NULL; + if (switch_xml_locate_user("id", id, domain_name, switch_channel_get_variable(channel, "network_addr"), + &x_domain_root, &x_domain, &x_user, xtra) == SWITCH_STATUS_SUCCESS) { + if ((x_params = switch_xml_child(x_user, "params"))) { + for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) { + const char *var = switch_xml_attr_soft(x_param, "name"); + const char *val = switch_xml_attr_soft(x_param, "value"); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", id, domain_name); - ok = 0; - } + if (!strcasecmp(var, "vm-mailto")) { + email_vm = switch_core_session_strdup(session, val); + } else if (!strcasecmp(var, "email-addr")) { + email_addr = val; + } else if (!strcasecmp(var, "vm-email-all-messages")) { + send_mail = switch_true(val); + } else if (!strcasecmp(var, "vm-delete-file")) { + email_delete = switch_true(val); + } else if (!strcasecmp(var, "vm-attach-file")) { + email_attach = switch_true(val); + } + } + } + + if (send_mail && switch_strlen_zero(email_vm) && !switch_strlen_zero(email_addr)) { + email_vm = switch_core_session_strdup(session, email_addr); + } + + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", id, domain_name); + ok = 0; + } switch_safe_free(xtra); - switch_xml_free(x_domain_root); - if (!ok) { - goto end; - } - } + switch_xml_free(x_domain_root); + if (!ok) { + goto end; + } + } - switch_snprintf(sql, sizeof(sql), - "select * from voicemail_prefs where user='%s' and domain='%s'", - id, - domain_name); - vm_execute_sql_callback(profile, profile->mutex, sql, prefs_callback, &cbt); - - file_path = switch_mprintf("%s%smsg_%s.%s", dir_path, SWITCH_PATH_SEPARATOR, uuid, profile->file_ext); + switch_snprintf(sql, sizeof(sql), + "select * from voicemail_prefs where user='%s' and domain='%s'", + id, + domain_name); + vm_execute_sql_callback(profile, profile->mutex, sql, prefs_callback, &cbt); - if ((voicemail_greeting_number = switch_channel_get_variable(channel, "voicemail_greeting_number"))) { - int num = atoi(voicemail_greeting_number); - if (num > 0 && num < 3) { - greet_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, num, profile->file_ext); - } - } else { - greet_path = cbt.greeting_path; - } + file_path = switch_mprintf("%s%smsg_%s.%s", dir_path, SWITCH_PATH_SEPARATOR, uuid, profile->file_ext); - greet: - memset(buf, 0, sizeof(buf)); - args.input_callback = cancel_on_dtmf; - args.buf = buf; - args.buflen = sizeof(buf); - - if (!switch_strlen_zero(greet_path)) { - memset(buf, 0, sizeof(buf)); - TRY_CODE(switch_ivr_play_file(session, NULL, greet_path, &args)); - } else { - if (!switch_strlen_zero(cbt.name_path)) { - memset(buf, 0, sizeof(buf)); - TRY_CODE(switch_ivr_play_file(session, NULL, cbt.name_path, &args)); - } - if (*buf == '\0') { - memset(buf, 0, sizeof(buf)); - TRY_CODE(switch_ivr_phrase_macro(session, VM_PLAY_GREETING_MACRO, id, NULL, &args)); - } - } + if ((voicemail_greeting_number = switch_channel_get_variable(channel, "voicemail_greeting_number"))) { + int num = atoi(voicemail_greeting_number); + if (num > 0 && num < 3) { + greet_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, num, profile->file_ext); + } + } else { + greet_path = cbt.greeting_path; + } - if (*buf != '\0') { - if (!strcasecmp(buf, profile->main_menu_key)) { - voicemail_check_main(session, profile_name, domain_name, id, 0); - } else if(!strcasecmp(buf, profile->operator_key) && !switch_strlen_zero(profile->operator_key)) { - int argc; - char *argv[4]; - char *mycmd; +greet: + memset(buf, 0, sizeof(buf)); + args.input_callback = cancel_on_dtmf; + args.buf = buf; + args.buflen = sizeof(buf); - if (!switch_strlen_zero(profile->operator_ext) && (mycmd = switch_core_session_strdup(session, profile->operator_ext))) { - argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); - if(argc >= 1 && argc <= 4) { - switch_ivr_session_transfer(session, argv[0], argv[1], argv[2]); - /* the application still runs after we leave it so we need to make sure that we dont do anything evil */ - send_mail=0; - goto end; - } - } - } else { - goto greet; - } - } + if (!switch_strlen_zero(greet_path)) { + memset(buf, 0, sizeof(buf)); + TRY_CODE(switch_ivr_play_file(session, NULL, greet_path, &args)); + } else { + if (!switch_strlen_zero(cbt.name_path)) { + memset(buf, 0, sizeof(buf)); + TRY_CODE(switch_ivr_play_file(session, NULL, cbt.name_path, &args)); + } + if (*buf == '\0') { + memset(buf, 0, sizeof(buf)); + TRY_CODE(switch_ivr_phrase_macro(session, VM_PLAY_GREETING_MACRO, id, NULL, &args)); + } + } + + if (*buf != '\0') { + if (!strcasecmp(buf, profile->main_menu_key)) { + voicemail_check_main(session, profile_name, domain_name, id, 0); + } else if(!strcasecmp(buf, profile->operator_key) && !switch_strlen_zero(profile->operator_key)) { + int argc; + char *argv[4]; + char *mycmd; + + if (!switch_strlen_zero(profile->operator_ext) && (mycmd = switch_core_session_strdup(session, profile->operator_ext))) { + argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + if(argc >= 1 && argc <= 4) { + switch_ivr_session_transfer(session, argv[0], argv[1], argv[2]); + /* the application still runs after we leave it so we need to make sure that we dont do anything evil */ + send_mail=0; + goto end; + } + } + } else { + goto greet; + } + } memset(&fh, 0, sizeof(fh)); - args.input_callback = control_playback; - memset(&cc, 0, sizeof(cc)); - cc.profile = profile; - cc.fh = &fh; - cc.noexit = 1; - args.buf = &cc; + args.input_callback = control_playback; + memset(&cc, 0, sizeof(cc)); + cc.profile = profile; + cc.fh = &fh; + cc.noexit = 1; + args.buf = &cc; - dbuf = switch_mprintf("%s (%s)", caller_profile->caller_id_name, caller_profile->caller_id_number); - switch_channel_set_variable(channel, "RECORD_ARTIST", dbuf); - free(dbuf); + dbuf = switch_mprintf("%s (%s)", caller_profile->caller_id_name, caller_profile->caller_id_number); + switch_channel_set_variable(channel, "RECORD_ARTIST", dbuf); + free(dbuf); switch_time_exp_lt(&tm, ts); switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); - switch_channel_set_variable(channel, "RECORD_DATE", date); - switch_channel_set_variable(channel, "RECORD_SOFTWARE", "FreeSWITCH"); - switch_channel_set_variable(channel, "RECORD_TITLE", profile->record_title); - switch_channel_set_variable(channel, "RECORD_COMMENT", profile->record_comment); - switch_channel_set_variable(channel, "RECORD_COPYRIGHT", profile->record_copyright); + switch_channel_set_variable(channel, "RECORD_DATE", date); + switch_channel_set_variable(channel, "RECORD_SOFTWARE", "FreeSWITCH"); + switch_channel_set_variable(channel, "RECORD_TITLE", profile->record_title); + switch_channel_set_variable(channel, "RECORD_COMMENT", profile->record_comment); + switch_channel_set_variable(channel, "RECORD_COPYRIGHT", profile->record_copyright); - status = create_file(session, profile, VM_RECORD_MESSAGE_MACRO, file_path, &message_len); + status = create_file(session, profile, VM_RECORD_MESSAGE_MACRO, file_path, &message_len); - if ((status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) && switch_channel_ready(channel)) { - char input[10] = "", key_buf[80] = "", term = 0; + if ((status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) && switch_channel_ready(channel)) { + char input[10] = "", key_buf[80] = "", term = 0; - switch_snprintf(key_buf, sizeof(key_buf), "%s:%s", - profile->urgent_key, - profile->terminator_key); + switch_snprintf(key_buf, sizeof(key_buf), "%s:%s", + profile->urgent_key, + profile->terminator_key); - vm_macro_get(session, VM_RECORD_URGENT_CHECK_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); - if (*profile->urgent_key == *input) { - read_flags = URGENT_FLAG_STRING; - priority = 1; - TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "marked-urgent", NULL, NULL)); - } else { - TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)); - } - } + vm_macro_get(session, VM_RECORD_URGENT_CHECK_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); + if (*profile->urgent_key == *input) { + read_flags = URGENT_FLAG_STRING; + priority = 1; + TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "marked-urgent", NULL, NULL)); + } else { + TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)); + } + } - if(!send_mail && switch_file_exists(file_path, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { - char *usql; - switch_event_t *event; - char *mwi_id = NULL; - int total_new_messages = 0; - int total_saved_messages = 0; - int total_new_urgent_messages = 0; - int total_saved_urgent_messages = 0; - - usql = switch_mprintf("insert into voicemail_data values(%ld,0,'%q','%q','%q','%q','%q','%q','%q','%u','','%q')", (long)time(NULL), - id, domain_name, uuid, caller_profile->caller_id_name, caller_profile->caller_id_number, - myfolder, file_path, message_len, read_flags); - vm_execute_sql(profile, usql, profile->mutex); - switch_safe_free(usql); + if(!send_mail && switch_file_exists(file_path, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { + char *usql; + switch_event_t *event; + char *mwi_id = NULL; + int total_new_messages = 0; + int total_saved_messages = 0; + int total_new_urgent_messages = 0; + int total_saved_urgent_messages = 0; - message_count(profile, id, domain_name, myfolder, &total_new_messages, &total_saved_messages, - &total_new_urgent_messages, &total_saved_urgent_messages); + usql = switch_mprintf("insert into voicemail_data values(%ld,0,'%q','%q','%q','%q','%q','%q','%q','%u','','%q')", (long)time(NULL), + id, domain_name, uuid, caller_profile->caller_id_name, caller_profile->caller_id_number, + myfolder, file_path, message_len, read_flags); + vm_execute_sql(profile, usql, profile->mutex); + switch_safe_free(usql); - if (switch_event_create(&event, SWITCH_EVENT_MESSAGE_WAITING) == SWITCH_STATUS_SUCCESS) { - const char *yn = "no"; - if (total_new_messages || total_saved_messages || total_new_urgent_messages || total_saved_urgent_messages) { - yn = "yes"; - } - mwi_id = switch_mprintf("%s@%s", id, domain_name); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", "%s", yn); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", mwi_id); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d (%d/%d)", - total_new_messages, total_saved_messages, total_new_urgent_messages, total_saved_urgent_messages); - switch_event_fire(&event); - switch_safe_free(mwi_id); - } - } - - end: + message_count(profile, id, domain_name, myfolder, &total_new_messages, &total_saved_messages, + &total_new_urgent_messages, &total_saved_urgent_messages); + + if (switch_event_create(&event, SWITCH_EVENT_MESSAGE_WAITING) == SWITCH_STATUS_SUCCESS) { + const char *yn = "no"; + if (total_new_messages || total_saved_messages || total_new_urgent_messages || total_saved_urgent_messages) { + yn = "yes"; + } + mwi_id = switch_mprintf("%s@%s", id, domain_name); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", "%s", yn); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", mwi_id); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d (%d/%d)", + total_new_messages, total_saved_messages, total_new_urgent_messages, total_saved_urgent_messages); + switch_event_fire(&event); + switch_safe_free(mwi_id); + } + } + +end: if (send_mail && !switch_strlen_zero(email_vm)) { - switch_event_t *event; - char *from; - char *body; - char *headers; - char *header_string; - char tmp[50]=""; - int total_new_messages = 0; - int total_saved_messages = 0; - int total_new_urgent_messages = 0; - int total_saved_urgent_messages = 0; - char *p; - long l_duration = 0; - switch_core_time_duration_t duration; - char duration_str[80]; + switch_event_t *event; + char *from; + char *body; + char *headers; + char *header_string; + char tmp[50]=""; + int total_new_messages = 0; + int total_saved_messages = 0; + int total_new_urgent_messages = 0; + int total_saved_urgent_messages = 0; + char *p; + long l_duration = 0; + switch_core_time_duration_t duration; + char duration_str[80]; - message_count(profile, id, domain_name, myfolder, &total_new_messages, &total_saved_messages, - &total_new_urgent_messages, &total_saved_urgent_messages); + message_count(profile, id, domain_name, myfolder, &total_new_messages, &total_saved_messages, + &total_new_urgent_messages, &total_saved_urgent_messages); - switch_time_exp_lt(&tm, switch_time_now()); - switch_strftime(date, &retsize, sizeof(date), profile->date_fmt, &tm); + switch_time_exp_lt(&tm, switch_time_now()); + switch_strftime(date, &retsize, sizeof(date), profile->date_fmt, &tm); - switch_channel_set_variable(channel, "voicemail_current_folder", myfolder); - switch_snprintf(tmp,sizeof(tmp), "%d", total_new_messages); - switch_channel_set_variable(channel, "voicemail_total_new_messages", tmp); - switch_snprintf(tmp,sizeof(tmp), "%d", total_saved_messages); - switch_channel_set_variable(channel, "voicemail_total_saved_messages", tmp); - switch_snprintf(tmp,sizeof(tmp), "%d", total_new_urgent_messages); - switch_channel_set_variable(channel, "voicemail_urgent_new_messages", tmp); - switch_snprintf(tmp,sizeof(tmp), "%d", total_saved_urgent_messages); - switch_channel_set_variable(channel, "voicemail_urgent_saved_messages", tmp); - switch_channel_set_variable(channel, "voicemail_account", id); - switch_channel_set_variable(channel, "voicemail_domain", domain_name); - switch_channel_set_variable(channel, "voicemail_caller_id_number", caller_profile->caller_id_number); - switch_channel_set_variable(channel, "voicemail_caller_id_name", caller_profile->caller_id_name); - switch_channel_set_variable(channel, "voicemail_file_path", file_path); - switch_channel_set_variable(channel, "voicemail_read_flags", read_flags); - switch_channel_set_variable(channel, "voicemail_time", date); - switch_snprintf(tmp,sizeof(tmp), "%d", priority); - switch_channel_set_variable(channel, "voicemail_priority", tmp); - switch_channel_set_variable(channel, "voicemail_email", email_vm); + switch_channel_set_variable(channel, "voicemail_current_folder", myfolder); + switch_snprintf(tmp,sizeof(tmp), "%d", total_new_messages); + switch_channel_set_variable(channel, "voicemail_total_new_messages", tmp); + switch_snprintf(tmp,sizeof(tmp), "%d", total_saved_messages); + switch_channel_set_variable(channel, "voicemail_total_saved_messages", tmp); + switch_snprintf(tmp,sizeof(tmp), "%d", total_new_urgent_messages); + switch_channel_set_variable(channel, "voicemail_urgent_new_messages", tmp); + switch_snprintf(tmp,sizeof(tmp), "%d", total_saved_urgent_messages); + switch_channel_set_variable(channel, "voicemail_urgent_saved_messages", tmp); + switch_channel_set_variable(channel, "voicemail_account", id); + switch_channel_set_variable(channel, "voicemail_domain", domain_name); + switch_channel_set_variable(channel, "voicemail_caller_id_number", caller_profile->caller_id_number); + switch_channel_set_variable(channel, "voicemail_caller_id_name", caller_profile->caller_id_name); + switch_channel_set_variable(channel, "voicemail_file_path", file_path); + switch_channel_set_variable(channel, "voicemail_read_flags", read_flags); + switch_channel_set_variable(channel, "voicemail_time", date); + switch_snprintf(tmp,sizeof(tmp), "%d", priority); + switch_channel_set_variable(channel, "voicemail_priority", tmp); + switch_channel_set_variable(channel, "voicemail_email", email_vm); l_duration = (long)message_len * 1000000; - switch_core_measure_time(l_duration, &duration); - duration.day += duration.yr * 365; - duration.hr += duration.day * 24; - switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", - duration.hr, - duration.min, - duration.sec - ); + switch_core_measure_time(l_duration, &duration); + duration.day += duration.yr * 365; + duration.hr += duration.day * 24; + switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", + duration.hr, + duration.min, + duration.sec + ); switch_channel_set_variable(channel, "voicemail_message_len", duration_str); - if (switch_strlen_zero(profile->email_from)) { - from = switch_core_session_sprintf(session, "%s@%s", id, domain_name); - } else { - from = switch_channel_expand_variables(channel, profile->email_headers); - } + if (switch_strlen_zero(profile->email_from)) { + from = switch_core_session_sprintf(session, "%s@%s", id, domain_name); + } else { + from = switch_channel_expand_variables(channel, profile->email_headers); + } - if (switch_strlen_zero(profile->email_headers)) { - headers = switch_core_session_sprintf(session, - "From: FreeSWITCH mod_voicemail <%s@%s>\n" - "Subject: Voicemail from %s %s\nX-Priority: %d", - id, domain_name, - caller_profile->caller_id_name, - caller_profile->caller_id_number, - priority); - } else { - headers = switch_channel_expand_variables(channel, profile->email_headers); - } + if (switch_strlen_zero(profile->email_headers)) { + headers = switch_core_session_sprintf(session, + "From: FreeSWITCH mod_voicemail <%s@%s>\n" + "Subject: Voicemail from %s %s\nX-Priority: %d", + id, domain_name, + caller_profile->caller_id_name, + caller_profile->caller_id_number, + priority); + } else { + headers = switch_channel_expand_variables(channel, profile->email_headers); + } - p = headers + (strlen(headers) - 1); + p = headers + (strlen(headers) - 1); - if (*p == '\n') { - if (*(p-1) == '\r') { - p--; - } - *p = '\0'; - } + if (*p == '\n') { + if (*(p-1) == '\r') { + p--; + } + *p = '\0'; + } - header_string = switch_core_session_sprintf(session, "%s\nX-Voicemail-Length: %u", headers, message_len); + header_string = switch_core_session_sprintf(session, "%s\nX-Voicemail-Length: %u", headers, message_len); if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) { - switch_channel_event_set_data(channel, event); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Type", "voicemail"); - switch_event_fire(&event); - } + switch_channel_event_set_data(channel, event); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Type", "voicemail"); + switch_event_fire(&event); + } - if (profile->email_body) { - body = switch_channel_expand_variables(channel, profile->email_body); - } else { - body = switch_mprintf("%u second Voicemail from %s %s", message_len, - caller_profile->caller_id_name, caller_profile->caller_id_number); - } + if (profile->email_body) { + body = switch_channel_expand_variables(channel, profile->email_body); + } else { + body = switch_mprintf("%u second Voicemail from %s %s", message_len, + caller_profile->caller_id_name, caller_profile->caller_id_number); + } - if (email_attach) { - switch_simple_email(email_vm, from, header_string, body, file_path); - } else { - switch_simple_email(email_vm, from, header_string, body, NULL); - } + if (email_attach) { + switch_simple_email(email_vm, from, header_string, body, file_path); + } else { + switch_simple_email(email_vm, from, header_string, body, NULL); + } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", email_vm); - switch_safe_free(body); - if (email_delete) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", email_vm); + switch_safe_free(body); + if (email_delete) { if (unlink(file_path) != 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "failed to delete file [%s]\n", file_path); } - } - } + } + } - switch_safe_free(file_path); - - if (switch_channel_ready(channel)) { - status = switch_ivr_phrase_macro(session, VM_GOODBYE_MACRO, NULL, NULL, NULL); - } + switch_safe_free(file_path); - return status; + if (switch_channel_ready(channel)) { + status = switch_ivr_phrase_macro(session, VM_GOODBYE_MACRO, NULL, NULL, NULL); + } + + return status; } @@ -2026,698 +2026,698 @@ SWITCH_STANDARD_APP(voicemail_function) int argc = 0; char *argv[6] = { 0 }; char *mydata = NULL; - const char *profile_name = NULL; - const char *domain_name = NULL; - const char *id = NULL; - const char *auth_var = NULL; - int x = 0, check = 0, auth = 0; - switch_channel_t *channel; + const char *profile_name = NULL; + const char *domain_name = NULL; + const char *id = NULL; + const char *auth_var = NULL; + int x = 0, check = 0, auth = 0; + switch_channel_t *channel; - channel = switch_core_session_get_channel(session); - switch_assert(channel != NULL); + channel = switch_core_session_get_channel(session); + switch_assert(channel != NULL); - if (switch_dir_make_recursive(SWITCH_GLOBAL_dirs.storage_dir, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", SWITCH_GLOBAL_dirs.storage_dir); - return; - } - - if (!switch_strlen_zero(data)) { - mydata = switch_core_session_strdup(session, data); - argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); - } + if (switch_dir_make_recursive(SWITCH_GLOBAL_dirs.storage_dir, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", SWITCH_GLOBAL_dirs.storage_dir); + return; + } - for (;;) { - if (argv[x] && !strcasecmp(argv[x], "check")) { - check++; - x++; - } else if (argv[x] && !strcasecmp(argv[x], "auth")) { - auth++; - x++; - } else { - break; - } - } + if (!switch_strlen_zero(data)) { + mydata = switch_core_session_strdup(session, data); + argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + } - if (argv[x]) { - profile_name = argv[x++]; - } + for (;;) { + if (argv[x] && !strcasecmp(argv[x], "check")) { + check++; + x++; + } else if (argv[x] && !strcasecmp(argv[x], "auth")) { + auth++; + x++; + } else { + break; + } + } - if (argv[x]) { - domain_name = argv[x++]; - } + if (argv[x]) { + profile_name = argv[x++]; + } - if (argv[x]) { - id = argv[x++]; - } + if (argv[x]) { + domain_name = argv[x++]; + } + + if (argv[x]) { + id = argv[x++]; + } if ((auth_var = switch_channel_get_variable(channel, "voicemail_authorized")) && switch_true(auth_var)) { - auth = 1; - } + auth = 1; + } - if (switch_strlen_zero(profile_name)) { - profile_name = switch_channel_get_variable(channel, "voicemail_profile_name"); - } + if (switch_strlen_zero(profile_name)) { + profile_name = switch_channel_get_variable(channel, "voicemail_profile_name"); + } - if (switch_strlen_zero(domain_name)) { - domain_name = switch_channel_get_variable(channel, "voicemail_domain_name"); - } + if (switch_strlen_zero(domain_name)) { + domain_name = switch_channel_get_variable(channel, "voicemail_domain_name"); + } - if (switch_strlen_zero(id)) { - id = switch_channel_get_variable(channel, "voicemail_id"); - } + if (switch_strlen_zero(id)) { + id = switch_channel_get_variable(channel, "voicemail_id"); + } - if (switch_strlen_zero(profile_name) || switch_strlen_zero(domain_name)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Usage: %s\n", VM_USAGE); - return; - } - - if (check) { - voicemail_check_main(session, profile_name, domain_name, id, auth); - } else { - voicemail_leave_main(session, profile_name, domain_name, id); - } + if (switch_strlen_zero(profile_name) || switch_strlen_zero(domain_name)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Usage: %s\n", VM_USAGE); + return; + } + + if (check) { + voicemail_check_main(session, profile_name, domain_name, id, auth); + } else { + voicemail_leave_main(session, profile_name, domain_name, id); + } } static void message_query_handler(switch_event_t *event) { char *account = switch_event_get_header(event, "message-account"); - int sent = 0; - switch_event_t *new_event = NULL; + int sent = 0; + switch_event_t *new_event = NULL; if (account) { - switch_hash_index_t *hi; - int total_new_messages = 0; - int total_saved_messages = 0; - int total_new_urgent_messages = 0; - int total_saved_urgent_messages = 0; - void *val; - vm_profile_t *profile; - char *id, *domain; + switch_hash_index_t *hi; + int total_new_messages = 0; + int total_saved_messages = 0; + int total_new_urgent_messages = 0; + int total_saved_urgent_messages = 0; + void *val; + vm_profile_t *profile; + char *id, *domain; - if (!strncasecmp(account, "sip:", 4)) { - id = strdup(account + 4); - } else { - id = strdup(account); - } - switch_assert(id); - - if ((domain = strchr(id, '@'))) { - *domain++ = '\0'; - for (hi = switch_hash_first(NULL, globals.profile_hash); hi; hi = switch_hash_next(hi)) { - switch_hash_this(hi, NULL, NULL, &val); - profile = (vm_profile_t *) val; - total_new_messages = total_saved_messages = 0; - message_count(profile, id, domain, "inbox", &total_new_messages, &total_saved_messages, - &total_new_urgent_messages, &total_saved_urgent_messages); - if (total_new_messages || total_saved_messages) { - if (switch_event_create(&new_event, SWITCH_EVENT_MESSAGE_WAITING) == SWITCH_STATUS_SUCCESS) { - const char *yn = "no"; - if (total_new_messages || total_saved_messages || total_new_urgent_messages || total_saved_urgent_messages) { - yn = "yes"; - } - switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", "%s", yn); - switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", account); - switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d (%d/%d)", - total_new_messages, total_saved_messages, total_new_urgent_messages, total_saved_urgent_messages); - switch_event_fire(&new_event); - sent++; - } - } - } - } - - switch_safe_free(id); + if (!strncasecmp(account, "sip:", 4)) { + id = strdup(account + 4); + } else { + id = strdup(account); + } + switch_assert(id); + + if ((domain = strchr(id, '@'))) { + *domain++ = '\0'; + for (hi = switch_hash_first(NULL, globals.profile_hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, NULL, NULL, &val); + profile = (vm_profile_t *) val; + total_new_messages = total_saved_messages = 0; + message_count(profile, id, domain, "inbox", &total_new_messages, &total_saved_messages, + &total_new_urgent_messages, &total_saved_urgent_messages); + if (total_new_messages || total_saved_messages) { + if (switch_event_create(&new_event, SWITCH_EVENT_MESSAGE_WAITING) == SWITCH_STATUS_SUCCESS) { + const char *yn = "no"; + if (total_new_messages || total_saved_messages || total_new_urgent_messages || total_saved_urgent_messages) { + yn = "yes"; + } + switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", "%s", yn); + switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", account); + switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d (%d/%d)", + total_new_messages, total_saved_messages, total_new_urgent_messages, total_saved_urgent_messages); + switch_event_fire(&new_event); + sent++; + } + } + } + } + + switch_safe_free(id); } - if (!sent) { - if (switch_event_create(&new_event, SWITCH_EVENT_MESSAGE_WAITING) == SWITCH_STATUS_SUCCESS) { - switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", "no"); - switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", account); - switch_event_fire(&new_event); - } - } + if (!sent) { + if (switch_event_create(&new_event, SWITCH_EVENT_MESSAGE_WAITING) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", "no"); + switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", account); + switch_event_fire(&new_event); + } + } } #define VOICEMAIL_SYNTAX "rss [ ]" struct holder { - vm_profile_t *profile; - switch_memory_pool_t *pool; + vm_profile_t *profile; + switch_memory_pool_t *pool; switch_stream_handle_t *stream; switch_xml_t xml; - switch_xml_t x_item; - switch_xml_t x_channel; - int items; - char *user; - char *domain; - char *host; - char *port; - char *uri; + switch_xml_t x_item; + switch_xml_t x_channel; + int items; + char *user; + char *domain; + char *host; + char *port; + char *uri; }; static int del_callback(void *pArg, int argc, char **argv, char **columnNames) { - if (argc > 8) { + if (argc > 8) { if (unlink(argv[8]) != 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "failed to delete file [%s]\n", argv[8]); } - } - return 0; + } + return 0; } static int play_callback(void *pArg, int argc, char **argv, char **columnNames) { - switch_file_t *fd; - struct holder *holder = (struct holder *) pArg; - char *fname, *ext; - switch_size_t flen; - uint8_t chunk[1024]; + switch_file_t *fd; + struct holder *holder = (struct holder *) pArg; + char *fname, *ext; + switch_size_t flen; + uint8_t chunk[1024]; const char *mime_type = "audio/inline", *new_type; - if ((fname = strrchr(argv[8], '/'))) { - fname++; - } else { - fname = argv[8]; - } + if ((fname = strrchr(argv[8], '/'))) { + fname++; + } else { + fname = argv[8]; + } - if ((ext = strrchr(fname, '.'))) { - ext++; - if ((new_type = switch_core_mime_ext2type(ext))) { - mime_type = new_type; - } - } + if ((ext = strrchr(fname, '.'))) { + ext++; + if ((new_type = switch_core_mime_ext2type(ext))) { + mime_type = new_type; + } + } - if (switch_file_open(&fd, argv[8], SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, holder->pool) == SWITCH_STATUS_SUCCESS) { - flen = switch_file_get_size(fd); - holder->stream->write_function(holder->stream, "Content-type: %s\n", mime_type); - holder->stream->write_function(holder->stream, "Content-length: %ld\n\n", (long)flen); - for(;;) { - switch_status_t status; + if (switch_file_open(&fd, argv[8], SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, holder->pool) == SWITCH_STATUS_SUCCESS) { + flen = switch_file_get_size(fd); + holder->stream->write_function(holder->stream, "Content-type: %s\n", mime_type); + holder->stream->write_function(holder->stream, "Content-length: %ld\n\n", (long)flen); + for(;;) { + switch_status_t status; - flen = sizeof(chunk); - status = switch_file_read(fd, chunk, &flen); - if (status != SWITCH_STATUS_SUCCESS || flen == 0) { - break; - } - - holder->stream->raw_write_function(holder->stream, chunk, flen); - } - switch_file_close(fd); - } - return 0; + flen = sizeof(chunk); + status = switch_file_read(fd, chunk, &flen); + if (status != SWITCH_STATUS_SUCCESS || flen == 0) { + break; + } + + holder->stream->raw_write_function(holder->stream, chunk, flen); + } + switch_file_close(fd); + } + return 0; } static void do_play(vm_profile_t *profile, char *user, char *domain, char *file, switch_stream_handle_t *stream) { - char *sql; - struct holder holder; + char *sql; + struct holder holder; - sql = switch_mprintf("update voicemail_data set read_epoch=%ld where user='%s' and domain='%s' and file_path like '%%%s'", - (long)time(NULL), user, domain, file); - - vm_execute_sql(profile, sql, profile->mutex); - free(sql); + sql = switch_mprintf("update voicemail_data set read_epoch=%ld where user='%s' and domain='%s' and file_path like '%%%s'", + (long)time(NULL), user, domain, file); - sql = switch_mprintf("select * from voicemail_data where user='%s' and domain='%s' and file_path like '%%%s'", user, domain, file); - memset(&holder, 0, sizeof(holder)); - holder.profile = profile; - holder.stream = stream; - switch_core_new_memory_pool(&holder.pool); - vm_execute_sql_callback(profile, profile->mutex, sql, play_callback, &holder); - switch_core_destroy_memory_pool(&holder.pool); - switch_safe_free(sql); + vm_execute_sql(profile, sql, profile->mutex); + free(sql); + + sql = switch_mprintf("select * from voicemail_data where user='%s' and domain='%s' and file_path like '%%%s'", user, domain, file); + memset(&holder, 0, sizeof(holder)); + holder.profile = profile; + holder.stream = stream; + switch_core_new_memory_pool(&holder.pool); + vm_execute_sql_callback(profile, profile->mutex, sql, play_callback, &holder); + switch_core_destroy_memory_pool(&holder.pool); + switch_safe_free(sql); } static void do_del(vm_profile_t *profile, char *user, char *domain, char *file, switch_stream_handle_t *stream) { - char *sql; - struct holder holder; - char *ref = NULL; - - if (stream->event) { - ref = switch_event_get_header(stream->event, "http-referer"); - } + char *sql; + struct holder holder; + char *ref = NULL; - sql = switch_mprintf("select * from voicemail_data where user='%s' and domain='%s' and file_path like '%%%s'", user, domain, file); - memset(&holder, 0, sizeof(holder)); - holder.profile = profile; - holder.stream = stream; - vm_execute_sql_callback(profile, profile->mutex, sql, del_callback, &holder); + if (stream->event) { + ref = switch_event_get_header(stream->event, "http-referer"); + } - switch_safe_free(sql); - sql = switch_mprintf("delete from voicemail_data where user='%s' and domain='%s' and file_path like '%%%s'", user, domain, file); - vm_execute_sql(profile, sql, profile->mutex); - free(sql); + sql = switch_mprintf("select * from voicemail_data where user='%s' and domain='%s' and file_path like '%%%s'", user, domain, file); + memset(&holder, 0, sizeof(holder)); + holder.profile = profile; + holder.stream = stream; + vm_execute_sql_callback(profile, profile->mutex, sql, del_callback, &holder); - if (ref) { - stream->write_function(stream,"Content-type: text/html\n\n

Message Deleted

\n" - "", ref); - } + switch_safe_free(sql); + sql = switch_mprintf("delete from voicemail_data where user='%s' and domain='%s' and file_path like '%%%s'", user, domain, file); + vm_execute_sql(profile, sql, profile->mutex); + free(sql); + + if (ref) { + stream->write_function(stream,"Content-type: text/html\n\n

Message Deleted

\n" + "", ref); + } } static int web_callback(void *pArg, int argc, char **argv, char **columnNames) { - struct holder *holder = (struct holder *) pArg; - char *del, *get, *fname, *ext; - switch_time_exp_t tm; + struct holder *holder = (struct holder *) pArg; + char *del, *get, *fname, *ext; + switch_time_exp_t tm; char create_date[80] = ""; char read_date[80] = ""; char rss_date[80] = ""; switch_size_t retsize; - long l_created = 0; - long l_read = 0; - long l_duration = 0; - switch_core_time_duration_t duration; - char duration_str[80]; - const char *fmt = "%a, %e %b %Y %T %z"; - char heard[80]; - char title_b4[128] = ""; - char title_aft[128*3] = ""; + long l_created = 0; + long l_read = 0; + long l_duration = 0; + switch_core_time_duration_t duration; + char duration_str[80]; + const char *fmt = "%a, %e %b %Y %T %z"; + char heard[80]; + char title_b4[128] = ""; + char title_aft[128*3] = ""; - if (argc > 0) { - l_created = atol(argv[0]) * 1000000; - } + if (argc > 0) { + l_created = atol(argv[0]) * 1000000; + } - if (argc > 1) { - l_read = atol(argv[1]) * 1000000; - } + if (argc > 1) { + l_read = atol(argv[1]) * 1000000; + } - if (argc > 9) { - l_duration = atol(argv[9]) * 1000000; - } + if (argc > 9) { + l_duration = atol(argv[9]) * 1000000; + } if ((fname = strrchr(argv[8], '/'))) { - fname++; - } else { - fname = argv[8]; - } + fname++; + } else { + fname = argv[8]; + } + + if ((ext = strrchr(fname, '.'))) { + ext++; + } - if ((ext = strrchr(fname, '.'))) { - ext++; - } - switch_core_measure_time(l_duration, &duration); - duration.day += duration.yr * 365; - duration.hr += duration.day * 24; + duration.day += duration.yr * 365; + duration.hr += duration.day * 24; - switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", - duration.hr, - duration.min, - duration.sec - ); + switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", + duration.hr, + duration.min, + duration.sec + ); - if (l_created) { - switch_time_exp_lt(&tm, l_created); - switch_strftime(create_date, &retsize, sizeof(create_date), fmt, &tm); - switch_strftime(rss_date, &retsize, sizeof(create_date), "%D %T", &tm); - } + if (l_created) { + switch_time_exp_lt(&tm, l_created); + switch_strftime(create_date, &retsize, sizeof(create_date), fmt, &tm); + switch_strftime(rss_date, &retsize, sizeof(create_date), "%D %T", &tm); + } - if (l_read) { - switch_time_exp_lt(&tm, l_read); - switch_strftime(read_date, &retsize, sizeof(read_date), fmt, &tm); - } + if (l_read) { + switch_time_exp_lt(&tm, l_read); + switch_strftime(read_date, &retsize, sizeof(read_date), fmt, &tm); + } - switch_snprintf(heard, sizeof(heard), *read_date == '\0' ? "never" : read_date); + switch_snprintf(heard, sizeof(heard), *read_date == '\0' ? "never" : read_date); - get = switch_mprintf("http://%s:%s%s/get/%s", holder->host, holder->port, holder->uri, fname); - del = switch_mprintf("http://%s:%s%s/del/%s", holder->host, holder->port, holder->uri, fname); + get = switch_mprintf("http://%s:%s%s/get/%s", holder->host, holder->port, holder->uri, fname); + del = switch_mprintf("http://%s:%s%s/del/%s", holder->host, holder->port, holder->uri, fname); - holder->stream->write_function(holder->stream, "
Message from %s %s

\n", - argv[5], argv[6]); - holder->stream->write_function(holder->stream, "Priority: %s
\n" - "Created: %s
\n" - "Last Heard: %s
\n" - "Duration: %s
\n", - //"Delete This Message

", - strcmp(argv[10], URGENT_FLAG_STRING) ? "normal" : "urgent", create_date, heard, duration_str); + holder->stream->write_function(holder->stream, "
Message from %s %s

\n", + argv[5], argv[6]); + holder->stream->write_function(holder->stream, "Priority: %s
\n" + "Created: %s
\n" + "Last Heard: %s
\n" + "Duration: %s
\n", + //"Delete This Message

", + strcmp(argv[10], URGENT_FLAG_STRING) ? "normal" : "urgent", create_date, heard, duration_str); - switch_snprintf(title_b4, sizeof(title_b4), "%s <%s> %s", argv[5], argv[6], rss_date); - switch_url_encode(title_b4, title_aft, sizeof(title_aft)-1); + switch_snprintf(title_b4, sizeof(title_b4), "%s <%s> %s", argv[5], argv[6], rss_date); + switch_url_encode(title_b4, title_aft, sizeof(title_aft)-1); holder->stream->write_function(holder->stream, - "
\n" - "

\n" - "[delete] [download] [call]


\n", - holder->host, holder->port, get, title_aft, holder->host, holder->port, get, title_aft, del, get, argv[6]); + "
\n" + "

\n" + "[delete] [download] [call]


\n", + holder->host, holder->port, get, title_aft, holder->host, holder->port, get, title_aft, del, get, argv[6]); - free(get); - free(del); + free(get); + free(del); - return 0; + return 0; } static int rss_callback(void *pArg, int argc, char **argv, char **columnNames) { - struct holder *holder = (struct holder *) pArg; - switch_xml_t x_tmp, x_link; - char *tmp, *del, *get; - switch_time_exp_t tm; + struct holder *holder = (struct holder *) pArg; + switch_xml_t x_tmp, x_link; + char *tmp, *del, *get; + switch_time_exp_t tm; char create_date[80] = ""; char read_date[80] = ""; char rss_date[80] = ""; switch_size_t retsize; const char *mime_type = "audio/inline", *new_type; - char *ext; - char *fname; - switch_size_t flen; - switch_file_t *fd; - long l_created = 0; - long l_read = 0; - long l_duration = 0; - switch_core_time_duration_t duration; - char duration_str[80]; - const char *fmt = "%a, %e %b %Y %T %z"; - char heard[80]; - - if (argc > 0) { - l_created = atol(argv[0]) * 1000000; - } + char *ext; + char *fname; + switch_size_t flen; + switch_file_t *fd; + long l_created = 0; + long l_read = 0; + long l_duration = 0; + switch_core_time_duration_t duration; + char duration_str[80]; + const char *fmt = "%a, %e %b %Y %T %z"; + char heard[80]; - if (argc > 1) { - l_read = atol(argv[1]) * 1000000; - } + if (argc > 0) { + l_created = atol(argv[0]) * 1000000; + } + + if (argc > 1) { + l_read = atol(argv[1]) * 1000000; + } + + if (argc > 9) { + l_duration = atol(argv[9]) * 1000000; + } - if (argc > 9) { - l_duration = atol(argv[9]) * 1000000; - } - switch_core_measure_time(l_duration, &duration); - duration.day += duration.yr * 365; - duration.hr += duration.day * 24; + duration.day += duration.yr * 365; + duration.hr += duration.day * 24; - switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", - duration.hr, - duration.min, - duration.sec - ); + switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", + duration.hr, + duration.min, + duration.sec + ); - if (l_created) { - switch_time_exp_lt(&tm, l_created); - switch_strftime(create_date, &retsize, sizeof(create_date), fmt, &tm); - switch_strftime(rss_date, &retsize, sizeof(create_date), fmt, &tm); - } + if (l_created) { + switch_time_exp_lt(&tm, l_created); + switch_strftime(create_date, &retsize, sizeof(create_date), fmt, &tm); + switch_strftime(rss_date, &retsize, sizeof(create_date), fmt, &tm); + } - if (l_read) { - switch_time_exp_lt(&tm, l_read); - switch_strftime(read_date, &retsize, sizeof(read_date), fmt, &tm); - } + if (l_read) { + switch_time_exp_lt(&tm, l_read); + switch_strftime(read_date, &retsize, sizeof(read_date), fmt, &tm); + } - holder->x_item = switch_xml_add_child_d(holder->x_channel, "item", holder->items++); + holder->x_item = switch_xml_add_child_d(holder->x_channel, "item", holder->items++); - x_tmp = switch_xml_add_child_d(holder->x_item, "title", 0); - tmp = switch_mprintf("Message from %s %s on %s", argv[5], argv[6], create_date); - switch_xml_set_txt_d(x_tmp, tmp); - free(tmp); + x_tmp = switch_xml_add_child_d(holder->x_item, "title", 0); + tmp = switch_mprintf("Message from %s %s on %s", argv[5], argv[6], create_date); + switch_xml_set_txt_d(x_tmp, tmp); + free(tmp); - x_tmp = switch_xml_add_child_d(holder->x_item, "description", 0); + x_tmp = switch_xml_add_child_d(holder->x_item, "description", 0); - switch_snprintf(heard, sizeof(heard), *read_date == '\0' ? "never" : read_date); - - if ((fname = strrchr(argv[8], '/'))) { - fname++; - } else { - fname = argv[8]; - } + switch_snprintf(heard, sizeof(heard), *read_date == '\0' ? "never" : read_date); - get = switch_mprintf("http://%s:%s%s/get/%s", holder->host, holder->port, holder->uri, fname); - del = switch_mprintf("http://%s:%s%s/del/%s", holder->host, holder->port, holder->uri, fname); - x_link = switch_xml_add_child_d(holder->x_item, "fsvm:rmlink", 0); - switch_xml_set_txt_d(x_link, del); + if ((fname = strrchr(argv[8], '/'))) { + fname++; + } else { + fname = argv[8]; + } + + get = switch_mprintf("http://%s:%s%s/get/%s", holder->host, holder->port, holder->uri, fname); + del = switch_mprintf("http://%s:%s%s/del/%s", holder->host, holder->port, holder->uri, fname); + x_link = switch_xml_add_child_d(holder->x_item, "fsvm:rmlink", 0); + switch_xml_set_txt_d(x_link, del); tmp = switch_mprintf("" - "Last Heard: %s
Duration: %s
" - "Delete This Message
" - "]]>", - strcmp(argv[10], URGENT_FLAG_STRING) ? "normal" : "urgent", heard, duration_str, del); + "Last Heard: %s
Duration: %s
" + "Delete This Message
" + "]]>", + strcmp(argv[10], URGENT_FLAG_STRING) ? "normal" : "urgent", heard, duration_str, del); - switch_xml_set_txt_d(x_tmp, tmp); - free(tmp); - free(del); + switch_xml_set_txt_d(x_tmp, tmp); + free(tmp); + free(del); x_tmp = switch_xml_add_child_d(holder->x_item, "pubDate", 0); - switch_xml_set_txt_d(x_tmp, rss_date); + switch_xml_set_txt_d(x_tmp, rss_date); - x_tmp = switch_xml_add_child_d(holder->x_item, "itunes:duration", 0); - switch_xml_set_txt_d(x_tmp, duration_str); + x_tmp = switch_xml_add_child_d(holder->x_item, "itunes:duration", 0); + switch_xml_set_txt_d(x_tmp, duration_str); x_tmp = switch_xml_add_child_d(holder->x_item, "guid", 0); - switch_xml_set_txt_d(x_tmp, get); + switch_xml_set_txt_d(x_tmp, get); - x_link = switch_xml_add_child_d(holder->x_item, "link", 0); - switch_xml_set_txt_d(x_link, get); + x_link = switch_xml_add_child_d(holder->x_item, "link", 0); + switch_xml_set_txt_d(x_link, get); - x_tmp = switch_xml_add_child_d(holder->x_item, "enclosure", 0); - switch_xml_set_attr_d(x_tmp, "url", get); - free(get); + x_tmp = switch_xml_add_child_d(holder->x_item, "enclosure", 0); + switch_xml_set_attr_d(x_tmp, "url", get); + free(get); if (switch_file_open(&fd, argv[8], SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, holder->pool) == SWITCH_STATUS_SUCCESS) { - flen = switch_file_get_size(fd); - tmp = switch_mprintf("%ld", (long) flen); - switch_xml_set_attr_d(x_tmp, "length", tmp); - free(tmp); - switch_file_close(fd); - } + flen = switch_file_get_size(fd); + tmp = switch_mprintf("%ld", (long) flen); + switch_xml_set_attr_d(x_tmp, "length", tmp); + free(tmp); + switch_file_close(fd); + } - if ((ext = strrchr(fname, '.'))) { - ext++; - if ((new_type = switch_core_mime_ext2type(ext))) { - mime_type = new_type; - } - } - switch_xml_set_attr_d(x_tmp, "type", mime_type); - - return 0; + if ((ext = strrchr(fname, '.'))) { + ext++; + if ((new_type = switch_core_mime_ext2type(ext))) { + mime_type = new_type; + } + } + switch_xml_set_attr_d(x_tmp, "type", mime_type); + + return 0; } static void do_rss(vm_profile_t *profile, char *user, char *domain, char *host, char *port, char *uri, switch_stream_handle_t *stream) { - struct holder holder; - switch_xml_t x_tmp; - char *sql, *xmlstr; - char *tmp = NULL; + struct holder holder; + switch_xml_t x_tmp; + char *sql, *xmlstr; + char *tmp = NULL; - stream->write_function(stream, "Content-type: text/xml\n\n"); - memset(&holder, 0, sizeof(holder)); - holder.profile = profile; - holder.stream = stream; - holder.xml = switch_xml_new("rss"); - holder.user = user; - holder.domain = domain; - holder.host = host; - holder.port = port; - holder.uri = uri; + stream->write_function(stream, "Content-type: text/xml\n\n"); + memset(&holder, 0, sizeof(holder)); + holder.profile = profile; + holder.stream = stream; + holder.xml = switch_xml_new("rss"); + holder.user = user; + holder.domain = domain; + holder.host = host; + holder.port = port; + holder.uri = uri; - switch_core_new_memory_pool(&holder.pool); - switch_assert(holder.xml); - - switch_xml_set_attr_d(holder.xml, "xmlns:itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd"); - switch_xml_set_attr_d(holder.xml, "xmlns:fsvm", "http://www.freeswitch.org/dtd/fsvm.dtd"); - switch_xml_set_attr_d(holder.xml, "version", "2.0"); - holder.x_channel = switch_xml_add_child_d(holder.xml, "channel", 0); - - x_tmp = switch_xml_add_child_d(holder.x_channel, "title", 0); - tmp = switch_mprintf("FreeSWITCH Voicemail for %s@%s", user, domain); - switch_xml_set_txt_d(x_tmp, tmp); - free(tmp); + switch_core_new_memory_pool(&holder.pool); + switch_assert(holder.xml); - x_tmp = switch_xml_add_child_d(holder.x_channel, "link", 0); - switch_xml_set_txt_d(x_tmp, "http://www.freeswitch.org"); + switch_xml_set_attr_d(holder.xml, "xmlns:itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd"); + switch_xml_set_attr_d(holder.xml, "xmlns:fsvm", "http://www.freeswitch.org/dtd/fsvm.dtd"); + switch_xml_set_attr_d(holder.xml, "version", "2.0"); + holder.x_channel = switch_xml_add_child_d(holder.xml, "channel", 0); - x_tmp = switch_xml_add_child_d(holder.x_channel, "description", 0); - switch_xml_set_txt_d(x_tmp, "http://www.freeswitch.org"); - - x_tmp = switch_xml_add_child_d(holder.x_channel, "ttl", 0); - switch_xml_set_txt_d(x_tmp, "15"); + x_tmp = switch_xml_add_child_d(holder.x_channel, "title", 0); + tmp = switch_mprintf("FreeSWITCH Voicemail for %s@%s", user, domain); + switch_xml_set_txt_d(x_tmp, tmp); + free(tmp); + + x_tmp = switch_xml_add_child_d(holder.x_channel, "link", 0); + switch_xml_set_txt_d(x_tmp, "http://www.freeswitch.org"); + + x_tmp = switch_xml_add_child_d(holder.x_channel, "description", 0); + switch_xml_set_txt_d(x_tmp, "http://www.freeswitch.org"); + + x_tmp = switch_xml_add_child_d(holder.x_channel, "ttl", 0); + switch_xml_set_txt_d(x_tmp, "15"); sql = switch_mprintf("select * from voicemail_data where user='%s' and domain='%s' order by read_flags", user, domain); - vm_execute_sql_callback(profile, profile->mutex, sql, rss_callback, &holder); + vm_execute_sql_callback(profile, profile->mutex, sql, rss_callback, &holder); - xmlstr = switch_xml_toxml(holder.xml, SWITCH_TRUE); + xmlstr = switch_xml_toxml(holder.xml, SWITCH_TRUE); - stream->write_function(stream, "%s", xmlstr); + stream->write_function(stream, "%s", xmlstr); - switch_safe_free(sql); - switch_safe_free(xmlstr); - switch_xml_free(holder.xml); - switch_core_destroy_memory_pool(&holder.pool); + switch_safe_free(sql); + switch_safe_free(xmlstr); + switch_xml_free(holder.xml); + switch_core_destroy_memory_pool(&holder.pool); } static void do_web(vm_profile_t *profile, char *user, char *domain, char *host, char *port, char *uri, switch_stream_handle_t *stream) { - char buf[80] = ""; - struct holder holder; - char *sql; - callback_t cbt = { 0 }; - int ttl = 0; + char buf[80] = ""; + struct holder holder; + char *sql; + callback_t cbt = { 0 }; + int ttl = 0; - stream->write_function(stream, "Content-type: text/html\n\n"); - memset(&holder, 0, sizeof(holder)); - holder.profile = profile; - holder.stream = stream; - holder.user = user; - holder.domain = domain; - holder.host = host; - holder.port = port; - holder.uri = uri; + stream->write_function(stream, "Content-type: text/html\n\n"); + memset(&holder, 0, sizeof(holder)); + holder.profile = profile; + holder.stream = stream; + holder.user = user; + holder.domain = domain; + holder.host = host; + holder.port = port; + holder.uri = uri; if (profile->web_head) { - stream->raw_write_function(stream, (uint8_t *)profile->web_head, strlen(profile->web_head)); - } - - cbt.buf = buf; - cbt.len = sizeof(buf); - - sql = switch_mprintf("select * from voicemail_data where user='%s' and domain='%s' order by read_flags", user, domain); - vm_execute_sql_callback(profile, profile->mutex, sql, web_callback, &holder); - switch_safe_free(sql); + stream->raw_write_function(stream, (uint8_t *)profile->web_head, strlen(profile->web_head)); + } - sql = switch_mprintf("select count(*) from voicemail_data where user='%s' and domain='%s' order by read_flags", user, domain); - vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); - switch_safe_free(sql); + cbt.buf = buf; + cbt.len = sizeof(buf); - ttl = atoi(buf); - stream->write_function(stream, "%d message%s
", ttl, ttl == 1 ? "" : "s"); + sql = switch_mprintf("select * from voicemail_data where user='%s' and domain='%s' order by read_flags", user, domain); + vm_execute_sql_callback(profile, profile->mutex, sql, web_callback, &holder); + switch_safe_free(sql); - if (profile->web_tail) { - stream->raw_write_function(stream, (uint8_t *)profile->web_tail, strlen(profile->web_tail)); - } + sql = switch_mprintf("select count(*) from voicemail_data where user='%s' and domain='%s' order by read_flags", user, domain); + vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt); + switch_safe_free(sql); + + ttl = atoi(buf); + stream->write_function(stream, "%d message%s
", ttl, ttl == 1 ? "" : "s"); + + if (profile->web_tail) { + stream->raw_write_function(stream, (uint8_t *)profile->web_tail, strlen(profile->web_tail)); + } } SWITCH_STANDARD_API(voicemail_api_function) { - int argc = 0; - char *mydata = NULL, *argv[6]; - char *host = NULL, *port = NULL, *uri = NULL; - char *user = NULL, *domain = NULL; - int ct = 0; - vm_profile_t *profile = NULL; - char *path_info = NULL; - int rss = 0, xarg = 0; - + int argc = 0; + char *mydata = NULL, *argv[6]; + char *host = NULL, *port = NULL, *uri = NULL; + char *user = NULL, *domain = NULL; + int ct = 0; + vm_profile_t *profile = NULL; + char *path_info = NULL; + int rss = 0, xarg = 0; + if (session) { return SWITCH_STATUS_FALSE; } - if (stream->event) { - host = switch_event_get_header(stream->event, "http-host"); - port = switch_event_get_header(stream->event, "http-port"); - uri = switch_event_get_header(stream->event, "http-uri"); - user = switch_event_get_header(stream->event, "freeswitch-user"); - domain = switch_event_get_header(stream->event, "freeswitch-domain"); - path_info = switch_event_get_header(stream->event, "http-path-info"); - } - - if (!switch_strlen_zero(cmd)) { - mydata = strdup(cmd); - switch_assert(mydata); - argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); - } - - if (argc > 0) { - if (!strcasecmp(argv[0], "rss")) { - rss++; - xarg++; - } - } + if (stream->event) { + host = switch_event_get_header(stream->event, "http-host"); + port = switch_event_get_header(stream->event, "http-port"); + uri = switch_event_get_header(stream->event, "http-uri"); + user = switch_event_get_header(stream->event, "freeswitch-user"); + domain = switch_event_get_header(stream->event, "freeswitch-domain"); + path_info = switch_event_get_header(stream->event, "http-path-info"); + } - if (!host) { - if (argc - rss < 5) { - goto error; - } - host = argv[xarg++]; - port = argv[xarg++]; - uri = argv[xarg++]; - user = argv[xarg++]; - domain = argv[xarg++]; - } + if (!switch_strlen_zero(cmd)) { + mydata = strdup(cmd); + switch_assert(mydata); + argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + } - if (!(host && port && uri && user && domain)) { - goto error; - } + if (argc > 0) { + if (!strcasecmp(argv[0], "rss")) { + rss++; + xarg++; + } + } - profile = switch_core_hash_find(globals.profile_hash, domain); - - if (!profile) { - profile = switch_core_hash_find(globals.profile_hash, "default"); - } - - if (!profile) { - switch_hash_index_t *hi; - void *val; - - for (hi = switch_hash_first(NULL, globals.profile_hash); hi; hi = switch_hash_next(hi)) { - switch_hash_this(hi, NULL, NULL, &val); - profile = (vm_profile_t *) val; + if (!host) { + if (argc - rss < 5) { + goto error; + } + host = argv[xarg++]; + port = argv[xarg++]; + uri = argv[xarg++]; + user = argv[xarg++]; + domain = argv[xarg++]; + } + + if (!(host && port && uri && user && domain)) { + goto error; + } + + profile = switch_core_hash_find(globals.profile_hash, domain); + + if (!profile) { + profile = switch_core_hash_find(globals.profile_hash, "default"); + } + + if (!profile) { + switch_hash_index_t *hi; + void *val; + + for (hi = switch_hash_first(NULL, globals.profile_hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, NULL, NULL, &val); + profile = (vm_profile_t *) val; if (profile) { - break; + break; } - } - } + } + } - if (!profile) { - stream->write_function(stream, "Can't find profile.\n"); - goto error; - } + if (!profile) { + stream->write_function(stream, "Can't find profile.\n"); + goto error; + } - if (path_info) { - if (!strncasecmp(path_info, "get/", 4)) { - do_play(profile, user, domain, path_info + 4, stream); - } else if (!strncasecmp(path_info, "del/", 4)) { - do_del(profile, user, domain, path_info + 4, stream); - } else if (!strncasecmp(path_info, "web", 3)) { - do_web(profile, user, domain, host, port, uri, stream); - } - } + if (path_info) { + if (!strncasecmp(path_info, "get/", 4)) { + do_play(profile, user, domain, path_info + 4, stream); + } else if (!strncasecmp(path_info, "del/", 4)) { + do_del(profile, user, domain, path_info + 4, stream); + } else if (!strncasecmp(path_info, "web", 3)) { + do_web(profile, user, domain, host, port, uri, stream); + } + } - if (rss || (path_info && !strncasecmp(path_info, "rss", 3))) { - do_rss(profile, user, domain, host, port, uri, stream); - } + if (rss || (path_info && !strncasecmp(path_info, "rss", 3))) { + do_rss(profile, user, domain, host, port, uri, stream); + } - goto done; + goto done; - error: - if (host) { - if (!ct) { - stream->write_function(stream, "Content-type: text/html\n\n

"); - } - } - stream->write_function(stream, "Error: %s\n", VOICEMAIL_SYNTAX); - - done: - switch_safe_free(mydata); - return SWITCH_STATUS_SUCCESS; +error: + if (host) { + if (!ct) { + stream->write_function(stream, "Content-type: text/html\n\n

"); + } + } + stream->write_function(stream, "Error: %s\n", VOICEMAIL_SYNTAX); + +done: + switch_safe_free(mydata); + return SWITCH_STATUS_SUCCESS; } SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load) { switch_application_interface_t *app_interface; - switch_api_interface_t *commands_api_interface; - switch_status_t status; + switch_api_interface_t *commands_api_interface; + switch_status_t status; - if ((status = load_config()) != SWITCH_STATUS_SUCCESS) { - return status; - } + if ((status = load_config()) != SWITCH_STATUS_SUCCESS) { + return status; + } /* connect my internal structure to the blank pointer passed to me */ *module_interface = switch_loadable_module_create_module_interface(pool, modname); SWITCH_ADD_APP(app_interface, "voicemail", "Voicemail", VM_DESC, voicemail_function, VM_USAGE, SAF_NONE); if (switch_event_bind((char *) modname, SWITCH_EVENT_MESSAGE_QUERY, SWITCH_EVENT_SUBCLASS_ANY, message_query_handler, NULL) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n"); - return SWITCH_STATUS_GENERR; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n"); + return SWITCH_STATUS_GENERR; } SWITCH_ADD_API(commands_api_interface, "voicemail", "voicemail", voicemail_api_function, VOICEMAIL_SYNTAX); - + /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_NOUNLOAD; }