Bug Summary

File:src/mod/applications/mod_voicemail/mod_voicemail.c
Location:line 4498, column 21
Description:Potential leak of memory pointed to by '__retval'

Annotated Source Code

1/*
2 * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
3 * Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
4 *
5 * Version: MPL 1.1
6 *
7 * The contents of this file are subject to the Mozilla Public License Version
8 * 1.1 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://www.mozilla.org/MPL/
11 *
12 * Software distributed under the License is distributed on an "AS IS" basis,
13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14 * for the specific language governing rights and limitations under the
15 * License.
16 *
17 * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
18 *
19 * The Initial Developer of the Original Code is
20 * Anthony Minessale II <anthm@freeswitch.org>
21 * Portions created by the Initial Developer are Copyright (C)
22 * the Initial Developer. All Rights Reserved.
23 *
24 * Contributor(s):
25 *
26 * Anthony Minessale II <anthm@freeswitch.org>
27 * Bret McDanel <trixter AT 0xdecafbad.com>
28 * John Wehle (john@feith.com)
29 * Raymond Chandler <intralanman@gmail.com>
30 * Kristin King <kristin.king@quentustech.com>
31 * Emmanuel Schmidbauer <e.schmidbauer@gmail.com>
32 *
33 * mod_voicemail.c -- Voicemail Module
34 *
35 */
36#include <switch.h>
37
38#ifdef _MSC_VER /* compilers are stupid sometimes */
39#define TRY_CODE(code)do { status = code; if (status != SWITCH_STATUS_SUCCESS &&
status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status
)
for(;;) {status = code; if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { goto end; } break;}
40#else
41#define TRY_CODE(code)do { status = code; if (status != SWITCH_STATUS_SUCCESS &&
status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status
)
do { status = code; if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status)
42#endif
43
44
45#define xml_safe_free(_x)if (_x) switch_xml_free(_x); _x = ((void*)0) if (_x) switch_xml_free(_x); _x = NULL((void*)0)
46
47SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load)switch_status_t mod_voicemail_load (switch_loadable_module_interface_t
**module_interface, switch_memory_pool_t *pool)
;
48SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_voicemail_shutdown)switch_status_t mod_voicemail_shutdown (void);
49SWITCH_MODULE_DEFINITION(mod_voicemail, mod_voicemail_load, mod_voicemail_shutdown, NULL)static const char modname[] = "mod_voicemail" ; __attribute__
((visibility("default"))) switch_loadable_module_function_table_t
mod_voicemail_module_interface = { 5, mod_voicemail_load, mod_voicemail_shutdown
, ((void*)0), SMODF_NONE }
;
50#define VM_EVENT_MAINT"vm::maintenance" "vm::maintenance"
51
52#define VM_MAX_GREETINGS9 9
53#define VM_EVENT_QUEUE_SIZE50000 50000
54
55static switch_status_t voicemail_inject(const char *data, switch_core_session_t *session);
56
57static const char *global_cf = "voicemail.conf";
58static struct {
59 switch_hash_t *profile_hash;
60 int debug;
61 int message_query_exact_match;
62 int32_t threads;
63 int32_t running;
64 switch_queue_t *event_queue;
65 switch_mutex_t *mutex;
66 switch_memory_pool_t *pool;
67} globals;
68
69typedef enum {
70 VM_DATE_FIRST,
71 VM_DATE_LAST,
72 VM_DATE_NEVER
73} date_location_t;
74
75typedef enum {
76 PFLAG_DESTROY = 1 << 0
77} vm_flags_t;
78
79typedef enum {
80 VM_MOVE_NEXT,
81 VM_MOVE_PREV,
82 VM_MOVE_SAME
83} msg_move_t;
84
85typedef enum {
86 MWI_REASON_UNKNOWN = 0,
87 MWI_REASON_NEW = 1,
88 MWI_REASON_DELETE = 2,
89 MWI_REASON_SAVE = 3,
90 MWI_REASON_PURGE = 4,
91 MWI_REASON_READ = 5
92} mwi_reason_t;
93
94struct mwi_reason_table {
95 const char *name;
96 int state;
97};
98
99static struct mwi_reason_table MWI_REASON_CHART[] = {
100 {"UNKNOWN", MWI_REASON_UNKNOWN},
101 {"NEW", MWI_REASON_NEW},
102 {"DELETE", MWI_REASON_DELETE},
103 {"SAVE", MWI_REASON_SAVE},
104 {"PURGE", MWI_REASON_PURGE},
105 {"READ", MWI_REASON_READ},
106 {NULL((void*)0), 0}
107};
108
109#define VM_PROFILE_CONFIGITEM_COUNT100 100
110
111struct vm_profile {
112 char *name;
113 char *dbname;
114 char *odbc_dsn;
115 char *play_new_messages_lifo;
116 char *play_saved_messages_lifo;
117 char terminator_key[2];
118 char play_new_messages_key[2];
119 char play_saved_messages_key[2];
120
121 char login_keys[16];
122 char main_menu_key[2];
123 char skip_greet_key[2];
124 char skip_info_key[2];
125 char config_menu_key[2];
126 char record_greeting_key[2];
127 char choose_greeting_key[2];
128 char record_name_key[2];
129 char change_pass_key[2];
130
131 char record_file_key[2];
132 char listen_file_key[2];
133 char save_file_key[2];
134 char delete_file_key[2];
135 char undelete_file_key[2];
136 char email_key[2];
137 char callback_key[2];
138 char pause_key[2];
139 char restart_key[2];
140 char ff_key[2];
141 char rew_key[2];
142 char prev_msg_key[2];
143 char next_msg_key[2];
144 char repeat_msg_key[2];
145 char urgent_key[2];
146 char operator_key[2];
147 char vmain_key[2];
148 char forward_key[2];
149 char prepend_key[2];
150 char file_ext[10];
151 char *record_title;
152 char *record_comment;
153 char *record_copyright;
154 char *operator_ext;
155 char *vmain_ext;
156 char *tone_spec;
157 char *storage_dir;
158 switch_bool_t storage_dir_shared;
159 char *callback_dialplan;
160 char *callback_context;
161 char *email_body;
162 char *email_headers;
163 char *notify_email_body;
164 char *notify_email_headers;
165 char *web_head;
166 char *web_tail;
167 char *email_from;
168 char *date_fmt;
169 char *convert_cmd;
170 char *convert_ext;
171 date_location_t play_date_announcement;
172 uint32_t digit_timeout;
173 uint32_t max_login_attempts;
174 uint32_t min_record_len;
175 uint32_t max_record_len;
176 uint32_t max_retries;
177 switch_mutex_t *mutex;
178 uint32_t record_threshold;
179 uint32_t record_silence_hits;
180 uint32_t record_sample_rate;
181 switch_bool_t auto_playback_recordings;
182 switch_bool_t db_password_override;
183 switch_bool_t allow_empty_password_auth;
184 switch_thread_rwlock_t *rwlock;
185 switch_memory_pool_t *pool;
186 uint32_t flags;
187
188 switch_xml_config_item_t config[VM_PROFILE_CONFIGITEM_COUNT100];
189 switch_xml_config_string_options_t config_str_pool;
190};
191typedef struct vm_profile vm_profile_t;
192
193const char * mwi_reason2str(mwi_reason_t state)
194{
195 uint8_t x;
196 const char *str = "UNKNOWN";
197
198 for (x = 0; x < (sizeof(MWI_REASON_CHART) / sizeof(struct mwi_reason_table)) - 1; x++) {
199 if (MWI_REASON_CHART[x].state == state) {
200 str = MWI_REASON_CHART[x].name;
201 break;
202 }
203 }
204
205 return str;
206}
207
208switch_cache_db_handle_t *vm_get_db_handle(vm_profile_t *profile)
209{
210
211 switch_cache_db_handle_t *dbh = NULL((void*)0);
212 char *dsn;
213
214 if (!zstr(profile->odbc_dsn)_zstr(profile->odbc_dsn)) {
215 dsn = profile->odbc_dsn;
216 } else {
217 dsn = profile->dbname;
218 }
219
220 if (switch_cache_db_get_db_handle_dsn(&dbh, dsn)_switch_cache_db_get_db_handle_dsn(&dbh, dsn, "mod_voicemail.c"
, (const char *)__func__, 220)
!= SWITCH_STATUS_SUCCESS) {
221 dbh = NULL((void*)0);
222 }
223
224 return dbh;
225}
226
227
228static switch_status_t vm_execute_sql(vm_profile_t *profile, char *sql, switch_mutex_t *mutex)
229{
230 switch_cache_db_handle_t *dbh = NULL((void*)0);
231 switch_status_t status = SWITCH_STATUS_FALSE;
232
233 if (mutex) {
234 switch_mutex_lock(mutex);
235 }
236
237 if (!(dbh = vm_get_db_handle(profile))) {
238 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 238, ((void*)0)
, SWITCH_LOG_ERROR, "Error Opening DB\n");
239 goto end;
240 }
241
242 status = switch_cache_db_execute_sql(dbh, sql, NULL((void*)0));
243
244 end:
245
246 switch_cache_db_release_db_handle(&dbh);
247
248 if (mutex) {
249 switch_mutex_unlock(mutex);
250 }
251
252 return status;
253}
254
255char *vm_execute_sql2str(vm_profile_t *profile, switch_mutex_t *mutex, char *sql, char *resbuf, size_t len)
256{
257 switch_cache_db_handle_t *dbh = NULL((void*)0);
258
259 char *ret = NULL((void*)0);
260
261 if (mutex) {
262 switch_mutex_lock(mutex);
263 }
264
265 if (!(dbh = vm_get_db_handle(profile))) {
266 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 266, ((void*)0)
, SWITCH_LOG_ERROR, "Error Opening DB\n");
267 goto end;
268 }
269
270 ret = switch_cache_db_execute_sql2str(dbh, sql, resbuf, len, NULL((void*)0));
271
272end:
273
274 switch_cache_db_release_db_handle(&dbh);
275
276 if (mutex) {
277 switch_mutex_unlock(mutex);
278 }
279
280 return ret;
281
282}
283
284
285static switch_bool_t vm_execute_sql_callback(vm_profile_t *profile, switch_mutex_t *mutex, char *sql, switch_core_db_callback_func_t callback,
286 void *pdata)
287{
288 switch_bool_t ret = SWITCH_FALSE;
289 char *errmsg = NULL((void*)0);
290 switch_cache_db_handle_t *dbh = NULL((void*)0);
291
292 if (mutex) {
293 switch_mutex_lock(mutex);
294 }
295
296 if (!(dbh = vm_get_db_handle(profile))) {
297 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 297, ((void*)0)
, SWITCH_LOG_ERROR, "Error Opening DB\n");
298 goto end;
299 }
300
301 switch_cache_db_execute_sql_callback(dbh, sql, callback, pdata, &errmsg);
302
303 if (errmsg) {
304 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 304, ((void*)0)
, SWITCH_LOG_ERROR, "SQL ERR: [%s] %s\n", sql, errmsg);
305 free(errmsg);
306 }
307
308 end:
309
310 switch_cache_db_release_db_handle(&dbh);
311
312 if (mutex) {
313 switch_mutex_unlock(mutex);
314 }
315
316 return ret;
317}
318
319
320
321static char vm_sql[] =
322 "CREATE TABLE voicemail_msgs (\n"
323 " created_epoch INTEGER,\n"
324 " read_epoch INTEGER,\n"
325 " username VARCHAR(255),\n"
326 " domain VARCHAR(255),\n"
327 " uuid VARCHAR(255),\n"
328 " cid_name VARCHAR(255),\n"
329 " cid_number VARCHAR(255),\n"
330 " in_folder VARCHAR(255),\n"
331 " file_path VARCHAR(255),\n"
332 " message_len INTEGER,\n" " flags VARCHAR(255),\n" " read_flags VARCHAR(255),\n" " forwarded_by VARCHAR(255)\n" ");\n";
333
334static char vm_pref_sql[] =
335 "CREATE TABLE voicemail_prefs (\n"
336 " username VARCHAR(255),\n"
337 " domain VARCHAR(255),\n"
338 " name_path VARCHAR(255),\n" " greeting_path VARCHAR(255),\n" " password VARCHAR(255)\n" ");\n";
339
340static char *vm_index_list[] = {
341 "create index voicemail_msgs_idx1 on voicemail_msgs(created_epoch)",
342 "create index voicemail_msgs_idx2 on voicemail_msgs(username)",
343 "create index voicemail_msgs_idx3 on voicemail_msgs(domain)",
344 "create index voicemail_msgs_idx4 on voicemail_msgs(uuid)",
345 "create index voicemail_msgs_idx5 on voicemail_msgs(in_folder)",
346 "create index voicemail_msgs_idx6 on voicemail_msgs(read_flags)",
347 "create index voicemail_msgs_idx7 on voicemail_msgs(forwarded_by)",
348 "create index voicemail_msgs_idx8 on voicemail_msgs(read_epoch)",
349 "create index voicemail_msgs_idx9 on voicemail_msgs(flags)",
350 "create index voicemail_prefs_idx1 on voicemail_prefs(username)",
351 "create index voicemail_prefs_idx2 on voicemail_prefs(domain)",
352 NULL((void*)0)
353};
354
355static void free_profile(vm_profile_t *profile)
356{
357 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 357, ((void*)0)
, SWITCH_LOG_DEBUG, "Destroying Profile %s\n", profile->name);
358 switch_core_destroy_memory_pool(&profile->pool)switch_core_perform_destroy_memory_pool(&profile->pool
, "mod_voicemail.c", (const char *)__func__, 358)
;
359}
360
361static void destroy_profile(const char *profile_name, switch_bool_t block)
362{
363 vm_profile_t *profile = NULL((void*)0);
364 switch_mutex_lock(globals.mutex);
365 if ((profile = switch_core_hash_find(globals.profile_hash, profile_name))) {
366 switch_core_hash_delete(globals.profile_hash, profile_name);
367 }
368 switch_mutex_unlock(globals.mutex);
369
370 if (!profile) {
371 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 371, ((void*)0)
, SWITCH_LOG_ERROR, "[%s] Invalid Profile\n", profile_name);
372 return;
373 }
374
375 if (block) {
376 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 376, ((void*)0)
, SWITCH_LOG_DEBUG, "[%s] Waiting for write lock\n", profile->name);
377 switch_thread_rwlock_wrlock(profile->rwlock);
378 } else {
379 if (switch_thread_rwlock_trywrlock(profile->rwlock) != SWITCH_STATUS_SUCCESS) {
380 /* Lock failed, set the destroy flag so it'll be destroyed whenever its not in use anymore */
381 switch_set_flag(profile, PFLAG_DESTROY)(profile)->flags |= (PFLAG_DESTROY);
382 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 382, ((void*)0)
, SWITCH_LOG_DEBUG, "[%s] Profile is in use, memory will be freed whenever its no longer in use\n",
383 profile->name);
384 return;
385 }
386 }
387
388 free_profile(profile);
389}
390
391
392/* Static buffer, 2 bytes */
393static switch_xml_config_string_options_t config_dtmf = { NULL((void*)0), 2, "[0-9#\\*]" };
394static switch_xml_config_string_options_t config_dtmf_optional = { NULL((void*)0), 2, "[0-9#\\*]?" };
395static switch_xml_config_string_options_t config_login_keys = { NULL((void*)0), 16, "[0-9#\\*]*" };
396static switch_xml_config_string_options_t config_file_ext = { NULL((void*)0), 10, NULL((void*)0) };
397static switch_xml_config_int_options_t config_int_0_10000 = { SWITCH_TRUE, 0, SWITCH_TRUE, 10000 };
398static switch_xml_config_int_options_t config_int_0_1000 = { SWITCH_TRUE, 0, SWITCH_TRUE, 1000 };
399static switch_xml_config_int_options_t config_int_digit_timeout = { SWITCH_TRUE, 0, SWITCH_TRUE, 30000 };
400static switch_xml_config_int_options_t config_int_max_logins = { SWITCH_TRUE, 0, SWITCH_TRUE, 10 };
401static switch_xml_config_int_options_t config_int_ht_0 = { SWITCH_TRUE, 0 };
402
403static switch_xml_config_enum_item_t config_play_date_announcement[] = {
404 {"first", VM_DATE_FIRST},
405 {"last", VM_DATE_LAST},
406 {"never", VM_DATE_NEVER},
407 {NULL((void*)0), 0}
408};
409
410
411static switch_status_t vm_config_email_callback(switch_xml_config_item_t *item, const char *newvalue, switch_config_callback_type_t callback_type,
412 switch_bool_t changed)
413{
414 vm_profile_t *profile = (vm_profile_t *) item->data;
415
416 switch_assert(profile)((profile) ? (void) (0) : __assert_fail ("profile", "mod_voicemail.c"
, 416, __PRETTY_FUNCTION__))
;
417
418 if (callback_type == CONFIG_LOAD || callback_type == CONFIG_RELOAD) {
419 char *email_headers = NULL((void*)0), *email_body = NULL((void*)0);
420 if (newvalue) {
421 switch_stream_handle_t stream;
422 SWITCH_STANDARD_STREAM(stream)memset(&stream, 0, sizeof(stream)); stream.data = malloc(
1024); ((stream.data) ? (void) (0) : __assert_fail ("stream.data"
, "mod_voicemail.c", 422, __PRETTY_FUNCTION__)); memset(stream
.data, 0, 1024); stream.end = stream.data; stream.data_size =
1024; stream.write_function = switch_console_stream_write; stream
.raw_write_function = switch_console_stream_raw_write; stream
.alloc_len = 1024; stream.alloc_chunk = 1024
;
423 if (switch_stream_write_file_contents(&stream, newvalue) == SWITCH_STATUS_SUCCESS) {
424 email_headers = switch_core_strdup(profile->pool, stream.data)switch_core_perform_strdup(profile->pool, stream.data, "mod_voicemail.c"
, (const char *)__func__, 424)
;
425 if ((email_body = strstr(email_headers, "\n\n"))) {
426 *email_body = '\0';
427 email_body += 2;
428 } else if ((email_body = strstr(email_headers, "\r\n\r\n"))) {
429 *email_body = '\0';
430 email_body += 4;
431 }
432 }
433
434 free(stream.data);
435 }
436
437 if (email_headers) {
438 profile->email_headers = email_headers;
439 }
440 if (email_body) {
441 profile->email_body = email_body;
442 }
443 }
444
445 return SWITCH_STATUS_SUCCESS;
446}
447
448static switch_status_t vm_config_notify_callback(switch_xml_config_item_t *item, const char *newvalue, switch_config_callback_type_t callback_type,
449 switch_bool_t changed)
450{
451 vm_profile_t *profile = (vm_profile_t *) item->data;
452
453 switch_assert(profile)((profile) ? (void) (0) : __assert_fail ("profile", "mod_voicemail.c"
, 453, __PRETTY_FUNCTION__))
;
454
455 if (callback_type == CONFIG_LOAD || callback_type == CONFIG_RELOAD) {
456 char *email_headers = NULL((void*)0), *email_body = NULL((void*)0);
457 if (newvalue) {
458 switch_stream_handle_t stream;
459 SWITCH_STANDARD_STREAM(stream)memset(&stream, 0, sizeof(stream)); stream.data = malloc(
1024); ((stream.data) ? (void) (0) : __assert_fail ("stream.data"
, "mod_voicemail.c", 459, __PRETTY_FUNCTION__)); memset(stream
.data, 0, 1024); stream.end = stream.data; stream.data_size =
1024; stream.write_function = switch_console_stream_write; stream
.raw_write_function = switch_console_stream_raw_write; stream
.alloc_len = 1024; stream.alloc_chunk = 1024
;
460 if (switch_stream_write_file_contents(&stream, newvalue) == SWITCH_STATUS_SUCCESS) {
461 email_headers = switch_core_strdup(profile->pool, stream.data)switch_core_perform_strdup(profile->pool, stream.data, "mod_voicemail.c"
, (const char *)__func__, 461)
;
462 if ((email_body = strstr(email_headers, "\n\n"))) {
463 *email_body = '\0';
464 email_body += 2;
465 } else if ((email_body = strstr(email_headers, "\r\n\r\n"))) {
466 *email_body = '\0';
467 email_body += 4;
468 }
469 }
470
471 free(stream.data);
472 }
473
474 if (email_headers) {
475 profile->notify_email_headers = email_headers;
476 }
477 if (email_body) {
478 profile->notify_email_body = email_body;
479 }
480 }
481
482 return SWITCH_STATUS_SUCCESS;
483}
484
485static switch_status_t vm_config_web_callback(switch_xml_config_item_t *item, const char *newvalue, switch_config_callback_type_t callback_type,
486 switch_bool_t changed)
487{
488 vm_profile_t *profile = (vm_profile_t *) item->data;
489
490 switch_assert(profile)((profile) ? (void) (0) : __assert_fail ("profile", "mod_voicemail.c"
, 490, __PRETTY_FUNCTION__))
;
491
492 if (callback_type == CONFIG_LOAD || callback_type == CONFIG_RELOAD) {
493 char *web_head = NULL((void*)0), *web_tail = NULL((void*)0);
494 if (newvalue) {
495 switch_stream_handle_t stream;
496 SWITCH_STANDARD_STREAM(stream)memset(&stream, 0, sizeof(stream)); stream.data = malloc(
1024); ((stream.data) ? (void) (0) : __assert_fail ("stream.data"
, "mod_voicemail.c", 496, __PRETTY_FUNCTION__)); memset(stream
.data, 0, 1024); stream.end = stream.data; stream.data_size =
1024; stream.write_function = switch_console_stream_write; stream
.raw_write_function = switch_console_stream_raw_write; stream
.alloc_len = 1024; stream.alloc_chunk = 1024
;
497 if (switch_stream_write_file_contents(&stream, newvalue) == SWITCH_STATUS_SUCCESS) {
498 web_head = switch_core_strdup(profile->pool, stream.data)switch_core_perform_strdup(profile->pool, stream.data, "mod_voicemail.c"
, (const char *)__func__, 498)
;
499
500 if ((web_tail = strstr(web_head, "<!break>\n"))) {
501 *web_tail = '\0';
502 web_tail += 9;
503 } else if ((web_tail = strstr(web_head, "<!break>\r\n"))) {
504 *web_tail = '\0';
505 web_tail += 10;
506 }
507 }
508
509 free(stream.data);
510 }
511
512 if (web_head) {
513 profile->web_head = web_head;
514 }
515
516 if (web_tail) {
517 profile->web_tail = web_tail;
518 }
519 }
520
521 return SWITCH_STATUS_SUCCESS;
522}
523
524static switch_status_t vm_config_validate_samplerate(switch_xml_config_item_t *item, const char *newvalue, switch_config_callback_type_t callback_type,
525 switch_bool_t changed)
526{
527 if ((callback_type == CONFIG_LOAD || callback_type == CONFIG_RELOAD) && newvalue) {
528 int val = *(int *) item->ptr;
529 if (val != 0 && !switch_is_valid_rate(val)(val == 8000 || val == 12000 || val == 16000 || val == 24000 ||
val == 32000 || val == 11025 || val == 22050 || val == 44100
|| val == 48000)
) {
530 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 530, ((void*)0)
, SWITCH_LOG_WARNING, "Invalid samplerate %s\n", newvalue);
531 return SWITCH_STATUS_FALSE;
532 }
533 }
534
535 return SWITCH_STATUS_SUCCESS;
536}
537
538/*!
539 * \brief Sets the profile's configuration instructions
540 */
541vm_profile_t *profile_set_config(vm_profile_t *profile)
542{
543 int i = 0;
544
545 profile->config_str_pool.pool = profile->pool;
546
547 /*
548 SWITCH _CONFIG_SET_ITEM(item, "key", type, flags,
549 pointer, default, options, help_syntax, help_description)
550 */
551
552 /* DTMFs */
553 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "terminator-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "terminator-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->terminator_key, (void*)("#"), &config_dtmf, (
(void*)0), ((void*)0), ((void*)0))
554 &profile->terminator_key, "#", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "terminator-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->terminator_key, (void*)("#"), &config_dtmf, (
(void*)0), ((void*)0), ((void*)0))
;
555 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "play-new-messages-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "play-new-messages-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->play_new_messages_key, (void*)("1"), &
config_dtmf, ((void*)0), ((void*)0), ((void*)0))
556 &profile->play_new_messages_key, "1", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "play-new-messages-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->play_new_messages_key, (void*)("1"), &
config_dtmf, ((void*)0), ((void*)0), ((void*)0))
;
557 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "play-saved-messages-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "play-saved-messages-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->play_saved_messages_key, (void*)("2"), &
config_dtmf, ((void*)0), ((void*)0), ((void*)0))
558 &profile->play_saved_messages_key, "2", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "play-saved-messages-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->play_saved_messages_key, (void*)("2"), &
config_dtmf, ((void*)0), ((void*)0), ((void*)0))
;
559 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "play-new-messages-lifo", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "play-new-messages-lifo", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->play_new_messages_lifo, (void*)(SWITCH_FALSE
), ((void*)0), ((void*)0), ((void*)0), ((void*)0))
560 &profile->play_new_messages_lifo, SWITCH_FALSE, NULL, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "play-new-messages-lifo", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->play_new_messages_lifo, (void*)(SWITCH_FALSE
), ((void*)0), ((void*)0), ((void*)0), ((void*)0))
;
561 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "play-saved-messages-lifo", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "play-saved-messages-lifo", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->play_saved_messages_lifo, (void*)(SWITCH_FALSE
), ((void*)0), ((void*)0), ((void*)0), ((void*)0))
562 &profile->play_saved_messages_lifo, SWITCH_FALSE, NULL, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "play-saved-messages-lifo", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->play_saved_messages_lifo, (void*)(SWITCH_FALSE
), ((void*)0), ((void*)0), ((void*)0), ((void*)0))
;
563 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "login-keys", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "login-keys", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->login_keys, (void*)("0"), &config_login_keys,
((void*)0), ((void*)0), ((void*)0))
564 &profile->login_keys, "0", &config_login_keys, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "login-keys", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->login_keys, (void*)("0"), &config_login_keys,
((void*)0), ((void*)0), ((void*)0))
;
565 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "main-menu-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "main-menu-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->main_menu_key, (void*)("0"), &config_dtmf, ((
void*)0), ((void*)0), ((void*)0))
566 &profile->main_menu_key, "0", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "main-menu-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->main_menu_key, (void*)("0"), &config_dtmf, ((
void*)0), ((void*)0), ((void*)0))
;
567 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "skip-greet-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "skip-greet-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->skip_greet_key, (void*)("#"), &config_dtmf, (
(void*)0), ((void*)0), ((void*)0))
568 &profile->skip_greet_key, "#", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "skip-greet-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->skip_greet_key, (void*)("#"), &config_dtmf, (
(void*)0), ((void*)0), ((void*)0))
;
569 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "skip-info-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "skip-info-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->skip_info_key, (void*)("*"), &config_dtmf, ((
void*)0), ((void*)0), ((void*)0))
570 &profile->skip_info_key, "*", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "skip-info-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->skip_info_key, (void*)("*"), &config_dtmf, ((
void*)0), ((void*)0), ((void*)0))
;
571 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "config-menu-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "config-menu-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->config_menu_key, (void*)("5"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
572 &profile->config_menu_key, "5", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "config-menu-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->config_menu_key, (void*)("5"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
573 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "record-greeting-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "record-greeting-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->record_greeting_key, (void*)("1"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
574 &profile->record_greeting_key, "1", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "record-greeting-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->record_greeting_key, (void*)("1"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
575 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "choose-greeting-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "choose-greeting-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->choose_greeting_key, (void*)("2"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
576 &profile->choose_greeting_key, "2", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "choose-greeting-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->choose_greeting_key, (void*)("2"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
577 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "record-name-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "record-name-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->record_name_key, (void*)("3"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
578 &profile->record_name_key, "3", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "record-name-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->record_name_key, (void*)("3"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
579 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "change-pass-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "change-pass-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->change_pass_key, (void*)("6"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
580 &profile->change_pass_key, "6", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "change-pass-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->change_pass_key, (void*)("6"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
581 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "record-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "record-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->record_file_key, (void*)("3"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
582 &profile->record_file_key, "3", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "record-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->record_file_key, (void*)("3"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
583 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "listen-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "listen-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->listen_file_key, (void*)("1"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
584 &profile->listen_file_key, "1", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "listen-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->listen_file_key, (void*)("1"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
585 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "save-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "save-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->save_file_key, (void*)("2"), &config_dtmf, ((
void*)0), ((void*)0), ((void*)0))
586 &profile->save_file_key, "2", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "save-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->save_file_key, (void*)("2"), &config_dtmf, ((
void*)0), ((void*)0), ((void*)0))
;
587 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "delete-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "delete-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->delete_file_key, (void*)("7"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
588 &profile->delete_file_key, "7", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "delete-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->delete_file_key, (void*)("7"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
589 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "undelete-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "undelete-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->undelete_file_key, (void*)("8"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
590 &profile->undelete_file_key, "8", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "undelete-file-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->undelete_file_key, (void*)("8"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
591 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "email-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->email_key, "4", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "email-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->email_key, (void*)("4"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
;
592 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "callback-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "callback-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->callback_key, (void*)("5"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
593 &profile->callback_key, "5", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "callback-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->callback_key, (void*)("5"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
;
594 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "pause-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->pause_key, "0", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "pause-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->pause_key, (void*)("0"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
;
595 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "restart-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "restart-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->restart_key, (void*)("1"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
596 &profile->restart_key, "1", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "restart-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->restart_key, (void*)("1"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
;
597 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "ff-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->ff_key, "6", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "ff-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile
->ff_key, (void*)("6"), &config_dtmf, ((void*)0), ((void
*)0), ((void*)0))
;
598 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "rew-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rew_key, "4", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "rew-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile
->rew_key, (void*)("4"), &config_dtmf, ((void*)0), ((void
*)0), ((void*)0))
;
599 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "previous-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "previous-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->prev_msg_key, (void*)("1"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
600 &profile->prev_msg_key, "1", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "previous-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->prev_msg_key, (void*)("1"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
601 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "next-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "next-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->next_msg_key, (void*)("3"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
602 &profile->next_msg_key, "3", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "next-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->next_msg_key, (void*)("3"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
603 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "repeat-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "repeat-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->repeat_msg_key, (void*)("0"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
604 &profile->repeat_msg_key, "0", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "repeat-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->repeat_msg_key, (void*)("0"), &config_dtmf
, ((void*)0), ((void*)0), ((void*)0))
;
605 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "urgent-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "urgent-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->urgent_key, (void*)("*"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
606 &profile->urgent_key, "*", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "urgent-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->urgent_key, (void*)("*"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
;
607 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "operator-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "operator-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->operator_key, (void*)(""), &config_dtmf_optional
, ((void*)0), ((void*)0), ((void*)0))
608 &profile->operator_key, "", &config_dtmf_optional, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "operator-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->operator_key, (void*)(""), &config_dtmf_optional
, ((void*)0), ((void*)0), ((void*)0))
;
609 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "vmain-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->vmain_key, "", &config_dtmf_optional, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "vmain-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->vmain_key, (void*)(""), &config_dtmf_optional
, ((void*)0), ((void*)0), ((void*)0))
;
610 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "vmain-extension", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "vmain-extension", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->vmain_ext, (void*)(""), &profile->config_str_pool
, ((void*)0), ((void*)0), ((void*)0))
611 &profile->vmain_ext, "", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "vmain-extension", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->vmain_ext, (void*)(""), &profile->config_str_pool
, ((void*)0), ((void*)0), ((void*)0))
;
612 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "forward-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "forward-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->forward_key, (void*)("8"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
613 &profile->forward_key, "8", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "forward-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->forward_key, (void*)("8"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
;
614 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "prepend-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "prepend-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->prepend_key, (void*)("1"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
615 &profile->prepend_key, "1", &config_dtmf, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "prepend-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->prepend_key, (void*)("1"), &config_dtmf, ((void
*)0), ((void*)0), ((void*)0))
;
616
617 /* Other settings */
618 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "file-extension", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "file-extension", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->file_ext, (void*)("wav"), &config_file_ext, (
(void*)0), ((void*)0), ((void*)0))
619 &profile->file_ext, "wav", &config_file_ext, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "file-extension", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->file_ext, (void*)("wav"), &config_file_ext, (
(void*)0), ((void*)0), ((void*)0))
;
620 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "record-title", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "record-title", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->record_title, (void*)("FreeSWITCH Voicemail"), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
621 &profile->record_title, "FreeSWITCH Voicemail", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "record-title", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->record_title, (void*)("FreeSWITCH Voicemail"), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
;
622 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "record-comment", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "record-comment", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->record_comment, (void*)("FreeSWITCH Voicemail"), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
623 &profile->record_comment, "FreeSWITCH Voicemail", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "record-comment", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->record_comment, (void*)("FreeSWITCH Voicemail"), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
;
624 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "record-copyright", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "record-copyright", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->record_copyright, (void*)("http://www.freeswitch.org"
), &profile->config_str_pool, ((void*)0), ((void*)0), (
(void*)0))
625 &profile->record_copyright, "http://www.freeswitch.org", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "record-copyright", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->record_copyright, (void*)("http://www.freeswitch.org"
), &profile->config_str_pool, ((void*)0), ((void*)0), (
(void*)0))
;
626 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "operator-extension", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "operator-extension", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->operator_ext, (void*)(""), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
627 &profile->operator_ext, "", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "operator-extension", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->operator_ext, (void*)(""), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
;
628
629 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "tone-spec", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "tone-spec", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->tone_spec, (void*)("%(1000, 0, 640)"), &profile
->config_str_pool, ((void*)0), ((void*)0), ((void*)0))
630 &profile->tone_spec, "%(1000, 0, 640)", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "tone-spec", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->tone_spec, (void*)("%(1000, 0, 640)"), &profile
->config_str_pool, ((void*)0), ((void*)0), ((void*)0))
;
631 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "storage-dir", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "storage-dir", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->storage_dir, (void*)(""), &profile->config_str_pool
, ((void*)0), ((void*)0), ((void*)0))
632 &profile->storage_dir, "", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "storage-dir", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->storage_dir, (void*)(""), &profile->config_str_pool
, ((void*)0), ((void*)0), ((void*)0))
;
633 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "storage-dir-shared", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "storage-dir-shared", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->storage_dir_shared, (void*)(SWITCH_FALSE),
((void*)0), ((void*)0), ((void*)0), ((void*)0))
634 &profile->storage_dir_shared, SWITCH_FALSE, NULL, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "storage-dir-shared", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->storage_dir_shared, (void*)(SWITCH_FALSE),
((void*)0), ((void*)0), ((void*)0), ((void*)0))
;
635 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "callback-dialplan", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "callback-dialplan", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->callback_dialplan, (void*)("XML"), &profile
->config_str_pool, ((void*)0), ((void*)0), ((void*)0))
636 &profile->callback_dialplan, "XML", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "callback-dialplan", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->callback_dialplan, (void*)("XML"), &profile
->config_str_pool, ((void*)0), ((void*)0), ((void*)0))
;
637 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "callback-context", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "callback-context", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->callback_context, (void*)("default"), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
638 &profile->callback_context, "default", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "callback-context", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->callback_context, (void*)("default"), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
;
639
640 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "notify-email-body", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "notify-email-body", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->notify_email_body, (void*)(((void*)0)), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
641 &profile->notify_email_body, NULL, &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "notify-email-body", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->notify_email_body, (void*)(((void*)0)), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
;
642 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "notify-email-headers", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "notify-email-headers", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->notify_email_headers, (void*)(((void*)0)),
&profile->config_str_pool, ((void*)0), ((void*)0), ((
void*)0))
643 &profile->notify_email_headers, NULL, &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "notify-email-headers", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->notify_email_headers, (void*)(((void*)0)),
&profile->config_str_pool, ((void*)0), ((void*)0), ((
void*)0))
;
644
645 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "play-date-announcement", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "play-date-announcement", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE
, &profile->play_date_announcement, (void*)(VM_DATE_FIRST
), &config_play_date_announcement, ((void*)0), ((void*)0)
, ((void*)0))
646 &profile->play_date_announcement, VM_DATE_FIRST, &config_play_date_announcement, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "play-date-announcement", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE
, &profile->play_date_announcement, (void*)(VM_DATE_FIRST
), &config_play_date_announcement, ((void*)0), ((void*)0)
, ((void*)0))
;
647
648 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "convert-cmd", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "convert-cmd", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->convert_cmd, (void*)(((void*)0)), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
649 &profile->convert_cmd, NULL, &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "convert-cmd", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->convert_cmd, (void*)(((void*)0)), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
;
650 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "convert-ext", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "convert-ext", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->convert_ext, (void*)(((void*)0)), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
651 &profile->convert_ext, NULL, &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "convert-ext", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->convert_ext, (void*)(((void*)0)), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
;
652
653
654 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "digit-timeout", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "digit-timeout", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &
profile->digit_timeout, (void*)(10000), &config_int_digit_timeout
, ((void*)0), ((void*)0), ((void*)0))
655 &profile->digit_timeout, 10000, &config_int_digit_timeout, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "digit-timeout", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &
profile->digit_timeout, (void*)(10000), &config_int_digit_timeout
, ((void*)0), ((void*)0), ((void*)0))
;
656 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "max-login-attempts", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "max-login-attempts", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,
&profile->max_login_attempts, (void*)(3), &config_int_max_logins
, ((void*)0), ((void*)0), ((void*)0))
657 &profile->max_login_attempts, 3, &config_int_max_logins, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "max-login-attempts", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,
&profile->max_login_attempts, (void*)(3), &config_int_max_logins
, ((void*)0), ((void*)0), ((void*)0))
;
658 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "min-record-len", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "min-record-len", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &
profile->min_record_len, (void*)(3), &config_int_0_10000
, ((void*)0), "seconds", ((void*)0))
659 &profile->min_record_len, 3, &config_int_0_10000, "seconds", NULL)switch_config_perform_set_item(&(profile->config[i++])
, "min-record-len", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &
profile->min_record_len, (void*)(3), &config_int_0_10000
, ((void*)0), "seconds", ((void*)0))
;
660 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "max-record-len", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "max-record-len", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &
profile->max_record_len, (void*)(300), &config_int_0_1000
, ((void*)0), "seconds", ((void*)0))
661 &profile->max_record_len, 300, &config_int_0_1000, "seconds", NULL)switch_config_perform_set_item(&(profile->config[i++])
, "max-record-len", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &
profile->max_record_len, (void*)(300), &config_int_0_1000
, ((void*)0), "seconds", ((void*)0))
;
662 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "max-retries", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "max-retries", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile
->max_retries, (void*)(3), &config_int_ht_0, ((void*)0
), ((void*)0), ((void*)0))
663 &profile->max_retries, 3, &config_int_ht_0, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "max-retries", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile
->max_retries, (void*)(3), &config_int_ht_0, ((void*)0
), ((void*)0), ((void*)0))
;
664 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "record-silence-threshold", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "record-silence-threshold", SWITCH_CONFIG_INT, CONFIG_RELOADABLE
, &profile->record_threshold, (void*)(200), &config_int_0_10000
, ((void*)0), ((void*)0), ((void*)0))
665 &profile->record_threshold, 200, &config_int_0_10000, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "record-silence-threshold", SWITCH_CONFIG_INT, CONFIG_RELOADABLE
, &profile->record_threshold, (void*)(200), &config_int_0_10000
, ((void*)0), ((void*)0), ((void*)0))
;
666 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "record-silence-hits", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "record-silence-hits", SWITCH_CONFIG_INT, CONFIG_RELOADABLE
, &profile->record_silence_hits, (void*)(2), &config_int_0_1000
, ((void*)0), ((void*)0), ((void*)0))
667 &profile->record_silence_hits, 2, &config_int_0_1000, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "record-silence-hits", SWITCH_CONFIG_INT, CONFIG_RELOADABLE
, &profile->record_silence_hits, (void*)(2), &config_int_0_1000
, ((void*)0), ((void*)0), ((void*)0))
;
668 SWITCH_CONFIG_SET_ITEM_CALLBACK(profile->config[i++], "record-sample-rate", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "record-sample-rate", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,
&profile->record_sample_rate, (void*)(0), ((void*)0),
vm_config_validate_samplerate, ((void*)0), ((void*)0))
669 &profile->record_sample_rate, 0, NULL, vm_config_validate_samplerate, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "record-sample-rate", SWITCH_CONFIG_INT, CONFIG_RELOADABLE,
&profile->record_sample_rate, (void*)(0), ((void*)0),
vm_config_validate_samplerate, ((void*)0), ((void*)0))
;
670
671 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "email_headers", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "email_headers", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->email_headers, (void*)(((void*)0)), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
672 &profile->email_headers, NULL, &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "email_headers", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->email_headers, (void*)(((void*)0)), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
;
673 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "email_body", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "email_body", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->email_body, (void*)(((void*)0)), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
674 &profile->email_body, NULL, &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "email_body", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->email_body, (void*)(((void*)0)), &profile->
config_str_pool, ((void*)0), ((void*)0), ((void*)0))
;
675 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "email_email-from", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "email_email-from", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->email_from, (void*)(((void*)0)), &profile
->config_str_pool, ((void*)0), ((void*)0), ((void*)0))
676 &profile->email_from, NULL, &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "email_email-from", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE
, &profile->email_from, (void*)(((void*)0)), &profile
->config_str_pool, ((void*)0), ((void*)0), ((void*)0))
;
677 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "email_date-fmt", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "email_date-fmt", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->date_fmt, (void*)("%A, %B %d %Y, %I:%M %p"), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
678 &profile->date_fmt, "%A, %B %d %Y, %I:%M %p", &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "email_date-fmt", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &
profile->date_fmt, (void*)("%A, %B %d %Y, %I:%M %p"), &
profile->config_str_pool, ((void*)0), ((void*)0), ((void*)
0))
;
679 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "odbc-dsn", SWITCH_CONFIG_STRING, 0, &profile->odbc_dsn, NULL, &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "odbc-dsn", SWITCH_CONFIG_STRING, 0, &profile->odbc_dsn
, (void*)(((void*)0)), &profile->config_str_pool, ((void
*)0), ((void*)0), ((void*)0))
;
680 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "dbname", SWITCH_CONFIG_STRING, 0, &profile->dbname, NULL, &profile->config_str_pool, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "dbname", SWITCH_CONFIG_STRING, 0, &profile->dbname,
(void*)(((void*)0)), &profile->config_str_pool, ((void
*)0), ((void*)0), ((void*)0))
;
681 SWITCH_CONFIG_SET_ITEM_CALLBACK(profile->config[i++], "email_template-file", SWITCH_CONFIG_CUSTOM, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "email_template-file", SWITCH_CONFIG_CUSTOM, CONFIG_RELOADABLE
, ((void*)0), (void*)(((void*)0)), profile, vm_config_email_callback
, ((void*)0), ((void*)0))
682 NULL, NULL, profile, vm_config_email_callback, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "email_template-file", SWITCH_CONFIG_CUSTOM, CONFIG_RELOADABLE
, ((void*)0), (void*)(((void*)0)), profile, vm_config_email_callback
, ((void*)0), ((void*)0))
;
683 SWITCH_CONFIG_SET_ITEM_CALLBACK(profile->config[i++], "email_notify-template-file", SWITCH_CONFIG_CUSTOM, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "email_notify-template-file", SWITCH_CONFIG_CUSTOM, CONFIG_RELOADABLE
, ((void*)0), (void*)(((void*)0)), profile, vm_config_notify_callback
, ((void*)0), ((void*)0))
684 NULL, NULL, profile, vm_config_notify_callback, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "email_notify-template-file", SWITCH_CONFIG_CUSTOM, CONFIG_RELOADABLE
, ((void*)0), (void*)(((void*)0)), profile, vm_config_notify_callback
, ((void*)0), ((void*)0))
;
685 SWITCH_CONFIG_SET_ITEM_CALLBACK(profile->config[i++], "web-template-file", SWITCH_CONFIG_CUSTOM, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "web-template-file", SWITCH_CONFIG_CUSTOM, CONFIG_RELOADABLE
, ((void*)0), (void*)(((void*)0)), profile, vm_config_web_callback
, ((void*)0), ((void*)0))
686 NULL, NULL, profile, vm_config_web_callback, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "web-template-file", SWITCH_CONFIG_CUSTOM, CONFIG_RELOADABLE
, ((void*)0), (void*)(((void*)0)), profile, vm_config_web_callback
, ((void*)0), ((void*)0))
;
687 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "db-password-override", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "db-password-override", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->db_password_override, (void*)(SWITCH_FALSE
), ((void*)0), ((void*)0), ((void*)0), ((void*)0))
688 &profile->db_password_override, SWITCH_FALSE, NULL, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "db-password-override", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->db_password_override, (void*)(SWITCH_FALSE
), ((void*)0), ((void*)0), ((void*)0), ((void*)0))
;
689 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "allow-empty-password-auth", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE,switch_config_perform_set_item(&(profile->config[i++])
, "allow-empty-password-auth", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->allow_empty_password_auth, (void*)(SWITCH_TRUE
), ((void*)0), ((void*)0), ((void*)0), ((void*)0))
690 &profile->allow_empty_password_auth, SWITCH_TRUE, NULL, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "allow-empty-password-auth", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->allow_empty_password_auth, (void*)(SWITCH_TRUE
), ((void*)0), ((void*)0), ((void*)0), ((void*)0))
;
691 SWITCH_CONFIG_SET_ITEM(profile->config[i++], "auto-playback-recordings", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE, &profile->auto_playback_recordings, SWITCH_FALSE, NULL, NULL, NULL)switch_config_perform_set_item(&(profile->config[i++])
, "auto-playback-recordings", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE
, &profile->auto_playback_recordings, (void*)(SWITCH_FALSE
), ((void*)0), ((void*)0), ((void*)0), ((void*)0))
;
692
693 switch_assert(i < VM_PROFILE_CONFIGITEM_COUNT)((i < 100) ? (void) (0) : __assert_fail ("i < 100", "mod_voicemail.c"
, 693, __PRETTY_FUNCTION__))
;
694
695 return profile;
696
697}
698
699static vm_profile_t *load_profile(const char *profile_name)
700{
701 vm_profile_t *profile = NULL((void*)0);
702 switch_xml_t x_profiles, x_profile, cfg, xml, x_email, param;
703 switch_event_t *event = NULL((void*)0);
704 switch_cache_db_handle_t *dbh = NULL((void*)0);
705
706 if (!(xml = switch_xml_open_cfg(global_cf, &cfg, NULL((void*)0)))) {
707 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 707, ((void*)0)
, SWITCH_LOG_ERROR, "Open of %s failed\n", global_cf);
708 return profile;
709 }
710 if (!(x_profiles = switch_xml_child(cfg, "profiles"))) {
711 goto end;
712 }
713
714 if ((x_profile = switch_xml_find_child(x_profiles, "profile", "name", profile_name))) {
715 switch_memory_pool_t *pool;
716 int x;
717 switch_size_t count;
718 char *errmsg;
719
720 if (switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 720)
!= SWITCH_STATUS_SUCCESS) {
721 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 721, ((void*)0)
, SWITCH_LOG_CRIT, "Pool Failure\n");
722 goto end;
723 }
724
725 if (!(profile = switch_core_alloc(pool, sizeof(vm_profile_t))switch_core_perform_alloc(pool, sizeof(vm_profile_t), "mod_voicemail.c"
, (const char *)__func__, 725)
)) {
726 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 726, ((void*)0)
, SWITCH_LOG_CRIT, "Alloc Failure\n");
727 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 727)
;
728 goto end;
729 }
730
731 profile->pool = pool;
732 profile_set_config(profile);
733
734 /* Add the params to the event structure */
735 count = switch_event_import_xml(switch_xml_child(x_profile, "param"), "name", "value", &event);
736
737 /* Take care of the custom config structure */
738 if ((x_email = switch_xml_child(x_profile, "email"))) {
739 if ((param = switch_xml_child(x_email, "body"))) {
740 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "email_body", param->txt);
741 }
742 if ((param = switch_xml_child(x_email, "headers"))) {
743 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "email_headers", param->txt);
744 }
745
746 for (param = switch_xml_child(x_email, "param"); param; param = param->next) {
747 char *var, *val;
748 char buf[2048];
749
750 if ((var = (char *) switch_xml_attr_soft(param, "name")) && (val = (char *) switch_xml_attr_soft(param, "value"))) {
751 switch_snprintf(buf, 2048, "email_%s", var);
752 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, buf, val);
753 }
754 }
755 }
756
757
758 if (switch_xml_config_parse_event(event, (int)count, SWITCH_FALSE, profile->config) != SWITCH_STATUS_SUCCESS) {
759 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 759, ((void*)0)
, SWITCH_LOG_ERROR, "Failed to process configuration\n");
760 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 760)
;
761 goto end;
762 }
763
764 switch_thread_rwlock_create(&profile->rwlock, pool);
765 profile->name = switch_core_strdup(pool, profile_name)switch_core_perform_strdup(pool, profile_name, "mod_voicemail.c"
, (const char *)__func__, 765)
;
766
767 if (zstr(profile->dbname)_zstr(profile->dbname)) {
768 profile->dbname = switch_core_sprintf(profile->pool, "voicemail_%s", profile_name);
769 }
770
771 if (!(dbh = vm_get_db_handle(profile))) {
772 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 772, ((void*)0)
, SWITCH_LOG_CRIT, "Cannot open DB!\n");
773 goto end;
774 }
775
776 switch_cache_db_test_reactive(dbh, "select count(forwarded_by) from voicemail_msgs", NULL((void*)0),
777 "alter table voicemail_msgs add forwarded_by varchar(255)");
778 switch_cache_db_test_reactive(dbh, "select count(forwarded_by) from voicemail_msgs", "drop table voicemail_msgs", vm_sql);
779
780 switch_cache_db_test_reactive(dbh, "select count(username) from voicemail_prefs", "drop table voicemail_prefs", vm_pref_sql);
781 switch_cache_db_test_reactive(dbh, "select count(password) from voicemail_prefs", NULL((void*)0), "alter table voicemail_prefs add password varchar(255)");
782
783 for (x = 0; vm_index_list[x]; x++) {
784 errmsg = NULL((void*)0);
785 switch_cache_db_execute_sql(dbh, vm_index_list[x], &errmsg);
786 switch_safe_free(errmsg)if (errmsg) {free(errmsg);errmsg=((void*)0);};
787 }
788
789 switch_cache_db_release_db_handle(&dbh);
790
791 switch_mutex_init(&profile->mutex, SWITCH_MUTEX_NESTED0x1, profile->pool);
792 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 792, ((void*)0)
, SWITCH_LOG_INFO, "Added Profile %s\n", profile->name);
793 switch_core_hash_insert(globals.profile_hash, profile->name, profile)switch_core_hash_insert_destructor(globals.profile_hash, profile
->name, profile, ((void*)0))
;
794 }
795
796 end:
797
798 switch_cache_db_release_db_handle(&dbh);
799
800 if (xml) {
801 switch_xml_free(xml);
802 }
803 if (event) {
804 switch_event_destroy(&event);
805 }
806 return profile;
807}
808
809
810static vm_profile_t *get_profile(const char *profile_name)
811{
812 vm_profile_t *profile = NULL((void*)0);
813
814 switch_mutex_lock(globals.mutex);
815 if (!(profile = switch_core_hash_find(globals.profile_hash, profile_name))) {
816 profile = load_profile(profile_name);
817 }
818 if (profile) {
819 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 819, ((void*)0)
, SWITCH_LOG_DEBUG10, "[%s] rwlock\n", profile->name);
820
821 switch_thread_rwlock_rdlock(profile->rwlock);
822 }
823 switch_mutex_unlock(globals.mutex);
824
825 return profile;
826}
827
828static void profile_rwunlock(vm_profile_t *profile)
829{
830 switch_thread_rwlock_unlock(profile->rwlock);
831 if (switch_test_flag(profile, PFLAG_DESTROY)((profile)->flags & PFLAG_DESTROY)) {
832 if (switch_thread_rwlock_trywrlock(profile->rwlock) == SWITCH_STATUS_SUCCESS) {
833 switch_thread_rwlock_unlock(profile->rwlock);
834 free_profile(profile);
835 }
836 }
837}
838
839
840static switch_status_t load_config(void)
841{
842 switch_xml_t cfg, xml, settings, param, x_profiles, x_profile;
843
844 if (!(xml = switch_xml_open_cfg(global_cf, &cfg, NULL((void*)0)))) {
845 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 845, ((void*)0)
, SWITCH_LOG_ERROR, "Open of %s failed\n", global_cf);
846 return SWITCH_STATUS_TERM;
847 }
848
849 switch_mutex_lock(globals.mutex);
850 if ((settings = switch_xml_child(cfg, "settings"))) {
851 for (param = switch_xml_child(settings, "param"); param; param = param->next) {
852 char *var = (char *) switch_xml_attr_soft(param, "name");
853 char *val = (char *) switch_xml_attr_soft(param, "value");
854
855 if (!strcasecmp(var, "debug")) {
856 globals.debug = atoi(val);
857 } else if (!strcasecmp(var, "message-query-exact-match")) {
858 globals.message_query_exact_match = switch_true(val);
859 }
860 }
861 }
862
863 if ((x_profiles = switch_xml_child(cfg, "profiles"))) {
864 for (x_profile = switch_xml_child(x_profiles, "profile"); x_profile; x_profile = x_profile->next) {
865 load_profile(switch_xml_attr_soft(x_profile, "name"));
866 }
867 }
868 switch_mutex_unlock(globals.mutex);
869
870 switch_xml_free(xml);
871 return SWITCH_STATUS_SUCCESS;
872}
873
874
875static switch_status_t cancel_on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen)
876{
877 switch (itype) {
878 case SWITCH_INPUT_TYPE_DTMF:
879 {
880 switch_dtmf_t *dtmf = (switch_dtmf_t *) input;
881 if (buf && buflen) {
882 char *bp = (char *) buf;
883 bp[0] = dtmf->digit;
884 bp[1] = '\0';
885 }
886 return SWITCH_STATUS_BREAK;
887 }
888 break;
889 default:
890 break;
891 }
892
893 return SWITCH_STATUS_SUCCESS;
894}
895
896
897struct call_control {
898 vm_profile_t *profile;
899 switch_file_handle_t *fh;
900 char buf[4];
901 int noexit;
902 int playback_controls_active;
903};
904typedef struct call_control cc_t;
905
906static switch_status_t control_playback(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen)
907{
908 switch (itype) {
909 case SWITCH_INPUT_TYPE_DTMF:
910 {
911 switch_dtmf_t *dtmf = (switch_dtmf_t *) input;
912 cc_t *cc = (cc_t *) buf;
913 switch_file_handle_t *fh = cc->fh;
914 uint32_t pos = 0;
915
916 if (!cc->noexit
917 && (dtmf->digit == *cc->profile->delete_file_key || dtmf->digit == *cc->profile->save_file_key
918 || dtmf->digit == *cc->profile->prev_msg_key || dtmf->digit == *cc->profile->next_msg_key
919 || dtmf->digit == *cc->profile->repeat_msg_key
920 || dtmf->digit == *cc->profile->terminator_key || dtmf->digit == *cc->profile->skip_info_key
921 || dtmf->digit == *cc->profile->forward_key)) {
922 *cc->buf = dtmf->digit;
923 return SWITCH_STATUS_BREAK;
924 }
925
926 if (!cc->playback_controls_active
927 && (dtmf->digit == *cc->profile->email_key)) {
928 *cc->buf = dtmf->digit;
929 return SWITCH_STATUS_BREAK;
930 }
931
932 if (!(fh && fh->file_interface && switch_test_flag(fh, SWITCH_FILE_OPEN)((fh)->flags & SWITCH_FILE_OPEN))) {
933 return SWITCH_STATUS_SUCCESS;
934 }
935
936 if (dtmf->digit == *cc->profile->pause_key) {
937 if (switch_test_flag(fh, SWITCH_FILE_PAUSE)((fh)->flags & SWITCH_FILE_PAUSE)) {
938 switch_clear_flag(fh, SWITCH_FILE_PAUSE)(fh)->flags &= ~(SWITCH_FILE_PAUSE);
939 } else {
940 switch_set_flag(fh, SWITCH_FILE_PAUSE)(fh)->flags |= (SWITCH_FILE_PAUSE);
941 }
942 return SWITCH_STATUS_SUCCESS;
943 }
944
945 if (dtmf->digit == *cc->profile->restart_key) {
946 unsigned int seekpos = 0;
947 fh->speed = 0;
948 switch_core_file_seek(fh, &seekpos, 0, SEEK_SET0);
949 return SWITCH_STATUS_SUCCESS;
950 }
951
952 if (dtmf->digit == *cc->profile->ff_key) {
953 int samps = 24000;
954 switch_core_file_seek(fh, &pos, samps, SEEK_CUR1);
955 return SWITCH_STATUS_SUCCESS;
956 }
957
958 if (dtmf->digit == *cc->profile->rew_key) {
959 int samps = -48000;
960 int target_pos = fh->offset_pos + samps;
961 if (target_pos < 1) {
962 /* too close to beginning of the file, just restart instead of rewind */
963 unsigned int seekpos = 0;
964 fh->speed = 0;
965 switch_core_file_seek(fh, &seekpos, 0, SEEK_SET0);
966 return SWITCH_STATUS_SUCCESS;
967 } else {
968 switch_core_file_seek(fh, &pos, samps, SEEK_CUR1);
969 return SWITCH_STATUS_SUCCESS;
970 }
971 }
972 }
973 break;
974 default:
975 break;
976 }
977
978 return SWITCH_STATUS_SUCCESS;
979}
980
981struct prefs_callback {
982 char name_path[255];
983 char greeting_path[255];
984 char password[255];
985};
986typedef struct prefs_callback prefs_callback_t;
987
988static int prefs_callback(void *pArg, int argc, char **argv, char **columnNames)
989{
990 prefs_callback_t *cbt = (prefs_callback_t *) pArg;
991
992 switch_copy_string(cbt->name_path, argv[2], sizeof(cbt->name_path));
993 switch_copy_string(cbt->greeting_path, argv[3], sizeof(cbt->greeting_path));
994 switch_copy_string(cbt->password, argv[4], sizeof(cbt->password));
995
996 return 0;
997}
998
999
1000typedef enum {
1001 VM_CHECK_START,
1002 VM_CHECK_AUTH,
1003 VM_CHECK_MENU,
1004 VM_CHECK_CONFIG,
1005 VM_CHECK_PLAY_MESSAGES,
1006 VM_CHECK_FOLDER_SUMMARY,
1007 VM_CHECK_LISTEN
1008} vm_check_state_t;
1009
1010
1011#define VM_INVALID_EXTENSION_MACRO"voicemail_invalid_extension" "voicemail_invalid_extension"
1012#define VM_FORWARD_MESSAGE_ENTER_EXTENSION_MACRO"voicemail_forward_message_enter_extension" "voicemail_forward_message_enter_extension"
1013#define VM_ACK_MACRO"voicemail_ack" "voicemail_ack"
1014#define VM_SAY_DATE_MACRO"voicemail_say_date" "voicemail_say_date"
1015#define VM_PLAY_GREETING_MACRO"voicemail_play_greeting" "voicemail_play_greeting"
1016#define VM_SAY_MESSAGE_NUMBER_MACRO"voicemail_say_message_number" "voicemail_say_message_number"
1017#define VM_SAY_NUMBER_MACRO"voicemail_say_number" "voicemail_say_number"
1018#define VM_SAY_PHONE_NUMBER_MACRO"voicemail_say_phone_number" "voicemail_say_phone_number"
1019#define VM_SAY_NAME_MACRO"voicemail_say_name" "voicemail_say_name"
1020
1021#define VM_FORWARD_PREPEND_MACRO"voicemail_forward_prepend" "voicemail_forward_prepend"
1022#define VM_RECORD_MESSAGE_MACRO"voicemail_record_message" "voicemail_record_message"
1023#define VM_CHOOSE_GREETING_MACRO"voicemail_choose_greeting" "voicemail_choose_greeting"
1024#define VM_CHOOSE_GREETING_FAIL_MACRO"voicemail_choose_greeting_fail" "voicemail_choose_greeting_fail"
1025#define VM_CHOOSE_GREETING_SELECTED_MACRO"voicemail_greeting_selected" "voicemail_greeting_selected"
1026#define VM_RECORD_GREETING_MACRO"voicemail_record_greeting" "voicemail_record_greeting"
1027#define VM_RECORD_NAME_MACRO"voicemail_record_name" "voicemail_record_name"
1028#define VM_LISTEN_FILE_CHECK_MACRO"voicemail_listen_file_check" "voicemail_listen_file_check"
1029#define VM_RECORD_FILE_CHECK_MACRO"voicemail_record_file_check" "voicemail_record_file_check"
1030#define VM_RECORD_URGENT_CHECK_MACRO"voicemail_record_urgent_check" "voicemail_record_urgent_check"
1031#define VM_MENU_MACRO"voicemail_menu" "voicemail_menu"
1032#define VM_CONFIG_MENU_MACRO"voicemail_config_menu" "voicemail_config_menu"
1033#define VM_ENTER_ID_MACRO"voicemail_enter_id" "voicemail_enter_id"
1034#define VM_ENTER_PASS_MACRO"voicemail_enter_pass" "voicemail_enter_pass"
1035#define VM_FAIL_AUTH_MACRO"voicemail_fail_auth" "voicemail_fail_auth"
1036#define VM_CHANGE_PASS_SUCCESS_MACRO"voicemail_change_pass_success" "voicemail_change_pass_success"
1037#define VM_CHANGE_PASS_FAIL_MACRO"voicemail_change_pass_fail" "voicemail_change_pass_fail"
1038#define VM_ABORT_MACRO"voicemail_abort" "voicemail_abort"
1039#define VM_HELLO_MACRO"voicemail_hello" "voicemail_hello"
1040#define VM_GOODBYE_MACRO"voicemail_goodbye" "voicemail_goodbye"
1041#define VM_MESSAGE_COUNT_MACRO"voicemail_message_count" "voicemail_message_count"
1042#define VM_DISK_QUOTA_EXCEEDED_MACRO"voicemail_disk_quota_exceeded" "voicemail_disk_quota_exceeded"
1043#define URGENT_FLAG_STRING"A_URGENT" "A_URGENT"
1044#define NORMAL_FLAG_STRING"B_NORMAL" "B_NORMAL"
1045
1046static switch_status_t vm_macro_get(switch_core_session_t *session,
1047 char *macro,
1048 char *macro_arg,
1049 char *buf, switch_size_t buflen, switch_size_t maxlen, char *term_chars, char *terminator_key, uint32_t timeout)
1050{
1051 switch_input_args_t args = { 0 }, *ap = NULL((void*)0);
1052 switch_status_t status = SWITCH_STATUS_SUCCESS;
1053 switch_size_t bslen;
1054
1055 if (buf && buflen) {
1056 memset(buf, 0, buflen);
1057 args.input_callback = cancel_on_dtmf;
1058 args.buf = buf;
1059 args.buflen = (uint32_t) buflen;
1060 ap = &args;
1061 }
1062
1063 status = switch_ivr_phrase_macro(session, macro, macro_arg, NULL, ap)switch_ivr_phrase_macro_event(session, macro, macro_arg, ((void
*)0), ((void*)0), ap)
;
1064
1065 if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
1066 if (buf) {
1067 memset(buf, 0, buflen);
1068 }
1069 return status;
1070 }
1071
1072 if (!buf) {
1073 return status;
1074 }
1075
1076 bslen = strlen(buf);
1077
1078 if (maxlen == 0 || maxlen > buflen - 1) {
1079 maxlen = buflen - 1;
1080 }
1081
1082 if (bslen < maxlen) {
1083 status = switch_ivr_collect_digits_count(session, buf + bslen, buflen, maxlen - bslen, term_chars, terminator_key, timeout, 0, 0);
1084 if (status == SWITCH_STATUS_TIMEOUT) {
1085 status = SWITCH_STATUS_SUCCESS;
1086 }
1087 }
1088
1089 return status;
1090}
1091
1092struct callback {
1093 char *buf;
1094 size_t len;
1095 int matches;
1096};
1097typedef struct callback callback_t;
1098
1099struct msg_cnt_callback {
1100 char *buf;
1101 size_t len;
1102 int matches;
1103 int total_new_messages;
1104 int total_new_urgent_messages;
1105 int total_saved_messages;
1106 int total_saved_urgent_messages;
1107};
1108typedef struct msg_cnt_callback msg_cnt_callback_t;
1109
1110
1111static int message_count_callback(void *pArg, int argc, char **argv, char **columnNames)
1112{
1113 msg_cnt_callback_t *cbt = (msg_cnt_callback_t *) pArg;
1114
1115 if (argc < 3 || zstr(argv[0])_zstr(argv[0]) || zstr(argv[1])_zstr(argv[1]) || zstr(argv[2])_zstr(argv[2])) {
1116 return -1;
1117 }
1118
1119 if (atoi(argv[0]) == 1) { /* UnRead */
1120 if (!strcasecmp(argv[1], "A_URGENT")) { /* Urgent */
1121 cbt->total_new_urgent_messages = atoi(argv[2]);
1122 } else { /* Normal */
1123 cbt->total_new_messages = atoi(argv[2]);
1124 }
1125 } else { /* Already Read */
1126 if (!strcasecmp(argv[1], "A_URGENT")) { /* Urgent */
1127 cbt->total_saved_urgent_messages = atoi(argv[2]);
1128 } else { /* Normal */
1129 cbt->total_saved_messages = atoi(argv[2]);
1130 }
1131 }
1132
1133 return 0;
1134}
1135
1136static int sql2str_callback(void *pArg, int argc, char **argv, char **columnNames)
1137{
1138 callback_t *cbt = (callback_t *) pArg;
1139
1140 switch_copy_string(cbt->buf, argv[0], cbt->len);
1141 cbt->matches++;
1142 return 0;
1143}
1144
1145
1146static int unlink_callback(void *pArg, int argc, char **argv, char **columnNames)
1147{
1148 if (argv[0]) {
1149 if (unlink(argv[0]) != 0) {
1150 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 1150, ((void*)0)
, SWITCH_LOG_WARNING, "Failed to delete file [%s]\n", argv[0]);
1151 }
1152 }
1153 return 0;
1154}
1155
1156
1157typedef enum {
1158 MSG_NONE,
1159 MSG_NEW,
1160 MSG_SAVED
1161} msg_type_t;
1162
1163
1164switch_status_t measure_file_len(const char *path, switch_size_t *message_len)
1165{
1166
1167 switch_file_handle_t fh = { 0 };
1168 uint32_t pos = 0;
1169 switch_status_t status = SWITCH_STATUS_FALSE;
1170
1171 if (switch_core_file_open(&fh, path, 0, 0, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL)switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1171, &fh, path, 0, 0, SWITCH_FILE_FLAG_READ |
SWITCH_FILE_DATA_SHORT, ((void*)0))
== SWITCH_STATUS_SUCCESS) {
1172
1173 if (switch_core_file_seek(&fh, &pos, 0, SEEK_END2) == SWITCH_STATUS_SUCCESS) {
1174 *message_len = pos / fh.samplerate;
1175 status = SWITCH_STATUS_SUCCESS;
1176 }
1177 switch_core_file_close(&fh);
1178 }
1179
1180 return status;
1181
1182}
1183
1184static switch_status_t create_file(switch_core_session_t *session, vm_profile_t *profile,
1185 char *macro_name, char *file_path, switch_size_t *message_len, switch_bool_t limit,
1186 const char *exit_keys, char *key_pressed)
1187{
1188 switch_channel_t *channel = switch_core_session_get_channel(session);
1189 switch_status_t status = SWITCH_STATUS_SUCCESS;
1190 switch_file_handle_t fh = { 0 };
1191 switch_input_args_t args = { 0 };
1192 char term;
1193 char input[10] = "", key_buf[80] = "";
1194 cc_t cc = { 0 };
1195 switch_codec_implementation_t read_impl = { 0 };
1196 int got_file = 0;
1197 switch_bool_t skip_record_check = switch_true(switch_channel_get_variable(channel, "skip_record_check")switch_channel_get_variable_dup(channel, "skip_record_check",
SWITCH_TRUE, -1)
);
1198
1199 switch_core_session_get_read_impl(session, &read_impl);
1200
1201
1202 if (exit_keys) {
1203 *key_pressed = '\0';
1204 }
1205
1206 while (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) {
1207 uint32_t counter = 0;
1208 switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s", profile->listen_file_key, profile->save_file_key, profile->record_file_key);
1209
1210 record_file:
1211 *message_len = 0;
1212
1213 if (macro_name)
1214 TRY_CODE(switch_ivr_phrase_macro(session, macro_name, NULL, NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, macro_name
, ((void*)0), ((void*)0), ((void*)0), ((void*)0)); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1215 switch_channel_flush_dtmf(channel);
1216 TRY_CODE(switch_ivr_gentones(session, profile->tone_spec, 0, NULL))do { status = switch_ivr_gentones(session, profile->tone_spec
, 0, ((void*)0)); if (status != SWITCH_STATUS_SUCCESS &&
status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status
)
;
1217
1218 memset(&fh, 0, sizeof(fh));
1219 fh.thresh = profile->record_threshold;
1220 fh.silence_hits = profile->record_silence_hits;
1221 fh.samplerate = profile->record_sample_rate;
1222
1223 memset(input, 0, sizeof(input));
1224 args.input_callback = cancel_on_dtmf;
1225 args.buf = input;
1226 args.buflen = sizeof(input);
1227
1228 unlink(file_path);
1229
1230 switch_ivr_record_file(session, &fh, file_path, &args, profile->max_record_len);
1231
1232 if (switch_file_exists(file_path, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
1233 got_file = 1;
1234 }
1235
1236 if (limit && (*message_len = fh.samples_out / (fh.samplerate ? fh.samplerate : 8000)) < profile->min_record_len) {
1237 if (unlink(file_path) != 0) {
1238 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1238, (const char*)(session)
, SWITCH_LOG_WARNING, "Failed to delete file [%s]\n", file_path);
1239 }
1240 got_file = 0;
1241 if (exit_keys && input[0] && strchr(exit_keys, input[0])(__extension__ (__builtin_constant_p (input[0]) && !__builtin_constant_p
(exit_keys) && (input[0]) == '\0' ? (char *) __rawmemchr
(exit_keys, input[0]) : __builtin_strchr (exit_keys, input[0
])))
) {
1242 *key_pressed = input[0];
1243 return SWITCH_STATUS_SUCCESS;
1244 }
1245 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1245, (const char*)(session)
, SWITCH_LOG_DEBUG, "Message is less than minimum record length: %d, discarding it.\n",
1246 profile->min_record_len);
1247 if (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE) && counter < profile->max_retries) {
1248 TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "too-small", NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_ack"
, "too-small", ((void*)0), ((void*)0), ((void*)0)); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1249 counter++;
1250 goto record_file;
1251 } else {
1252 status = SWITCH_STATUS_NOTFOUND;
1253 goto end;
1254 }
1255 } else {
1256 status = SWITCH_STATUS_SUCCESS;
1257 }
1258
1259 if (profile->auto_playback_recordings) {
1260 play_file:
1261 memset(&fh, 0, sizeof(fh));
1262 args.input_callback = control_playback;
1263 memset(&cc, 0, sizeof(cc));
1264 cc.profile = profile;
1265 cc.fh = &fh;
1266 args.buf = &cc;
1267 switch_ivr_play_file(session, &fh, file_path, &args);
1268 }
1269 while (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) {
1270 *input = '\0';
1271
1272 if (*cc.buf && *cc.buf != *profile->terminator_key) {
1273 *input = *cc.buf;
1274 *(input + 1) = '\0';
1275 status = SWITCH_STATUS_SUCCESS;
1276 *cc.buf = '\0';
1277 } else if (skip_record_check) {
1278 /* Skip the record check and simply return */
1279 goto end;
1280 } else {
1281 (void) vm_macro_get(session, VM_RECORD_FILE_CHECK_MACRO"voicemail_record_file_check", key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout);
1282 if (!switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) goto end;
1283 }
1284
1285 if (!strcmp(input, profile->listen_file_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->listen_file_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->listen_file_key), (!((size_t)(
const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->listen_file_key) + 1) - (size_t)(const void *)(
profile->listen_file_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->listen_file_key) : (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
listen_file_key) && ((size_t)(const void *)((profile->
listen_file_key) + 1) - (size_t)(const void *)(profile->listen_file_key
) == 1) ? __builtin_strcmp (input, profile->listen_file_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->listen_file_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
listen_file_key) && ((size_t)(const void *)((profile->
listen_file_key) + 1) - (size_t)(const void *)(profile->listen_file_key
) == 1) && (__s2_len = __builtin_strlen (profile->
listen_file_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->listen_file_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->listen_file_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->listen_file_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->listen_file_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->listen_file_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
listen_file_key)))); })
) {
1286 goto play_file;
1287 } else if (!strcmp(input, profile->record_file_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->record_file_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->record_file_key), (!((size_t)(
const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->record_file_key) + 1) - (size_t)(const void *)(
profile->record_file_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->record_file_key) : (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
record_file_key) && ((size_t)(const void *)((profile->
record_file_key) + 1) - (size_t)(const void *)(profile->record_file_key
) == 1) ? __builtin_strcmp (input, profile->record_file_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->record_file_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
record_file_key) && ((size_t)(const void *)((profile->
record_file_key) + 1) - (size_t)(const void *)(profile->record_file_key
) == 1) && (__s2_len = __builtin_strlen (profile->
record_file_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->record_file_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->record_file_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->record_file_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->record_file_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->record_file_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
record_file_key)))); })
) {
1288 goto record_file;
1289 } else {
1290 (void) switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)switch_ivr_phrase_macro_event(session, "voicemail_ack", "saved"
, ((void*)0), ((void*)0), ((void*)0))
;
1291 goto end;
1292 }
1293 }
1294 }
1295
1296 end:
1297
1298 if (!got_file) {
1299 status = SWITCH_STATUS_NOTFOUND;
1300 }
1301
1302 return status;
1303}
1304
1305
1306struct listen_callback {
1307 char created_epoch[255];
1308 char read_epoch[255];
1309 char user[255];
1310 char domain[255];
1311 char uuid[255];
1312 char cid_name[255];
1313 char cid_number[255];
1314 char in_folder[255];
1315 char file_path[255];
1316 char message_len[255];
1317 char flags[255];
1318 char read_flags[255];
1319 char forwarded_by[255];
1320 char *email;
1321 int index;
1322 int want;
1323 msg_type_t type;
1324 msg_move_t move;
1325 char *convert_cmd;
1326 char *convert_ext;
1327};
1328typedef struct listen_callback listen_callback_t;
1329
1330static int listen_callback(void *pArg, int argc, char **argv, char **columnNames)
1331{
1332 listen_callback_t *cbt = (listen_callback_t *) pArg;
1333
1334 if (cbt->index++ != cbt->want) {
1335 return 0;
1336 }
1337
1338 switch_copy_string(cbt->created_epoch, argv[0], 255);
1339 switch_copy_string(cbt->read_epoch, argv[1], 255);
1340 switch_copy_string(cbt->user, argv[2], 255);
1341 switch_copy_string(cbt->domain, argv[3], 255);
1342 switch_copy_string(cbt->uuid, argv[4], 255);
1343 switch_copy_string(cbt->cid_name, argv[5], 255);
1344 switch_copy_string(cbt->cid_number, argv[6], 255);
1345 switch_copy_string(cbt->in_folder, argv[7], 255);
1346 switch_copy_string(cbt->file_path, argv[8], 255);
1347 switch_copy_string(cbt->message_len, argv[9], 255);
1348 switch_copy_string(cbt->flags, argv[10], 255);
1349 switch_copy_string(cbt->read_flags, argv[11], 255);
1350 switch_copy_string(cbt->forwarded_by, argv[12], 255);
1351
1352 return -1;
1353}
1354
1355static char *resolve_id(const char *myid, const char *domain_name, const char *action)
1356{
1357 switch_xml_t xx_user;
1358 switch_event_t *params;
1359 char *ret = (char *) myid;
1360
1361 switch_event_create(&params, SWITCH_EVENT_GENERAL)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 1361, &params, SWITCH_EVENT_GENERAL
, ((void*)0))
;
1362 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "action", action);
1363
1364 if (switch_xml_locate_user_merged("id:number-alias", myid, domain_name, NULL((void*)0), &xx_user, params) == SWITCH_STATUS_SUCCESS) {
1365 ret = strdup(switch_xml_attr(xx_user, "id"))(__extension__ (__builtin_constant_p (switch_xml_attr(xx_user
, "id")) && ((size_t)(const void *)((switch_xml_attr(
xx_user, "id")) + 1) - (size_t)(const void *)(switch_xml_attr
(xx_user, "id")) == 1) ? (((const char *) (switch_xml_attr(xx_user
, "id")))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1
) : ({ size_t __len = strlen (switch_xml_attr(xx_user, "id"))
+ 1; char *__retval = (char *) malloc (__len); if (__retval !=
((void*)0)) __retval = (char *) memcpy (__retval, switch_xml_attr
(xx_user, "id"), __len); __retval; })) : __strdup (switch_xml_attr
(xx_user, "id"))))
;
1366 switch_xml_free(xx_user);
1367 }
1368
1369 switch_event_destroy(&params);
1370 return ret;
1371}
1372
1373static void message_count(vm_profile_t *profile, const char *id_in, const char *domain_name, const char *myfolder, int *total_new_messages,
1374 int *total_saved_messages, int *total_new_urgent_messages, int *total_saved_urgent_messages)
1375{
1376 char msg_count[80] = "";
1377 msg_cnt_callback_t cbt = { 0 };
1378 char *sql;
1379 char *myid = NULL((void*)0);
1380
1381
1382 cbt.buf = msg_count;
1383 cbt.len = sizeof(msg_count);
1384
1385 cbt.total_new_messages = 0;
1386 cbt.total_new_urgent_messages = 0;
1387 cbt.total_saved_messages = 0;
1388 cbt.total_saved_urgent_messages = 0;
1389
1390 myid = resolve_id(id_in, domain_name, "message-count");
1391
1392 sql = switch_mprintf(
1393 "select 1, read_flags, count(read_epoch) from voicemail_msgs where "
1394 "username='%q' and domain='%q' and in_folder='%q' and read_epoch=0 "
1395 "group by read_flags "
1396 "union "
1397 "select 0, read_flags, count(read_epoch) from voicemail_msgs where "
1398 "username='%q' and domain='%q' and in_folder='%q' and read_epoch<>0 "
1399 "group by read_flags;",
1400
1401 myid, domain_name, myfolder,
1402 myid, domain_name, myfolder);
1403
1404 vm_execute_sql_callback(profile, profile->mutex, sql, message_count_callback, &cbt);
1405 free(sql);
1406
1407 *total_new_messages = cbt.total_new_messages + cbt.total_new_urgent_messages;
1408 *total_new_urgent_messages = cbt.total_new_urgent_messages;
1409 *total_saved_messages = cbt.total_saved_messages + cbt.total_saved_urgent_messages;
1410 *total_saved_urgent_messages = cbt.total_saved_urgent_messages;
1411
1412 if (myid != id_in) {
1413 free(myid);
1414 }
1415}
1416
1417/* TODO Port this as switch_ core function */
1418switch_status_t vm_merge_media_files(const char** inputs, const char *output) {
1419 switch_status_t status = SWITCH_STATUS_SUCCESS;
1420 switch_file_handle_t fh_output = { 0 };
1421 int channels = 1;
1422 int rate = 8000; /* TODO Make this configurable */
1423 int j = 0;
1424
1425 if (switch_core_file_open(&fh_output, output, channels, rate, SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT, NULL)switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1425, &fh_output, output, channels, rate, SWITCH_FILE_FLAG_WRITE
| SWITCH_FILE_DATA_SHORT, ((void*)0))
!= SWITCH_STATUS_SUCCESS) {
1426 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 1426, ((void*)0)
, SWITCH_LOG_ERROR, "Couldn't open %s\n", output);
1427 goto end;
1428 }
1429
1430 for (j = 0; inputs[j] != NULL((void*)0) && j < 128 && status == SWITCH_STATUS_SUCCESS; j++) {
1431 switch_file_handle_t fh_input = { 0 };
1432 char buf[2048];
1433 switch_size_t len = sizeof(buf) / 2;
1434
1435 if (switch_core_file_open(&fh_input, inputs[j], channels, rate, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL)switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1435, &fh_input, inputs[j], channels, rate, SWITCH_FILE_FLAG_READ
| SWITCH_FILE_DATA_SHORT, ((void*)0))
!= SWITCH_STATUS_SUCCESS) {
1436 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 1436, ((void*)0)
, SWITCH_LOG_ERROR, "Couldn't open %s\n", inputs[j]);
1437 status = SWITCH_STATUS_GENERR;
1438 break;
1439 }
1440
1441 while (switch_core_file_read(&fh_input, buf, &len) == SWITCH_STATUS_SUCCESS) {
1442 if (switch_core_file_write(&fh_output, buf, &len) != SWITCH_STATUS_SUCCESS) {
1443 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 1443, ((void*)0)
, SWITCH_LOG_ERROR, "Write error\n");
1444 status = SWITCH_STATUS_GENERR;
1445 break;
1446 }
1447 }
1448
1449 if (fh_input.file_interface) {
1450 switch_core_file_close(&fh_input);
1451 }
1452 }
1453
1454 if (fh_output.file_interface) {
1455 switch_core_file_close(&fh_output);
1456 }
1457end:
1458 return status;
1459}
1460
1461#define VM_STARTSAMPLES1024 * 32 1024 * 32
1462
1463static char *vm_merge_file(switch_core_session_t *session, vm_profile_t *profile, const char *announce, const char *orig)
1464{
1465 switch_channel_t *channel = switch_core_session_get_channel(session);
1466 switch_file_handle_t lrfh = { 0 }, *rfh = NULL((void*)0), lfh = {
1467 0}, *fh = NULL((void*)0);
1468 char *tmp_path;
1469 switch_uuid_t uuid;
1470 char uuid_str[SWITCH_UUID_FORMATTED_LENGTH256 + 1];
1471 char *ret = NULL((void*)0);
1472 int16_t *abuf = NULL((void*)0);
1473 switch_size_t olen = 0;
1474 int asis = 0;
1475 switch_codec_implementation_t read_impl = { 0 };
1476 switch_core_session_get_read_impl(session, &read_impl);
1477
1478 switch_uuid_get(&uuid);
1479 switch_uuid_format(uuid_str, &uuid);
1480
1481 lfh.channels = read_impl.number_of_channels;
1482 lfh.native_rate = read_impl.actual_samples_per_second;
1483
1484 tmp_path = switch_core_session_sprintf(session, "%s%smsg_%s.%s", SWITCH_GLOBAL_dirs.temp_dir, SWITCH_PATH_SEPARATOR"/", uuid_str, profile->file_ext);
1485
1486 if (switch_core_file_open(&lfh,switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1489, &lfh, tmp_path, lfh.channels, read_impl.
actual_samples_per_second, SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT
, ((void*)0))
1487 tmp_path,switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1489, &lfh, tmp_path, lfh.channels, read_impl.
actual_samples_per_second, SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT
, ((void*)0))
1488 lfh.channels,switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1489, &lfh, tmp_path, lfh.channels, read_impl.
actual_samples_per_second, SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT
, ((void*)0))
1489 read_impl.actual_samples_per_second, SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT, NULL)switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1489, &lfh, tmp_path, lfh.channels, read_impl.
actual_samples_per_second, SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT
, ((void*)0))
!= SWITCH_STATUS_SUCCESS) {
1490 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1490, (const char*)(session)
, SWITCH_LOG_ERROR, "Failed to open file %s\n", tmp_path);
1491 goto end;
1492 }
1493
1494 fh = &lfh;
1495
1496
1497 if (switch_core_file_open(&lrfh,switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1500, &lrfh, announce, lfh.channels, read_impl
.actual_samples_per_second, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT
, ((void*)0))
1498 announce,switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1500, &lrfh, announce, lfh.channels, read_impl
.actual_samples_per_second, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT
, ((void*)0))
1499 lfh.channels,switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1500, &lrfh, announce, lfh.channels, read_impl
.actual_samples_per_second, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT
, ((void*)0))
1500 read_impl.actual_samples_per_second, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL)switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1500, &lrfh, announce, lfh.channels, read_impl
.actual_samples_per_second, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT
, ((void*)0))
!= SWITCH_STATUS_SUCCESS) {
1501 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1501, (const char*)(session)
, SWITCH_LOG_ERROR, "Failed to open file %s\n", announce);
1502 goto end;
1503 }
1504
1505 rfh = &lrfh;
1506
1507 switch_zmalloc(abuf, VM_STARTSAMPLES * sizeof(*abuf))(void)((((abuf = calloc(1, (1024 * 32 * sizeof(*abuf))))) ? (
void) (0) : __assert_fail ("(abuf = calloc(1, (1024 * 32 * sizeof(*abuf))))"
, "mod_voicemail.c", 1507, __PRETTY_FUNCTION__)),abuf)
;
1508
1509 if (switch_test_flag(fh, SWITCH_FILE_NATIVE)((fh)->flags & SWITCH_FILE_NATIVE)) {
1510 asis = 1;
1511 }
1512
1513 while (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) {
1514 olen = VM_STARTSAMPLES1024 * 32;
1515
1516 if (!asis) {
1517 olen /= 2;
1518 }
1519
1520 if (switch_core_file_read(rfh, abuf, &olen) != SWITCH_STATUS_SUCCESS || !olen) {
1521 break;
1522 }
1523
1524 switch_core_file_write(fh, abuf, &olen);
1525
1526 }
1527
1528 if (rfh) {
1529 switch_core_file_close(rfh);
1530 rfh = NULL((void*)0);
1531 }
1532
1533 if (switch_core_file_open(&lrfh,switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1536, &lrfh, orig, lfh.channels, read_impl.actual_samples_per_second
, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, ((void*)0))
1534 orig,switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1536, &lrfh, orig, lfh.channels, read_impl.actual_samples_per_second
, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, ((void*)0))
1535 lfh.channels,switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1536, &lrfh, orig, lfh.channels, read_impl.actual_samples_per_second
, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, ((void*)0))
1536 read_impl.actual_samples_per_second, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL)switch_core_perform_file_open("mod_voicemail.c", (const char *
)__func__, 1536, &lrfh, orig, lfh.channels, read_impl.actual_samples_per_second
, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, ((void*)0))
!= SWITCH_STATUS_SUCCESS) {
1537 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1537, (const char*)(session)
, SWITCH_LOG_ERROR, "Failed to open file %s\n", orig);
1538 goto end;
1539 }
1540
1541 rfh = &lrfh;
1542
1543 while (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) {
1544 olen = VM_STARTSAMPLES1024 * 32;
1545
1546 if (!asis) {
1547 olen /= 2;
1548 }
1549
1550 if (switch_core_file_read(rfh, abuf, &olen) != SWITCH_STATUS_SUCCESS || !olen) {
1551 break;
1552 }
1553
1554 switch_core_file_write(fh, abuf, &olen);
1555
1556 }
1557
1558 if (unlink(announce) != 0) {
1559 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1559, (const char*)(session)
, SWITCH_LOG_WARNING, "Failed to delete file [%s]\n", announce);
1560 }
1561 ret = tmp_path;
1562
1563 end:
1564
1565 if (fh) {
1566 switch_core_file_close(fh);
1567 fh = NULL((void*)0);
1568 }
1569
1570 if (rfh) {
1571 switch_core_file_close(rfh);
1572 rfh = NULL((void*)0);
1573 }
1574
1575 switch_safe_free(abuf)if (abuf) {free(abuf);abuf=((void*)0);};
1576
1577 return ret;
1578
1579}
1580
1581
1582static switch_status_t listen_file(switch_core_session_t *session, vm_profile_t *profile, listen_callback_t *cbt)
1583{
1584 switch_channel_t *channel = switch_core_session_get_channel(session);
1585 switch_status_t status = SWITCH_STATUS_SUCCESS;
1586 switch_input_args_t args = { 0 };
1587 char term;
1588 char input[10] = "", key_buf[80] = "";
1589 switch_file_handle_t fh = { 0 };
1590 cc_t cc = { 0 };
1591 char *forward_file_path = NULL((void*)0);
1592 switch_core_session_message_t msg = { 0 };
1593 char cid_buf[1024] = "";
1594
1595 if (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) {
1596 switch_snprintf(cid_buf, sizeof(cid_buf), "%s|%s", cbt->cid_name, cbt->cid_number);
1597
1598 msg.from = __FILE__"mod_voicemail.c";
1599 msg.string_arg = cid_buf;
1600 msg.message_id = SWITCH_MESSAGE_INDICATE_DISPLAY;
1601
1602 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1602, (const char*)(session)
, SWITCH_LOG_DEBUG, "Sending display update [%s] to %s\n",
1603 cid_buf, switch_channel_get_name(channel));
1604 switch_core_session_receive_message(session, &msg)switch_core_session_perform_receive_message(session, &msg
, "mod_voicemail.c", (const char *)__func__, 1604)
;
1605
1606 if (!zstr(cbt->cid_number)_zstr(cbt->cid_number) && (switch_true(switch_channel_get_variable(channel, "vm_announce_cid")switch_channel_get_variable_dup(channel, "vm_announce_cid", SWITCH_TRUE
, -1)
))) {
1607 TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_PHONE_NUMBER_MACRO, cbt->cid_number, NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_say_phone_number"
, cbt->cid_number, ((void*)0), ((void*)0), ((void*)0)); if
(status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1608 }
1609
1610 args.input_callback = cancel_on_dtmf;
1611
1612 switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s:%s:%s%s%s", profile->repeat_msg_key, profile->save_file_key,
1613 profile->delete_file_key, profile->email_key, profile->callback_key,
1614 profile->forward_key, cbt->email ? ":" : "", cbt->email ? cbt->email : "");
1615
1616
1617 switch_snprintf(input, sizeof(input), "%s:%d", cbt->type == MSG_NEW ? "new" : "saved", cbt->want + 1);
1618 memset(&cc, 0, sizeof(cc));
1619 cc.profile = profile;
1620 args.buf = &cc;
1621 args.input_callback = control_playback;
1622 TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_MESSAGE_NUMBER_MACRO, input, NULL, &args))do { status = switch_ivr_phrase_macro_event(session, "voicemail_say_message_number"
, input, ((void*)0), ((void*)0), &args); if (status != SWITCH_STATUS_SUCCESS
&& status != SWITCH_STATUS_BREAK) { goto end; } break
;} while(status)
;
1623
1624 play_file:
1625
1626 if (!*cc.buf && (profile->play_date_announcement == VM_DATE_FIRST)) {
1627 cc.fh = NULL((void*)0);
1628 TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_DATE_MACRO, cbt->created_epoch, NULL, &args))do { status = switch_ivr_phrase_macro_event(session, "voicemail_say_date"
, cbt->created_epoch, ((void*)0), ((void*)0), &args); if
(status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1629 }
1630
1631 if (!*cc.buf || *cc.buf == *cc.profile->skip_info_key) {
1632 *cc.buf = '\0';
1633 memset(&fh, 0, sizeof(fh));
1634 cc.fh = &fh;
1635 cc.playback_controls_active = 1;
1636 if (switch_file_exists(cbt->file_path, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
1637 TRY_CODE(switch_ivr_play_file(session, &fh, cbt->file_path, &args))do { status = switch_ivr_play_file(session, &fh, cbt->
file_path, &args); if (status != SWITCH_STATUS_SUCCESS &&
status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status
)
;
1638 }
1639 cc.playback_controls_active = 0;
1640 }
1641
1642 if (!*cc.buf && (profile->play_date_announcement == VM_DATE_LAST)) {
1643 cc.fh = NULL((void*)0);
1644 TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_DATE_MACRO, cbt->created_epoch, NULL, &args))do { status = switch_ivr_phrase_macro_event(session, "voicemail_say_date"
, cbt->created_epoch, ((void*)0), ((void*)0), &args); if
(status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1645 }
1646
1647 if (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) {
1648 if (*cc.buf && *cc.buf != *profile->terminator_key) {
1649 *input = *cc.buf;
1650 *(input + 1) = '\0';
1651 status = SWITCH_STATUS_SUCCESS;
1652 *cc.buf = '\0';
1653 } else {
1654 TRY_CODE(vm_macro_get(session, VM_LISTEN_FILE_CHECK_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout))do { status = vm_macro_get(session, "voicemail_listen_file_check"
, key_buf, input, sizeof(input), 1, "", &term, profile->
digit_timeout); if (status != SWITCH_STATUS_SUCCESS &&
status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status
)
;
1655 }
1656 if (!strcmp(input, profile->prev_msg_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->prev_msg_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->prev_msg_key), (!((size_t)(const
void *)((input) + 1) - (size_t)(const void *)(input) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)((profile
->prev_msg_key) + 1) - (size_t)(const void *)(profile->
prev_msg_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp (
input, profile->prev_msg_key) : (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
prev_msg_key) && ((size_t)(const void *)((profile->
prev_msg_key) + 1) - (size_t)(const void *)(profile->prev_msg_key
) == 1) ? __builtin_strcmp (input, profile->prev_msg_key) :
(__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->prev_msg_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
prev_msg_key) && ((size_t)(const void *)((profile->
prev_msg_key) + 1) - (size_t)(const void *)(profile->prev_msg_key
) == 1) && (__s2_len = __builtin_strlen (profile->
prev_msg_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->prev_msg_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->prev_msg_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->prev_msg_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->prev_msg_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->prev_msg_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
prev_msg_key)))); })
) {
1657 cbt->move = VM_MOVE_PREV;
1658 } else if (!strcmp(input, profile->repeat_msg_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->repeat_msg_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->repeat_msg_key), (!((size_t)(const
void *)((input) + 1) - (size_t)(const void *)(input) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)((profile
->repeat_msg_key) + 1) - (size_t)(const void *)(profile->
repeat_msg_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->repeat_msg_key) : (__builtin_constant_p (
input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
repeat_msg_key) && ((size_t)(const void *)((profile->
repeat_msg_key) + 1) - (size_t)(const void *)(profile->repeat_msg_key
) == 1) ? __builtin_strcmp (input, profile->repeat_msg_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->repeat_msg_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
repeat_msg_key) && ((size_t)(const void *)((profile->
repeat_msg_key) + 1) - (size_t)(const void *)(profile->repeat_msg_key
) == 1) && (__s2_len = __builtin_strlen (profile->
repeat_msg_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->repeat_msg_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->repeat_msg_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->repeat_msg_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->repeat_msg_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->repeat_msg_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
repeat_msg_key)))); })
) {
1659 cbt->move = VM_MOVE_SAME;
1660 } else if (!strcmp(input, profile->next_msg_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->next_msg_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->next_msg_key), (!((size_t)(const
void *)((input) + 1) - (size_t)(const void *)(input) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)((profile
->next_msg_key) + 1) - (size_t)(const void *)(profile->
next_msg_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp (
input, profile->next_msg_key) : (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
next_msg_key) && ((size_t)(const void *)((profile->
next_msg_key) + 1) - (size_t)(const void *)(profile->next_msg_key
) == 1) ? __builtin_strcmp (input, profile->next_msg_key) :
(__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->next_msg_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
next_msg_key) && ((size_t)(const void *)((profile->
next_msg_key) + 1) - (size_t)(const void *)(profile->next_msg_key
) == 1) && (__s2_len = __builtin_strlen (profile->
next_msg_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->next_msg_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->next_msg_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->next_msg_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->next_msg_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->next_msg_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
next_msg_key)))); })
) {
1661 cbt->move = VM_MOVE_NEXT;
1662 } else if (!strcmp(input, profile->listen_file_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->listen_file_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->listen_file_key), (!((size_t)(
const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->listen_file_key) + 1) - (size_t)(const void *)(
profile->listen_file_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->listen_file_key) : (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
listen_file_key) && ((size_t)(const void *)((profile->
listen_file_key) + 1) - (size_t)(const void *)(profile->listen_file_key
) == 1) ? __builtin_strcmp (input, profile->listen_file_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->listen_file_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
listen_file_key) && ((size_t)(const void *)((profile->
listen_file_key) + 1) - (size_t)(const void *)(profile->listen_file_key
) == 1) && (__s2_len = __builtin_strlen (profile->
listen_file_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->listen_file_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->listen_file_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->listen_file_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->listen_file_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->listen_file_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
listen_file_key)))); })
) {
1663 *cc.buf = '\0';
1664 goto play_file;
1665 } else if (!strcmp(input, profile->callback_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->callback_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->callback_key), (!((size_t)(const
void *)((input) + 1) - (size_t)(const void *)(input) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)((profile
->callback_key) + 1) - (size_t)(const void *)(profile->
callback_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp (
input, profile->callback_key) : (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
callback_key) && ((size_t)(const void *)((profile->
callback_key) + 1) - (size_t)(const void *)(profile->callback_key
) == 1) ? __builtin_strcmp (input, profile->callback_key) :
(__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->callback_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
callback_key) && ((size_t)(const void *)((profile->
callback_key) + 1) - (size_t)(const void *)(profile->callback_key
) == 1) && (__s2_len = __builtin_strlen (profile->
callback_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->callback_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->callback_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->callback_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->callback_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->callback_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
callback_key)))); })
) {
1666 const char *callback_dialplan;
1667 const char *callback_context;
1668
1669 if (!(callback_dialplan = switch_channel_get_variable(channel, "voicemail_callback_dialplan")switch_channel_get_variable_dup(channel, "voicemail_callback_dialplan"
, SWITCH_TRUE, -1)
)) {
1670 callback_dialplan = profile->callback_dialplan;
1671 }
1672
1673 if (!(callback_context = switch_channel_get_variable(channel, "voicemail_callback_context")switch_channel_get_variable_dup(channel, "voicemail_callback_context"
, SWITCH_TRUE, -1)
)) {
1674 callback_context = profile->callback_context;
1675 }
1676
1677 switch_core_session_execute_exten(session, cbt->cid_number, callback_dialplan, callback_context);
1678 } else if (!strcmp(input, profile->forward_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->forward_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->forward_key), (!((size_t)(const
void *)((input) + 1) - (size_t)(const void *)(input) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)((profile
->forward_key) + 1) - (size_t)(const void *)(profile->forward_key
) == 1) || __s2_len >= 4)) ? __builtin_strcmp (input, profile
->forward_key) : (__builtin_constant_p (input) && (
(size_t)(const void *)((input) + 1) - (size_t)(const void *)(
input) == 1) && (__s1_len = __builtin_strlen (input),
__s1_len < 4) ? (__builtin_constant_p (profile->forward_key
) && ((size_t)(const void *)((profile->forward_key
) + 1) - (size_t)(const void *)(profile->forward_key) == 1
) ? __builtin_strcmp (input, profile->forward_key) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (profile->forward_key); int __result = (((const unsigned
char *) (const char *) (input))[0] - __s2[0]); if (__s1_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) (input))[1] - __s2[1]); if (__s1_len > 1
&& __result == 0) { __result = (((const unsigned char
*) (const char *) (input))[2] - __s2[2]); if (__s1_len > 2
&& __result == 0) __result = (((const unsigned char *
) (const char *) (input))[3] - __s2[3]); } } __result; }))) :
(__builtin_constant_p (profile->forward_key) && (
(size_t)(const void *)((profile->forward_key) + 1) - (size_t
)(const void *)(profile->forward_key) == 1) && (__s2_len
= __builtin_strlen (profile->forward_key), __s2_len < 4
) ? (__builtin_constant_p (input) && ((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) ? __builtin_strcmp
(input, profile->forward_key) : (- (__extension__ ({ const
unsigned char *__s2 = (const unsigned char *) (const char *)
(input); int __result = (((const unsigned char *) (const char
*) (profile->forward_key))[0] - __s2[0]); if (__s2_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) (profile->forward_key))[1] - __s2[1]); if
(__s2_len > 1 && __result == 0) { __result = (((const
unsigned char *) (const char *) (profile->forward_key))[2
] - __s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) (profile->forward_key
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (input
, profile->forward_key)))); })
) {
1679 char *cmd = NULL((void*)0);
1680 char *new_file_path = NULL((void*)0);
1681 char vm_cc[256] = "";
1682 char macro_buf[80] = "";
1683 int ok = 0;
1684
1685 switch_xml_t x_param, x_params, x_user = NULL((void*)0);
1686 switch_event_t *my_params = NULL((void*)0);
1687 switch_bool_t vm_enabled = SWITCH_TRUE;
1688
1689 switch_snprintf(key_buf, sizeof(key_buf), "%s:%s", profile->prepend_key, profile->forward_key);
1690 TRY_CODE(vm_macro_get(session, VM_FORWARD_PREPEND_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout))do { status = vm_macro_get(session, "voicemail_forward_prepend"
, key_buf, input, sizeof(input), 1, "", &term, profile->
digit_timeout); if (status != SWITCH_STATUS_SUCCESS &&
status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status
)
;
1691 if (!strcmp(input, profile->prepend_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->prepend_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->prepend_key), (!((size_t)(const
void *)((input) + 1) - (size_t)(const void *)(input) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)((profile
->prepend_key) + 1) - (size_t)(const void *)(profile->prepend_key
) == 1) || __s2_len >= 4)) ? __builtin_strcmp (input, profile
->prepend_key) : (__builtin_constant_p (input) && (
(size_t)(const void *)((input) + 1) - (size_t)(const void *)(
input) == 1) && (__s1_len = __builtin_strlen (input),
__s1_len < 4) ? (__builtin_constant_p (profile->prepend_key
) && ((size_t)(const void *)((profile->prepend_key
) + 1) - (size_t)(const void *)(profile->prepend_key) == 1
) ? __builtin_strcmp (input, profile->prepend_key) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (profile->prepend_key); int __result = (((const unsigned
char *) (const char *) (input))[0] - __s2[0]); if (__s1_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) (input))[1] - __s2[1]); if (__s1_len > 1
&& __result == 0) { __result = (((const unsigned char
*) (const char *) (input))[2] - __s2[2]); if (__s1_len > 2
&& __result == 0) __result = (((const unsigned char *
) (const char *) (input))[3] - __s2[3]); } } __result; }))) :
(__builtin_constant_p (profile->prepend_key) && (
(size_t)(const void *)((profile->prepend_key) + 1) - (size_t
)(const void *)(profile->prepend_key) == 1) && (__s2_len
= __builtin_strlen (profile->prepend_key), __s2_len < 4
) ? (__builtin_constant_p (input) && ((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) ? __builtin_strcmp
(input, profile->prepend_key) : (- (__extension__ ({ const
unsigned char *__s2 = (const unsigned char *) (const char *)
(input); int __result = (((const unsigned char *) (const char
*) (profile->prepend_key))[0] - __s2[0]); if (__s2_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) (profile->prepend_key))[1] - __s2[1]); if
(__s2_len > 1 && __result == 0) { __result = (((const
unsigned char *) (const char *) (profile->prepend_key))[2
] - __s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) (profile->prepend_key
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (input
, profile->prepend_key)))); })
) {
1692 switch_uuid_t uuid;
1693 char uuid_str[SWITCH_UUID_FORMATTED_LENGTH256 + 1];
1694 switch_size_t message_len = 0;
1695 char *new_path = NULL((void*)0);
1696
1697 switch_uuid_get(&uuid);
1698 switch_uuid_format(uuid_str, &uuid);
1699
1700 forward_file_path =
1701 switch_core_session_sprintf(session, "%s%smsg_%s.wav", SWITCH_GLOBAL_dirs.temp_dir, SWITCH_PATH_SEPARATOR"/", uuid_str);
1702 TRY_CODE(create_file(session, profile, VM_RECORD_MESSAGE_MACRO, forward_file_path, &message_len, SWITCH_TRUE, NULL, NULL))do { status = create_file(session, profile, "voicemail_record_message"
, forward_file_path, &message_len, SWITCH_TRUE, ((void*)0
), ((void*)0)); if (status != SWITCH_STATUS_SUCCESS &&
status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status
)
;
1703 if ((new_path = vm_merge_file(session, profile, forward_file_path, cbt->file_path))) {
1704 switch_ivr_sleep(session, 1500, SWITCH_TRUE, NULL((void*)0));
1705 forward_file_path = new_path;
1706 } else {
1707 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1707, (const char*)(session)
, SWITCH_LOG_ERROR, "Error merging files\n");
1708 TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "deleted", NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_ack"
, "deleted", ((void*)0), ((void*)0), ((void*)0)); if (status !=
SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1709 goto end;
1710 }
1711
1712 new_file_path = forward_file_path;
1713 } else {
1714 new_file_path = cbt->file_path;
1715 }
1716
1717 while (!ok) {
1718
1719 xml_safe_free(x_user)if (x_user) switch_xml_free(x_user); x_user = ((void*)0);
1720
1721 switch_snprintf(macro_buf, sizeof(macro_buf), "phrase:%s:%s", VM_FORWARD_MESSAGE_ENTER_EXTENSION_MACRO"voicemail_forward_message_enter_extension", profile->terminator_key);
1722 vm_cc[0] = '\0';
1723
1724 TRY_CODE(switch_ivr_readdo { status = switch_ivr_read (session, 0, sizeof(vm_cc), macro_buf
, ((void*)0), vm_cc, sizeof(vm_cc), profile->digit_timeout
, profile->terminator_key, 0); if (status != SWITCH_STATUS_SUCCESS
&& status != SWITCH_STATUS_BREAK) { goto end; } break
;} while(status)
1725 (session, 0, sizeof(vm_cc), macro_buf, NULL, vm_cc, sizeof(vm_cc), profile->digit_timeout, profile->terminator_key, 0))do { status = switch_ivr_read (session, 0, sizeof(vm_cc), macro_buf
, ((void*)0), vm_cc, sizeof(vm_cc), profile->digit_timeout
, profile->terminator_key, 0); if (status != SWITCH_STATUS_SUCCESS
&& status != SWITCH_STATUS_BREAK) { goto end; } break
;} while(status)
;
1726
1727 cmd = switch_core_session_sprintf(session, "%s@%s@%s %s %s '%s'", vm_cc, cbt->domain, profile->name,
1728 new_file_path, cbt->cid_number, cbt->cid_name);
1729
1730 switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 1730, &my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
1731 switch_assert(my_params)((my_params) ? (void) (0) : __assert_fail ("my_params", "mod_voicemail.c"
, 1731, __PRETTY_FUNCTION__))
;
1732
1733 status = switch_xml_locate_user_merged("id:number-alias", vm_cc, cbt->domain, NULL((void*)0), &x_user, my_params);
1734 switch_event_destroy(&my_params);
1735
1736 if (status != SWITCH_STATUS_SUCCESS) {
1737 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1737, (const char*)(session)
, SWITCH_LOG_WARNING,
1738 "Failed to forward message - Cannot locate user %s@%s\n", vm_cc, cbt->domain);
1739 TRY_CODE(switch_ivr_phrase_macro(session, VM_INVALID_EXTENSION_MACRO, vm_cc, NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_invalid_extension"
, vm_cc, ((void*)0), ((void*)0), ((void*)0)); if (status != SWITCH_STATUS_SUCCESS
&& status != SWITCH_STATUS_BREAK) { goto end; } break
;} while(status)
;
1740 continue;
1741 } else {
1742 x_params = switch_xml_child(x_user, "params");
1743
1744 for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
1745 const char *var = switch_xml_attr_soft(x_param, "name");
1746 const char *val = switch_xml_attr_soft(x_param, "value");
1747 if (zstr(var)_zstr(var) || zstr(val)_zstr(val)) {
1748 continue; /* Ignore empty entires */
1749 }
1750
1751 if (!strcasecmp(var, "vm-enabled")) {
1752 vm_enabled = !switch_false(val);
1753 }
1754 }
1755
1756 if (!vm_enabled) {
1757 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1757, (const char*)(session)
, SWITCH_LOG_WARNING, "Failed to forward message - Voicemail is disabled for user %s@%s\n", vm_cc, cbt->domain);
1758 TRY_CODE(switch_ivr_phrase_macro(session, VM_INVALID_EXTENSION_MACRO, vm_cc, NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_invalid_extension"
, vm_cc, ((void*)0), ((void*)0), ((void*)0)); if (status != SWITCH_STATUS_SUCCESS
&& status != SWITCH_STATUS_BREAK) { goto end; } break
;} while(status)
;
1759 continue;
1760 } else {
1761 if (voicemail_inject(cmd, session) == SWITCH_STATUS_SUCCESS) {
1762 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1762, (const char*)(session)
, SWITCH_LOG_NOTICE, "Forwarded message to %s\n", vm_cc);
1763 TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_ack"
, "saved", ((void*)0), ((void*)0), ((void*)0)); if (status !=
SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1764 cbt->move = VM_MOVE_SAME;
1765 } else {
1766 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1766, (const char*)(session)
, SWITCH_LOG_ERROR, "Failed to forward message to %s\n", vm_cc);
1767 TRY_CODE(switch_ivr_phrase_macro(session, VM_INVALID_EXTENSION_MACRO, vm_cc, NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_invalid_extension"
, vm_cc, ((void*)0), ((void*)0), ((void*)0)); if (status != SWITCH_STATUS_SUCCESS
&& status != SWITCH_STATUS_BREAK) { goto end; } break
;} while(status)
;
1768 continue;
1769 }
1770 }
1771 }
1772
1773 xml_safe_free(x_user)if (x_user) switch_xml_free(x_user); x_user = ((void*)0);
1774
1775 break;
1776 }
1777
1778 } else if (!strcmp(input, profile->delete_file_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->delete_file_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->delete_file_key), (!((size_t)(
const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->delete_file_key) + 1) - (size_t)(const void *)(
profile->delete_file_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->delete_file_key) : (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
delete_file_key) && ((size_t)(const void *)((profile->
delete_file_key) + 1) - (size_t)(const void *)(profile->delete_file_key
) == 1) ? __builtin_strcmp (input, profile->delete_file_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->delete_file_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
delete_file_key) && ((size_t)(const void *)((profile->
delete_file_key) + 1) - (size_t)(const void *)(profile->delete_file_key
) == 1) && (__s2_len = __builtin_strlen (profile->
delete_file_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->delete_file_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->delete_file_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->delete_file_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->delete_file_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->delete_file_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
delete_file_key)))); })
|| (!strcmp(input, profile->email_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->email_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->email_key), (!((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) || __s1_len
>= 4) && (!((size_t)(const void *)((profile->email_key
) + 1) - (size_t)(const void *)(profile->email_key) == 1) ||
__s2_len >= 4)) ? __builtin_strcmp (input, profile->email_key
) : (__builtin_constant_p (input) && ((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) &&
(__s1_len = __builtin_strlen (input), __s1_len < 4) ? (__builtin_constant_p
(profile->email_key) && ((size_t)(const void *)((
profile->email_key) + 1) - (size_t)(const void *)(profile->
email_key) == 1) ? __builtin_strcmp (input, profile->email_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->email_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
email_key) && ((size_t)(const void *)((profile->email_key
) + 1) - (size_t)(const void *)(profile->email_key) == 1) &&
(__s2_len = __builtin_strlen (profile->email_key), __s2_len
< 4) ? (__builtin_constant_p (input) && ((size_t)
(const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) ? __builtin_strcmp (input, profile->email_key) : (- (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (input); int __result = (((const unsigned char *) (const
char *) (profile->email_key))[0] - __s2[0]); if (__s2_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (profile->email_key))[1] - __s2[1]
); if (__s2_len > 1 && __result == 0) { __result =
(((const unsigned char *) (const char *) (profile->email_key
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) (profile
->email_key))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp
(input, profile->email_key)))); })
&& !zstr(cbt->email)_zstr(cbt->email))) {
1779 char *sql = switch_mprintf("update voicemail_msgs set flags='delete' where uuid='%s'", cbt->uuid);
1780 vm_execute_sql(profile, sql, profile->mutex);
1781 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
1782 if (!strcmp(input, profile->email_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->email_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->email_key), (!((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) || __s1_len
>= 4) && (!((size_t)(const void *)((profile->email_key
) + 1) - (size_t)(const void *)(profile->email_key) == 1) ||
__s2_len >= 4)) ? __builtin_strcmp (input, profile->email_key
) : (__builtin_constant_p (input) && ((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) &&
(__s1_len = __builtin_strlen (input), __s1_len < 4) ? (__builtin_constant_p
(profile->email_key) && ((size_t)(const void *)((
profile->email_key) + 1) - (size_t)(const void *)(profile->
email_key) == 1) ? __builtin_strcmp (input, profile->email_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->email_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
email_key) && ((size_t)(const void *)((profile->email_key
) + 1) - (size_t)(const void *)(profile->email_key) == 1) &&
(__s2_len = __builtin_strlen (profile->email_key), __s2_len
< 4) ? (__builtin_constant_p (input) && ((size_t)
(const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) ? __builtin_strcmp (input, profile->email_key) : (- (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (input); int __result = (((const unsigned char *) (const
char *) (profile->email_key))[0] - __s2[0]); if (__s2_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (profile->email_key))[1] - __s2[1]
); if (__s2_len > 1 && __result == 0) { __result =
(((const unsigned char *) (const char *) (profile->email_key
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) (profile
->email_key))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp
(input, profile->email_key)))); })
&& !zstr(cbt->email)_zstr(cbt->email)) {
1783 switch_event_t *event;
1784 char *from;
1785 char *headers, *header_string;
1786 char *body;
1787 int priority = 3;
1788 switch_size_t retsize;
1789 switch_time_exp_t tm;
1790 char date[80] = "";
1791 char tmp[50] = "";
1792 int total_new_messages = 0;
1793 int total_saved_messages = 0;
1794 int total_new_urgent_messages = 0;
1795 int total_saved_urgent_messages = 0;
1796 int32_t message_len = 0;
1797 char *p;
1798 switch_time_t l_duration = 0;
1799 switch_core_time_duration_t duration;
1800 char duration_str[80];
1801 char *formatted_cid_num = NULL((void*)0);
1802 if (!strcasecmp(cbt->read_flags, URGENT_FLAG_STRING"A_URGENT")) {
1803 priority = 1;
1804 }
1805
1806 message_count(profile, cbt->user, cbt->domain, cbt->in_folder, &total_new_messages, &total_saved_messages,
1807 &total_new_urgent_messages, &total_saved_urgent_messages);
1808
1809 switch_time_exp_lt(&tm, switch_time_make(atol(cbt->created_epoch), 0));
1810 switch_strftime(date, &retsize, sizeof(date), profile->date_fmt, &tm);
1811
1812 formatted_cid_num = switch_format_number(cbt->cid_number);
1813
1814 switch_snprintf(tmp, sizeof(tmp), "%d", total_new_messages);
1815 switch_channel_set_variable(channel, "voicemail_total_new_messages", tmp)switch_channel_set_variable_var_check(channel, "voicemail_total_new_messages"
, tmp, SWITCH_TRUE)
;
1816 switch_snprintf(tmp, sizeof(tmp), "%d", total_saved_messages);
1817 switch_channel_set_variable(channel, "voicemail_total_saved_messages", tmp)switch_channel_set_variable_var_check(channel, "voicemail_total_saved_messages"
, tmp, SWITCH_TRUE)
;
1818 switch_snprintf(tmp, sizeof(tmp), "%d", total_new_urgent_messages);
1819 switch_channel_set_variable(channel, "voicemail_urgent_new_messages", tmp)switch_channel_set_variable_var_check(channel, "voicemail_urgent_new_messages"
, tmp, SWITCH_TRUE)
;
1820 switch_snprintf(tmp, sizeof(tmp), "%d", total_saved_urgent_messages);
1821 switch_channel_set_variable(channel, "voicemail_urgent_saved_messages", tmp)switch_channel_set_variable_var_check(channel, "voicemail_urgent_saved_messages"
, tmp, SWITCH_TRUE)
;
1822 switch_channel_set_variable(channel, "voicemail_current_folder", cbt->in_folder)switch_channel_set_variable_var_check(channel, "voicemail_current_folder"
, cbt->in_folder, SWITCH_TRUE)
;
1823 switch_channel_set_variable(channel, "voicemail_account", cbt->user)switch_channel_set_variable_var_check(channel, "voicemail_account"
, cbt->user, SWITCH_TRUE)
;
1824 switch_channel_set_variable(channel, "voicemail_domain", cbt->domain)switch_channel_set_variable_var_check(channel, "voicemail_domain"
, cbt->domain, SWITCH_TRUE)
;
1825 switch_channel_set_variable(channel, "voicemail_caller_id_number", cbt->cid_number)switch_channel_set_variable_var_check(channel, "voicemail_caller_id_number"
, cbt->cid_number, SWITCH_TRUE)
;
1826 switch_channel_set_variable(channel, "voicemail_formatted_caller_id_number", formatted_cid_num)switch_channel_set_variable_var_check(channel, "voicemail_formatted_caller_id_number"
, formatted_cid_num, SWITCH_TRUE)
;
1827 switch_channel_set_variable(channel, "voicemail_caller_id_name", cbt->cid_name)switch_channel_set_variable_var_check(channel, "voicemail_caller_id_name"
, cbt->cid_name, SWITCH_TRUE)
;
1828 switch_channel_set_variable(channel, "voicemail_file_path", cbt->file_path)switch_channel_set_variable_var_check(channel, "voicemail_file_path"
, cbt->file_path, SWITCH_TRUE)
;
1829 switch_channel_set_variable(channel, "voicemail_read_flags", cbt->read_flags)switch_channel_set_variable_var_check(channel, "voicemail_read_flags"
, cbt->read_flags, SWITCH_TRUE)
;
1830 switch_channel_set_variable(channel, "voicemail_time", date)switch_channel_set_variable_var_check(channel, "voicemail_time"
, date, SWITCH_TRUE)
;
1831 switch_snprintf(tmp, sizeof(tmp), "%d", priority);
1832 switch_channel_set_variable(channel, "voicemail_priority", tmp)switch_channel_set_variable_var_check(channel, "voicemail_priority"
, tmp, SWITCH_TRUE)
;
1833 message_len = atoi(cbt->message_len);
1834 switch_safe_free(formatted_cid_num)if (formatted_cid_num) {free(formatted_cid_num);formatted_cid_num
=((void*)0);}
;
1835
1836 l_duration = switch_time_make(atol(cbt->message_len), 0);
1837 switch_core_measure_time(l_duration, &duration);
1838 duration.day += duration.yr * 365;
1839 duration.hr += duration.day * 24;
1840
1841 switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", duration.hr, duration.min, duration.sec);
1842
1843 switch_channel_set_variable(channel, "voicemail_message_len", duration_str)switch_channel_set_variable_var_check(channel, "voicemail_message_len"
, duration_str, SWITCH_TRUE)
;
1844 switch_channel_set_variable(channel, "voicemail_email", cbt->email)switch_channel_set_variable_var_check(channel, "voicemail_email"
, cbt->email, SWITCH_TRUE)
;
1845
1846 if (zstr(profile->email_headers)_zstr(profile->email_headers)) {
1847 from = switch_core_session_sprintf(session, "%s@%s", cbt->user, cbt->domain);
1848 } else {
1849 from = switch_channel_expand_variables(channel, profile->email_from)switch_channel_expand_variables_check(channel, profile->email_from
, ((void*)0), ((void*)0), 0)
;
1850 }
1851
1852 if (zstr(profile->email_headers)_zstr(profile->email_headers)) {
1853 headers = switch_core_session_sprintf(session,
1854 "From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s\nX-Priority: %d",
1855 cbt->user, cbt->domain, cbt->cid_name, cbt->cid_number, priority);
1856 } else {
1857 headers = switch_channel_expand_variables(channel, profile->email_headers)switch_channel_expand_variables_check(channel, profile->email_headers
, ((void*)0), ((void*)0), 0)
;
1858 }
1859
1860 p = headers + (strlen(headers) - 1);
1861 if (*p == '\n') {
1862 if (*(p - 1) == '\r') {
1863 p--;
1864 }
1865 *p = '\0';
1866 }
1867
1868 header_string = switch_core_session_sprintf(session, "%s\nX-Voicemail-Length: %u", headers, message_len);
1869
1870 if (switch_event_create(&event, SWITCH_EVENT_GENERAL)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 1870, &event, SWITCH_EVENT_GENERAL
, ((void*)0))
== SWITCH_STATUS_SUCCESS) {
1871 /* this isn't done? it was in the other place
1872 * switch_channel_event_set_data(channel, event);
1873 */
1874 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Message-Type", "forwarded-voicemail");
1875 switch_event_fire(&event)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 1875, &event, ((void*)0))
;
1876 }
1877
1878 if (profile->email_body) {
1879 body = switch_channel_expand_variables(channel, profile->email_body)switch_channel_expand_variables_check(channel, profile->email_body
, ((void*)0), ((void*)0), 0)
;
1880 } else {
1881 body = switch_mprintf("%u second Voicemail from %s %s", message_len, cbt->cid_name, cbt->cid_number);
1882 }
1883
1884 switch_simple_email(cbt->email, from, header_string, body, cbt->file_path, cbt->convert_cmd, cbt->convert_ext);
1885 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1885, (const char*)(session)
, SWITCH_LOG_DEBUG, "Sending message to %s\n", cbt->email);
1886 switch_safe_free(body)if (body) {free(body);body=((void*)0);};
1887 TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "emailed", NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_ack"
, "emailed", ((void*)0), ((void*)0), ((void*)0)); if (status !=
SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1888 } else {
1889 TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "deleted", NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_ack"
, "deleted", ((void*)0), ((void*)0), ((void*)0)); if (status !=
SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1890 }
1891 } else {
1892 char *sql = switch_mprintf("update voicemail_msgs set flags='save' where uuid='%s'", cbt->uuid);
1893 vm_execute_sql(profile, sql, profile->mutex);
1894 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
1895 TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_ack"
, "saved", ((void*)0), ((void*)0), ((void*)0)); if (status !=
SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
1896 }
1897 }
1898 }
1899
1900 end:
1901
1902 if (forward_file_path) {
1903 if (unlink(forward_file_path) != 0) {
1904 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 1904, (const char*)(session)
, SWITCH_LOG_WARNING, "Failed to delete file [%s]\n", forward_file_path);
1905 }
1906 }
1907
1908 return status;
1909}
1910
1911
1912static void update_mwi(vm_profile_t *profile, const char *id, const char *domain_name, const char *myfolder, mwi_reason_t reason)
1913{
1914 const char *yn = "no";
1915 const char *update_reason = mwi_reason2str(reason);
1916 int total_new_messages = 0;
1917 int total_saved_messages = 0;
1918 int total_new_urgent_messages = 0;
1919 int total_saved_urgent_messages = 0;
1920 switch_event_t *event;
1921 switch_event_t *message_event;
1922
1923 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 1923, ((void*)0)
, SWITCH_LOG_DEBUG, "Update MWI: Processing for %s@%s in %s\n", id, domain_name, myfolder);
1924
1925 message_count(profile, id, domain_name, myfolder, &total_new_messages, &total_saved_messages, &total_new_urgent_messages,
1926 &total_saved_urgent_messages);
1927
1928 if (switch_event_create(&event, SWITCH_EVENT_MESSAGE_WAITING)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 1928, &event, SWITCH_EVENT_MESSAGE_WAITING
, ((void*)0))
!= SWITCH_STATUS_SUCCESS) {
1929 return;
1930 }
1931
1932 if (total_new_messages || total_new_urgent_messages) {
1933 yn = "yes";
1934 }
1935 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", yn);
1936 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Update-Reason", update_reason);
1937 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", "%s@%s", id, domain_name);
1938 /*
1939 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d (%d/%d)", total_new_messages, total_saved_messages,
1940 total_new_urgent_messages, total_saved_urgent_messages);
1941 */
1942 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d", total_new_messages, total_saved_messages);
1943
1944 switch_event_fire(&event)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 1944, &event, ((void*)0))
;
1945
1946 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 1946, ((void*)0)
, SWITCH_LOG_DEBUG, "Update MWI: Messages Waiting %s\n", yn);
1947 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 1947, ((void*)0)
, SWITCH_LOG_DEBUG, "Update MWI: Update Reason %s\n", update_reason);
1948 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 1948, ((void*)0)
, SWITCH_LOG_DEBUG, "Update MWI: Message Account %s@%s\n", id, domain_name);
1949 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 1949, ((void*)0)
, SWITCH_LOG_DEBUG, "Update MWI: Voice Message %d/%d\n", total_new_messages, total_saved_messages);
1950
1951 switch_event_create_subclass(&message_event, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 1951, &message_event, SWITCH_EVENT_CUSTOM
, "vm::maintenance")
;
1952 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-Action", "mwi-update");
1953 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-User", id);
1954 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-Domain", domain_name);
1955 switch_event_add_header(message_event, SWITCH_STACK_BOTTOM, "VM-Total-New", "%d", total_new_messages);
1956 switch_event_add_header(message_event, SWITCH_STACK_BOTTOM, "VM-Total-Saved", "%d", total_saved_messages);
1957 switch_event_add_header(message_event, SWITCH_STACK_BOTTOM, "VM-Total-New-Urgent", "%d", total_new_urgent_messages);
1958 switch_event_add_header(message_event, SWITCH_STACK_BOTTOM, "VM-Total-Saved-Urgent", "%d", total_saved_urgent_messages);
1959
1960 switch_event_fire(&message_event)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 1960, &message_event, ((void*)0))
;
1961}
1962
1963static void voicemail_check_main(switch_core_session_t *session, vm_profile_t *profile, const char *domain_name, const char *id, int auth, const char *uuid_in)
1964{
1965 vm_check_state_t vm_check_state = VM_CHECK_START;
1966 switch_channel_t *channel = switch_core_session_get_channel(session);
1967 switch_caller_profile_t *caller_profile = switch_channel_get_caller_profile(channel);
1968 switch_xml_t x_user = NULL((void*)0), x_params, x_param;
1969 switch_status_t status;
1970 char pass_buf[80] = "", *mypass = NULL((void*)0), id_buf[80] = "", *myfolder = NULL((void*)0);
1971 const char *thepass = NULL((void*)0), *myid = id, *thehash = NULL((void*)0), *vmhash = NULL((void*)0);
1972 char term = 0;
1973 uint32_t timeout, attempts = 0, retries = 0;
1974 int failed = 0;
1975 msg_type_t play_msg_type = MSG_NONE;
1976 char *dir_path = NULL((void*)0), *file_path = NULL((void*)0), *tmp_file_path = NULL((void*)0);
1977 int total_new_messages = 0;
1978 int total_saved_messages = 0;
1979 int total_new_urgent_messages = 0;
1980 int total_saved_urgent_messages = 0;
1981 int heard_auto_new = 0;
1982 char *vm_email = NULL((void*)0), *email_addr = NULL((void*)0);
1983 char *convert_cmd = profile->convert_cmd;
1984 char *convert_ext = profile->convert_ext;
1985 char *vm_storage_dir = NULL((void*)0);
1986 char *storage_dir = NULL((void*)0);
1987 char global_buf[2] = "";
1988 switch_input_args_t args = { 0 };
1989 const char *caller_id_number = NULL((void*)0);
1990 int auth_only = 0, authed = 0;
1991 switch_event_t *event;
1992
1993 if (!(caller_id_number = switch_channel_get_variable(channel, "effective_caller_id_number")switch_channel_get_variable_dup(channel, "effective_caller_id_number"
, SWITCH_TRUE, -1)
)) {
1994 caller_id_number = caller_profile->caller_id_number;
1995 }
1996
1997 if (auth == 2) {
1998 auth_only = 1;
1999 auth = 0;
2000 } else {
2001 auth_only = switch_true(switch_channel_get_variable(channel, "vm_auth_only")switch_channel_get_variable_dup(channel, "vm_auth_only", SWITCH_TRUE
, -1)
);
2002 }
2003
2004 timeout = profile->digit_timeout;
2005 attempts = profile->max_login_attempts;
2006 switch_ivr_phrase_macro(session, VM_HELLO_MACRO, NULL, NULL, &args)switch_ivr_phrase_macro_event(session, "voicemail_hello", ((void
*)0), ((void*)0), ((void*)0), &args)
;
2007 *global_buf = '\0';
2008
2009 while (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) {
2010 switch_ivr_sleep(session, 100, SWITCH_TRUE, NULL((void*)0));
2011
2012 switch (vm_check_state) {
2013 case VM_CHECK_START:
2014 {
2015 total_new_messages = 0;
2016 total_saved_messages = 0;
2017 total_new_urgent_messages = 0;
2018 total_saved_urgent_messages = 0;
2019 heard_auto_new = 0;
2020 play_msg_type = MSG_NONE;
2021 attempts = profile->max_login_attempts;
2022 retries = profile->max_retries;
2023 myid = id;
2024 mypass = NULL((void*)0);
2025 myfolder = "inbox";
2026 vm_check_state = VM_CHECK_AUTH;
2027 xml_safe_free(x_user)if (x_user) switch_xml_free(x_user); x_user = ((void*)0);
2028 }
2029 break;
2030 case VM_CHECK_FOLDER_SUMMARY:
2031 {
2032 int informed = 0;
2033 char msg_count[80] = "";
2034 switch_input_args_t folder_args = { 0 };
2035 switch_event_t *params;
2036 const char *vm_auto_play = switch_channel_get_variable(channel, "vm_auto_play")switch_channel_get_variable_dup(channel, "vm_auto_play", SWITCH_TRUE
, -1)
;
2037 int auto_play = 1;
2038
2039 if (vm_auto_play && !switch_true(vm_auto_play)) {
2040 auto_play = 0;
2041 }
2042
2043 folder_args.input_callback = cancel_on_dtmf;
2044 folder_args.buf = &global_buf;
2045 folder_args.buflen = sizeof(global_buf);
2046
2047 switch_channel_set_variable(channel, "voicemail_current_folder", myfolder)switch_channel_set_variable_var_check(channel, "voicemail_current_folder"
, myfolder, SWITCH_TRUE)
;
2048 message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages,
2049 &total_new_urgent_messages, &total_saved_urgent_messages);
2050
2051
2052 switch_event_create_subclass(&params, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 2052, &params, SWITCH_EVENT_CUSTOM
, "vm::maintenance")
;
2053 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Action", "folder-summary");
2054 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-User", myid);
2055 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Domain", domain_name);
2056 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Folder", myfolder);
2057 switch_event_add_header(params, SWITCH_STACK_BOTTOM, "VM-Total-New-Messages", "%u", total_new_messages);
2058 switch_event_add_header(params, SWITCH_STACK_BOTTOM, "VM-Total-Saved-Messages", "%u", total_saved_messages);
2059 switch_event_add_header(params, SWITCH_STACK_BOTTOM, "VM-Total-New-Urgent-Messages", "%u", total_new_urgent_messages);
2060 switch_event_add_header(params, SWITCH_STACK_BOTTOM, "VM-Total-Saved-Urgent-Messages", "%u", total_saved_urgent_messages);
2061 switch_event_fire(&params)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 2061, &params, ((void*)0))
;
2062
2063 if (total_new_urgent_messages > 0) {
2064 switch_snprintf(msg_count, sizeof(msg_count), "%d:urgent-new", total_new_urgent_messages);
2065 TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, &folder_args))do { status = switch_ivr_phrase_macro_event(session, "voicemail_message_count"
, msg_count, ((void*)0), ((void*)0), &folder_args); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2066 informed++;
2067 if (auto_play && !zstr_buf(global_buf)(*(global_buf) == '\0')) {
2068 vm_check_state = VM_CHECK_MENU;
2069 continue;
2070 }
2071 }
2072
2073 if (total_new_messages > 0 && total_new_messages != total_new_urgent_messages) {
2074 switch_snprintf(msg_count, sizeof(msg_count), "%d:new", total_new_messages);
2075 TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, &folder_args))do { status = switch_ivr_phrase_macro_event(session, "voicemail_message_count"
, msg_count, ((void*)0), ((void*)0), &folder_args); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2076 informed++;
2077 if (auto_play && !zstr_buf(global_buf)(*(global_buf) == '\0')) {
2078 vm_check_state = VM_CHECK_MENU;
2079 continue;
2080 }
2081 }
2082
2083 if (auto_play && !heard_auto_new && total_new_messages + total_new_urgent_messages > 0) {
2084 heard_auto_new = 1;
2085 play_msg_type = MSG_NEW;
2086 vm_check_state = VM_CHECK_PLAY_MESSAGES;
2087 continue;
2088 }
2089
2090 if (!informed) {
2091 switch_snprintf(msg_count, sizeof(msg_count), "0:new");
2092 TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, &folder_args))do { status = switch_ivr_phrase_macro_event(session, "voicemail_message_count"
, msg_count, ((void*)0), ((void*)0), &folder_args); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2093 switch_snprintf(msg_count, sizeof(msg_count), "%d:saved", total_saved_messages);
2094 TRY_CODE(switch_ivr_phrase_macro(session, VM_MESSAGE_COUNT_MACRO, msg_count, NULL, &folder_args))do { status = switch_ivr_phrase_macro_event(session, "voicemail_message_count"
, msg_count, ((void*)0), ((void*)0), &folder_args); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2095 informed++;
2096 }
2097
2098 vm_check_state = VM_CHECK_MENU;
2099 }
2100 break;
2101 case VM_CHECK_PLAY_MESSAGES:
2102 {
2103 listen_callback_t cbt;
2104 char sql[512];
2105 int cur_message, total_messages;
2106
2107 message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages,
2108 &total_new_urgent_messages, &total_saved_urgent_messages);
2109 memset(&cbt, 0, sizeof(cbt));
2110 cbt.email = vm_email ? vm_email : email_addr;
2111 cbt.convert_cmd = convert_cmd;
2112 cbt.convert_ext = convert_ext;
2113 cbt.move = VM_MOVE_NEXT;
2114 switch (play_msg_type) {
2115 case MSG_NEW:
2116 {
2117 switch_snprintf(sql, sizeof(sql),
2118 "select created_epoch, read_epoch, username, domain, uuid, cid_name, cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by from voicemail_msgs where username='%s' and domain='%s' and read_epoch=0"
2119 " order by read_flags, created_epoch %s", myid, domain_name,
2120 profile->play_new_messages_lifo ? "desc" : "asc");
2121 total_messages = total_new_messages;
2122 heard_auto_new = 1;
2123 }
2124 break;
2125 case MSG_SAVED:
2126 default:
2127 {
2128 switch_snprintf(sql, sizeof(sql),
2129 "select created_epoch, read_epoch, username, domain, uuid, cid_name, cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by from voicemail_msgs where username='%s' and domain='%s' and read_epoch !=0"
2130 " order by read_flags, created_epoch %s", myid, domain_name,
2131 profile->play_saved_messages_lifo ? "desc" : "asc");
2132 total_messages = total_saved_messages;
2133 heard_auto_new = 1;
2134 }
2135 break;
2136 }
2137 for (cur_message = 0; cur_message < total_messages; cur_message++) {
2138 cbt.index = 0;
2139 cbt.want = cur_message;
2140 cbt.type = play_msg_type;
2141 cbt.move = VM_MOVE_NEXT;
2142 vm_execute_sql_callback(profile, profile->mutex, sql, listen_callback, &cbt);
2143 if (!zstr(uuid_in)_zstr(uuid_in) && strcmp(cbt.uuid, uuid_in)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(cbt.uuid) && __builtin_constant_p (uuid_in) &&
(__s1_len = __builtin_strlen (cbt.uuid), __s2_len = __builtin_strlen
(uuid_in), (!((size_t)(const void *)((cbt.uuid) + 1) - (size_t
)(const void *)(cbt.uuid) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((uuid_in) + 1) - (size_t)(const void
*)(uuid_in) == 1) || __s2_len >= 4)) ? __builtin_strcmp (
cbt.uuid, uuid_in) : (__builtin_constant_p (cbt.uuid) &&
((size_t)(const void *)((cbt.uuid) + 1) - (size_t)(const void
*)(cbt.uuid) == 1) && (__s1_len = __builtin_strlen (
cbt.uuid), __s1_len < 4) ? (__builtin_constant_p (uuid_in)
&& ((size_t)(const void *)((uuid_in) + 1) - (size_t)
(const void *)(uuid_in) == 1) ? __builtin_strcmp (cbt.uuid, uuid_in
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (uuid_in); int __result = (((const unsigned
char *) (const char *) (cbt.uuid))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (cbt.uuid))[1] - __s2[1]); if (__s1_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (cbt.uuid))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (cbt.uuid))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p (uuid_in) && ((size_t)
(const void *)((uuid_in) + 1) - (size_t)(const void *)(uuid_in
) == 1) && (__s2_len = __builtin_strlen (uuid_in), __s2_len
< 4) ? (__builtin_constant_p (cbt.uuid) && ((size_t
)(const void *)((cbt.uuid) + 1) - (size_t)(const void *)(cbt.
uuid) == 1) ? __builtin_strcmp (cbt.uuid, uuid_in) : (- (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (cbt.uuid); int __result = (((const unsigned char *)
(const char *) (uuid_in))[0] - __s2[0]); if (__s2_len > 0
&& __result == 0) { __result = (((const unsigned char
*) (const char *) (uuid_in))[1] - __s2[1]); if (__s2_len >
1 && __result == 0) { __result = (((const unsigned char
*) (const char *) (uuid_in))[2] - __s2[2]); if (__s2_len >
2 && __result == 0) __result = (((const unsigned char
*) (const char *) (uuid_in))[3] - __s2[3]); } } __result; })
))) : __builtin_strcmp (cbt.uuid, uuid_in)))); })
) {
2144 continue;
2145 }
2146 status = listen_file(session, profile, &cbt);
2147 if (cbt.move == VM_MOVE_PREV) {
2148 if (cur_message <= 0) {
2149 cur_message = -1;
2150 } else {
2151 cur_message -= 2;
2152 }
2153 } else if (cbt.move == VM_MOVE_SAME) {
2154 cur_message -= 1;
2155 }
2156
2157 if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
2158 break;
2159 }
2160 }
2161 switch_snprintf(sql, sizeof(sql), "update voicemail_msgs set read_epoch=%ld where read_epoch=0 and "
2162 "username='%s' and domain='%s' and flags='save'",
2163 (long) switch_epoch_time_now(NULL((void*)0)), myid, domain_name);
2164 vm_execute_sql(profile, sql, profile->mutex);
2165 switch_snprintfv(sql, sizeof(sql), "select file_path from voicemail_msgs where username='%q' and domain='%q' and flags='delete'", myid,
2166 domain_name);
2167 vm_execute_sql_callback(profile, profile->mutex, sql, unlink_callback, NULL((void*)0));
2168 switch_snprintfv(sql, sizeof(sql), "delete from voicemail_msgs where username='%q' and domain='%q' and flags='delete'", myid, domain_name);
2169 vm_execute_sql(profile, sql, profile->mutex);
2170 vm_check_state = VM_CHECK_FOLDER_SUMMARY;
2171
2172 update_mwi(profile, myid, domain_name, myfolder, MWI_REASON_PURGE);
2173 }
2174 break;
2175 case VM_CHECK_CONFIG:
2176 {
2177 char *sql = NULL((void*)0);
2178 char input[10] = "";
2179 char key_buf[80] = "";
2180 callback_t cbt = { 0 };
2181 char msg_count[80] = "";
2182 cc_t cc = { 0 };
2183 switch_size_t message_len = 0;
2184
2185 cbt.buf = msg_count;
2186 cbt.len = sizeof(msg_count);
2187 sql = switch_mprintf("select count(*) from voicemail_prefs where username='%q' and domain = '%q'", myid, domain_name);
2188 vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
2189 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
2190 if (*msg_count == '\0' || !atoi(msg_count)) {
2191 sql = switch_mprintf("insert into voicemail_prefs values('%q','%q','','','')", myid, domain_name);
2192 vm_execute_sql(profile, sql, profile->mutex);
2193 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
2194 }
2195
2196 switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s:%s",
2197 profile->record_greeting_key,
2198 profile->choose_greeting_key, profile->record_name_key, profile->change_pass_key, profile->main_menu_key);
2199
2200
2201 TRY_CODE(vm_macro_get(session, VM_CONFIG_MENU_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout))do { status = vm_macro_get(session, "voicemail_config_menu", key_buf
, input, sizeof(input), 1, "", &term, timeout); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2202 if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
2203 goto end;
2204 }
2205
2206 if (!strcmp(input, profile->main_menu_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->main_menu_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->main_menu_key), (!((size_t)(const
void *)((input) + 1) - (size_t)(const void *)(input) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)((profile
->main_menu_key) + 1) - (size_t)(const void *)(profile->
main_menu_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->main_menu_key) : (__builtin_constant_p (
input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
main_menu_key) && ((size_t)(const void *)((profile->
main_menu_key) + 1) - (size_t)(const void *)(profile->main_menu_key
) == 1) ? __builtin_strcmp (input, profile->main_menu_key)
: (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->main_menu_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
main_menu_key) && ((size_t)(const void *)((profile->
main_menu_key) + 1) - (size_t)(const void *)(profile->main_menu_key
) == 1) && (__s2_len = __builtin_strlen (profile->
main_menu_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->main_menu_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->main_menu_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->main_menu_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->main_menu_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->main_menu_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
main_menu_key)))); })
) {
2207 vm_check_state = VM_CHECK_MENU;
2208 } else if (!strcmp(input, profile->choose_greeting_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->choose_greeting_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->choose_greeting_key), (!((size_t
)(const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->choose_greeting_key) + 1) - (size_t)(const void
*)(profile->choose_greeting_key) == 1) || __s2_len >= 4
)) ? __builtin_strcmp (input, profile->choose_greeting_key
) : (__builtin_constant_p (input) && ((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) &&
(__s1_len = __builtin_strlen (input), __s1_len < 4) ? (__builtin_constant_p
(profile->choose_greeting_key) && ((size_t)(const
void *)((profile->choose_greeting_key) + 1) - (size_t)(const
void *)(profile->choose_greeting_key) == 1) ? __builtin_strcmp
(input, profile->choose_greeting_key) : (__extension__ ({
const unsigned char *__s2 = (const unsigned char *) (const char
*) (profile->choose_greeting_key); int __result = (((const
unsigned char *) (const char *) (input))[0] - __s2[0]); if (
__s1_len > 0 && __result == 0) { __result = (((const
unsigned char *) (const char *) (input))[1] - __s2[1]); if (
__s1_len > 1 && __result == 0) { __result = (((const
unsigned char *) (const char *) (input))[2] - __s2[2]); if (
__s1_len > 2 && __result == 0) __result = (((const
unsigned char *) (const char *) (input))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p (profile->choose_greeting_key
) && ((size_t)(const void *)((profile->choose_greeting_key
) + 1) - (size_t)(const void *)(profile->choose_greeting_key
) == 1) && (__s2_len = __builtin_strlen (profile->
choose_greeting_key), __s2_len < 4) ? (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) ? __builtin_strcmp (input, profile
->choose_greeting_key) : (- (__extension__ ({ const unsigned
char *__s2 = (const unsigned char *) (const char *) (input);
int __result = (((const unsigned char *) (const char *) (profile
->choose_greeting_key))[0] - __s2[0]); if (__s2_len > 0
&& __result == 0) { __result = (((const unsigned char
*) (const char *) (profile->choose_greeting_key))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (profile->choose_greeting_key
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) (profile
->choose_greeting_key))[3] - __s2[3]); } } __result; }))))
: __builtin_strcmp (input, profile->choose_greeting_key))
)); })
) {
2209 int num;
2210 switch_input_args_t greeting_args = { 0 };
2211 greeting_args.input_callback = cancel_on_dtmf;
2212
2213 TRY_CODE(vm_macro_get(session, VM_CHOOSE_GREETING_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout))do { status = vm_macro_get(session, "voicemail_choose_greeting"
, key_buf, input, sizeof(input), 1, "", &term, timeout); if
(status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2214
2215
2216 num = atoi(input);
2217 file_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR"/", num, profile->file_ext);
2218 if (num < 1 || num > VM_MAX_GREETINGS9) {
2219 status = SWITCH_STATUS_FALSE;
2220 } else {
2221 switch_file_handle_t fh = { 0 };
2222 memset(&fh, 0, sizeof(fh));
2223 greeting_args.input_callback = control_playback;
2224 memset(&cc, 0, sizeof(cc));
2225 cc.profile = profile;
2226 cc.fh = &fh;
2227 cc.noexit = 1;
2228 greeting_args.buf = &cc;
2229 status = switch_ivr_play_file(session, &fh, file_path, &greeting_args);
2230 }
2231 if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
2232 TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_choose_greeting_fail"
, ((void*)0), ((void*)0), ((void*)0), ((void*)0)); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2233 } else {
2234 switch_event_t *params;
2235
2236 TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_SELECTED_MACRO, input, NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_greeting_selected"
, input, ((void*)0), ((void*)0), ((void*)0)); if (status != SWITCH_STATUS_SUCCESS
&& status != SWITCH_STATUS_BREAK) { goto end; } break
;} while(status)
;
2237 sql =
2238 switch_mprintf("update voicemail_prefs set greeting_path='%s' where username='%s' and domain='%s'", file_path, myid,
2239 domain_name);
2240 vm_execute_sql(profile, sql, profile->mutex);
2241 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
2242
2243 switch_event_create_subclass(&params, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 2243, &params, SWITCH_EVENT_CUSTOM
, "vm::maintenance")
;
2244 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Action", "change-greeting");
2245 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Greeting-Path", file_path);
2246 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-User", myid);
2247 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Domain", domain_name);
2248 switch_channel_event_set_data(channel, params);
2249 switch_event_fire(&params)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 2249, &params, ((void*)0))
;
2250 }
2251 switch_safe_free(file_path)if (file_path) {free(file_path);file_path=((void*)0);};
2252 } else if (!strcmp(input, profile->record_greeting_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->record_greeting_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->record_greeting_key), (!((size_t
)(const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->record_greeting_key) + 1) - (size_t)(const void
*)(profile->record_greeting_key) == 1) || __s2_len >= 4
)) ? __builtin_strcmp (input, profile->record_greeting_key
) : (__builtin_constant_p (input) && ((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) &&
(__s1_len = __builtin_strlen (input), __s1_len < 4) ? (__builtin_constant_p
(profile->record_greeting_key) && ((size_t)(const
void *)((profile->record_greeting_key) + 1) - (size_t)(const
void *)(profile->record_greeting_key) == 1) ? __builtin_strcmp
(input, profile->record_greeting_key) : (__extension__ ({
const unsigned char *__s2 = (const unsigned char *) (const char
*) (profile->record_greeting_key); int __result = (((const
unsigned char *) (const char *) (input))[0] - __s2[0]); if (
__s1_len > 0 && __result == 0) { __result = (((const
unsigned char *) (const char *) (input))[1] - __s2[1]); if (
__s1_len > 1 && __result == 0) { __result = (((const
unsigned char *) (const char *) (input))[2] - __s2[2]); if (
__s1_len > 2 && __result == 0) __result = (((const
unsigned char *) (const char *) (input))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p (profile->record_greeting_key
) && ((size_t)(const void *)((profile->record_greeting_key
) + 1) - (size_t)(const void *)(profile->record_greeting_key
) == 1) && (__s2_len = __builtin_strlen (profile->
record_greeting_key), __s2_len < 4) ? (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) ? __builtin_strcmp (input, profile
->record_greeting_key) : (- (__extension__ ({ const unsigned
char *__s2 = (const unsigned char *) (const char *) (input);
int __result = (((const unsigned char *) (const char *) (profile
->record_greeting_key))[0] - __s2[0]); if (__s2_len > 0
&& __result == 0) { __result = (((const unsigned char
*) (const char *) (profile->record_greeting_key))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (profile->record_greeting_key
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) (profile
->record_greeting_key))[3] - __s2[3]); } } __result; }))))
: __builtin_strcmp (input, profile->record_greeting_key))
)); })
) {
2253 int num;
2254 TRY_CODE(vm_macro_get(session, VM_CHOOSE_GREETING_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout))do { status = vm_macro_get(session, "voicemail_choose_greeting"
, key_buf, input, sizeof(input), 1, "", &term, timeout); if
(status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2255
2256 num = atoi(input);
2257 if (num < 1 || num > VM_MAX_GREETINGS9) {
2258 TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_choose_greeting_fail"
, ((void*)0), ((void*)0), ((void*)0), ((void*)0)); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2259 } else {
2260 switch_event_t *params;
2261 file_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR"/", num, profile->file_ext);
2262 tmp_file_path = switch_mprintf("%s%sgreeting_%d_TMP.%s", dir_path, SWITCH_PATH_SEPARATOR"/", num, profile->file_ext);
2263 unlink(tmp_file_path);
2264
2265 TRY_CODE(create_file(session, profile, VM_RECORD_GREETING_MACRO, file_path, &message_len, SWITCH_TRUE, NULL, NULL))do { status = create_file(session, profile, "voicemail_record_greeting"
, file_path, &message_len, SWITCH_TRUE, ((void*)0), ((void
*)0)); if (status != SWITCH_STATUS_SUCCESS && status !=
SWITCH_STATUS_BREAK) { goto end; } break;} while(status)
;
2266 switch_file_rename(tmp_file_path, file_path, switch_core_session_get_pool(session));
2267
2268 sql =
2269 switch_mprintf("update voicemail_prefs set greeting_path='%s' where username='%s' and domain='%s'", file_path, myid,
2270 domain_name);
2271 vm_execute_sql(profile, sql, profile->mutex);
2272 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
2273 switch_safe_free(file_path)if (file_path) {free(file_path);file_path=((void*)0);};
2274 switch_safe_free(tmp_file_path)if (tmp_file_path) {free(tmp_file_path);tmp_file_path=((void*
)0);}
;
2275
2276 switch_event_create_subclass(&params, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 2276, &params, SWITCH_EVENT_CUSTOM
, "vm::maintenance")
;
2277 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Action", "record-greeting");
2278 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Greeting-Path", file_path);
2279 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-User", myid);
2280 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Domain", domain_name);
2281 switch_channel_event_set_data(channel, params);
2282 switch_event_fire(&params)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 2282, &params, ((void*)0))
;
2283 }
2284
2285 } else if (!strcmp(input, profile->change_pass_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->change_pass_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->change_pass_key), (!((size_t)(
const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->change_pass_key) + 1) - (size_t)(const void *)(
profile->change_pass_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->change_pass_key) : (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
change_pass_key) && ((size_t)(const void *)((profile->
change_pass_key) + 1) - (size_t)(const void *)(profile->change_pass_key
) == 1) ? __builtin_strcmp (input, profile->change_pass_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->change_pass_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
change_pass_key) && ((size_t)(const void *)((profile->
change_pass_key) + 1) - (size_t)(const void *)(profile->change_pass_key
) == 1) && (__s2_len = __builtin_strlen (profile->
change_pass_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->change_pass_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->change_pass_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->change_pass_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->change_pass_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->change_pass_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
change_pass_key)))); })
) {
2286 char buf[256] = "";
2287 char macro[256] = "";
2288 switch_event_t *params;
2289 switch_xml_t xx_user, xx_domain, xx_domain_root;
2290 int fail = 0;
2291 int ok = 0;
2292
2293 while (!ok) {
2294 fail = 0;
2295 switch_snprintf(macro, sizeof(macro), "phrase:%s:%s", VM_ENTER_PASS_MACRO"voicemail_enter_pass", profile->terminator_key);
2296 TRY_CODE(switch_ivr_read(session, 0, 255, macro, NULL, buf, sizeof(buf), 10000, profile->terminator_key, 0))do { status = switch_ivr_read(session, 0, 255, macro, ((void*
)0), buf, sizeof(buf), 10000, profile->terminator_key, 0);
if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
2297
2298
2299 switch_event_create_subclass(&params, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 2299, &params, SWITCH_EVENT_CUSTOM
, "vm::maintenance")
;
2300 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Action", "change-password");
2301 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-User-Password", buf);
2302 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-User", myid);
2303 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Domain", domain_name);
2304 switch_channel_event_set_data(channel, params);
2305
2306 if (switch_xml_locate_user("id", myid, domain_name, switch_channel_get_variable(channel, "network_addr")switch_channel_get_variable_dup(channel, "network_addr", SWITCH_TRUE
, -1)
,
2307 &xx_domain_root, &xx_domain, &xx_user, NULL((void*)0), params) == SWITCH_STATUS_SUCCESS) {
2308 switch_xml_t x_result;
2309
2310 if ((x_result = switch_xml_child(xx_user, "result"))) {
2311 if (!switch_true(switch_xml_attr_soft(x_result, "success"))) {
2312 fail = 1;
2313 }
2314 }
2315
2316 switch_xml_free(xx_domain_root);
2317 }
2318
2319 if (fail) {
2320 /* add feedback for user - let him/her know that the password they tried to change to is not allowed */
2321 switch_ivr_phrase_macro(session, VM_CHANGE_PASS_FAIL_MACRO, NULL, NULL, NULL)switch_ivr_phrase_macro_event(session, "voicemail_change_pass_fail"
, ((void*)0), ((void*)0), ((void*)0), ((void*)0))
;
2322 } else {
2323 sql = switch_mprintf("update voicemail_prefs set password='%s' where username='%s' and domain='%s'", buf, myid, domain_name);
2324 vm_execute_sql(profile, sql, profile->mutex);
2325 switch_safe_free(file_path)if (file_path) {free(file_path);file_path=((void*)0);};
2326 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
2327 ok = 1;
2328 /* add feedback for user - let him/her know that password change was successful */
2329 switch_ivr_phrase_macro(session, VM_CHANGE_PASS_SUCCESS_MACRO, NULL, NULL, NULL)switch_ivr_phrase_macro_event(session, "voicemail_change_pass_success"
, ((void*)0), ((void*)0), ((void*)0), ((void*)0))
;
2330 }
2331
2332 switch_event_destroy(&params);
2333 }
2334
2335 } else if (!strcmp(input, profile->record_name_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->record_name_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->record_name_key), (!((size_t)(
const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->record_name_key) + 1) - (size_t)(const void *)(
profile->record_name_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->record_name_key) : (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
record_name_key) && ((size_t)(const void *)((profile->
record_name_key) + 1) - (size_t)(const void *)(profile->record_name_key
) == 1) ? __builtin_strcmp (input, profile->record_name_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->record_name_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
record_name_key) && ((size_t)(const void *)((profile->
record_name_key) + 1) - (size_t)(const void *)(profile->record_name_key
) == 1) && (__s2_len = __builtin_strlen (profile->
record_name_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->record_name_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->record_name_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->record_name_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->record_name_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->record_name_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
record_name_key)))); })
) {
2336 switch_event_t *params;
2337 file_path = switch_mprintf("%s%srecorded_name.%s", dir_path, SWITCH_PATH_SEPARATOR"/", profile->file_ext);
2338 tmp_file_path = switch_mprintf("%s%srecorded_name_TMP.%s", dir_path, SWITCH_PATH_SEPARATOR"/", profile->file_ext);
2339 unlink(tmp_file_path);
2340 TRY_CODE(create_file(session, profile, VM_RECORD_NAME_MACRO, file_path, &message_len, SWITCH_FALSE, NULL, NULL))do { status = create_file(session, profile, "voicemail_record_name"
, file_path, &message_len, SWITCH_FALSE, ((void*)0), ((void
*)0)); if (status != SWITCH_STATUS_SUCCESS && status !=
SWITCH_STATUS_BREAK) { goto end; } break;} while(status)
;
2341 switch_file_rename(tmp_file_path, file_path, switch_core_session_get_pool(session));
2342 sql = switch_mprintf("update voicemail_prefs set name_path='%s' where username='%s' and domain='%s'", file_path, myid, domain_name);
2343 vm_execute_sql(profile, sql, profile->mutex);
2344 switch_safe_free(file_path)if (file_path) {free(file_path);file_path=((void*)0);};
2345 switch_safe_free(tmp_file_path)if (tmp_file_path) {free(tmp_file_path);tmp_file_path=((void*
)0);}
;
2346 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
2347
2348 switch_event_create_subclass(&params, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 2348, &params, SWITCH_EVENT_CUSTOM
, "vm::maintenance")
;
2349 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Action", "record-name");
2350 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Name-Path", file_path);
2351 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-User", myid);
2352 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "VM-Domain", domain_name);
2353 switch_channel_event_set_data(channel, params);
2354 switch_event_fire(&params)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 2354, &params, ((void*)0))
;
2355 }
2356 continue;
2357 }
2358 break;
2359 case VM_CHECK_MENU:
2360 {
2361 char input[10] = "";
2362 char key_buf[80] = "";
2363 play_msg_type = MSG_NONE;
2364
2365 if (!retries) {
2366 goto end;
2367 }
2368
2369 retries--;
2370
2371 if (!zstr_buf(global_buf)(*(global_buf) == '\0')) {
2372 switch_set_string(input, global_buf)switch_copy_string(input, global_buf, sizeof(input));
2373 *global_buf = '\0';
2374 status = SWITCH_STATUS_SUCCESS;
2375 } else {
2376 switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s",
2377 profile->play_new_messages_key, profile->play_saved_messages_key, profile->config_menu_key, profile->terminator_key);
2378
2379 status = vm_macro_get(session, VM_MENU_MACRO"voicemail_menu", key_buf, input, sizeof(input), 1, "", &term, timeout);
2380 }
2381
2382 if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
2383 goto end;
2384 }
2385
2386 if (!strcmp(input, profile->play_new_messages_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->play_new_messages_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->play_new_messages_key), (!((size_t
)(const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->play_new_messages_key) + 1) - (size_t)(const void
*)(profile->play_new_messages_key) == 1) || __s2_len >=
4)) ? __builtin_strcmp (input, profile->play_new_messages_key
) : (__builtin_constant_p (input) && ((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) &&
(__s1_len = __builtin_strlen (input), __s1_len < 4) ? (__builtin_constant_p
(profile->play_new_messages_key) && ((size_t)(const
void *)((profile->play_new_messages_key) + 1) - (size_t)(
const void *)(profile->play_new_messages_key) == 1) ? __builtin_strcmp
(input, profile->play_new_messages_key) : (__extension__ (
{ const unsigned char *__s2 = (const unsigned char *) (const char
*) (profile->play_new_messages_key); int __result = (((const
unsigned char *) (const char *) (input))[0] - __s2[0]); if (
__s1_len > 0 && __result == 0) { __result = (((const
unsigned char *) (const char *) (input))[1] - __s2[1]); if (
__s1_len > 1 && __result == 0) { __result = (((const
unsigned char *) (const char *) (input))[2] - __s2[2]); if (
__s1_len > 2 && __result == 0) __result = (((const
unsigned char *) (const char *) (input))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p (profile->play_new_messages_key
) && ((size_t)(const void *)((profile->play_new_messages_key
) + 1) - (size_t)(const void *)(profile->play_new_messages_key
) == 1) && (__s2_len = __builtin_strlen (profile->
play_new_messages_key), __s2_len < 4) ? (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) ? __builtin_strcmp (input, profile
->play_new_messages_key) : (- (__extension__ ({ const unsigned
char *__s2 = (const unsigned char *) (const char *) (input);
int __result = (((const unsigned char *) (const char *) (profile
->play_new_messages_key))[0] - __s2[0]); if (__s2_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) (profile->play_new_messages_key))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (profile->play_new_messages_key
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) (profile
->play_new_messages_key))[3] - __s2[3]); } } __result; }))
)) : __builtin_strcmp (input, profile->play_new_messages_key
)))); })
) {
2387 play_msg_type = MSG_NEW;
2388 } else if (!strcmp(input, profile->play_saved_messages_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->play_saved_messages_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->play_saved_messages_key), (!((
size_t)(const void *)((input) + 1) - (size_t)(const void *)(input
) == 1) || __s1_len >= 4) && (!((size_t)(const void
*)((profile->play_saved_messages_key) + 1) - (size_t)(const
void *)(profile->play_saved_messages_key) == 1) || __s2_len
>= 4)) ? __builtin_strcmp (input, profile->play_saved_messages_key
) : (__builtin_constant_p (input) && ((size_t)(const void
*)((input) + 1) - (size_t)(const void *)(input) == 1) &&
(__s1_len = __builtin_strlen (input), __s1_len < 4) ? (__builtin_constant_p
(profile->play_saved_messages_key) && ((size_t)(const
void *)((profile->play_saved_messages_key) + 1) - (size_t
)(const void *)(profile->play_saved_messages_key) == 1) ? __builtin_strcmp
(input, profile->play_saved_messages_key) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (profile->play_saved_messages_key); int __result =
(((const unsigned char *) (const char *) (input))[0] - __s2[
0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
play_saved_messages_key) && ((size_t)(const void *)((
profile->play_saved_messages_key) + 1) - (size_t)(const void
*)(profile->play_saved_messages_key) == 1) && (__s2_len
= __builtin_strlen (profile->play_saved_messages_key), __s2_len
< 4) ? (__builtin_constant_p (input) && ((size_t)
(const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) ? __builtin_strcmp (input, profile->play_saved_messages_key
) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (input); int __result = (((const unsigned
char *) (const char *) (profile->play_saved_messages_key)
)[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->play_saved_messages_key))[1] - __s2[1]); if (__s2_len >
1 && __result == 0) { __result = (((const unsigned char
*) (const char *) (profile->play_saved_messages_key))[2] -
__s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) (profile->play_saved_messages_key
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (input
, profile->play_saved_messages_key)))); })
) {
2389 play_msg_type = MSG_SAVED;
2390 } else if (!strcmp(input, profile->terminator_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->terminator_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->terminator_key), (!((size_t)(const
void *)((input) + 1) - (size_t)(const void *)(input) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)((profile
->terminator_key) + 1) - (size_t)(const void *)(profile->
terminator_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->terminator_key) : (__builtin_constant_p (
input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
terminator_key) && ((size_t)(const void *)((profile->
terminator_key) + 1) - (size_t)(const void *)(profile->terminator_key
) == 1) ? __builtin_strcmp (input, profile->terminator_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->terminator_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
terminator_key) && ((size_t)(const void *)((profile->
terminator_key) + 1) - (size_t)(const void *)(profile->terminator_key
) == 1) && (__s2_len = __builtin_strlen (profile->
terminator_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->terminator_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->terminator_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->terminator_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->terminator_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->terminator_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
terminator_key)))); })
) {
2391 goto end;
2392 } else if (!strcmp(input, profile->config_menu_key)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(input) && __builtin_constant_p (profile->config_menu_key
) && (__s1_len = __builtin_strlen (input), __s2_len =
__builtin_strlen (profile->config_menu_key), (!((size_t)(
const void *)((input) + 1) - (size_t)(const void *)(input) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
((profile->config_menu_key) + 1) - (size_t)(const void *)(
profile->config_menu_key) == 1) || __s2_len >= 4)) ? __builtin_strcmp
(input, profile->config_menu_key) : (__builtin_constant_p
(input) && ((size_t)(const void *)((input) + 1) - (size_t
)(const void *)(input) == 1) && (__s1_len = __builtin_strlen
(input), __s1_len < 4) ? (__builtin_constant_p (profile->
config_menu_key) && ((size_t)(const void *)((profile->
config_menu_key) + 1) - (size_t)(const void *)(profile->config_menu_key
) == 1) ? __builtin_strcmp (input, profile->config_menu_key
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (profile->config_menu_key); int __result
= (((const unsigned char *) (const char *) (input))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (input))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (input))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (profile->
config_menu_key) && ((size_t)(const void *)((profile->
config_menu_key) + 1) - (size_t)(const void *)(profile->config_menu_key
) == 1) && (__s2_len = __builtin_strlen (profile->
config_menu_key), __s2_len < 4) ? (__builtin_constant_p (input
) && ((size_t)(const void *)((input) + 1) - (size_t)(
const void *)(input) == 1) ? __builtin_strcmp (input, profile
->config_menu_key) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (input); int __result
= (((const unsigned char *) (const char *) (profile->config_menu_key
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (profile
->config_menu_key))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (profile->config_menu_key))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (profile->config_menu_key))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (input, profile->
config_menu_key)))); })
) {
2393 vm_check_state = VM_CHECK_CONFIG;
2394 }
2395
2396 if (play_msg_type) {
2397 vm_check_state = VM_CHECK_PLAY_MESSAGES;
2398 retries = profile->max_retries;
2399 }
2400
2401 continue;
2402 }
2403 break;
2404 case VM_CHECK_AUTH:
2405 {
2406 prefs_callback_t cbt = { {0}
2407 };
2408 char sql[512] = "";
2409
2410 if (!attempts) {
2411 failed = 1;
2412 goto end;
2413 }
2414
2415 attempts--;
2416
2417 if (!myid) {
2418 status = vm_macro_get(session, VM_ENTER_ID_MACRO"voicemail_enter_id", profile->terminator_key, id_buf, sizeof(id_buf), 0,
2419 profile->terminator_key, &term, timeout);
2420 if (status != SWITCH_STATUS_SUCCESS) {
2421 goto end;
2422 }
2423
2424 if (*id_buf == '\0') {
2425 continue;
2426 } else {
2427 myid = id_buf;
2428 }
2429 }
2430
2431 if (!x_user) {
2432 switch_event_t *params;
2433 int ok = 1;
2434
2435 switch_event_create(&params, SWITCH_EVENT_GENERAL)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 2435, &params, SWITCH_EVENT_GENERAL
, ((void*)0))
;
2436 switch_assert(params)((params) ? (void) (0) : __assert_fail ("params", "mod_voicemail.c"
, 2436, __PRETTY_FUNCTION__))
;
2437 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "action", "voicemail-lookup");
2438 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "destination_number", caller_profile->destination_number);
2439 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "caller_id_number", caller_id_number);
2440
2441 if (switch_xml_locate_user_merged("id:number-alias", myid, domain_name, switch_channel_get_variable(channel, "network_addr")switch_channel_get_variable_dup(channel, "network_addr", SWITCH_TRUE
, -1)
,
2442 &x_user, params) != SWITCH_STATUS_SUCCESS) {
2443 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 2443, (const char*)(session)
, SWITCH_LOG_WARNING, "Can't find user [%s@%s]\n", myid, domain_name);
2444 ok = 0;
2445 } else {
2446 switch_bool_t vm_enabled = SWITCH_TRUE;
2447
2448 x_params = switch_xml_child(x_user, "params");
2449
2450 for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
2451 const char *var = switch_xml_attr_soft(x_param, "name");
2452 const char *val = switch_xml_attr_soft(x_param, "value");
2453
2454 if (zstr(var)_zstr(var) || zstr(val)_zstr(val)) {
2455 continue; /* Ignore empty entires */
2456 }
2457
2458 if (!strcasecmp(var, "vm-enabled")) {
2459 vm_enabled = !switch_false(val);
2460 }
2461 }
2462
2463 if (!vm_enabled) {
2464 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 2464, (const char*)(session)
, SWITCH_LOG_WARNING, "User [%s@%s] have voicemail disabled\n", myid, domain_name);
2465 ok = 0;
2466 }
2467 myid = switch_core_session_strdup(session, switch_xml_attr(x_user, "id"))switch_core_perform_session_strdup(session, switch_xml_attr(x_user
, "id"), "mod_voicemail.c", (const char *)__func__, 2467)
;
2468 }
2469
2470 switch_event_destroy(&params);
2471
2472 if (!ok) {
2473 goto end;
2474 }
2475 }
2476
2477 thepass = thehash = NULL((void*)0);
2478 switch_snprintfv(sql, sizeof(sql), "select * from voicemail_prefs where username='%q' and domain='%q'", myid, domain_name);
2479 vm_execute_sql_callback(profile, profile->mutex, sql, prefs_callback, &cbt);
2480
2481 x_params = switch_xml_child(x_user, "variables");
2482 for (x_param = switch_xml_child(x_params, "variable"); x_param; x_param = x_param->next) {
2483 const char *var = switch_xml_attr_soft(x_param, "name");
2484 const char *val = switch_xml_attr_soft(x_param, "value");
2485
2486 if (!strcasecmp(var, "timezone")) {
2487 switch_channel_set_variable(channel, var, val)switch_channel_set_variable_var_check(channel, var, val, SWITCH_TRUE
)
;
2488 }
2489 }
2490
2491 x_params = switch_xml_child(x_user, "params");
2492 for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
2493 const char *var = switch_xml_attr_soft(x_param, "name");
2494 const char *val = switch_xml_attr_soft(x_param, "value");
2495
2496 if (!strcasecmp(var, "a1-hash")) {
2497 thehash = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2497)
;
2498 } else if (!strcasecmp(var, "vm-a1-hash")) {
2499 vmhash = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2499)
;
2500 } else if (!auth && !thepass && !strcasecmp(var, "password")) {
2501 thepass = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2501)
;
2502 } else if (!auth && !strcasecmp(var, "vm-password")) {
2503 if (!zstr(val)_zstr(val) && !strcasecmp(val, "user-choose")) {
2504 if (zstr(cbt.password)_zstr(cbt.password)) {
2505 if (profile->allow_empty_password_auth) {
2506 auth = 1;
2507 }
2508 } else {
2509 thepass = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2509)
;
2510 }
2511 } else {
2512 thepass = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2512)
;
2513 }
2514 } else if (!strcasecmp(var, "vm-mailto")) {
2515 vm_email = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2515)
;
2516 email_addr = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2516)
;
2517 } else if (!strcasecmp(var, "email-addr")) {
2518 email_addr = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2518)
;
2519 } else if (!strcasecmp(var, "vm-convert-cmd")) {
2520 convert_cmd = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2520)
;
2521 } else if (!strcasecmp(var, "vm-convert-ext")) {
2522 convert_ext = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2522)
;
2523 } else if (!strcasecmp(var, "vm-storage-dir")) {
2524 vm_storage_dir = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2524)
;
2525 } else if (!strcasecmp(var, "vm-domain-storage-dir")) {
2526 storage_dir = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2526)
;
2527 } else if (!strcasecmp(var, "storage-dir")) {
2528 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 2528, (const char*)(session)
, SWITCH_LOG_WARNING,
2529 "Using deprecated 'storage-dir' directory variable: Please use 'vm-domain-storage-dir'.\n");
2530 storage_dir = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 2530)
;
2531 } else if (!strcasecmp(var, "timezone")) {
2532 switch_channel_set_variable(channel, var, val)switch_channel_set_variable_var_check(channel, var, val, SWITCH_TRUE
)
;
2533 }
2534
2535 }
2536
2537 if (!mypass) {
2538 if (auth) {
2539 mypass = "OK";
2540 } else {
2541 status = vm_macro_get(session, VM_ENTER_PASS_MACRO"voicemail_enter_pass", profile->terminator_key,
2542 pass_buf, sizeof(pass_buf), 0, profile->terminator_key, &term, timeout);
2543 if (status != SWITCH_STATUS_SUCCESS) {
2544 goto end;
2545 }
2546 if (*pass_buf == '\0') {
2547 continue;
2548 } else {
2549 mypass = pass_buf;
2550 }
2551 }
2552 }
2553
2554 if (vmhash) {
2555 thehash = vmhash;
2556 }
2557
2558 if (!auth && !thepass && !zstr(cbt.password)_zstr(cbt.password)) {
2559 thepass = cbt.password;
2560 }
2561
2562 if (!auth) {
2563 if (!zstr(cbt.password)_zstr(cbt.password) && !strcmp(cbt.password, mypass)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(cbt.password) && __builtin_constant_p (mypass) &&
(__s1_len = __builtin_strlen (cbt.password), __s2_len = __builtin_strlen
(mypass), (!((size_t)(const void *)((cbt.password) + 1) - (size_t
)(const void *)(cbt.password) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((mypass) + 1) - (size_t)(const void
*)(mypass) == 1) || __s2_len >= 4)) ? __builtin_strcmp (cbt
.password, mypass) : (__builtin_constant_p (cbt.password) &&
((size_t)(const void *)((cbt.password) + 1) - (size_t)(const
void *)(cbt.password) == 1) && (__s1_len = __builtin_strlen
(cbt.password), __s1_len < 4) ? (__builtin_constant_p (mypass
) && ((size_t)(const void *)((mypass) + 1) - (size_t)
(const void *)(mypass) == 1) ? __builtin_strcmp (cbt.password
, mypass) : (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) (mypass); int __result = (((
const unsigned char *) (const char *) (cbt.password))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (cbt.password))[1
] - __s2[1]); if (__s1_len > 1 && __result == 0) {
__result = (((const unsigned char *) (const char *) (cbt.password
))[2] - __s2[2]); if (__s1_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) (cbt.password
))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (
mypass) && ((size_t)(const void *)((mypass) + 1) - (size_t
)(const void *)(mypass) == 1) && (__s2_len = __builtin_strlen
(mypass), __s2_len < 4) ? (__builtin_constant_p (cbt.password
) && ((size_t)(const void *)((cbt.password) + 1) - (size_t
)(const void *)(cbt.password) == 1) ? __builtin_strcmp (cbt.password
, mypass) : (- (__extension__ ({ const unsigned char *__s2 = (
const unsigned char *) (const char *) (cbt.password); int __result
= (((const unsigned char *) (const char *) (mypass))[0] - __s2
[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (mypass))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (mypass))[2] - __s2
[2]); if (__s2_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (mypass))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (cbt.password, mypass
)))); })
) {
2564 auth++;
2565 } else if (!thepass && profile->allow_empty_password_auth) {
2566 auth++;
2567 }
2568
2569 if (!auth && (!profile->db_password_override || (profile->db_password_override && zstr(cbt.password)_zstr(cbt.password))) && (thepass || thehash) && mypass) {
2570 if (thehash) {
2571 char digest[SWITCH_MD5_DIGEST_STRING_SIZE33] = { 0 };
2572 char *lpbuf = switch_mprintf("%s:%s:%s", myid, domain_name, mypass);
2573 switch_md5_string(digest, (void *) lpbuf, strlen(lpbuf));
2574 if (!strcmp(digest, thehash)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(digest) && __builtin_constant_p (thehash) &&
(__s1_len = __builtin_strlen (digest), __s2_len = __builtin_strlen
(thehash), (!((size_t)(const void *)((digest) + 1) - (size_t
)(const void *)(digest) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((thehash) + 1) - (size_t)(const void
*)(thehash) == 1) || __s2_len >= 4)) ? __builtin_strcmp (
digest, thehash) : (__builtin_constant_p (digest) && (
(size_t)(const void *)((digest) + 1) - (size_t)(const void *)
(digest) == 1) && (__s1_len = __builtin_strlen (digest
), __s1_len < 4) ? (__builtin_constant_p (thehash) &&
((size_t)(const void *)((thehash) + 1) - (size_t)(const void
*)(thehash) == 1) ? __builtin_strcmp (digest, thehash) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (thehash); int __result = (((const unsigned char *) (
const char *) (digest))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (digest))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (digest))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (digest))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(thehash) && ((size_t)(const void *)((thehash) + 1) -
(size_t)(const void *)(thehash) == 1) && (__s2_len =
__builtin_strlen (thehash), __s2_len < 4) ? (__builtin_constant_p
(digest) && ((size_t)(const void *)((digest) + 1) - (
size_t)(const void *)(digest) == 1) ? __builtin_strcmp (digest
, thehash) : (- (__extension__ ({ const unsigned char *__s2 =
(const unsigned char *) (const char *) (digest); int __result
= (((const unsigned char *) (const char *) (thehash))[0] - __s2
[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (thehash))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (thehash))[2] - __s2
[2]); if (__s2_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (thehash))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (digest, thehash
)))); })
) {
2575 auth++;
2576 }
2577 switch_safe_free(lpbuf)if (lpbuf) {free(lpbuf);lpbuf=((void*)0);};
2578 }
2579
2580 if (!auth && thepass && !strcmp(thepass, mypass)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(thepass) && __builtin_constant_p (mypass) &&
(__s1_len = __builtin_strlen (thepass), __s2_len = __builtin_strlen
(mypass), (!((size_t)(const void *)((thepass) + 1) - (size_t
)(const void *)(thepass) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((mypass) + 1) - (size_t)(const void
*)(mypass) == 1) || __s2_len >= 4)) ? __builtin_strcmp (thepass
, mypass) : (__builtin_constant_p (thepass) && ((size_t
)(const void *)((thepass) + 1) - (size_t)(const void *)(thepass
) == 1) && (__s1_len = __builtin_strlen (thepass), __s1_len
< 4) ? (__builtin_constant_p (mypass) && ((size_t
)(const void *)((mypass) + 1) - (size_t)(const void *)(mypass
) == 1) ? __builtin_strcmp (thepass, mypass) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (mypass); int __result = (((const unsigned char *) (
const char *) (thepass))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (thepass))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (thepass))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (thepass))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(mypass) && ((size_t)(const void *)((mypass) + 1) - (
size_t)(const void *)(mypass) == 1) && (__s2_len = __builtin_strlen
(mypass), __s2_len < 4) ? (__builtin_constant_p (thepass)
&& ((size_t)(const void *)((thepass) + 1) - (size_t)
(const void *)(thepass) == 1) ? __builtin_strcmp (thepass, mypass
) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (thepass); int __result = (((const unsigned
char *) (const char *) (mypass))[0] - __s2[0]); if (__s2_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (mypass))[1] - __s2[1]); if (__s2_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (mypass))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (mypass))[3] - __s2[3]); } } __result
; })))) : __builtin_strcmp (thepass, mypass)))); })
) {
2581 auth++;
2582 }
2583 }
2584 }
2585
2586 switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 2586, &event, SWITCH_EVENT_CUSTOM
, "vm::maintenance")
;
2587 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "VM-Action", "authentication");
2588 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "VM-Auth-Result", auth ? "success" : "fail");
2589 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "VM-User", myid);
2590 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "VM-Domain", domain_name);
2591 switch_channel_event_set_data(channel, event);
2592 switch_event_fire(&event)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 2592, &event, ((void*)0))
;
2593
2594 xml_safe_free(x_user)if (x_user) switch_xml_free(x_user); x_user = ((void*)0);
2595
2596 if (auth) {
2597 if (!dir_path) {
2598 if (!zstr(vm_storage_dir)_zstr(vm_storage_dir)) {
2599 /* check for absolute or relative path */
2600 if (switch_is_file_path(vm_storage_dir)) {
2601 dir_path = switch_core_session_strdup(session, vm_storage_dir)switch_core_perform_session_strdup(session, vm_storage_dir, "mod_voicemail.c"
, (const char *)__func__, 2601)
;
2602 } else {
2603 dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s", SWITCH_GLOBAL_dirs.storage_dir,
2604 SWITCH_PATH_SEPARATOR"/", SWITCH_PATH_SEPARATOR"/", vm_storage_dir);
2605 }
2606 } else if (!zstr(storage_dir)_zstr(storage_dir)) {
2607 dir_path = switch_core_session_sprintf(session, "%s%s%s", storage_dir, SWITCH_PATH_SEPARATOR"/", myid);
2608 } else if (!zstr(profile->storage_dir)_zstr(profile->storage_dir)) {
2609 if (profile->storage_dir_shared) {
2610 dir_path =
2611 switch_core_session_sprintf(session, "%s%s%s%s%s%s%s", profile->storage_dir, SWITCH_PATH_SEPARATOR"/", domain_name,
2612 SWITCH_PATH_SEPARATOR"/", "voicemail",
2613 SWITCH_PATH_SEPARATOR"/", myid);
2614 } else {
2615 dir_path =
2616 switch_core_session_sprintf(session, "%s%s%s%s%s", profile->storage_dir, SWITCH_PATH_SEPARATOR"/", domain_name,
2617 SWITCH_PATH_SEPARATOR"/", myid);
2618 }
2619 } else {
2620 dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir,
2621 SWITCH_PATH_SEPARATOR"/",
2622 SWITCH_PATH_SEPARATOR"/",
2623 profile->name, SWITCH_PATH_SEPARATOR"/", domain_name, SWITCH_PATH_SEPARATOR"/", myid);
2624 }
2625
2626 if (switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS0x0400 | 0x0200 | 0x0100 | 0x0040 | 0x0010, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
2627 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 2627, (const char*)(session)
, SWITCH_LOG_ERROR, "Error creating %s\n", dir_path);
2628 goto end;
2629 }
2630 }
2631
2632 authed = 1;
2633
2634 if (auth_only) goto end;
2635
2636 vm_check_state = VM_CHECK_FOLDER_SUMMARY;
2637 } else {
2638 goto failed;
2639 }
2640
2641 continue;
2642
2643 failed:
2644
2645 xml_safe_free(x_user)if (x_user) switch_xml_free(x_user); x_user = ((void*)0);
2646
2647 switch_ivr_phrase_macro(session, VM_FAIL_AUTH_MACRO, NULL, NULL, NULL)switch_ivr_phrase_macro_event(session, "voicemail_fail_auth",
((void*)0), ((void*)0), ((void*)0), ((void*)0))
;
2648 myid = id;
2649 mypass = NULL((void*)0);
2650 continue;
2651 }
2652 break;
2653 default:
2654 break;
2655 }
2656 }
2657
2658 end:
2659
2660 switch_safe_free(file_path)if (file_path) {free(file_path);file_path=((void*)0);};
2661
2662 if (tmp_file_path) {
2663 unlink(tmp_file_path);
2664 free(tmp_file_path);
2665 tmp_file_path = NULL((void*)0);
2666 }
2667
2668 if (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE) && (!auth_only || !authed)) {
2669 if (failed) {
2670 switch_ivr_phrase_macro(session, VM_ABORT_MACRO, NULL, NULL, NULL)switch_ivr_phrase_macro_event(session, "voicemail_abort", ((void
*)0), ((void*)0), ((void*)0), ((void*)0))
;
2671 }
2672 switch_ivr_phrase_macro(session, VM_GOODBYE_MACRO, NULL, NULL, NULL)switch_ivr_phrase_macro_event(session, "voicemail_goodbye", (
(void*)0), ((void*)0), ((void*)0), ((void*)0))
;
2673 }
2674
2675 if (auth_only) {
2676 if (authed) {
2677 switch_channel_set_variable(channel, "user_pin_authenticated", "true")switch_channel_set_variable_var_check(channel, "user_pin_authenticated"
, "true", SWITCH_TRUE)
;
2678 switch_channel_set_variable(channel, "user_pin_authenticated_user", myid)switch_channel_set_variable_var_check(channel, "user_pin_authenticated_user"
, myid, SWITCH_TRUE)
;
2679 if (!zstr(myid)_zstr(myid) && !zstr(domain_name)_zstr(domain_name)) {
2680 char *account = switch_core_session_sprintf(session, "%s@%s", myid, domain_name);
2681 switch_ivr_set_user(session, account);
2682 }
2683 } else {
2684 switch_channel_hangup(channel, SWITCH_CAUSE_USER_CHALLENGE)switch_channel_perform_hangup(channel, "mod_voicemail.c", (const
char *)__func__, 2684, SWITCH_CAUSE_USER_CHALLENGE)
;
2685 }
2686 }
2687
2688 xml_safe_free(x_user)if (x_user) switch_xml_free(x_user); x_user = ((void*)0);
2689}
2690
2691
2692static switch_status_t deliver_vm(vm_profile_t *profile,
2693 switch_xml_t x_user,
2694 const char *domain_name,
2695 const char *path,
2696 uint32_t message_len,
2697 const char *read_flags,
2698 switch_event_t *params,
2699 switch_memory_pool_t *pool,
2700 const char *caller_id_name,
2701 const char *caller_id_number,
2702 const char *forwarded_by,
2703 switch_bool_t copy, const char *use_uuid, switch_core_session_t *session)
2704{
2705 char *file_path = NULL((void*)0), *dir_path = NULL((void*)0);
2706 const char *myid = switch_xml_attr(x_user, "id");
2707 switch_uuid_t uuid;
2708 char uuid_str[SWITCH_UUID_FORMATTED_LENGTH256 + 1];
2709 const char *filename;
2710 switch_xml_t x_param, x_params;
2711 const char *vm_cc = NULL((void*)0), *vm_cc_tmp = NULL((void*)0);
2712 char *vm_email = NULL((void*)0);
2713 char *vm_email_from = NULL((void*)0);
2714 char *vm_notify_email = NULL((void*)0);
2715 char *vm_timezone = NULL((void*)0);
2716 int send_mail = 0;
2717 int send_main = 0;
2718 int send_notify = 0;
2719 int insert_db = 1;
2720 int email_attach = 0;
2721 char *vm_storage_dir = NULL((void*)0);
2722 char *storage_dir = NULL((void*)0);
2723 char *myfolder = "inbox";
2724 int priority = 3;
2725 const char *tmp;
2726 switch_event_t *local_event = NULL((void*)0);
2727 switch_status_t ret = SWITCH_STATUS_SUCCESS;
2728 char *convert_cmd = profile->convert_cmd;
2729 char *convert_ext = profile->convert_ext;
2730
2731 if (!params) {
2732 switch_event_create(&local_event, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 2732, &local_event, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
2733 params = local_event;
2734 }
2735
2736 if ((tmp = switch_event_get_header(params, "effective_caller_id_name")switch_event_get_header_idx(params, "effective_caller_id_name"
, -1)
)) {
2737 caller_id_name = tmp;
2738 }
2739
2740 if ((tmp = switch_event_get_header(params, "effective_caller_id_number")switch_event_get_header_idx(params, "effective_caller_id_number"
, -1)
)) {
2741 caller_id_number = tmp;
2742 }
2743
2744 if (!use_uuid) {
2745 switch_uuid_get(&uuid);
2746 switch_uuid_format(uuid_str, &uuid);
2747 use_uuid = uuid_str;
2748 }
2749
2750 if ((filename = strrchr(path, *SWITCH_PATH_SEPARATOR"/"))) {
2751 filename++;
2752 } else {
2753 filename = path;
2754 }
2755
2756 x_params = switch_xml_child(x_user, "variables");
2757 for (x_param = switch_xml_child(x_params, "variable"); x_param; x_param = x_param->next) {
2758 const char *var = switch_xml_attr_soft(x_param, "name");
2759 const char *val = switch_xml_attr_soft(x_param, "value");
2760
2761 if (!strcasecmp(var, "timezone")) {
2762 vm_timezone = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2762)
;
2763 }
2764 }
2765
2766 x_params = switch_xml_child(x_user, "params");
2767
2768 for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
2769 const char *var = switch_xml_attr_soft(x_param, "name");
2770 const char *val = switch_xml_attr_soft(x_param, "value");
2771
2772 if (!strcasecmp(var, "vm-cc")) {
2773 vm_cc = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2773)
;
2774 } else if (!strcasecmp(var, "vm-mailto")) {
2775 vm_email = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2775)
;
2776 } else if (!strcasecmp(var, "vm-notify-mailto")) {
2777 vm_notify_email = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2777)
;
2778 } else if (!strcasecmp(var, "vm-mailfrom")) {
2779 vm_email_from = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2779)
;
2780 } else if (!strcasecmp(var, "vm-email-all-messages") && (send_main = switch_true(val))) {
2781 send_mail++;
2782 } else if (!strcasecmp(var, "vm-storage-dir")) {
2783 vm_storage_dir = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2783)
;
2784 } else if (!strcasecmp(var, "vm-domain-storage-dir")) {
2785 storage_dir = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2785)
;
2786 } else if (!strcasecmp(var, "storage-dir")) {
2787 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 2787, ((void*)0)
, SWITCH_LOG_WARNING,
2788 "Using deprecated 'storage-dir' directory variable: Please use 'vm-domain-storage-dir'.\n");
2789 storage_dir = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2789)
;
2790 } else if (!strcasecmp(var, "vm-notify-email-all-messages") && (send_notify = switch_true(val))) {
2791 send_mail++;
2792 } else if (!strcasecmp(var, "vm-keep-local-after-email")) {
2793 insert_db = switch_true(val);
2794 } else if (!strcasecmp(var, "vm-attach-file")) {
2795 email_attach = switch_true(val);
2796 } else if (!strcasecmp(var, "vm-convert-cmd")) {
2797 convert_cmd = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2797)
;
2798 } else if (!strcasecmp(var, "vm-convert-ext")) {
2799 convert_ext = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2799)
;
2800 } else if (!strcasecmp(var, "timezone")) {
2801 vm_timezone = switch_core_strdup(pool, val)switch_core_perform_strdup(pool, val, "mod_voicemail.c", (const
char *)__func__, 2801)
;
2802 }
2803 /*switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Send mail is %d, var is %s\n", send_mail, var); */
2804 }
2805
2806 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 2806, ((void*)0)
, SWITCH_LOG_DEBUG, "Deliver VM to %s@%s\n", myid, domain_name);
2807
2808 if (!zstr(vm_storage_dir)_zstr(vm_storage_dir)) {
2809 /* check for absolute or relative path */
2810 if (switch_is_file_path(vm_storage_dir)) {
2811 dir_path = strdup(vm_storage_dir)(__extension__ (__builtin_constant_p (vm_storage_dir) &&
((size_t)(const void *)((vm_storage_dir) + 1) - (size_t)(const
void *)(vm_storage_dir) == 1) ? (((const char *) (vm_storage_dir
))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({
size_t __len = strlen (vm_storage_dir) + 1; char *__retval =
(char *) malloc (__len); if (__retval != ((void*)0)) __retval
= (char *) memcpy (__retval, vm_storage_dir, __len); __retval
; })) : __strdup (vm_storage_dir)))
;
2812 } else {
2813 dir_path = switch_mprintf("%s%svoicemail%s%s", SWITCH_GLOBAL_dirs.storage_dir,
2814 SWITCH_PATH_SEPARATOR"/", SWITCH_PATH_SEPARATOR"/", vm_storage_dir);
2815 }
2816 } else if (!zstr(storage_dir)_zstr(storage_dir)) {
2817 dir_path = switch_mprintf("%s%s%s", storage_dir, SWITCH_PATH_SEPARATOR"/", myid);
2818 } else if (!zstr(profile->storage_dir)_zstr(profile->storage_dir)) {
2819 if (profile->storage_dir_shared) {
2820 dir_path = switch_mprintf("%s%s%s%s%s%s%s", profile->storage_dir, SWITCH_PATH_SEPARATOR"/", domain_name, SWITCH_PATH_SEPARATOR"/", "voicemail", SWITCH_PATH_SEPARATOR"/", myid);
2821 } else {
2822 dir_path = switch_mprintf("%s%s%s%s%s", profile->storage_dir, SWITCH_PATH_SEPARATOR"/", domain_name, SWITCH_PATH_SEPARATOR"/", myid);
2823 }
2824 } else {
2825 dir_path = switch_mprintf("%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir,
2826 SWITCH_PATH_SEPARATOR"/",
2827 SWITCH_PATH_SEPARATOR"/", profile->name, SWITCH_PATH_SEPARATOR"/", domain_name, SWITCH_PATH_SEPARATOR"/", myid);
2828 }
2829
2830 if (switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS0x0400 | 0x0200 | 0x0100 | 0x0040 | 0x0010, pool) != SWITCH_STATUS_SUCCESS) {
2831 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 2831, ((void*)0)
, SWITCH_LOG_ERROR, "Error creating %s\n", dir_path);
2832 ret = SWITCH_STATUS_FALSE;
2833 goto failed;
2834 }
2835
2836 if (copy) {
2837 file_path = switch_mprintf("%s%smsg_%s_broadcast_%s", dir_path, SWITCH_PATH_SEPARATOR"/", use_uuid, filename);
2838
2839 if (strlen(file_path) >= 250 /* Max size of the SQL field */) {
2840 char *ext;
2841 switch_safe_free(file_path)if (file_path) {free(file_path);file_path=((void*)0);};
2842
2843 if (!(ext = strrchr(filename, '.'))) {
2844 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 2844, ((void*)0)
, SWITCH_LOG_ERROR, "Filename doesn't include a file format %s\n", filename);
2845 ret = SWITCH_STATUS_FALSE;
2846 goto failed;
2847 }
2848
2849 ext++;
2850
2851 file_path = switch_mprintf("%s%smsg_%s_broadcast_%" SWITCH_TIME_T_FMT"ld" ".%s", dir_path, SWITCH_PATH_SEPARATOR"/", use_uuid, switch_micro_time_now(), ext);
2852 }
2853
2854 switch_file_copy(path, file_path, SWITCH_FPROT_FILE_SOURCE_PERMS0x1000, pool);
2855 } else {
2856 file_path = (char *) path;
2857 }
2858
2859 if (!message_len) {
2860 size_t len = 0;
2861 if (measure_file_len(file_path, &len) == SWITCH_STATUS_SUCCESS) {
2862 message_len = (uint32_t)len;
2863 }
2864 }
2865
2866 if (insert_db && switch_file_exists(file_path, pool) == SWITCH_STATUS_SUCCESS) {
2867 char *usql;
2868 switch_event_t *message_event;
2869
2870 switch_event_create_subclass(&message_event, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 2870, &message_event, SWITCH_EVENT_CUSTOM
, "vm::maintenance")
;
2871 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-Action", "leave-message");
2872 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-User", myid);
2873 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-Domain", domain_name);
2874 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-Caller-ID-Name", caller_id_name);
2875 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-Caller-ID-Number", caller_id_number);
2876 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-File-Path", file_path);
2877 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-Flags", read_flags);
2878 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-Folder", myfolder);
2879 switch_event_add_header_string(message_event, SWITCH_STACK_BOTTOM, "VM-UUID", use_uuid);
2880 switch_event_add_header(message_event, SWITCH_STACK_BOTTOM, "VM-Message-Len", "%u", message_len);
2881 switch_event_add_header(message_event, SWITCH_STACK_BOTTOM, "VM-Timestamp", "%lu", (unsigned long) switch_epoch_time_now(NULL((void*)0)));
2882
2883 switch_event_fire(&message_event)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 2883, &message_event, ((void*)0))
;
2884
2885 usql = switch_mprintf("insert into voicemail_msgs(created_epoch, read_epoch, username, domain, uuid, cid_name, "
2886 "cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by) "
2887 "values(%ld,0,'%q','%q','%q','%q','%q','%q','%q','%u','','%q','%q')", (long) switch_epoch_time_now(NULL((void*)0)),
2888 myid, domain_name, use_uuid, caller_id_name, caller_id_number,
2889 myfolder, file_path, message_len, read_flags, switch_str_nil(forwarded_by)(forwarded_by ? forwarded_by : ""));
2890
2891 vm_execute_sql(profile, usql, profile->mutex);
2892 switch_safe_free(usql)if (usql) {free(usql);usql=((void*)0);};
2893
2894 update_mwi(profile, myid, domain_name, myfolder, MWI_REASON_NEW);
2895 }
2896
2897 if (send_mail && (!zstr(vm_email)_zstr(vm_email) || !zstr(vm_notify_email)_zstr(vm_notify_email)) && switch_file_exists(file_path, pool) == SWITCH_STATUS_SUCCESS) {
2898 switch_event_t *event;
2899 char *from;
2900 char *body;
2901 char *headers;
2902 char *header_string;
2903 char tmpvar[50] = "";
2904 int total_new_messages = 0;
2905 int total_saved_messages = 0;
2906 int total_new_urgent_messages = 0;
2907 int total_saved_urgent_messages = 0;
2908 char *p;
2909 switch_time_t l_duration = 0;
2910 switch_core_time_duration_t duration;
2911 char duration_str[80];
2912 switch_time_exp_t tm;
2913 char date[80] = "";
2914 switch_size_t retsize;
2915 char *formatted_cid_num = NULL((void*)0);
2916
2917 message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages,
2918 &total_new_urgent_messages, &total_saved_urgent_messages);
2919
2920 if (zstr(vm_timezone)_zstr(vm_timezone) || (switch_strftime_tz(vm_timezone, profile->date_fmt, date, sizeof(date), 0) != SWITCH_STATUS_SUCCESS)) {
2921 switch_time_exp_lt(&tm, switch_micro_time_now());
2922 switch_strftime(date, &retsize, sizeof(date), profile->date_fmt, &tm);
2923 }
2924
2925 formatted_cid_num = switch_format_number(caller_id_number);
2926 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_current_folder", myfolder);
2927 switch_snprintf(tmpvar, sizeof(tmpvar), "%d", total_new_messages);
2928 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_total_new_messages", tmpvar);
2929 switch_snprintf(tmpvar, sizeof(tmpvar), "%d", total_saved_messages);
2930 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_total_saved_messages", tmpvar);
2931 switch_snprintf(tmpvar, sizeof(tmpvar), "%d", total_new_urgent_messages);
2932 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_urgent_new_messages", tmpvar);
2933 switch_snprintf(tmpvar, sizeof(tmpvar), "%d", total_saved_urgent_messages);
2934 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_urgent_saved_messages", tmpvar);
2935 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_account", myid);
2936 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_domain", domain_name);
2937 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_caller_id_number", caller_id_number);
2938 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_formatted_caller_id_number", formatted_cid_num);
2939 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_caller_id_name", caller_id_name);
2940 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_file_path", file_path);
2941 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_read_flags", read_flags);
2942 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_time", date);
2943 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_uuid", use_uuid);
2944
2945 switch_safe_free(formatted_cid_num)if (formatted_cid_num) {free(formatted_cid_num);formatted_cid_num
=((void*)0);}
;
2946
2947 switch_snprintf(tmpvar, sizeof(tmpvar), "%d", priority);
2948 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_priority", tmpvar);
2949 if (vm_email) {
2950 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_email", vm_email);
2951 }
2952 if (vm_email_from) {
2953 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_email_from", vm_email_from);
2954 }
2955 if (vm_notify_email) {
2956 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_notify_email", vm_notify_email);
2957 }
2958 l_duration = switch_time_make(message_len, 0);
2959 switch_core_measure_time(l_duration, &duration);
2960 duration.day += duration.yr * 365;
2961 duration.hr += duration.day * 24;
2962 switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", duration.hr, duration.min, duration.sec);
2963
2964 switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "voicemail_message_len", duration_str);
2965
2966 if (!zstr(vm_email_from)_zstr(vm_email_from)) {
2967 from = switch_core_strdup(pool, vm_email_from)switch_core_perform_strdup(pool, vm_email_from, "mod_voicemail.c"
, (const char *)__func__, 2967)
;
2968 } else if (zstr(profile->email_from)_zstr(profile->email_from)) {
2969 from = switch_core_sprintf(pool, "%s@%s", myid, domain_name);
2970 } else {
2971 from = switch_event_expand_headers(params, profile->email_from)switch_event_expand_headers_check(params, profile->email_from
, ((void*)0), ((void*)0), 0)
;
2972 }
2973
2974
2975 if (send_main) {
2976 if (zstr(profile->email_headers)_zstr(profile->email_headers)) {
2977 headers = switch_mprintf("From: FreeSWITCH mod_voicemail <%s@%s>\n"
2978 "Subject: Voicemail from %s %s\nX-Priority: %d", myid, domain_name, caller_id_name, caller_id_number, priority);
2979 } else {
2980 headers = switch_event_expand_headers(params, profile->email_headers)switch_event_expand_headers_check(params, profile->email_headers
, ((void*)0), ((void*)0), 0)
;
2981 }
2982
2983 p = headers + (strlen(headers) - 1);
2984
2985 if (*p == '\n') {
2986 if (*(p - 1) == '\r') {
2987 p--;
2988 }
2989 *p = '\0';
2990 }
2991
2992 header_string = switch_core_sprintf(pool, "%s\nX-Voicemail-Length: %u", headers, message_len);
2993
2994 switch_event_dup(&event, params);
2995
2996 if (event) {
2997 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Message-Type", "voicemail");
2998 switch_event_fire(&event)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 2998, &event, ((void*)0))
;
2999 }
3000
3001 if (profile->email_body) {
3002 body = switch_event_expand_headers(params, profile->email_body)switch_event_expand_headers_check(params, profile->email_body
, ((void*)0), ((void*)0), 0)
;
3003 } else {
3004 body = switch_mprintf("%u second Voicemail from %s %s", message_len, caller_id_name, caller_id_number);
3005 }
3006
3007 if (email_attach) {
3008 switch_simple_email(vm_email, from, header_string, body, file_path, convert_cmd, convert_ext);
3009 } else {
3010 switch_simple_email(vm_email, from, header_string, body, NULL((void*)0), NULL((void*)0), NULL((void*)0));
3011 }
3012
3013 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 3013, ((void*)0)
, SWITCH_LOG_DEBUG, "Sending message to %s\n", vm_email);
3014
3015 if (body != profile->email_body) {
3016 switch_safe_free(body)if (body) {free(body);body=((void*)0);};
3017 }
3018
3019 if (headers != profile->email_headers) {
3020 switch_safe_free(headers)if (headers) {free(headers);headers=((void*)0);};
3021 }
3022 }
3023
3024
3025 if (send_notify) {
3026 if (zstr(vm_notify_email)_zstr(vm_notify_email)) {
3027 vm_notify_email = vm_email;
3028 }
3029
3030 if (zstr(profile->notify_email_headers)_zstr(profile->notify_email_headers)) {
3031 headers = switch_mprintf("From: FreeSWITCH mod_voicemail <%s@%s>\n"
3032 "Subject: Voicemail from %s %s\nX-Priority: %d", myid, domain_name, caller_id_name, caller_id_number, priority);
3033 } else {
3034 headers = switch_event_expand_headers(params, profile->notify_email_headers)switch_event_expand_headers_check(params, profile->notify_email_headers
, ((void*)0), ((void*)0), 0)
;
3035 }
3036
3037 p = headers + (strlen(headers) - 1);
3038
3039 if (*p == '\n') {
3040 if (*(p - 1) == '\r') {
3041 p--;
3042 }
3043 *p = '\0';
3044 }
3045
3046 header_string = switch_core_sprintf(pool, "%s\nX-Voicemail-Length: %u", headers, message_len);
3047
3048 switch_event_dup(&event, params);
3049
3050 if (event) {
3051 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Message-Type", "voicemail-notify");
3052 switch_event_fire(&event)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 3052, &event, ((void*)0))
;
3053 }
3054
3055 if (profile->notify_email_body) {
3056 body = switch_event_expand_headers(params, profile->notify_email_body)switch_event_expand_headers_check(params, profile->notify_email_body
, ((void*)0), ((void*)0), 0)
;
3057 } else {
3058 body = switch_mprintf("%u second Voicemail from %s %s", message_len, caller_id_name, caller_id_number);
3059 }
3060
3061 switch_simple_email(vm_notify_email, from, header_string, body, NULL((void*)0), NULL((void*)0), NULL((void*)0));
3062
3063 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 3063, ((void*)0)
, SWITCH_LOG_DEBUG, "Sending notify message to %s\n", vm_notify_email);
3064
3065 if (body != profile->notify_email_body) {
3066 switch_safe_free(body)if (body) {free(body);body=((void*)0);};
3067 }
3068
3069 if (headers != profile->notify_email_headers) {
3070 switch_safe_free(headers)if (headers) {free(headers);headers=((void*)0);};
3071 }
3072 }
3073 }
3074
3075 if (session) {
3076 switch_channel_t *channel = switch_core_session_get_channel(session);
3077 if (channel && (vm_cc_tmp = switch_channel_get_variable(channel, "vm_cc")switch_channel_get_variable_dup(channel, "vm_cc", SWITCH_TRUE
, -1)
)) {
3078 vm_cc = vm_cc_tmp;
3079 }
3080 }
3081
3082 if (vm_cc) {
3083 char *vm_cc_dup;
3084 int vm_cc_num = 0;
3085 char *vm_cc_list[256] = { 0 };
3086 int vm_cc_i;
3087
3088 vm_cc_dup = strdup(vm_cc)(__extension__ (__builtin_constant_p (vm_cc) && ((size_t
)(const void *)((vm_cc) + 1) - (size_t)(const void *)(vm_cc) ==
1) ? (((const char *) (vm_cc))[0] == '\0' ? (char *) calloc (
(size_t) 1, (size_t) 1) : ({ size_t __len = strlen (vm_cc) + 1
; char *__retval = (char *) malloc (__len); if (__retval != (
(void*)0)) __retval = (char *) memcpy (__retval, vm_cc, __len
); __retval; })) : __strdup (vm_cc)))
;
3089 vm_cc_num = switch_separate_string(vm_cc_dup, ',', vm_cc_list, (sizeof(vm_cc_list) / sizeof(vm_cc_list[0])));
3090
3091 for (vm_cc_i=0; vm_cc_i<vm_cc_num; vm_cc_i++) {
3092 char *cmd, *val;
3093 const char *vm_cc_current = vm_cc_list[vm_cc_i];
3094
3095 val = strdup(caller_id_name)(__extension__ (__builtin_constant_p (caller_id_name) &&
((size_t)(const void *)((caller_id_name) + 1) - (size_t)(const
void *)(caller_id_name) == 1) ? (((const char *) (caller_id_name
))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({
size_t __len = strlen (caller_id_name) + 1; char *__retval =
(char *) malloc (__len); if (__retval != ((void*)0)) __retval
= (char *) memcpy (__retval, caller_id_name, __len); __retval
; })) : __strdup (caller_id_name)))
;
3096 switch_url_decode(val);
3097
3098 cmd = switch_mprintf("%s %s %s '%s' %s@%s %s",
3099 vm_cc_current, file_path, caller_id_number,
3100 val, myid, domain_name, read_flags);
3101
3102 free(val);
3103
3104 if (voicemail_inject(cmd, session) == SWITCH_STATUS_SUCCESS) {
3105 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3105, (const char*)(session)
, SWITCH_LOG_NOTICE, "Sent Carbon Copy to %s\n", vm_cc_current);
3106 } else {
3107 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3107, (const char*)(session)
, SWITCH_LOG_ERROR, "Failed to Carbon Copy to %s\n", vm_cc_current);
3108 }
3109 switch_safe_free(cmd)if (cmd) {free(cmd);cmd=((void*)0);};
3110 }
3111
3112 switch_safe_free(vm_cc_dup)if (vm_cc_dup) {free(vm_cc_dup);vm_cc_dup=((void*)0);};
3113 }
3114
3115
3116 failed:
3117
3118 if (!insert_db && file_path && switch_file_exists(file_path, pool) == SWITCH_STATUS_SUCCESS) {
3119 if (unlink(file_path) != 0) {
3120 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 3120, ((void*)0)
, SWITCH_LOG_WARNING, "Failed to delete file [%s]\n", file_path);
3121 }
3122 }
3123
3124 switch_event_destroy(&local_event);
3125
3126 switch_safe_free(dir_path)if (dir_path) {free(dir_path);dir_path=((void*)0);};
3127
3128 if (file_path != path) {
3129 switch_safe_free(file_path)if (file_path) {free(file_path);file_path=((void*)0);};
3130 }
3131
3132 return ret;
3133
3134}
3135
3136static switch_status_t voicemail_inject(const char *data, switch_core_session_t *session)
3137{
3138 vm_profile_t *profile;
3139 char *dup = NULL((void*)0), *user = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
3140 switch_status_t status = SWITCH_STATUS_SUCCESS;
3141 int isgroup = 0, isall = 0;
3142 int argc = 0;
3143 char *argv[6] = { 0 };
3144 char *box, *path, *cid_num, *cid_name;
3145 switch_memory_pool_t *pool = NULL((void*)0);
3146 char *forwarded_by = NULL((void*)0);
3147 char *read_flags = NORMAL_FLAG_STRING"B_NORMAL";
3148 char *dup_domain = NULL((void*)0);
3149
3150 if (zstr(data)_zstr(data)) {
3151 status = SWITCH_STATUS_FALSE;
3152 goto end;
3153 }
3154
3155 dup = strdup(data)(__extension__ (__builtin_constant_p (data) && ((size_t
)(const void *)((data) + 1) - (size_t)(const void *)(data) ==
1) ? (((const char *) (data))[0] == '\0' ? (char *) calloc (
(size_t) 1, (size_t) 1) : ({ size_t __len = strlen (data) + 1
; char *__retval = (char *) malloc (__len); if (__retval != (
(void*)0)) __retval = (char *) memcpy (__retval, data, __len)
; __retval; })) : __strdup (data)))
;
3156 switch_assert(dup)((dup) ? (void) (0) : __assert_fail ("dup", "mod_voicemail.c"
, 3156, __PRETTY_FUNCTION__))
;
3157
3158 if ((argc = switch_separate_string(dup, ' ', argv, (sizeof(argv) / sizeof(argv[0])))) < 2) {
3159 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 3159, ((void*)0)
, SWITCH_LOG_ERROR, "Not enough args [%s]\n", data);
3160 status = SWITCH_STATUS_FALSE;
3161 goto end;
3162 }
3163
3164 box = argv[0];
3165 path = argv[1];
3166 cid_num = argv[2] ? argv[2] : "anonymous";
3167 cid_name = argv[3] ? argv[3] : "anonymous";
3168 forwarded_by = argv[4];
3169 if (!zstr(argv[5])_zstr(argv[5])) {
3170 read_flags = argv[5];
3171 }
3172
3173 user = box;
3174
3175 if ((domain = strchr(user, '@')(__extension__ (__builtin_constant_p ('@') && !__builtin_constant_p
(user) && ('@') == '\0' ? (char *) __rawmemchr (user
, '@') : __builtin_strchr (user, '@')))
)) {
3176 *domain++ = '\0';
3177
3178 if ((profile_name = strchr(domain, '@')(__extension__ (__builtin_constant_p ('@') && !__builtin_constant_p
(domain) && ('@') == '\0' ? (char *) __rawmemchr (domain
, '@') : __builtin_strchr (domain, '@')))
)) {
3179 *profile_name++ = '\0';
3180 } else {
3181 profile_name = domain;
3182 }
3183 }
3184
3185 if (switch_stristr("group=", user)) {
3186 user += 6;
3187 isgroup++;
3188 } else if (switch_stristr("domain=", user)) {
3189 user += 7;
3190 domain = user;
3191 profile_name = domain;
3192 isall++;
3193 }
3194
3195 if (zstr(domain)_zstr(domain)) {
3196 if ((dup_domain = switch_core_get_domain(SWITCH_TRUE))) {
3197 domain = dup_domain;
3198 }
3199 profile_name = domain;
3200 }
3201
3202 if (!domain) {
3203 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 3203, ((void*)0)
, SWITCH_LOG_ERROR, "Invalid syntax [%s][%s]\n", switch_str_nil(user)(user ? user : ""), switch_str_nil(domain)(domain ? domain : ""));
3204 status = SWITCH_STATUS_FALSE;
3205 goto end;
3206 }
3207
3208 if (!(profile = get_profile(profile_name))) {
3209 if (!(profile = get_profile(domain))) {
3210 profile = get_profile("default");
3211 }
3212 }
3213
3214 if (!profile) {
3215 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 3215, ((void*)0)
, SWITCH_LOG_ERROR, "Can't find profile\n");
3216 status = SWITCH_STATUS_FALSE;
3217 } else {
3218 switch_xml_t x_domain, xml_root;
3219 switch_event_t *my_params = NULL((void*)0);
3220 switch_xml_t ut;
3221
3222 switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 3222, &my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
3223 switch_assert(my_params)((my_params) ? (void) (0) : __assert_fail ("my_params", "mod_voicemail.c"
, 3223, __PRETTY_FUNCTION__))
;
3224
3225 if (isgroup) {
3226 switch_event_add_header_string(my_params, SWITCH_STACK_BOTTOM, "group", user);
3227 } else {
3228 if (isall) {
3229 switch_event_add_header_string(my_params, SWITCH_STACK_BOTTOM, "user", "_all_");
3230 } else {
3231 switch_event_add_header_string(my_params, SWITCH_STACK_BOTTOM, "user", user);
3232 }
3233 }
3234
3235 if (forwarded_by) {
3236 switch_event_add_header_string(my_params, SWITCH_STACK_BOTTOM, "Forwarded-By", forwarded_by);
3237 }
3238 switch_event_add_header_string(my_params, SWITCH_STACK_BOTTOM, "domain", domain);
3239 switch_event_add_header_string(my_params, SWITCH_STACK_BOTTOM, "purpose", "publish-vm");
3240
3241 if (switch_xml_locate_domain(domain, my_params, &xml_root, &x_domain) != SWITCH_STATUS_SUCCESS) {
3242 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 3242, ((void*)0)
, SWITCH_LOG_WARNING, "Cannot locate domain %s\n", domain);
3243 status = SWITCH_STATUS_FALSE;
3244 switch_event_destroy(&my_params);
3245 profile_rwunlock(profile);
3246 goto end;
3247 }
3248
3249 switch_event_destroy(&my_params);
3250
3251 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 3251)
;
3252
3253
3254 if (isgroup) {
3255 switch_xml_t group = NULL((void*)0), groups = NULL((void*)0), users = NULL((void*)0);
3256 if ((groups = switch_xml_child(x_domain, "groups"))) {
3257 if ((group = switch_xml_find_child_multi(groups, "group", "name", user, NULL((void*)0)))) {
3258 if ((users = switch_xml_child(group, "users"))) {
3259 for (ut = switch_xml_child(users, "user"); ut; ut = ut->next) {
3260 const char *type = switch_xml_attr_soft(ut, "type");
3261
3262 if (!strcasecmp(type, "pointer")) {
3263 const char *uname = switch_xml_attr_soft(ut, "id");
3264 switch_xml_t ux;
3265
3266 if (switch_xml_locate_user_in_domain(uname, x_domain, &ux, NULL((void*)0)) == SWITCH_STATUS_SUCCESS) {
3267 switch_xml_merge_user(ux, x_domain, group);
3268 switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 3268, &my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
3269 status =
3270 deliver_vm(profile, ux, domain, path, 0, read_flags, my_params, pool, cid_name, cid_num, forwarded_by,
3271 SWITCH_TRUE, session ? switch_core_session_get_uuid(session) : NULL((void*)0), NULL((void*)0));
3272 switch_event_destroy(&my_params);
3273 }
3274 continue;
3275 }
3276
3277 switch_xml_merge_user(ut, x_domain, group);
3278 switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 3278, &my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
3279 status = deliver_vm(profile, ut, domain, path, 0, read_flags,
3280 my_params, pool, cid_name, cid_num, forwarded_by, SWITCH_TRUE,
3281 session ? switch_core_session_get_uuid(session) : NULL((void*)0), NULL((void*)0));
3282 switch_event_destroy(&my_params);
3283 }
3284 }
3285 } else {
3286 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 3286, ((void*)0)
, SWITCH_LOG_WARNING, "Cannot locate group %s\n", user);
3287 }
3288 }
3289 } else if (isall) {
3290 switch_xml_t group = NULL((void*)0), groups = NULL((void*)0), users = NULL((void*)0);
3291 if ((groups = switch_xml_child(x_domain, "groups"))) {
3292 for (group = switch_xml_child(groups, "group"); group; group = group->next) {
3293 if ((users = switch_xml_child(group, "users"))) {
3294 for (ut = switch_xml_child(users, "user"); ut; ut = ut->next) {
3295 const char *type = switch_xml_attr_soft(ut, "type");
3296
3297 if (!strcasecmp(type, "pointer")) {
3298 continue;
3299 }
3300
3301 switch_xml_merge_user(ut, x_domain, group);
3302 switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 3302, &my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
3303 status = deliver_vm(profile, ut, domain, path, 0, read_flags,
3304 my_params, pool, cid_name, cid_num, forwarded_by, SWITCH_TRUE,
3305 session ? switch_core_session_get_uuid(session) : NULL((void*)0), NULL((void*)0));
3306 switch_event_destroy(&my_params);
3307 }
3308 }
3309 }
3310 }
3311
3312 } else {
3313 switch_xml_t x_group = NULL((void*)0);
3314
3315 if ((status = switch_xml_locate_user_in_domain(user, x_domain, &ut, &x_group)) == SWITCH_STATUS_SUCCESS) {
3316 switch_xml_merge_user(ut, x_domain, x_group);
3317 switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 3317, &my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
3318 status = deliver_vm(profile, ut, domain, path, 0, read_flags,
3319 my_params, pool, cid_name, cid_num, forwarded_by, SWITCH_TRUE,
3320 session ? switch_core_session_get_uuid(session) : NULL((void*)0), NULL((void*)0));
3321 switch_event_destroy(&my_params);
3322 } else {
3323 status = SWITCH_STATUS_FALSE;
3324 }
3325 }
3326 profile_rwunlock(profile);
3327
3328 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 3328)
;
3329
3330 switch_xml_free(xml_root);
3331 }
3332
3333 end:
3334
3335 switch_safe_free(dup)if (dup) {free(dup);dup=((void*)0);};
3336 switch_safe_free(dup_domain)if (dup_domain) {free(dup_domain);dup_domain=((void*)0);};
3337
3338 return status;
3339}
3340
3341static switch_status_t voicemail_leave_main(switch_core_session_t *session, vm_profile_t *profile, const char *domain_name, const char *id)
3342{
3343 switch_channel_t *channel = switch_core_session_get_channel(session);
3344 char sql[256];
3345 prefs_callback_t cbt;
3346 switch_uuid_t tmp_uuid;
3347 char tmp_uuid_str[SWITCH_UUID_FORMATTED_LENGTH256 + 1];
3348 char *file_path = NULL((void*)0);
3349 char *dir_path = NULL((void*)0);
3350 switch_status_t status = SWITCH_STATUS_SUCCESS;
3351 switch_caller_profile_t *caller_profile = switch_channel_get_caller_profile(channel);
3352 switch_file_handle_t fh = { 0 };
3353 switch_input_args_t args = { 0 };
3354 char *vm_email = NULL((void*)0);
3355 char *vm_notify_email = NULL((void*)0);
3356 cc_t cc = { 0 };
3357 char *read_flags = NORMAL_FLAG_STRING"B_NORMAL";
3358 const char *operator_ext = switch_channel_get_variable(channel, "vm_operator_extension")switch_channel_get_variable_dup(channel, "vm_operator_extension"
, SWITCH_TRUE, -1)
;
3359 char buf[2];
3360 char key_buf[80];
3361 char *greet_path = NULL((void*)0);
3362 const char *voicemail_greeting_number = NULL((void*)0);
3363 switch_size_t message_len = 0;
3364 switch_time_exp_t tm;
3365 char date[80] = "";
3366 switch_size_t retsize;
3367 switch_time_t ts = switch_micro_time_now();
3368 char *vm_storage_dir = NULL((void*)0);
3369 char *storage_dir = NULL((void*)0);
3370 char *record_macro = VM_RECORD_MESSAGE_MACRO"voicemail_record_message";
3371 int send_main = 0;
3372 int send_notify = 0;
3373 const char *read_id = NULL((void*)0);
3374 const char *caller_id_name = NULL((void*)0);
3375 const char *caller_id_number = NULL((void*)0);
3376 switch_xml_t x_user = NULL((void*)0), x_params = NULL((void*)0), x_param = NULL((void*)0);
3377 switch_event_t *vars = NULL((void*)0);
3378 const char *vtmp, *vm_ext = NULL((void*)0);
3379 int disk_quota = 0;
3380 switch_bool_t skip_greeting = switch_true(switch_channel_get_variable(channel, "skip_greeting")switch_channel_get_variable_dup(channel, "skip_greeting", SWITCH_TRUE
, -1)
);
3381 switch_bool_t skip_instructions = switch_true(switch_channel_get_variable(channel, "skip_instructions")switch_channel_get_variable_dup(channel, "skip_instructions",
SWITCH_TRUE, -1)
);
3382 switch_bool_t skip_record_urgent_check = switch_true(switch_channel_get_variable(channel, "skip_record_urgent_check")switch_channel_get_variable_dup(channel, "skip_record_urgent_check"
, SWITCH_TRUE, -1)
);
3383 switch_bool_t vm_enabled = SWITCH_TRUE;
3384
3385 switch_channel_set_variable(channel, "skip_greeting", NULL)switch_channel_set_variable_var_check(channel, "skip_greeting"
, ((void*)0), SWITCH_TRUE)
;
3386 switch_channel_set_variable(channel, "skip_instructions", NULL)switch_channel_set_variable_var_check(channel, "skip_instructions"
, ((void*)0), SWITCH_TRUE)
;
3387 switch_channel_set_variable(channel, "skip_record_urgent_check", NULL)switch_channel_set_variable_var_check(channel, "skip_record_urgent_check"
, ((void*)0), SWITCH_TRUE)
;
3388
3389 memset(&cbt, 0, sizeof(cbt));
3390
3391 if (id) {
3392 int ok = 1;
3393 switch_event_t *locate_params = NULL((void*)0);
3394 const char *email_addr = NULL((void*)0);
3395
3396 switch_event_create(&locate_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 3396, &locate_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
3397 switch_assert(locate_params)((locate_params) ? (void) (0) : __assert_fail ("locate_params"
, "mod_voicemail.c", 3397, __PRETTY_FUNCTION__))
;
3398 switch_event_add_header_string(locate_params, SWITCH_STACK_BOTTOM, "action", "voicemail-lookup");
3399
3400 if (switch_xml_locate_user_merged("id:number-alias", id, domain_name, switch_channel_get_variable(channel, "network_addr")switch_channel_get_variable_dup(channel, "network_addr", SWITCH_TRUE
, -1)
,
3401 &x_user, locate_params) == SWITCH_STATUS_SUCCESS) {
3402 id = switch_core_session_strdup(session, switch_xml_attr(x_user, "id"))switch_core_perform_session_strdup(session, switch_xml_attr(x_user
, "id"), "mod_voicemail.c", (const char *)__func__, 3402)
;
3403
3404 if ((x_params = switch_xml_child(x_user, "params"))) {
3405 for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
3406 const char *var = switch_xml_attr_soft(x_param, "name");
3407 const char *val = switch_xml_attr_soft(x_param, "value");
3408
3409 if (!strcasecmp(var, "vm-mailto")) {
3410 vm_email = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 3410)
;
3411 } else if (!strcasecmp(var, "vm-notify-mailto")) {
3412 vm_notify_email = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 3412)
;
3413 } else if (!strcasecmp(var, "vm-skip-instructions")) {
3414 skip_instructions = switch_true(val);
3415 } else if (!strcasecmp(var, "email-addr")) {
3416 email_addr = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 3416)
;
3417 } else if (!strcasecmp(var, "vm-storage-dir")) {
3418 vm_storage_dir = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 3418)
;
3419 } else if (!strcasecmp(var, "vm-domain-storage-dir")) {
3420 storage_dir = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 3420)
;
3421 } else if (!strcasecmp(var, "storage-dir")) {
3422 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3422, (const char*)(session)
, SWITCH_LOG_WARNING,
3423 "Using deprecated 'storage-dir' directory variable: Please use 'vm-domain-storage-dir'.\n");
3424 storage_dir = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 3424)
;
3425 } else if (!strcasecmp(var, "vm-disk-quota")) {
3426 disk_quota = atoi(val);
3427 } else if (!strcasecmp(var, "vm-alternate-greet-id")) {
3428 read_id = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 3428)
;
3429 } else if (!strcasecmp(var, "vm-enabled")) {
3430 vm_enabled = !switch_false(val);
3431 } else if (!strcasecmp(var, "vm-message-ext")) {
3432 vm_ext = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 3432)
;
3433 } else if (!strcasecmp(var, "vm-operator-extension") && (zstr(operator_ext)_zstr(operator_ext))) {
3434 operator_ext = switch_core_session_strdup(session, val)switch_core_perform_session_strdup(session, val, "mod_voicemail.c"
, (const char *)__func__, 3434)
;
3435 }
3436 }
3437 }
3438
3439 if (!vm_enabled) {
3440 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3440, (const char*)(session)
, SWITCH_LOG_WARNING, "User [%s@%s] have voicemail disabled\n", id, domain_name);
3441 ok = 0;
3442 }
3443
3444 if (send_main && zstr(vm_email)_zstr(vm_email) && !zstr(email_addr)_zstr(email_addr)) {
3445 vm_email = switch_core_session_strdup(session, email_addr)switch_core_perform_session_strdup(session, email_addr, "mod_voicemail.c"
, (const char *)__func__, 3445)
;
3446 if (zstr(vm_email)_zstr(vm_email)) {
3447 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3447, (const char*)(session)
, SWITCH_LOG_WARNING, "No email address, not going to send email.\n");
3448 send_main = 0;
3449 }
3450 }
3451
3452 if (send_notify && zstr(vm_notify_email)_zstr(vm_notify_email)) {
3453 vm_notify_email = vm_email;
3454 if (zstr(vm_notify_email)_zstr(vm_notify_email)) {
3455 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3455, (const char*)(session)
, SWITCH_LOG_WARNING, "No notify email address, not going to notify.\n");
3456 send_notify = 0;
3457 }
3458 }
3459
3460 } else {
3461 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3461, (const char*)(session)
, SWITCH_LOG_WARNING, "Can't find user [%s@%s]\n", id, domain_name);
3462 ok = 0;
3463 }
3464
3465 switch_event_destroy(&locate_params);
3466
3467 if (!ok) {
3468 goto end;
3469 }
3470 }
3471
3472 if (!zstr(vm_storage_dir)_zstr(vm_storage_dir)) {
3473 /* check for absolute or relative path */
3474 if (switch_is_file_path(vm_storage_dir)) {
3475 dir_path = switch_core_session_strdup(session, vm_storage_dir)switch_core_perform_session_strdup(session, vm_storage_dir, "mod_voicemail.c"
, (const char *)__func__, 3475)
;
3476 } else {
3477 dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s", SWITCH_GLOBAL_dirs.storage_dir,
3478 SWITCH_PATH_SEPARATOR"/", SWITCH_PATH_SEPARATOR"/", vm_storage_dir);
3479 }
3480 } else if (!zstr(storage_dir)_zstr(storage_dir)) {
3481 dir_path = switch_core_session_sprintf(session, "%s%s%s", storage_dir, SWITCH_PATH_SEPARATOR"/", id);
3482 } else if (!zstr(profile->storage_dir)_zstr(profile->storage_dir)) {
3483 if (profile->storage_dir_shared) {
3484 dir_path = switch_core_session_sprintf(session, "%s%s%s%s%s%s%s", profile->storage_dir, SWITCH_PATH_SEPARATOR"/", domain_name, SWITCH_PATH_SEPARATOR"/", "voicemail", SWITCH_PATH_SEPARATOR"/", id);
3485 } else {
3486 dir_path = switch_core_session_sprintf(session, "%s%s%s%s%s", profile->storage_dir, SWITCH_PATH_SEPARATOR"/", domain_name, SWITCH_PATH_SEPARATOR"/", id);
3487 }
3488 } else {
3489 dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir,
3490 SWITCH_PATH_SEPARATOR"/",
3491 SWITCH_PATH_SEPARATOR"/", profile->name, SWITCH_PATH_SEPARATOR"/", domain_name, SWITCH_PATH_SEPARATOR"/", id);
3492 }
3493
3494 if (switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS0x0400 | 0x0200 | 0x0100 | 0x0040 | 0x0010, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
3495 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3495, (const char*)(session)
, SWITCH_LOG_ERROR, "Error creating %s\n", dir_path);
3496 goto end;
3497 }
3498
3499 switch_snprintfv(sql, sizeof(sql), "select * from voicemail_prefs where username='%q' and domain='%q'", id, domain_name);
3500 vm_execute_sql_callback(profile, profile->mutex, sql, prefs_callback, &cbt);
3501
3502 if (!vm_ext) {
3503 vm_ext = profile->file_ext;
3504 }
3505 if ((vtmp = switch_channel_get_variable(channel, "vm_message_ext")switch_channel_get_variable_dup(channel, "vm_message_ext", SWITCH_TRUE
, -1)
)) {
3506 vm_ext = vtmp;
3507 }
3508
3509 switch_uuid_get(&tmp_uuid);
3510 switch_uuid_format(tmp_uuid_str, &tmp_uuid);
3511
3512 file_path = switch_mprintf("%s%smsg_%s.%s", dir_path, SWITCH_PATH_SEPARATOR"/", tmp_uuid_str, vm_ext);
3513
3514 if ((voicemail_greeting_number = switch_channel_get_variable(channel, "voicemail_greeting_number")switch_channel_get_variable_dup(channel, "voicemail_greeting_number"
, SWITCH_TRUE, -1)
)) {
3515 int num = atoi(voicemail_greeting_number);
3516 if (num > 0 && num <= VM_MAX_GREETINGS9) {
3517 greet_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR"/", num, profile->file_ext);
3518 }
3519 } else if (!(greet_path = (char *) switch_channel_get_variable(channel, "voicemail_greeting_path")switch_channel_get_variable_dup(channel, "voicemail_greeting_path"
, SWITCH_TRUE, -1)
)) {
3520 greet_path = cbt.greeting_path;
3521 }
3522
3523 greet:
3524 if (!skip_greeting) {
3525 memset(buf, 0, sizeof(buf));
3526 args.input_callback = cancel_on_dtmf;
3527 args.buf = buf;
3528 args.buflen = sizeof(buf);
3529
3530 switch_ivr_sleep(session, 100, SWITCH_TRUE, NULL((void*)0));
3531
3532 if (switch_file_exists(greet_path, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
3533 memset(buf, 0, sizeof(buf));
3534 TRY_CODE(switch_ivr_play_file(session, NULL, greet_path, &args))do { status = switch_ivr_play_file(session, ((void*)0), greet_path
, &args); if (status != SWITCH_STATUS_SUCCESS && status
!= SWITCH_STATUS_BREAK) { goto end; } break;} while(status)
;
3535 } else {
3536 if (switch_file_exists(cbt.name_path, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
3537 memset(buf, 0, sizeof(buf));
3538 TRY_CODE(switch_ivr_play_file(session, NULL, cbt.name_path, &args))do { status = switch_ivr_play_file(session, ((void*)0), cbt.name_path
, &args); if (status != SWITCH_STATUS_SUCCESS && status
!= SWITCH_STATUS_BREAK) { goto end; } break;} while(status)
;
3539 }
3540 if (*buf == '\0') {
3541 if (!read_id) {
3542 if (!(read_id = switch_channel_get_variable(channel, "voicemail_alternate_greet_id")switch_channel_get_variable_dup(channel, "voicemail_alternate_greet_id"
, SWITCH_TRUE, -1)
)) {
3543 read_id = id;
3544 }
3545 }
3546 memset(buf, 0, sizeof(buf));
3547 TRY_CODE(switch_ivr_phrase_macro(session, VM_PLAY_GREETING_MACRO, read_id, NULL, &args))do { status = switch_ivr_phrase_macro_event(session, "voicemail_play_greeting"
, read_id, ((void*)0), ((void*)0), &args); if (status != SWITCH_STATUS_SUCCESS
&& status != SWITCH_STATUS_BREAK) { goto end; } break
;} while(status)
;
3548 }
3549 }
3550
3551 if (*buf != '\0') {
3552 greet_key_press:
3553 if (switch_stristr(buf, profile->login_keys)) {
3554 voicemail_check_main(session, profile, domain_name, id, 0, NULL((void*)0));
3555 } else if ((!zstr(profile->operator_ext)_zstr(profile->operator_ext) || !zstr(operator_ext)_zstr(operator_ext)) && !zstr(profile->operator_key)_zstr(profile->operator_key) && !strcasecmp(buf, profile->operator_key) ) {
3556 int argc;
3557 char *argv[4];
3558 char *mycmd;
3559
3560 if ((!zstr(operator_ext)_zstr(operator_ext) && (mycmd = switch_core_session_strdup(session, operator_ext)switch_core_perform_session_strdup(session, operator_ext, "mod_voicemail.c"
, (const char *)__func__, 3560)
)) ||
3561 (!zstr(profile->operator_ext)_zstr(profile->operator_ext) && (mycmd = switch_core_session_strdup(session, profile->operator_ext)switch_core_perform_session_strdup(session, profile->operator_ext
, "mod_voicemail.c", (const char *)__func__, 3561)
))) {
3562 argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
3563 if (argc >= 1 && argc <= 4) {
3564 switch_ivr_session_transfer(session, argv[0], argv[1], argv[2]);
3565 /* the application still runs after we leave it so we need to make sure that we don't do anything evil */
3566 goto end;
3567 }
3568 }
3569 } else if (!strcasecmp(buf, profile->vmain_key) && !zstr(profile->vmain_key)_zstr(profile->vmain_key)) {
3570 int argc;
3571 char *argv[4];
3572 char *mycmd;
3573
3574 if (!zstr(profile->vmain_ext)_zstr(profile->vmain_ext) && (mycmd = switch_core_session_strdup(session, profile->vmain_ext)switch_core_perform_session_strdup(session, profile->vmain_ext
, "mod_voicemail.c", (const char *)__func__, 3574)
)) {
3575 argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
3576 if (argc >= 1 && argc <= 4) {
3577 switch_ivr_session_transfer(session, argv[0], argv[1], argv[2]);
3578 /* the application still runs after we leave it so we need to make sure that we don't do anything evil */
3579 goto end;
3580 }
3581 }
3582 } else if (*profile->skip_greet_key && !strcasecmp(buf, profile->skip_greet_key)) {
3583 skip_instructions = SWITCH_TRUE;
3584 } else {
3585 goto greet;
3586 }
3587 }
3588 }
3589
3590 if (skip_instructions) {
3591 record_macro = NULL((void*)0);
3592 }
3593
3594 if (disk_quota) {
3595 callback_t callback = { 0 };
3596 char sqlstmt[256];
3597 char disk_usage[256] = "";
3598
3599 callback.buf = disk_usage;
3600 callback.len = sizeof(disk_usage);
3601
3602 switch_snprintfv(sqlstmt, sizeof(sqlstmt), "select sum(message_len) from voicemail_msgs where username='%q' and domain='%q'", id, domain_name);
3603 vm_execute_sql_callback(profile, profile->mutex, sqlstmt, sql2str_callback, &callback);
3604
3605 if (atoi(disk_usage) >= disk_quota) {
3606 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3606, (const char*)(session)
, SWITCH_LOG_NOTICE, "Voicemail disk quota is exceeded for %s\n", id);
3607 TRY_CODE(switch_ivr_phrase_macro(session, VM_DISK_QUOTA_EXCEEDED_MACRO, NULL, NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_disk_quota_exceeded"
, ((void*)0), ((void*)0), ((void*)0), ((void*)0)); if (status
!= SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
3608 goto end;
3609 }
3610 }
3611
3612
3613 memset(&fh, 0, sizeof(fh));
3614 args.input_callback = control_playback;
3615 memset(&cc, 0, sizeof(cc));
3616 cc.profile = profile;
3617 cc.fh = &fh;
3618 cc.noexit = 1;
3619 args.buf = &cc;
3620
3621 if (!(caller_id_name = switch_channel_get_variable(channel, "effective_caller_id_name")switch_channel_get_variable_dup(channel, "effective_caller_id_name"
, SWITCH_TRUE, -1)
)) {
3622 caller_id_name = caller_profile->caller_id_name;
3623 }
3624
3625 if (!(caller_id_number = switch_channel_get_variable(channel, "effective_caller_id_number")switch_channel_get_variable_dup(channel, "effective_caller_id_number"
, SWITCH_TRUE, -1)
)) {
3626 caller_id_number = caller_profile->caller_id_number;
3627 }
3628
3629 switch_channel_set_variable_printf(channel, "RECORD_ARTIST", "%s (%s)", caller_id_name, caller_id_number);
3630
3631 switch_time_exp_lt(&tm, ts);
3632 switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm);
3633 switch_channel_set_variable(channel, "RECORD_DATE", date)switch_channel_set_variable_var_check(channel, "RECORD_DATE",
date, SWITCH_TRUE)
;
3634 switch_channel_set_variable(channel, "RECORD_SOFTWARE", "FreeSWITCH")switch_channel_set_variable_var_check(channel, "RECORD_SOFTWARE"
, "FreeSWITCH", SWITCH_TRUE)
;
3635 switch_channel_set_variable(channel, "RECORD_TITLE", profile->record_title)switch_channel_set_variable_var_check(channel, "RECORD_TITLE"
, profile->record_title, SWITCH_TRUE)
;
3636 switch_channel_set_variable(channel, "RECORD_COMMENT", profile->record_comment)switch_channel_set_variable_var_check(channel, "RECORD_COMMENT"
, profile->record_comment, SWITCH_TRUE)
;
3637 switch_channel_set_variable(channel, "RECORD_COPYRIGHT", profile->record_copyright)switch_channel_set_variable_var_check(channel, "RECORD_COPYRIGHT"
, profile->record_copyright, SWITCH_TRUE)
;
3638
3639 switch_snprintf(key_buf, sizeof(key_buf), "%s:%s", profile->operator_key, profile->vmain_key);
3640 memset(buf, 0, sizeof(buf));
3641
3642 status = create_file(session, profile, record_macro, file_path, &message_len, SWITCH_TRUE, key_buf, buf);
3643
3644 if (status == SWITCH_STATUS_NOTFOUND) {
3645 goto end;
3646 }
3647
3648 if (buf[0]) {
3649 goto greet_key_press;
3650 }
3651
3652 if ((status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) && switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) {
3653 char input[10] = "", term = 0;
3654
3655 switch_snprintf(key_buf, sizeof(key_buf), "%s:%s", profile->urgent_key, profile->terminator_key);
3656 if (!skip_record_urgent_check) {
3657 (void) vm_macro_get(session, VM_RECORD_URGENT_CHECK_MACRO"voicemail_record_urgent_check", key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout);
3658 if (!switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE)) goto deliver;
3659 if (*profile->urgent_key == *input) {
3660 read_flags = URGENT_FLAG_STRING"A_URGENT";
3661 (void) switch_ivr_phrase_macro(session, VM_ACK_MACRO, "marked-urgent", NULL, NULL)switch_ivr_phrase_macro_event(session, "voicemail_ack", "marked-urgent"
, ((void*)0), ((void*)0), ((void*)0))
;
3662 } else {
3663 (void) switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)switch_ivr_phrase_macro_event(session, "voicemail_ack", "saved"
, ((void*)0), ((void*)0), ((void*)0))
;
3664 }
3665 }
3666 }
3667
3668 deliver:
3669 if (x_user) {
3670 switch_channel_get_variables(channel, &vars);
3671 status = deliver_vm(profile, x_user, domain_name, file_path, (uint32_t)message_len, read_flags, vars,
3672 switch_core_session_get_pool(session), caller_id_name, caller_id_number, NULL((void*)0), SWITCH_FALSE,
3673 switch_core_session_get_uuid(session), session);
3674 switch_event_destroy(&vars);
3675 if (status == SWITCH_STATUS_SUCCESS) {
3676 switch_core_time_duration_t duration;
3677 char duration_str[80];
3678 switch_time_t l_duration = switch_time_make(message_len, 0);
3679
3680 switch_core_measure_time(l_duration, &duration);
3681 duration.day += duration.yr * 365;
3682 duration.hr += duration.day * 24;
3683
3684 switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", duration.hr, duration.min, duration.sec);
3685
3686 switch_channel_set_variable(channel, "voicemail_account", id)switch_channel_set_variable_var_check(channel, "voicemail_account"
, id, SWITCH_TRUE)
;
3687 switch_channel_set_variable(channel, "voicemail_domain", domain_name)switch_channel_set_variable_var_check(channel, "voicemail_domain"
, domain_name, SWITCH_TRUE)
;
3688 switch_channel_set_variable(channel, "voicemail_file_path", file_path)switch_channel_set_variable_var_check(channel, "voicemail_file_path"
, file_path, SWITCH_TRUE)
;
3689 switch_channel_set_variable(channel, "voicemail_read_flags", read_flags)switch_channel_set_variable_var_check(channel, "voicemail_read_flags"
, read_flags, SWITCH_TRUE)
;
3690 switch_channel_set_variable(channel, "voicemail_message_len", duration_str)switch_channel_set_variable_var_check(channel, "voicemail_message_len"
, duration_str, SWITCH_TRUE)
;
3691 } else {
3692 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3692, (const char*)(session)
, SWITCH_LOG_ERROR, "Failed to deliver message\n");
3693 TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "deleted", NULL, NULL))do { status = switch_ivr_phrase_macro_event(session, "voicemail_ack"
, "deleted", ((void*)0), ((void*)0), ((void*)0)); if (status !=
SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK
) { goto end; } break;} while(status)
;
3694 }
3695
3696 }
3697
3698 end:
3699
3700 xml_safe_free(x_user)if (x_user) switch_xml_free(x_user); x_user = ((void*)0);
3701
3702 switch_safe_free(file_path)if (file_path) {free(file_path);file_path=((void*)0);};
3703
3704 if (switch_channel_ready(channel)switch_channel_test_ready(channel, SWITCH_TRUE, SWITCH_FALSE) && vm_enabled) {
3705 status = switch_ivr_phrase_macro(session, VM_GOODBYE_MACRO, NULL, NULL, NULL)switch_ivr_phrase_macro_event(session, "voicemail_goodbye", (
(void*)0), ((void*)0), ((void*)0), ((void*)0))
;
3706 }
3707
3708 return status;
3709}
3710
3711
3712#define VM_DESC"voicemail" "voicemail"
3713#define VM_USAGE"[check] [auth] <profile_name> <domain_name> [<id>] [uuid]" "[check] [auth] <profile_name> <domain_name> [<id>] [uuid]"
3714
3715SWITCH_STANDARD_APP(voicemail_function)static void voicemail_function (switch_core_session_t *session
, const char *data)
3716{
3717 char *argv[6] = { 0 };
3718 char *mydata = NULL((void*)0);
3719 vm_profile_t *profile = NULL((void*)0);
3720 const char *profile_name = NULL((void*)0);
3721 const char *domain_name = NULL((void*)0);
3722 const char *id = NULL((void*)0);
3723 const char *auth_var = NULL((void*)0);
3724 const char *uuid = NULL((void*)0);
3725 int x = 0, check = 0, auth = 0;
3726 switch_channel_t *channel = switch_core_session_get_channel(session);
3727
3728 if (!zstr(data)_zstr(data)) {
3729 mydata = switch_core_session_strdup(session, data)switch_core_perform_session_strdup(session, data, "mod_voicemail.c"
, (const char *)__func__, 3729)
;
3730 switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
3731 }
3732
3733 for (;;) {
3734 if (argv[x] && !strcasecmp(argv[x], "check")) {
3735 check++;
3736 x++;
3737 } else if (argv[x] && !strcasecmp(argv[x], "auth_only")) {
3738 auth = 2;
3739 x++;
3740 } else if (argv[x] && !strcasecmp(argv[x], "auth")) {
3741 auth++;
3742 x++;
3743 } else {
3744 break;
3745 }
3746 }
3747
3748 if (argv[x]) {
3749 profile_name = argv[x++];
3750 }
3751
3752 if (argv[x]) {
3753 domain_name = argv[x++];
3754 }
3755
3756 if (argv[x]) {
3757 id = argv[x++];
3758 }
3759
3760 if ((auth_var = switch_channel_get_variable(channel, "voicemail_authorized")switch_channel_get_variable_dup(channel, "voicemail_authorized"
, SWITCH_TRUE, -1)
) && switch_true(auth_var)) {
3761 auth = 1;
3762 }
3763
3764 if (zstr(profile_name)_zstr(profile_name)) {
3765 profile_name = switch_channel_get_variable(channel, "voicemail_profile_name")switch_channel_get_variable_dup(channel, "voicemail_profile_name"
, SWITCH_TRUE, -1)
;
3766 }
3767
3768 if (zstr(domain_name)_zstr(domain_name)) {
3769 domain_name = switch_channel_get_variable(channel, "voicemail_domain_name")switch_channel_get_variable_dup(channel, "voicemail_domain_name"
, SWITCH_TRUE, -1)
;
3770 }
3771
3772 if (zstr(id)_zstr(id)) {
3773 id = switch_channel_get_variable(channel, "voicemail_id")switch_channel_get_variable_dup(channel, "voicemail_id", SWITCH_TRUE
, -1)
;
3774 }
3775
3776 if (zstr(profile_name)_zstr(profile_name) || zstr(domain_name)_zstr(domain_name)) {
3777 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3777, (const char*)(session)
, SWITCH_LOG_ERROR, "Error Usage: %s\n", VM_USAGE"[check] [auth] <profile_name> <domain_name> [<id>] [uuid]");
3778 return;
3779 }
3780
3781 if (!(profile = get_profile(profile_name))) {
3782 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 3782, (const char*)(session)
, SWITCH_LOG_ERROR, "Error invalid profile %s\n", profile_name);
3783 return;
3784 }
3785
3786 if (check || auth == 2) {
3787 if (argv[x]) {
3788 uuid = argv[x++];
3789 }
3790 voicemail_check_main(session, profile, domain_name, id, auth, uuid);
3791 } else {
3792 voicemail_leave_main(session, profile, domain_name, id);
3793 }
3794
3795 profile_rwunlock(profile);
3796
3797}
3798
3799#define BOXCOUNT_SYNTAX"[profile/]<user>@<domain>[|[new|saved|new-urgent|saved-urgent|all]]" "[profile/]<user>@<domain>[|[new|saved|new-urgent|saved-urgent|all]]"
3800SWITCH_STANDARD_API(boxcount_api_function)static switch_status_t boxcount_api_function ( const char *cmd
, switch_core_session_t *session, switch_stream_handle_t *stream
)
3801{
3802 char *dup;
3803 const char *how = "new";
3804 int total_new_messages = 0;
3805 int total_saved_messages = 0;
3806 int total_new_urgent_messages = 0;
3807 int total_saved_urgent_messages = 0;
3808 vm_profile_t *profile;
3809 char *id, *domain, *p, *profilename = NULL((void*)0);
3810
3811 if (zstr(cmd)_zstr(cmd)) {
3812 stream->write_function(stream, "%d", 0);
3813 return SWITCH_STATUS_SUCCESS;
3814 }
3815
3816 id = dup = strdup(cmd)(__extension__ (__builtin_constant_p (cmd) && ((size_t
)(const void *)((cmd) + 1) - (size_t)(const void *)(cmd) == 1
) ? (((const char *) (cmd))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen (cmd) + 1; char *
__retval = (char *) malloc (__len); if (__retval != ((void*)0
)) __retval = (char *) memcpy (__retval, cmd, __len); __retval
; })) : __strdup (cmd)))
;
3817
3818 if ((p = strchr(dup, '/')(__extension__ (__builtin_constant_p ('/') && !__builtin_constant_p
(dup) && ('/') == '\0' ? (char *) __rawmemchr (dup, '/'
) : __builtin_strchr (dup, '/')))
)) {
3819 *p++ = '\0';
3820 id = p;
3821 profilename = dup;
3822 }
3823
3824 if (!strncasecmp(id, "sip:", 4)) {
3825 id += 4;
3826 }
3827
3828 if (zstr(id)_zstr(id)) {
3829 stream->write_function(stream, "%d", 0);
3830 goto done;
3831 }
3832
3833 if ((domain = strchr(id, '@')(__extension__ (__builtin_constant_p ('@') && !__builtin_constant_p
(id) && ('@') == '\0' ? (char *) __rawmemchr (id, '@'
) : __builtin_strchr (id, '@')))
)) {
3834 *domain++ = '\0';
3835 if ((p = strchr(domain, '|')(__extension__ (__builtin_constant_p ('|') && !__builtin_constant_p
(domain) && ('|') == '\0' ? (char *) __rawmemchr (domain
, '|') : __builtin_strchr (domain, '|')))
)) {
3836 *p++ = '\0';
3837 how = p;
3838 }
3839
3840 if (!zstr(profilename)_zstr(profilename)) {
3841 if ((profile = get_profile(profilename))) {
3842 message_count(profile, id, domain, "inbox", &total_new_messages, &total_saved_messages,
3843 &total_new_urgent_messages, &total_saved_urgent_messages);
3844 profile_rwunlock(profile);
3845 } else {
3846 stream->write_function(stream, "-ERR No such profile\n");
3847 goto done;
3848 }
3849 } else {
3850 /* Kept for backwards-compatibility */
3851 switch_hash_index_t *hi;
3852 switch_mutex_lock(globals.mutex);
3853 if ((hi = switch_core_hash_first(globals.profile_hash)switch_core_hash_first_iter(globals.profile_hash, ((void*)0)))) {
3854 void *val;
3855 switch_core_hash_this(hi, NULL((void*)0), NULL((void*)0), &val);
3856 profile = (vm_profile_t *) val;
3857 total_new_messages = total_saved_messages = 0;
3858 message_count(profile, id, domain, "inbox", &total_new_messages, &total_saved_messages,
3859 &total_new_urgent_messages, &total_saved_urgent_messages);
3860 }
3861 switch_mutex_unlock(globals.mutex);
3862 }
3863 }
3864
3865 if (!strcasecmp(how, "saved")) {
3866 stream->write_function(stream, "%d", total_saved_messages);
3867 } else if (!strcasecmp(how, "new-urgent")) {
3868 stream->write_function(stream, "%d", total_new_urgent_messages);
3869 } else if (!strcasecmp(how, "new-saved")) {
3870 stream->write_function(stream, "%d", total_saved_urgent_messages);
3871 } else if (!strcasecmp(how, "all")) {
3872 stream->write_function(stream, "%d:%d:%d:%d", total_new_messages, total_saved_messages, total_new_urgent_messages, total_saved_urgent_messages);
3873 } else {
3874 stream->write_function(stream, "%d", total_new_messages);
3875 }
3876
3877 done:
3878 switch_safe_free(dup)if (dup) {free(dup);dup=((void*)0);};
3879 return SWITCH_STATUS_SUCCESS;
3880}
3881
3882#define PREFS_SYNTAX"[profile/]<user>@<domain>[|[name_path|greeting_path|password]]" "[profile/]<user>@<domain>[|[name_path|greeting_path|password]]"
3883SWITCH_STANDARD_API(prefs_api_function)static switch_status_t prefs_api_function ( const char *cmd, switch_core_session_t
*session, switch_stream_handle_t *stream)
3884{
3885 char *dup = NULL((void*)0);
3886 const char *how = "greeting_path";
3887 vm_profile_t *profile = NULL((void*)0);
3888 char *id, *domain, *p, *profilename = NULL((void*)0);
3889 char sql[256];
3890 prefs_callback_t cbt = { {0} };
3891
3892 if (zstr(cmd)_zstr(cmd)) {
3893 stream->write_function(stream, "%d", 0);
3894 goto done;
3895 }
3896
3897 id = dup = strdup(cmd)(__extension__ (__builtin_constant_p (cmd) && ((size_t
)(const void *)((cmd) + 1) - (size_t)(const void *)(cmd) == 1
) ? (((const char *) (cmd))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen (cmd) + 1; char *
__retval = (char *) malloc (__len); if (__retval != ((void*)0
)) __retval = (char *) memcpy (__retval, cmd, __len); __retval
; })) : __strdup (cmd)))
;
3898
3899 if ((p = strchr(dup, '/')(__extension__ (__builtin_constant_p ('/') && !__builtin_constant_p
(dup) && ('/') == '\0' ? (char *) __rawmemchr (dup, '/'
) : __builtin_strchr (dup, '/')))
)) {
3900 *p++ = '\0';
3901 id = p;
3902 profilename = dup;
3903 }
3904
3905 if (!strncasecmp(id, "sip:", 4)) {
3906 id += 4;
3907 }
3908
3909 if (zstr(id)_zstr(id)) {
3910 stream->write_function(stream, "%d", 0);
3911 goto done;
3912 }
3913
3914 if ((domain = strchr(id, '@')(__extension__ (__builtin_constant_p ('@') && !__builtin_constant_p
(id) && ('@') == '\0' ? (char *) __rawmemchr (id, '@'
) : __builtin_strchr (id, '@')))
)) {
3915 *domain++ = '\0';
3916 if ((p = strchr(domain, '|')(__extension__ (__builtin_constant_p ('|') && !__builtin_constant_p
(domain) && ('|') == '\0' ? (char *) __rawmemchr (domain
, '|') : __builtin_strchr (domain, '|')))
)) {
3917 *p++ = '\0';
3918 how = p;
3919 }
3920
3921 if (!zstr(profilename)_zstr(profilename) && !(profile = get_profile(profilename))) {
3922 stream->write_function(stream, "-ERR No such profile\n");
3923 goto done;
3924 }
3925 if (!profile && !(profile = get_profile("default"))) {
3926 stream->write_function(stream, "-ERR profile 'default' doesn't exist\n");
3927 goto done;
3928 }
3929 } else {
3930 stream->write_function(stream, "-ERR No domain specified\n");
3931 goto done;
3932
3933 }
3934
3935 switch_snprintfv(sql, sizeof(sql), "select * from voicemail_prefs where username='%q' and domain='%q'", id, domain);
3936 vm_execute_sql_callback(profile, profile->mutex, sql, prefs_callback, &cbt);
3937
3938 if (!strcasecmp(how, "greeting_path")) {
3939 stream->write_function(stream, "%s", cbt.greeting_path);
3940 } else if (!strcasecmp(how, "name_path")) {
3941 stream->write_function(stream, "%s", cbt.name_path);
3942 } else if (!strcasecmp(how, "password")) {
3943 stream->write_function(stream, "%s", cbt.password);
3944 } else {
3945 stream->write_function(stream, "%s:%s:%s", cbt.greeting_path, cbt.name_path, cbt.password);
3946 }
3947 profile_rwunlock(profile);
3948 done:
3949 switch_safe_free(dup)if (dup) {free(dup);dup=((void*)0);};
3950 return SWITCH_STATUS_SUCCESS;
3951}
3952
3953#define parse_profile(){ 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_subclass_detailed
("mod_voicemail.c", (const char * )(const char *)__func__, 3953
, &new_event, SWITCH_EVENT_MESSAGE_WAITING, ((void*)0)) ==
SWITCH_STATUS_SUCCESS) { const char *yn = "no"; if (total_new_messages
|| total_new_urgent_messages) { yn = "yes"; } switch_event_add_header_string
(new_event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", yn);
switch_event_add_header_string(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); } } }
{\
3954 total_new_messages = total_saved_messages = 0; \
3955 message_count(profile, id, domain, "inbox", &total_new_messages, &total_saved_messages, \
3956 &total_new_urgent_messages, &total_saved_urgent_messages); \
3957 if (total_new_messages || total_saved_messages) { \
3958 if (switch_event_create(&new_event, SWITCH_EVENT_MESSAGE_WAITING)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 3958, &new_event, SWITCH_EVENT_MESSAGE_WAITING
, ((void*)0))
== SWITCH_STATUS_SUCCESS) { \
3959 const char *yn = "no"; \
3960 if (total_new_messages || total_new_urgent_messages) { \
3961 yn = "yes"; \
3962 } \
3963 switch_event_add_header_string(new_event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", yn); \
3964 switch_event_add_header_string(new_event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", account); \
3965 switch_event_add_header(new_event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d (%d/%d)", \
3966 +total_new_messages, total_saved_messages, total_new_urgent_messages, total_saved_urgent_messages); \
3967 } \
3968 } \
3969 }
3970
3971
3972static void actual_message_query_handler(switch_event_t *event)
3973{
3974 char *account = switch_event_get_header(event, "message-account")switch_event_get_header_idx(event, "message-account", -1);
3975 switch_event_t *new_event = NULL((void*)0);
3976 char *dup = NULL((void*)0);
3977 int total_new_messages = 0;
3978 int total_saved_messages = 0;
3979 int total_new_urgent_messages = 0;
3980 int total_saved_urgent_messages = 0;
3981
3982 if (account) {
3983 switch_hash_index_t *hi;
3984 void *val;
3985 vm_profile_t *profile;
3986 char *id, *domain;
3987
3988 dup = strdup(account)(__extension__ (__builtin_constant_p (account) && ((size_t
)(const void *)((account) + 1) - (size_t)(const void *)(account
) == 1) ? (((const char *) (account))[0] == '\0' ? (char *) calloc
((size_t) 1, (size_t) 1) : ({ size_t __len = strlen (account
) + 1; char *__retval = (char *) malloc (__len); if (__retval
!= ((void*)0)) __retval = (char *) memcpy (__retval, account
, __len); __retval; })) : __strdup (account)))
;
3989
3990 switch_split_user_domain(dup, &id, &domain);
3991
3992 if (!id || !domain) {
3993 free(dup);
3994 return;
3995 }
3996
3997 profile = NULL((void*)0);
3998
3999 if (globals.message_query_exact_match) {
4000 if ((profile = (vm_profile_t *) switch_core_hash_find(globals.profile_hash, domain))) {
4001 parse_profile(){ 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_subclass_detailed
("mod_voicemail.c", (const char * )(const char *)__func__, 4001
, &new_event, SWITCH_EVENT_MESSAGE_WAITING, ((void*)0)) ==
SWITCH_STATUS_SUCCESS) { const char *yn = "no"; if (total_new_messages
|| total_new_urgent_messages) { yn = "yes"; } switch_event_add_header_string
(new_event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", yn);
switch_event_add_header_string(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); } } }
;
4002 } else {
4003 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 4003, ((void*)0)
, SWITCH_LOG_WARNING,
4004 "Cound not find a profile for domain: [%s] Returning 0 messages\nWhen message-query-exact-match is enabled you must have a dedicated vm profile per distinct domain name you wish to use.\n", domain);
4005 }
4006 } else {
4007 for (hi = switch_core_hash_first(globals.profile_hash)switch_core_hash_first_iter(globals.profile_hash, ((void*)0)); hi; hi = switch_core_hash_next(&hi)) {
4008 switch_core_hash_this(hi, NULL((void*)0), NULL((void*)0), &val);
4009 profile = (vm_profile_t *) val;
4010 parse_profile(){ 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_subclass_detailed
("mod_voicemail.c", (const char * )(const char *)__func__, 4010
, &new_event, SWITCH_EVENT_MESSAGE_WAITING, ((void*)0)) ==
SWITCH_STATUS_SUCCESS) { const char *yn = "no"; if (total_new_messages
|| total_new_urgent_messages) { yn = "yes"; } switch_event_add_header_string
(new_event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", yn);
switch_event_add_header_string(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); } } }
;
4011
4012 if (new_event) {
4013 break;
4014 }
4015 }
4016 switch_safe_free(hi)if (hi) {free(hi);hi=((void*)0);};
4017 }
4018
4019 switch_safe_free(dup)if (dup) {free(dup);dup=((void*)0);};
4020
4021 }
4022
4023 if (!new_event) {
4024 if (switch_event_create(&new_event, SWITCH_EVENT_MESSAGE_WAITING)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 4024, &new_event, SWITCH_EVENT_MESSAGE_WAITING
, ((void*)0))
== SWITCH_STATUS_SUCCESS) {
4025 switch_event_add_header_string(new_event, SWITCH_STACK_BOTTOM, "MWI-Messages-Waiting", "no");
4026 switch_event_add_header_string(new_event, SWITCH_STACK_BOTTOM, "MWI-Message-Account", account);
4027 }
4028 }
4029
4030 if (new_event) {
4031 switch_event_header_t *hp;
4032
4033 for (hp = event->headers; hp; hp = hp->next) {
4034 if (!strncasecmp(hp->name, "vm-", 3)) {
4035 switch_event_add_header_string(new_event, SWITCH_STACK_BOTTOM, hp->name + 3, hp->value);
4036 }
4037 }
4038
4039 switch_event_fire(&new_event)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 4039, &new_event, ((void*)0))
;
4040 }
4041
4042
4043}
4044
4045static int EVENT_THREAD_RUNNING = 0;
4046static int EVENT_THREAD_STARTED = 0;
4047
4048void *SWITCH_THREAD_FUNC vm_event_thread_run(switch_thread_t *thread, void *obj)
4049{
4050 void *pop;
4051 int done = 0;
4052
4053 switch_mutex_lock(globals.mutex);
4054 if (!EVENT_THREAD_RUNNING) {
4055 EVENT_THREAD_RUNNING++;
4056 globals.threads++;
4057 } else {
4058 done = 1;
4059 }
4060 switch_mutex_unlock(globals.mutex);
4061
4062 if (done) {
4063 return NULL((void*)0);
4064 }
4065
4066 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 4066, ((void*)0)
, SWITCH_LOG_CONSOLE, "Event Thread Started\n");
4067
4068 while (globals.running == 1) {
4069 int count = 0;
4070
4071 if (switch_queue_trypop(globals.event_queue, &pop) == SWITCH_STATUS_SUCCESS) {
4072 switch_event_t *event = (switch_event_t *) pop;
4073
4074 if (!pop) {
4075 break;
4076 }
4077 actual_message_query_handler(event);
4078 switch_event_destroy(&event);
4079 count++;
4080 }
4081
4082 if (!count) {
4083 switch_yield(100000)switch_sleep(100000);;
4084 }
4085 }
4086
4087 while (switch_queue_trypop(globals.event_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
4088 switch_event_t *event = (switch_event_t *) pop;
4089 switch_event_destroy(&event);
4090 }
4091
4092
4093 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 4093, ((void*)0)
, SWITCH_LOG_CONSOLE, "Event Thread Ended\n");
4094
4095 switch_mutex_lock(globals.mutex);
4096 globals.threads--;
4097 EVENT_THREAD_RUNNING = EVENT_THREAD_STARTED = 0;
4098 switch_mutex_unlock(globals.mutex);
4099
4100 return NULL((void*)0);
4101}
4102
4103void vm_event_thread_start(void)
4104{
4105 switch_thread_t *thread;
4106 switch_threadattr_t *thd_attr = NULL((void*)0);
4107 int done = 0;
4108
4109 switch_mutex_lock(globals.mutex);
4110 if (!EVENT_THREAD_STARTED) {
4111 EVENT_THREAD_STARTED++;
4112 } else {
4113 done = 1;
4114 }
4115 switch_mutex_unlock(globals.mutex);
4116
4117 if (done) {
4118 return;
4119 }
4120
4121 switch_threadattr_create(&thd_attr, globals.pool);
4122 switch_threadattr_detach_set(thd_attr, 1);
4123 switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE240 * 1024);
4124 switch_threadattr_priority_set(thd_attr, SWITCH_PRI_IMPORTANT);
4125 switch_thread_create(&thread, thd_attr, vm_event_thread_run, NULL((void*)0), globals.pool);
4126}
4127
4128void vm_event_handler(switch_event_t *event)
4129{
4130 switch_event_t *cloned_event;
4131
4132 switch_event_dup(&cloned_event, event);
4133 switch_assert(cloned_event)((cloned_event) ? (void) (0) : __assert_fail ("cloned_event",
"mod_voicemail.c", 4133, __PRETTY_FUNCTION__))
;
4134 switch_queue_push(globals.event_queue, cloned_event);
4135
4136 if (!EVENT_THREAD_STARTED) {
4137 vm_event_thread_start();
4138 }
4139}
4140
4141struct holder {
4142 vm_profile_t *profile;
4143 switch_memory_pool_t *pool;
4144 switch_stream_handle_t *stream;
4145 switch_xml_t xml;
4146 switch_xml_t x_item;
4147 switch_xml_t x_channel;
4148 int items;
4149 const char *user;
4150 const char *domain;
4151 const char *host;
4152 const char *port;
4153 const char *uri;
4154};
4155
4156
4157static int del_callback(void *pArg, int argc, char **argv, char **columnNames)
4158{
4159 if (argc > 8) {
4160 if (unlink(argv[8]) != 0) {
4161 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 4161, ((void*)0)
, SWITCH_LOG_WARNING, "Failed to delete file [%s]\n", argv[8]);
4162 }
4163 }
4164 return 0;
4165}
4166
4167static int play_callback(void *pArg, int argc, char **argv, char **columnNames)
4168{
4169 switch_file_t *fd;
4170 struct holder *holder = (struct holder *) pArg;
4171 char *fname, *ext;
4172 switch_size_t flen;
4173 uint8_t chunk[1024];
4174 const char *mime_type = "audio/inline", *new_type;
4175
4176 if ((fname = strrchr(argv[8], '/'))) {
4177 fname++;
4178 } else {
4179 fname = argv[8];
4180 }
4181
4182 if ((ext = strrchr(fname, '.'))) {
4183 ext++;
4184 if ((new_type = switch_core_mime_ext2type(ext))) {
4185 mime_type = new_type;
4186 }
4187 }
4188
4189 if (switch_file_open(&fd, argv[8], SWITCH_FOPEN_READ0x00001, SWITCH_FPROT_UREAD0x0400 | SWITCH_FPROT_UWRITE0x0200, holder->pool) == SWITCH_STATUS_SUCCESS) {
4190 flen = switch_file_get_size(fd);
4191 holder->stream->write_function(holder->stream, "Content-type: %s\n", mime_type);
4192 holder->stream->write_function(holder->stream, "Content-length: %ld\n\n", (long) flen);
4193 for (;;) {
4194 switch_status_t status;
4195
4196 flen = sizeof(chunk);
4197 status = switch_file_read(fd, chunk, &flen);
4198 if (status != SWITCH_STATUS_SUCCESS || flen == 0) {
4199 break;
4200 }
4201
4202 holder->stream->raw_write_function(holder->stream, chunk, flen);
4203 }
4204 switch_file_close(fd);
4205 }
4206 return 0;
4207}
4208
4209static void do_play(vm_profile_t *profile, char *user_in, char *domain, char *file, switch_stream_handle_t *stream)
4210{
4211 char *sql;
4212 struct holder holder;
4213 char *user;
4214
4215 user = resolve_id(user_in, domain, "web-vm");
4216
4217 sql = switch_mprintf("update voicemail_msgs set read_epoch=%ld where username='%s' and domain='%s' and file_path like '%%%s'",
4218 (long) switch_epoch_time_now(NULL((void*)0)), user, domain, file);
4219
4220 vm_execute_sql(profile, sql, profile->mutex);
4221 free(sql);
4222
4223 sql = switch_mprintf("select created_epoch, read_epoch, username, domain, uuid, cid_name, cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by from voicemail_msgs where username='%s' and domain='%s' and file_path like '%%%s' order by created_epoch",
4224 user, domain, file);
4225 memset(&holder, 0, sizeof(holder));
4226 holder.profile = profile;
4227 holder.stream = stream;
4228 switch_core_new_memory_pool(&holder.pool)switch_core_perform_new_memory_pool(&holder.pool, "mod_voicemail.c"
, (const char *)__func__, 4228)
;
4229 vm_execute_sql_callback(profile, profile->mutex, sql, play_callback, &holder);
4230 switch_core_destroy_memory_pool(&holder.pool)switch_core_perform_destroy_memory_pool(&holder.pool, "mod_voicemail.c"
, (const char *)__func__, 4230)
;
4231 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
4232}
4233
4234
4235static void do_del(vm_profile_t *profile, char *user_in, char *domain, char *file, switch_stream_handle_t *stream)
4236{
4237 char *myfolder = "inbox";
4238 char *sql;
4239 struct holder holder;
4240 char *ref = NULL((void*)0);
4241 char *user;
4242
4243 user = resolve_id(user_in, domain, "web-vm");
4244
4245 if (stream->param_event) {
4246 ref = switch_event_get_header(stream->param_event, "http-referer")switch_event_get_header_idx(stream->param_event, "http-referer"
, -1)
;
4247 }
4248
4249 sql = switch_mprintf("select created_epoch, read_epoch, username, domain, uuid, cid_name, cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by from voicemail_msgs where username='%s' and domain='%s' and file_path like '%%%s' order by created_epoch",
4250 user, domain, file);
4251 memset(&holder, 0, sizeof(holder));
4252 holder.profile = profile;
4253 holder.stream = stream;
4254 vm_execute_sql_callback(profile, profile->mutex, sql, del_callback, &holder);
4255
4256 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
4257 sql = switch_mprintf("delete from voicemail_msgs where username='%s' and domain='%s' and file_path like '%%%s'", user, domain, file);
4258 vm_execute_sql(profile, sql, profile->mutex);
4259 free(sql);
4260
4261 update_mwi(profile, user, domain, myfolder, MWI_REASON_DELETE);
4262
4263 if (ref) {
4264 stream->write_function(stream, "Content-type: text/html\n\n<h2>Message Deleted</h2>\n" "<META http-equiv=\"refresh\" content=\"1;URL=%s\">", ref);
4265 }
4266}
4267
4268
4269static int web_callback(void *pArg, int argc, char **argv, char **columnNames)
4270{
4271 struct holder *holder = (struct holder *) pArg;
4272 char *del, *get, *fname, *ext;
4273 switch_time_exp_t tm;
4274 char create_date[80] = "";
4275 char read_date[80] = "";
4276 char rss_date[80] = "";
4277 switch_size_t retsize;
4278 switch_time_t l_created = 0;
4279 switch_time_t l_read = 0;
4280 switch_time_t l_duration = 0;
4281 switch_core_time_duration_t duration;
4282 char duration_str[80];
4283 const char *fmt = "%a, %e %b %Y %T %z";
4284 char heard[80];
4285 char title_b4[128] = "";
4286 char title_aft[128 * 3 + 1] = "";
4287
4288 if (argc > 0) {
4289 l_created = switch_time_make(atol(argv[0]), 0);
4290 }
4291
4292 if (argc > 1) {
4293 l_read = switch_time_make(atol(argv[1]), 0);
4294 }
4295
4296 if (argc > 9) {
4297 l_duration = switch_time_make(atol(argv[9]), 0);
4298 }
4299
4300 if ((fname = strrchr(argv[8], '/'))) {
4301 fname++;
4302 } else {
4303 fname = argv[8];
4304 }
4305
4306 if ((ext = strrchr(fname, '.'))) {
4307 ext++;
4308 }
4309
4310 switch_core_measure_time(l_duration, &duration);
4311 duration.day += duration.yr * 365;
4312 duration.hr += duration.day * 24;
4313
4314 switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", duration.hr, duration.min, duration.sec);
4315
4316 if (l_created) {
4317 switch_time_exp_lt(&tm, l_created);
4318 switch_strftime_nocheck(create_date, &retsize, sizeof(create_date), fmt, &tm);
4319 switch_strftime_nocheck(rss_date, &retsize, sizeof(create_date), "%D %T", &tm);
4320 }
4321
4322 if (l_read) {
4323 switch_time_exp_lt(&tm, l_read);
4324 switch_strftime_nocheck(read_date, &retsize, sizeof(read_date), fmt, &tm);
4325 }
4326
4327 switch_snprintf(heard, sizeof(heard), *read_date == '\0' ? "never" : read_date);
4328
4329 get = switch_mprintf("http://%s:%s%s/get/%s", holder->host, holder->port, holder->uri, fname);
4330 del = switch_mprintf("http://%s:%s%s/del/%s", holder->host, holder->port, holder->uri, fname);
4331
4332 holder->stream->write_function(holder->stream, "<font face=tahoma><div class=title><b>Message from %s %s</b></div><hr noshade size=1>\n",
4333 argv[5], argv[6]);
4334 holder->stream->write_function(holder->stream, "Priority: %s<br>\n" "Created: %s<br>\n" "Last Heard: %s<br>\n" "Duration: %s<br>\n",
4335 //"<a href=%s>Delete This Message</a><br><hr noshade size=1>",
4336 strcmp(argv[10], URGENT_FLAG_STRING)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(argv[10]) && __builtin_constant_p ("A_URGENT") &&
(__s1_len = __builtin_strlen (argv[10]), __s2_len = __builtin_strlen
("A_URGENT"), (!((size_t)(const void *)((argv[10]) + 1) - (size_t
)(const void *)(argv[10]) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)(("A_URGENT") + 1) - (size_t)(const
void *)("A_URGENT") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(argv[10], "A_URGENT") : (__builtin_constant_p (argv[10]) &&
((size_t)(const void *)((argv[10]) + 1) - (size_t)(const void
*)(argv[10]) == 1) && (__s1_len = __builtin_strlen (
argv[10]), __s1_len < 4) ? (__builtin_constant_p ("A_URGENT"
) && ((size_t)(const void *)(("A_URGENT") + 1) - (size_t
)(const void *)("A_URGENT") == 1) ? __builtin_strcmp (argv[10
], "A_URGENT") : (__extension__ ({ const unsigned char *__s2 =
(const unsigned char *) (const char *) ("A_URGENT"); int __result
= (((const unsigned char *) (const char *) (argv[10]))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (argv[10]))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (argv[10]))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (argv[10]))[3] - __s2
[3]); } } __result; }))) : (__builtin_constant_p ("A_URGENT")
&& ((size_t)(const void *)(("A_URGENT") + 1) - (size_t
)(const void *)("A_URGENT") == 1) && (__s2_len = __builtin_strlen
("A_URGENT"), __s2_len < 4) ? (__builtin_constant_p (argv
[10]) && ((size_t)(const void *)((argv[10]) + 1) - (size_t
)(const void *)(argv[10]) == 1) ? __builtin_strcmp (argv[10],
"A_URGENT") : (- (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) (argv[10]); int __result
= (((const unsigned char *) (const char *) ("A_URGENT"))[0] -
__s2[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("A_URGENT"))[1] -
__s2[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("A_URGENT"))[2] -
__s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) ("A_URGENT"))[3] -
__s2[3]); } } __result; })))) : __builtin_strcmp (argv[10], "A_URGENT"
)))); })
? "normal" : "urgent", create_date, heard, duration_str);
4337
4338 switch_snprintf(title_b4, sizeof(title_b4), "%s <%s> %s", argv[5], argv[6], rss_date);
4339 switch_url_encode(title_b4, title_aft, sizeof(title_aft));
4340
4341 holder->stream->write_function(holder->stream,
4342 "<br><object width=550 height=15 \n"
4343 "type=\"application/x-shockwave-flash\" \n"
4344 "data=\"http://%s:%s/pub/slim.swf?song_url=%s&player_title=%s\">\n"
4345 "<param name=movie value=\"http://%s:%s/pub/slim.swf?song_url=%s&player_title=%s\"></object><br><br>\n"
4346 "[<a href=%s>delete</a>] [<a href=%s>download</a>] [<a href=tel:%s>call</a>] <br><br><br></font>\n",
4347 holder->host, holder->port, get, title_aft, holder->host, holder->port, get, title_aft, del, get, argv[6]);
4348
4349 free(get);
4350 free(del);
4351
4352 return 0;
4353}
4354
4355static int rss_callback(void *pArg, int argc, char **argv, char **columnNames)
4356{
4357 struct holder *holder = (struct holder *) pArg;
4358 switch_xml_t x_tmp, x_link;
4359 char *tmp, *del, *get;
4360 switch_time_exp_t tm;
4361 char create_date[80] = "";
4362 char read_date[80] = "";
4363 char rss_date[80] = "";
4364 switch_size_t retsize;
4365 const char *mime_type = "audio/inline", *new_type;
4366 char *ext;
4367 char *fname;
4368 switch_size_t flen;
4369 switch_file_t *fd;
4370 switch_time_t l_created = 0;
4371 switch_time_t l_read = 0;
4372 switch_time_t l_duration = 0;
4373 switch_core_time_duration_t duration;
4374 char duration_str[80];
4375 const char *fmt = "%a, %e %b %Y %T %z";
4376 char heard[80];
4377
4378 if (argc > 0) {
4379 l_created = switch_time_make(atol(argv[0]), 0);
4380 }
4381
4382 if (argc > 1) {
4383 l_read = switch_time_make(atol(argv[1]), 0);
4384 }
4385
4386 if (argc > 9) {
4387 l_duration = switch_time_make(atol(argv[9]), 0);
4388 }
4389
4390 switch_core_measure_time(l_duration, &duration);
4391 duration.day += duration.yr * 365;
4392 duration.hr += duration.day * 24;
4393
4394 switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", duration.hr, duration.min, duration.sec);
4395
4396 if (l_created) {
4397 switch_time_exp_lt(&tm, l_created);
4398 switch_strftime_nocheck(create_date, &retsize, sizeof(create_date), fmt, &tm);
4399 switch_strftime_nocheck(rss_date, &retsize, sizeof(create_date), fmt, &tm);
4400 }
4401
4402 if (l_read) {
4403 switch_time_exp_lt(&tm, l_read);
4404 switch_strftime_nocheck(read_date, &retsize, sizeof(read_date), fmt, &tm);
4405 }
4406
4407 holder->x_item = switch_xml_add_child_d(holder->x_channel, "item", holder->items++)switch_xml_set_flag(switch_xml_add_child(holder->x_channel
, (__extension__ (__builtin_constant_p ("item") && ((
size_t)(const void *)(("item") + 1) - (size_t)(const void *)(
"item") == 1) ? (((const char *) ("item"))[0] == '\0' ? (char
*) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen
("item") + 1; char *__retval = (char *) malloc (__len); if (
__retval != ((void*)0)) __retval = (char *) memcpy (__retval,
"item", __len); __retval; })) : __strdup ("item"))), holder->
items++), SWITCH_XML_NAMEM)
;
4408
4409 x_tmp = switch_xml_add_child_d(holder->x_item, "title", 0)switch_xml_set_flag(switch_xml_add_child(holder->x_item, (
__extension__ (__builtin_constant_p ("title") && ((size_t
)(const void *)(("title") + 1) - (size_t)(const void *)("title"
) == 1) ? (((const char *) ("title"))[0] == '\0' ? (char *) calloc
((size_t) 1, (size_t) 1) : ({ size_t __len = strlen ("title"
) + 1; char *__retval = (char *) malloc (__len); if (__retval
!= ((void*)0)) __retval = (char *) memcpy (__retval, "title"
, __len); __retval; })) : __strdup ("title"))), 0), SWITCH_XML_NAMEM
)
;
4410 tmp = switch_mprintf("Message from %s %s on %s", argv[5], argv[6], create_date);
4411 switch_xml_set_txt_d(x_tmp, tmp)switch_xml_set_flag(switch_xml_set_txt(x_tmp, (__extension__ (
__builtin_constant_p (tmp) && ((size_t)(const void *)
((tmp) + 1) - (size_t)(const void *)(tmp) == 1) ? (((const char
*) (tmp))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t)
1) : ({ size_t __len = strlen (tmp) + 1; char *__retval = (char
*) malloc (__len); if (__retval != ((void*)0)) __retval = (char
*) memcpy (__retval, tmp, __len); __retval; })) : __strdup (
tmp)))), SWITCH_XML_TXTM)
;
4412 free(tmp);
4413
4414 x_tmp = switch_xml_add_child_d(holder->x_item, "description", 0)switch_xml_set_flag(switch_xml_add_child(holder->x_item, (
__extension__ (__builtin_constant_p ("description") &&
((size_t)(const void *)(("description") + 1) - (size_t)(const
void *)("description") == 1) ? (((const char *) ("description"
))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({
size_t __len = strlen ("description") + 1; char *__retval = (
char *) malloc (__len); if (__retval != ((void*)0)) __retval =
(char *) memcpy (__retval, "description", __len); __retval; }
)) : __strdup ("description"))), 0), SWITCH_XML_NAMEM)
;
4415
4416 switch_snprintf(heard, sizeof(heard), *read_date == '\0' ? "never" : read_date);
4417
4418 if ((fname = strrchr(argv[8], '/'))) {
4419 fname++;
4420 } else {
4421 fname = argv[8];
4422 }
4423
4424 get = switch_mprintf("http://%s:%s%s/get/%s", holder->host, holder->port, holder->uri, fname);
4425 del = switch_mprintf("http://%s:%s%s/del/%s", holder->host, holder->port, holder->uri, fname);
4426 x_link = switch_xml_add_child_d(holder->x_item, "fsvm:rmlink", 0)switch_xml_set_flag(switch_xml_add_child(holder->x_item, (
__extension__ (__builtin_constant_p ("fsvm:rmlink") &&
((size_t)(const void *)(("fsvm:rmlink") + 1) - (size_t)(const
void *)("fsvm:rmlink") == 1) ? (((const char *) ("fsvm:rmlink"
))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({
size_t __len = strlen ("fsvm:rmlink") + 1; char *__retval = (
char *) malloc (__len); if (__retval != ((void*)0)) __retval =
(char *) memcpy (__retval, "fsvm:rmlink", __len); __retval; }
)) : __strdup ("fsvm:rmlink"))), 0), SWITCH_XML_NAMEM)
;
4427 switch_xml_set_txt_d(x_link, del)switch_xml_set_flag(switch_xml_set_txt(x_link, (__extension__
(__builtin_constant_p (del) && ((size_t)(const void *
)((del) + 1) - (size_t)(const void *)(del) == 1) ? (((const char
*) (del))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t)
1) : ({ size_t __len = strlen (del) + 1; char *__retval = (char
*) malloc (__len); if (__retval != ((void*)0)) __retval = (char
*) memcpy (__retval, del, __len); __retval; })) : __strdup (
del)))), SWITCH_XML_TXTM)
;
4428
4429 tmp = switch_mprintf("<![CDATA[Priority: %s<br>"
4430 "Last Heard: %s<br>Duration: %s<br>"
4431 "<a href=%s>Delete This Message</a><br>"
4432 "]]>", strcmp(argv[10], URGENT_FLAG_STRING)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(argv[10]) && __builtin_constant_p ("A_URGENT") &&
(__s1_len = __builtin_strlen (argv[10]), __s2_len = __builtin_strlen
("A_URGENT"), (!((size_t)(const void *)((argv[10]) + 1) - (size_t
)(const void *)(argv[10]) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)(("A_URGENT") + 1) - (size_t)(const
void *)("A_URGENT") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(argv[10], "A_URGENT") : (__builtin_constant_p (argv[10]) &&
((size_t)(const void *)((argv[10]) + 1) - (size_t)(const void
*)(argv[10]) == 1) && (__s1_len = __builtin_strlen (
argv[10]), __s1_len < 4) ? (__builtin_constant_p ("A_URGENT"
) && ((size_t)(const void *)(("A_URGENT") + 1) - (size_t
)(const void *)("A_URGENT") == 1) ? __builtin_strcmp (argv[10
], "A_URGENT") : (__extension__ ({ const unsigned char *__s2 =
(const unsigned char *) (const char *) ("A_URGENT"); int __result
= (((const unsigned char *) (const char *) (argv[10]))[0] - __s2
[0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (argv[10]))[1] - __s2
[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (argv[10]))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (argv[10]))[3] - __s2
[3]); } } __result; }))) : (__builtin_constant_p ("A_URGENT")
&& ((size_t)(const void *)(("A_URGENT") + 1) - (size_t
)(const void *)("A_URGENT") == 1) && (__s2_len = __builtin_strlen
("A_URGENT"), __s2_len < 4) ? (__builtin_constant_p (argv
[10]) && ((size_t)(const void *)((argv[10]) + 1) - (size_t
)(const void *)(argv[10]) == 1) ? __builtin_strcmp (argv[10],
"A_URGENT") : (- (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) (argv[10]); int __result
= (((const unsigned char *) (const char *) ("A_URGENT"))[0] -
__s2[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("A_URGENT"))[1] -
__s2[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("A_URGENT"))[2] -
__s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) ("A_URGENT"))[3] -
__s2[3]); } } __result; })))) : __builtin_strcmp (argv[10], "A_URGENT"
)))); })
? "normal" : "urgent", heard, duration_str, del);
4433
4434 switch_xml_set_txt_d(x_tmp, tmp)switch_xml_set_flag(switch_xml_set_txt(x_tmp, (__extension__ (
__builtin_constant_p (tmp) && ((size_t)(const void *)
((tmp) + 1) - (size_t)(const void *)(tmp) == 1) ? (((const char
*) (tmp))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t)
1) : ({ size_t __len = strlen (tmp) + 1; char *__retval = (char
*) malloc (__len); if (__retval != ((void*)0)) __retval = (char
*) memcpy (__retval, tmp, __len); __retval; })) : __strdup (
tmp)))), SWITCH_XML_TXTM)
;
4435 free(tmp);
4436 free(del);
4437
4438 x_tmp = switch_xml_add_child_d(holder->x_item, "pubDate", 0)switch_xml_set_flag(switch_xml_add_child(holder->x_item, (
__extension__ (__builtin_constant_p ("pubDate") && ((
size_t)(const void *)(("pubDate") + 1) - (size_t)(const void *
)("pubDate") == 1) ? (((const char *) ("pubDate"))[0] == '\0'
? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len
= strlen ("pubDate") + 1; char *__retval = (char *) malloc (
__len); if (__retval != ((void*)0)) __retval = (char *) memcpy
(__retval, "pubDate", __len); __retval; })) : __strdup ("pubDate"
))), 0), SWITCH_XML_NAMEM)
;
4439 switch_xml_set_txt_d(x_tmp, rss_date)switch_xml_set_flag(switch_xml_set_txt(x_tmp, (__extension__ (
__builtin_constant_p (rss_date) && ((size_t)(const void
*)((rss_date) + 1) - (size_t)(const void *)(rss_date) == 1) ?
(((const char *) (rss_date))[0] == '\0' ? (char *) calloc ((
size_t) 1, (size_t) 1) : ({ size_t __len = strlen (rss_date) +
1; char *__retval = (char *) malloc (__len); if (__retval !=
((void*)0)) __retval = (char *) memcpy (__retval, rss_date, __len
); __retval; })) : __strdup (rss_date)))), SWITCH_XML_TXTM)
;
4440
4441 x_tmp = switch_xml_add_child_d(holder->x_item, "itunes:duration", 0)switch_xml_set_flag(switch_xml_add_child(holder->x_item, (
__extension__ (__builtin_constant_p ("itunes:duration") &&
((size_t)(const void *)(("itunes:duration") + 1) - (size_t)(
const void *)("itunes:duration") == 1) ? (((const char *) ("itunes:duration"
))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({
size_t __len = strlen ("itunes:duration") + 1; char *__retval
= (char *) malloc (__len); if (__retval != ((void*)0)) __retval
= (char *) memcpy (__retval, "itunes:duration", __len); __retval
; })) : __strdup ("itunes:duration"))), 0), SWITCH_XML_NAMEM)
;
4442 switch_xml_set_txt_d(x_tmp, duration_str)switch_xml_set_flag(switch_xml_set_txt(x_tmp, (__extension__ (
__builtin_constant_p (duration_str) && ((size_t)(const
void *)((duration_str) + 1) - (size_t)(const void *)(duration_str
) == 1) ? (((const char *) (duration_str))[0] == '\0' ? (char
*) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen
(duration_str) + 1; char *__retval = (char *) malloc (__len)
; if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval
, duration_str, __len); __retval; })) : __strdup (duration_str
)))), SWITCH_XML_TXTM)
;
4443
4444 x_tmp = switch_xml_add_child_d(holder->x_item, "guid", 0)switch_xml_set_flag(switch_xml_add_child(holder->x_item, (
__extension__ (__builtin_constant_p ("guid") && ((size_t
)(const void *)(("guid") + 1) - (size_t)(const void *)("guid"
) == 1) ? (((const char *) ("guid"))[0] == '\0' ? (char *) calloc
((size_t) 1, (size_t) 1) : ({ size_t __len = strlen ("guid")
+ 1; char *__retval = (char *) malloc (__len); if (__retval !=
((void*)0)) __retval = (char *) memcpy (__retval, "guid", __len
); __retval; })) : __strdup ("guid"))), 0), SWITCH_XML_NAMEM)
;
4445 switch_xml_set_txt_d(x_tmp, get)switch_xml_set_flag(switch_xml_set_txt(x_tmp, (__extension__ (
__builtin_constant_p (get) && ((size_t)(const void *)
((get) + 1) - (size_t)(const void *)(get) == 1) ? (((const char
*) (get))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t)
1) : ({ size_t __len = strlen (get) + 1; char *__retval = (char
*) malloc (__len); if (__retval != ((void*)0)) __retval = (char
*) memcpy (__retval, get, __len); __retval; })) : __strdup (
get)))), SWITCH_XML_TXTM)
;
4446
4447 x_link = switch_xml_add_child_d(holder->x_item, "link", 0)switch_xml_set_flag(switch_xml_add_child(holder->x_item, (
__extension__ (__builtin_constant_p ("link") && ((size_t
)(const void *)(("link") + 1) - (size_t)(const void *)("link"
) == 1) ? (((const char *) ("link"))[0] == '\0' ? (char *) calloc
((size_t) 1, (size_t) 1) : ({ size_t __len = strlen ("link")
+ 1; char *__retval = (char *) malloc (__len); if (__retval !=
((void*)0)) __retval = (char *) memcpy (__retval, "link", __len
); __retval; })) : __strdup ("link"))), 0), SWITCH_XML_NAMEM)
;
4448 switch_xml_set_txt_d(x_link, get)switch_xml_set_flag(switch_xml_set_txt(x_link, (__extension__
(__builtin_constant_p (get) && ((size_t)(const void *
)((get) + 1) - (size_t)(const void *)(get) == 1) ? (((const char
*) (get))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t)
1) : ({ size_t __len = strlen (get) + 1; char *__retval = (char
*) malloc (__len); if (__retval != ((void*)0)) __retval = (char
*) memcpy (__retval, get, __len); __retval; })) : __strdup (
get)))), SWITCH_XML_TXTM)
;
4449
4450 x_tmp = switch_xml_add_child_d(holder->x_item, "enclosure", 0)switch_xml_set_flag(switch_xml_add_child(holder->x_item, (
__extension__ (__builtin_constant_p ("enclosure") && (
(size_t)(const void *)(("enclosure") + 1) - (size_t)(const void
*)("enclosure") == 1) ? (((const char *) ("enclosure"))[0] ==
'\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len
= strlen ("enclosure") + 1; char *__retval = (char *) malloc
(__len); if (__retval != ((void*)0)) __retval = (char *) memcpy
(__retval, "enclosure", __len); __retval; })) : __strdup ("enclosure"
))), 0), SWITCH_XML_NAMEM)
;
4451 switch_xml_set_attr_d(x_tmp, "url", get)switch_xml_set_attr(switch_xml_set_flag(x_tmp, SWITCH_XML_DUP
), (__extension__ (__builtin_constant_p ("url") && ((
size_t)(const void *)(("url") + 1) - (size_t)(const void *)("url"
) == 1) ? (((const char *) ("url"))[0] == '\0' ? (char *) calloc
((size_t) 1, (size_t) 1) : ({ size_t __len = strlen ("url") +
1; char *__retval = (char *) malloc (__len); if (__retval !=
((void*)0)) __retval = (char *) memcpy (__retval, "url", __len
); __retval; })) : __strdup ("url"))), (__extension__ (__builtin_constant_p
((get ? get : "")) && ((size_t)(const void *)(((get ?
get : "")) + 1) - (size_t)(const void *)((get ? get : "")) ==
1) ? (((const char *) ((get ? get : "")))[0] == '\0' ? (char
*) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen
((get ? get : "")) + 1; char *__retval = (char *) malloc (__len
); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval
, (get ? get : ""), __len); __retval; })) : __strdup ((get ? get
: "")))))
;
4452 free(get);
4453
4454 if (switch_file_open(&fd, argv[8], SWITCH_FOPEN_READ0x00001, SWITCH_FPROT_UREAD0x0400 | SWITCH_FPROT_UWRITE0x0200, holder->pool) == SWITCH_STATUS_SUCCESS) {
4455 flen = switch_file_get_size(fd);
4456 tmp = switch_mprintf("%ld", (long) flen);
4457 switch_xml_set_attr_d(x_tmp, "length", tmp)switch_xml_set_attr(switch_xml_set_flag(x_tmp, SWITCH_XML_DUP
), (__extension__ (__builtin_constant_p ("length") &&
((size_t)(const void *)(("length") + 1) - (size_t)(const void
*)("length") == 1) ? (((const char *) ("length"))[0] == '\0'
? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len
= strlen ("length") + 1; char *__retval = (char *) malloc (__len
); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval
, "length", __len); __retval; })) : __strdup ("length"))), (__extension__
(__builtin_constant_p ((tmp ? tmp : "")) && ((size_t
)(const void *)(((tmp ? tmp : "")) + 1) - (size_t)(const void
*)((tmp ? tmp : "")) == 1) ? (((const char *) ((tmp ? tmp : ""
)))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : (
{ size_t __len = strlen ((tmp ? tmp : "")) + 1; char *__retval
= (char *) malloc (__len); if (__retval != ((void*)0)) __retval
= (char *) memcpy (__retval, (tmp ? tmp : ""), __len); __retval
; })) : __strdup ((tmp ? tmp : "")))))
;
4458 free(tmp);
4459 switch_file_close(fd);
4460 }
4461
4462 if ((ext = strrchr(fname, '.'))) {
4463 ext++;
4464 if ((new_type = switch_core_mime_ext2type(ext))) {
4465 mime_type = new_type;
4466 }
4467 }
4468 switch_xml_set_attr_d(x_tmp, "type", mime_type)switch_xml_set_attr(switch_xml_set_flag(x_tmp, SWITCH_XML_DUP
), (__extension__ (__builtin_constant_p ("type") && (
(size_t)(const void *)(("type") + 1) - (size_t)(const void *)
("type") == 1) ? (((const char *) ("type"))[0] == '\0' ? (char
*) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen
("type") + 1; char *__retval = (char *) malloc (__len); if (
__retval != ((void*)0)) __retval = (char *) memcpy (__retval,
"type", __len); __retval; })) : __strdup ("type"))), (__extension__
(__builtin_constant_p ((mime_type ? mime_type : "")) &&
((size_t)(const void *)(((mime_type ? mime_type : "")) + 1) -
(size_t)(const void *)((mime_type ? mime_type : "")) == 1) ?
(((const char *) ((mime_type ? mime_type : "")))[0] == '\0' ?
(char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len =
strlen ((mime_type ? mime_type : "")) + 1; char *__retval = (
char *) malloc (__len); if (__retval != ((void*)0)) __retval =
(char *) memcpy (__retval, (mime_type ? mime_type : ""), __len
); __retval; })) : __strdup ((mime_type ? mime_type : "")))))
;
4469
4470 return 0;
4471}
4472
4473
4474static void do_rss(vm_profile_t *profile, char *user, char *domain, char *host, char *port, char *uri, switch_stream_handle_t *stream)
4475{
4476 struct holder holder;
4477 switch_xml_t x_tmp;
4478 char *sql, *xmlstr;
4479 char *tmp = NULL((void*)0);
4480
4481 stream->write_function(stream, "Content-type: text/xml\n\n");
4482 memset(&holder, 0, sizeof(holder));
4483 holder.profile = profile;
4484 holder.stream = stream;
4485 holder.xml = switch_xml_new("rss");
4486 holder.user = user;
4487 holder.domain = domain;
4488 holder.host = host;
4489 holder.port = port;
4490 holder.uri = uri;
4491
4492 switch_core_new_memory_pool(&holder.pool)switch_core_perform_new_memory_pool(&holder.pool, "mod_voicemail.c"
, (const char *)__func__, 4492)
;
4493 switch_assert(holder.xml)((holder.xml) ? (void) (0) : __assert_fail ("holder.xml", "mod_voicemail.c"
, 4493, __PRETTY_FUNCTION__))
;
4494
4495 switch_xml_set_attr_d(holder.xml, "xmlns:itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd")switch_xml_set_attr(switch_xml_set_flag(holder.xml, SWITCH_XML_DUP
), (__extension__ (__builtin_constant_p ("xmlns:itunes") &&
((size_t)(const void *)(("xmlns:itunes") + 1) - (size_t)(const
void *)("xmlns:itunes") == 1) ? (((const char *) ("xmlns:itunes"
))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({
size_t __len = strlen ("xmlns:itunes") + 1; char *__retval =
(char *) malloc (__len); if (__retval != ((void*)0)) __retval
= (char *) memcpy (__retval, "xmlns:itunes", __len); __retval
; })) : __strdup ("xmlns:itunes"))), (__extension__ (__builtin_constant_p
(("http://www.itunes.com/dtds/podcast-1.0.dtd" ? "http://www.itunes.com/dtds/podcast-1.0.dtd"
: "")) && ((size_t)(const void *)((("http://www.itunes.com/dtds/podcast-1.0.dtd"
? "http://www.itunes.com/dtds/podcast-1.0.dtd" : "")) + 1) -
(size_t)(const void *)(("http://www.itunes.com/dtds/podcast-1.0.dtd"
? "http://www.itunes.com/dtds/podcast-1.0.dtd" : "")) == 1) ?
(((const char *) (("http://www.itunes.com/dtds/podcast-1.0.dtd"
? "http://www.itunes.com/dtds/podcast-1.0.dtd" : "")))[0] ==
'\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len
= strlen (("http://www.itunes.com/dtds/podcast-1.0.dtd" ? "http://www.itunes.com/dtds/podcast-1.0.dtd"
: "")) + 1; char *__retval = (char *) malloc (__len); if (__retval
!= ((void*)0)) __retval = (char *) memcpy (__retval, ("http://www.itunes.com/dtds/podcast-1.0.dtd"
? "http://www.itunes.com/dtds/podcast-1.0.dtd" : ""), __len)
; __retval; })) : __strdup (("http://www.itunes.com/dtds/podcast-1.0.dtd"
? "http://www.itunes.com/dtds/podcast-1.0.dtd" : "")))))
;
4496 switch_xml_set_attr_d(holder.xml, "xmlns:fsvm", "http://www.freeswitch.org/dtd/fsvm.dtd")switch_xml_set_attr(switch_xml_set_flag(holder.xml, SWITCH_XML_DUP
), (__extension__ (__builtin_constant_p ("xmlns:fsvm") &&
((size_t)(const void *)(("xmlns:fsvm") + 1) - (size_t)(const
void *)("xmlns:fsvm") == 1) ? (((const char *) ("xmlns:fsvm"
))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({
size_t __len = strlen ("xmlns:fsvm") + 1; char *__retval = (
char *) malloc (__len); if (__retval != ((void*)0)) __retval =
(char *) memcpy (__retval, "xmlns:fsvm", __len); __retval; }
)) : __strdup ("xmlns:fsvm"))), (__extension__ (__builtin_constant_p
(("http://www.freeswitch.org/dtd/fsvm.dtd" ? "http://www.freeswitch.org/dtd/fsvm.dtd"
: "")) && ((size_t)(const void *)((("http://www.freeswitch.org/dtd/fsvm.dtd"
? "http://www.freeswitch.org/dtd/fsvm.dtd" : "")) + 1) - (size_t
)(const void *)(("http://www.freeswitch.org/dtd/fsvm.dtd" ? "http://www.freeswitch.org/dtd/fsvm.dtd"
: "")) == 1) ? (((const char *) (("http://www.freeswitch.org/dtd/fsvm.dtd"
? "http://www.freeswitch.org/dtd/fsvm.dtd" : "")))[0] == '\0'
? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len
= strlen (("http://www.freeswitch.org/dtd/fsvm.dtd" ? "http://www.freeswitch.org/dtd/fsvm.dtd"
: "")) + 1; char *__retval = (char *) malloc (__len); if (__retval
!= ((void*)0)) __retval = (char *) memcpy (__retval, ("http://www.freeswitch.org/dtd/fsvm.dtd"
? "http://www.freeswitch.org/dtd/fsvm.dtd" : ""), __len); __retval
; })) : __strdup (("http://www.freeswitch.org/dtd/fsvm.dtd" ?
"http://www.freeswitch.org/dtd/fsvm.dtd" : "")))))
;
4497 switch_xml_set_attr_d(holder.xml, "version", "2.0")switch_xml_set_attr(switch_xml_set_flag(holder.xml, SWITCH_XML_DUP
), (__extension__ (__builtin_constant_p ("version") &&
((size_t)(const void *)(("version") + 1) - (size_t)(const void
*)("version") == 1) ? (((const char *) ("version"))[0] == '\0'
? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len
= strlen ("version") + 1; char *__retval = (char *) malloc (
__len); if (__retval != ((void*)0)) __retval = (char *) memcpy
(__retval, "version", __len); __retval; })) : __strdup ("version"
))), (__extension__ (__builtin_constant_p (("2.0" ? "2.0" : ""
)) && ((size_t)(const void *)((("2.0" ? "2.0" : "")) +
1) - (size_t)(const void *)(("2.0" ? "2.0" : "")) == 1) ? ((
(const char *) (("2.0" ? "2.0" : "")))[0] == '\0' ? (char *) calloc
((size_t) 1, (size_t) 1) : ({ size_t __len = strlen (("2.0" ?
"2.0" : "")) + 1; char *__retval = (char *) malloc (__len); if
(__retval != ((void*)0)) __retval = (char *) memcpy (__retval
, ("2.0" ? "2.0" : ""), __len); __retval; })) : __strdup (("2.0"
? "2.0" : "")))))
;
1
Within the expansion of the macro 'switch_xml_set_attr_d':
a
Memory is allocated
b
Assuming '__retval' is not equal to null
4498 holder.x_channel = switch_xml_add_child_d(holder.xml, "channel", 0)switch_xml_set_flag(switch_xml_add_child(holder.xml, (__extension__
(__builtin_constant_p ("channel") && ((size_t)(const
void *)(("channel") + 1) - (size_t)(const void *)("channel")
== 1) ? (((const char *) ("channel"))[0] == '\0' ? (char *) calloc
((size_t) 1, (size_t) 1) : ({ size_t __len = strlen ("channel"
) + 1; char *__retval = (char *) malloc (__len); if (__retval
!= ((void*)0)) __retval = (char *) memcpy (__retval, "channel"
, __len); __retval; })) : __strdup ("channel"))), 0), SWITCH_XML_NAMEM
)
;
2
Within the expansion of the macro 'switch_xml_add_child_d':
a
Potential leak of memory pointed to by '__retval'
4499
4500 x_tmp = switch_xml_add_child_d(holder.x_channel, "title", 0)switch_xml_set_flag(switch_xml_add_child(holder.x_channel, (__extension__
(__builtin_constant_p ("title") && ((size_t)(const void
*)(("title") + 1) - (size_t)(const void *)("title") == 1) ? (
((const char *) ("title"))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen ("title") + 1; char
*__retval = (char *) malloc (__len); if (__retval != ((void*
)0)) __retval = (char *) memcpy (__retval, "title", __len); __retval
; })) : __strdup ("title"))), 0), SWITCH_XML_NAMEM)
;
4501 tmp = switch_mprintf("FreeSWITCH Voicemail for %s@%s", user, domain);
4502 switch_xml_set_txt_d(x_tmp, tmp)switch_xml_set_flag(switch_xml_set_txt(x_tmp, (__extension__ (
__builtin_constant_p (tmp) && ((size_t)(const void *)
((tmp) + 1) - (size_t)(const void *)(tmp) == 1) ? (((const char
*) (tmp))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t)
1) : ({ size_t __len = strlen (tmp) + 1; char *__retval = (char
*) malloc (__len); if (__retval != ((void*)0)) __retval = (char
*) memcpy (__retval, tmp, __len); __retval; })) : __strdup (
tmp)))), SWITCH_XML_TXTM)
;
4503 free(tmp);
4504
4505 x_tmp = switch_xml_add_child_d(holder.x_channel, "link", 0)switch_xml_set_flag(switch_xml_add_child(holder.x_channel, (__extension__
(__builtin_constant_p ("link") && ((size_t)(const void
*)(("link") + 1) - (size_t)(const void *)("link") == 1) ? ((
(const char *) ("link"))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen ("link") + 1; char
*__retval = (char *) malloc (__len); if (__retval != ((void*
)0)) __retval = (char *) memcpy (__retval, "link", __len); __retval
; })) : __strdup ("link"))), 0), SWITCH_XML_NAMEM)
;
4506 switch_xml_set_txt_d(x_tmp, "http://www.freeswitch.org")switch_xml_set_flag(switch_xml_set_txt(x_tmp, (__extension__ (
__builtin_constant_p ("http://www.freeswitch.org") &&
((size_t)(const void *)(("http://www.freeswitch.org") + 1) -
(size_t)(const void *)("http://www.freeswitch.org") == 1) ? (
((const char *) ("http://www.freeswitch.org"))[0] == '\0' ? (
char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen
("http://www.freeswitch.org") + 1; char *__retval = (char *)
malloc (__len); if (__retval != ((void*)0)) __retval = (char
*) memcpy (__retval, "http://www.freeswitch.org", __len); __retval
; })) : __strdup ("http://www.freeswitch.org")))), SWITCH_XML_TXTM
)
;
4507
4508 x_tmp = switch_xml_add_child_d(holder.x_channel, "description", 0)switch_xml_set_flag(switch_xml_add_child(holder.x_channel, (__extension__
(__builtin_constant_p ("description") && ((size_t)(const
void *)(("description") + 1) - (size_t)(const void *)("description"
) == 1) ? (((const char *) ("description"))[0] == '\0' ? (char
*) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen
("description") + 1; char *__retval = (char *) malloc (__len
); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval
, "description", __len); __retval; })) : __strdup ("description"
))), 0), SWITCH_XML_NAMEM)
;
4509 switch_xml_set_txt_d(x_tmp, "http://www.freeswitch.org")switch_xml_set_flag(switch_xml_set_txt(x_tmp, (__extension__ (
__builtin_constant_p ("http://www.freeswitch.org") &&
((size_t)(const void *)(("http://www.freeswitch.org") + 1) -
(size_t)(const void *)("http://www.freeswitch.org") == 1) ? (
((const char *) ("http://www.freeswitch.org"))[0] == '\0' ? (
char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen
("http://www.freeswitch.org") + 1; char *__retval = (char *)
malloc (__len); if (__retval != ((void*)0)) __retval = (char
*) memcpy (__retval, "http://www.freeswitch.org", __len); __retval
; })) : __strdup ("http://www.freeswitch.org")))), SWITCH_XML_TXTM
)
;
4510
4511 x_tmp = switch_xml_add_child_d(holder.x_channel, "ttl", 0)switch_xml_set_flag(switch_xml_add_child(holder.x_channel, (__extension__
(__builtin_constant_p ("ttl") && ((size_t)(const void
*)(("ttl") + 1) - (size_t)(const void *)("ttl") == 1) ? (((const
char *) ("ttl"))[0] == '\0' ? (char *) calloc ((size_t) 1, (
size_t) 1) : ({ size_t __len = strlen ("ttl") + 1; char *__retval
= (char *) malloc (__len); if (__retval != ((void*)0)) __retval
= (char *) memcpy (__retval, "ttl", __len); __retval; })) : __strdup
("ttl"))), 0), SWITCH_XML_NAMEM)
;
4512 switch_xml_set_txt_d(x_tmp, "15")switch_xml_set_flag(switch_xml_set_txt(x_tmp, (__extension__ (
__builtin_constant_p ("15") && ((size_t)(const void *
)(("15") + 1) - (size_t)(const void *)("15") == 1) ? (((const
char *) ("15"))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t
) 1) : ({ size_t __len = strlen ("15") + 1; char *__retval = (
char *) malloc (__len); if (__retval != ((void*)0)) __retval =
(char *) memcpy (__retval, "15", __len); __retval; })) : __strdup
("15")))), SWITCH_XML_TXTM)
;
4513
4514 sql = switch_mprintf("select created_epoch, read_epoch, username, domain, uuid, cid_name, cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by from voicemail_msgs where username='%s' and domain='%s' order by read_flags, created_epoch", user, domain);
4515 vm_execute_sql_callback(profile, profile->mutex, sql, rss_callback, &holder);
4516
4517 xmlstr = switch_xml_toxml(holder.xml, SWITCH_TRUE);
4518
4519 stream->write_function(stream, "%s", xmlstr);
4520
4521 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
4522 switch_safe_free(xmlstr)if (xmlstr) {free(xmlstr);xmlstr=((void*)0);};
4523 switch_xml_free(holder.xml);
4524 switch_core_destroy_memory_pool(&holder.pool)switch_core_perform_destroy_memory_pool(&holder.pool, "mod_voicemail.c"
, (const char *)__func__, 4524)
;
4525}
4526
4527
4528static void do_web(vm_profile_t *profile, const char *user_in, const char *domain, const char *host, const char *port, const char *uri,
4529 switch_stream_handle_t *stream)
4530{
4531 char buf[80] = "";
4532 struct holder holder;
4533 char *sql;
4534 callback_t cbt = { 0 };
4535 int ttl = 0;
4536 char *user;
4537
4538 user = resolve_id(user_in, domain, "web-vm");
4539
4540 stream->write_function(stream, "Content-type: text/html\n\n");
4541 memset(&holder, 0, sizeof(holder));
4542 holder.profile = profile;
4543 holder.stream = stream;
4544 holder.user = user;
4545 holder.domain = domain;
4546 holder.host = host;
4547 holder.port = port;
4548 holder.uri = uri;
4549
4550 if (profile->web_head) {
4551 stream->raw_write_function(stream, (uint8_t *) profile->web_head, strlen(profile->web_head));
4552 }
4553
4554 cbt.buf = buf;
4555 cbt.len = sizeof(buf);
4556
4557 sql = switch_mprintf("select created_epoch, read_epoch, username, domain, uuid, cid_name, cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by from voicemail_msgs where username='%s' and domain='%s' order by read_flags, created_epoch", user, domain);
4558 vm_execute_sql_callback(profile, profile->mutex, sql, web_callback, &holder);
4559 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
4560
4561 sql = switch_mprintf("select count(*) from voicemail_msgs where username='%s' and domain='%s' order by read_flags", user, domain);
4562 vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
4563 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
4564
4565 ttl = atoi(buf);
4566 stream->write_function(stream, "%d message%s<br>", ttl, ttl == 1 ? "" : "s");
4567
4568 if (profile->web_tail) {
4569 stream->raw_write_function(stream, (uint8_t *) profile->web_tail, strlen(profile->web_tail));
4570 }
4571
4572 if (user != user_in) {
4573 free(user);
4574 }
4575}
4576
4577#define VM_INJECT_USAGE"[group=<group>[@domain]|domain=<domain>|<box>[@<domain>]] <sound_file> [<cid_num>] [<cid_name>]" "[group=<group>[@domain]|domain=<domain>|<box>[@<domain>]] <sound_file> [<cid_num>] [<cid_name>]"
4578SWITCH_STANDARD_API(voicemail_inject_api_function)static switch_status_t voicemail_inject_api_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
4579{
4580 if (voicemail_inject(cmd, session) == SWITCH_STATUS_SUCCESS) {
4581 stream->write_function(stream, "%s", "+OK\n");
4582 } else {
4583 stream->write_function(stream, "Error: %s\n", VM_INJECT_USAGE"[group=<group>[@domain]|domain=<domain>|<box>[@<domain>]] <sound_file> [<cid_num>] [<cid_name>]");
4584 }
4585 return SWITCH_STATUS_SUCCESS;
4586}
4587
4588
4589static int api_del_callback(void *pArg, int argc, char **argv, char **columnNames)
4590{
4591
4592 unlink(argv[3]);
4593
4594 return 0;
4595}
4596
4597
4598#define VM_DELETE_USAGE"<id>@<domain>[/profile] [<uuid>]" "<id>@<domain>[/profile] [<uuid>]"
4599SWITCH_STANDARD_API(voicemail_delete_api_function)static switch_status_t voicemail_delete_api_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
4600{
4601 char *sql;
4602 char *id = NULL((void*)0), *domain = NULL((void*)0), *uuid = NULL((void*)0), *profile_name = "default";
4603 char *p, *e = NULL((void*)0);
4604 vm_profile_t *profile;
4605
4606 if (zstr(cmd)_zstr(cmd)) {
4607 stream->write_function(stream, "Usage: %s\n", VM_DELETE_USAGE"<id>@<domain>[/profile] [<uuid>]");
4608 return SWITCH_STATUS_SUCCESS;
4609 }
4610
4611 id = strdup(cmd)(__extension__ (__builtin_constant_p (cmd) && ((size_t
)(const void *)((cmd) + 1) - (size_t)(const void *)(cmd) == 1
) ? (((const char *) (cmd))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen (cmd) + 1; char *
__retval = (char *) malloc (__len); if (__retval != ((void*)0
)) __retval = (char *) memcpy (__retval, cmd, __len); __retval
; })) : __strdup (cmd)))
;
4612
4613 if (!id) {
4614 stream->write_function(stream, "Allocation Error\n");
4615 return SWITCH_STATUS_SUCCESS;
4616 }
4617
4618 if ((p = strchr(id, '@')(__extension__ (__builtin_constant_p ('@') && !__builtin_constant_p
(id) && ('@') == '\0' ? (char *) __rawmemchr (id, '@'
) : __builtin_strchr (id, '@')))
)) {
4619 *p++ = '\0';
4620 domain = e = p;
4621 }
4622
4623 if (domain && (p = strchr(domain, '/')(__extension__ (__builtin_constant_p ('/') && !__builtin_constant_p
(domain) && ('/') == '\0' ? (char *) __rawmemchr (domain
, '/') : __builtin_strchr (domain, '/')))
)) {
4624 *p++ = '\0';
4625 profile_name = e = p;
4626 }
4627
4628 if (e && (p = strchr(e, ' ')(__extension__ (__builtin_constant_p (' ') && !__builtin_constant_p
(e) && (' ') == '\0' ? (char *) __rawmemchr (e, ' ')
: __builtin_strchr (e, ' ')))
)) {
4629 *p++ = '\0';
4630 uuid = p;
4631 }
4632
4633
4634 if (domain && profile_name && (profile = get_profile(profile_name))) {
4635
4636 if (uuid) {
4637 sql = switch_mprintf("select username, domain, in_folder, file_path from voicemail_msgs where uuid='%q'", uuid);
4638 } else {
4639 sql = switch_mprintf("select username, domain, in_folder, file_path from voicemail_msgs where username='%q' and domain='%q'", id, domain);
4640 }
4641
4642 vm_execute_sql_callback(profile, profile->mutex, sql, api_del_callback, profile);
4643 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
4644
4645 if (uuid) {
4646 sql = switch_mprintf("delete from voicemail_msgs where uuid='%q'", uuid);
4647 } else {
4648 sql = switch_mprintf("delete from voicemail_msgs where username='%q' and domain='%q'", id, domain);
4649 }
4650
4651 vm_execute_sql(profile, sql, profile->mutex);
4652 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
4653
4654 update_mwi(profile, id, domain, "inbox", MWI_REASON_DELETE);
4655
4656 stream->write_function(stream, "%s", "+OK\n");
4657 profile_rwunlock(profile);
4658 } else {
4659 stream->write_function(stream, "%s", "-ERR can't find user or profile.\n");
4660 }
4661
4662 switch_safe_free(id)if (id) {free(id);id=((void*)0);};
4663
4664 return SWITCH_STATUS_SUCCESS;
4665}
4666
4667
4668
4669
4670#define VM_READ_USAGE"<id>@<domain>[/profile] <read|unread> [<uuid>]" "<id>@<domain>[/profile] <read|unread> [<uuid>]"
4671SWITCH_STANDARD_API(voicemail_read_api_function)static switch_status_t voicemail_read_api_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
4672{
4673 char *sql;
4674 char *id = NULL((void*)0), *domain = NULL((void*)0), *uuid = NULL((void*)0), *profile_name = "default";
4675 char *ru = NULL((void*)0), *p, *e = NULL((void*)0);
4676 vm_profile_t *profile;
4677 int mread = -1;
4678
4679 if (zstr(cmd)_zstr(cmd)) {
4680 stream->write_function(stream, "Usage: %s\n", VM_READ_USAGE"<id>@<domain>[/profile] <read|unread> [<uuid>]");
4681 return SWITCH_STATUS_SUCCESS;
4682 }
4683
4684 id = strdup(cmd)(__extension__ (__builtin_constant_p (cmd) && ((size_t
)(const void *)((cmd) + 1) - (size_t)(const void *)(cmd) == 1
) ? (((const char *) (cmd))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen (cmd) + 1; char *
__retval = (char *) malloc (__len); if (__retval != ((void*)0
)) __retval = (char *) memcpy (__retval, cmd, __len); __retval
; })) : __strdup (cmd)))
;
4685
4686 if (!id) {
4687 stream->write_function(stream, "Allocation failure\n");
4688 return SWITCH_STATUS_SUCCESS;
4689 }
4690
4691 if ((p = strchr(id, '@')(__extension__ (__builtin_constant_p ('@') && !__builtin_constant_p
(id) && ('@') == '\0' ? (char *) __rawmemchr (id, '@'
) : __builtin_strchr (id, '@')))
)) {
4692 *p++ = '\0';
4693 domain = e = p;
4694 }
4695
4696 if (domain && (p = strchr(domain, '/')(__extension__ (__builtin_constant_p ('/') && !__builtin_constant_p
(domain) && ('/') == '\0' ? (char *) __rawmemchr (domain
, '/') : __builtin_strchr (domain, '/')))
)) {
4697 *p++ = '\0';
4698 profile_name = e = p;
4699 }
4700
4701 if (e && (p = strchr(e, ' ')(__extension__ (__builtin_constant_p (' ') && !__builtin_constant_p
(e) && (' ') == '\0' ? (char *) __rawmemchr (e, ' ')
: __builtin_strchr (e, ' ')))
)) {
4702 *p++ = '\0';
4703 ru = e = p;
4704 }
4705
4706 if (e && (p = strchr(e, ' ')(__extension__ (__builtin_constant_p (' ') && !__builtin_constant_p
(e) && (' ') == '\0' ? (char *) __rawmemchr (e, ' ')
: __builtin_strchr (e, ' ')))
)) {
4707 *p++ = '\0';
4708 uuid = p;
4709 }
4710
4711 if (ru) {
4712 if (!strcasecmp(ru, "read")) {
4713 mread = 1;
4714 } else if (!strcasecmp(ru, "unread")) {
4715 mread = 0;
4716 } else {
4717 mread = -1;
4718 }
4719 }
4720
4721
4722 if (mread > -1 && domain && profile_name && (profile = get_profile(profile_name))) {
4723
4724 if (mread) {
4725 if (uuid) {
4726 sql = switch_mprintf("update voicemail_msgs set read_epoch=%ld where uuid='%q'", (long) switch_epoch_time_now(NULL((void*)0)), uuid);
4727 } else {
4728 sql = switch_mprintf("update voicemail_msgs set read_epoch=%ld where domain='%q'", (long) switch_epoch_time_now(NULL((void*)0)), domain);
4729 }
4730 } else{
4731 if (uuid) {
4732 sql = switch_mprintf("update voicemail_msgs set read_epoch=0,flags='' where uuid='%q'", uuid);
4733 } else {
4734 sql = switch_mprintf("update voicemail_msgs set read_epoch=0,flags='' where domain='%q'", domain);
4735 }
4736 }
4737
4738 vm_execute_sql(profile, sql, profile->mutex);
4739 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
4740
4741 update_mwi(profile, id, domain, "inbox", MWI_REASON_READ);
4742
4743 stream->write_function(stream, "%s", "+OK\n");
4744
4745 profile_rwunlock(profile);
4746 } else {
4747 stream->write_function(stream, "%s", "-ERR can't find user or profile.\n");
4748 }
4749
4750 switch_safe_free(id)if (id) {free(id);id=((void*)0);};
4751
4752 return SWITCH_STATUS_SUCCESS;
4753}
4754
4755
4756
4757static int api_list_callback(void *pArg, int argc, char **argv, char **columnNames)
4758{
4759 switch_stream_handle_t *stream = (switch_stream_handle_t *) pArg;
4760
4761 if (!strcasecmp(argv[10], "xml")) {
4762 stream->write_function(stream, " <message>\n");
4763 stream->write_function(stream, " <created_epoch>%s</created_epoch>\n", argv[0]);
4764 stream->write_function(stream, " <read_epoch>%s</read_epoch>\n", argv[1]);
4765 stream->write_function(stream, " <username>%s</username>\n", argv[2]);
4766 stream->write_function(stream, " <domain>%s</domain>\n", argv[3]);
4767 stream->write_function(stream, " <folder>%s</folder>\n", argv[4]);
4768 stream->write_function(stream, " <path>%s</path>\n", argv[5]);
4769 stream->write_function(stream, " <uuid>%s</uuid>\n", argv[6]);
4770 stream->write_function(stream, " <cid-name>%s</cid-name>\n", argv[7]);
4771 stream->write_function(stream, " <cid-number>%s</cid-number>\n", argv[8]);
4772 stream->write_function(stream, " <message-len>%s</message-len>\n", argv[9]);
4773 stream->write_function(stream, " </message>\n");
4774 } else {
4775 stream->write_function(stream, "%s:%s:%s:%s:%s:%s:%s:%s:%s:%s\n", argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]);
4776 }
4777
4778 return 0;
4779}
4780
4781
4782#define VM_LIST_USAGE"<id>@<domain>[/profile] [xml]" "<id>@<domain>[/profile] [xml]"
4783SWITCH_STANDARD_API(voicemail_list_api_function)static switch_status_t voicemail_list_api_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
4784{
4785 char *sql;
4786 char *id = NULL((void*)0), *uuid = NULL((void*)0), *domain = NULL((void*)0), *format = "text", *profile_name = "default";
4787 char *p, *e = NULL((void*)0);
4788 vm_profile_t *profile;
4789
4790 if (zstr(cmd)_zstr(cmd)) {
4791 stream->write_function(stream, "Usage: %s\n", VM_LIST_USAGE"<id>@<domain>[/profile] [xml]");
4792 return SWITCH_STATUS_SUCCESS;
4793 }
4794
4795 id = strdup(cmd)(__extension__ (__builtin_constant_p (cmd) && ((size_t
)(const void *)((cmd) + 1) - (size_t)(const void *)(cmd) == 1
) ? (((const char *) (cmd))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen (cmd) + 1; char *
__retval = (char *) malloc (__len); if (__retval != ((void*)0
)) __retval = (char *) memcpy (__retval, cmd, __len); __retval
; })) : __strdup (cmd)))
;
4796
4797 if (!id) {
4798 stream->write_function(stream, "Allocation Error\n");
4799 return SWITCH_STATUS_SUCCESS;
4800 }
4801
4802 if ((p = strchr(id, '@')(__extension__ (__builtin_constant_p ('@') && !__builtin_constant_p
(id) && ('@') == '\0' ? (char *) __rawmemchr (id, '@'
) : __builtin_strchr (id, '@')))
)) {
4803 *p++ = '\0';
4804 domain = e = p;
4805 }
4806
4807 if (domain && (p = strchr(domain, '/')(__extension__ (__builtin_constant_p ('/') && !__builtin_constant_p
(domain) && ('/') == '\0' ? (char *) __rawmemchr (domain
, '/') : __builtin_strchr (domain, '/')))
)) {
4808 *p++ = '\0';
4809 profile_name = e = p;
4810 }
4811
4812 if (e && (p = strchr(e, ' ')(__extension__ (__builtin_constant_p (' ') && !__builtin_constant_p
(e) && (' ') == '\0' ? (char *) __rawmemchr (e, ' ')
: __builtin_strchr (e, ' ')))
)) {
4813 *p++ = '\0';
4814 format = e = p;
4815 }
4816
4817 if (e && (p = strchr(e, ' ')(__extension__ (__builtin_constant_p (' ') && !__builtin_constant_p
(e) && (' ') == '\0' ? (char *) __rawmemchr (e, ' ')
: __builtin_strchr (e, ' ')))
)) {
4818 *p++ = '\0';
4819 uuid = p;
4820 }
4821
4822 if (domain && profile_name && (profile = get_profile(profile_name))) {
4823 if (uuid) {
4824 sql = switch_mprintf("select created_epoch, read_epoch, username, domain, in_folder, file_path, uuid, cid_name, cid_number, message_len, "
4825 "'%q' from voicemail_msgs where username='%q' and domain='%q' and uuid='%q'",
4826 format, id, domain, uuid);
4827 } else {
4828 sql = switch_mprintf("select created_epoch, read_epoch, username, domain, in_folder, file_path, uuid, cid_name, cid_number, message_len, "
4829 "'%q' from voicemail_msgs where username='%q' and domain='%q'",
4830 format, id, domain);
4831 }
4832
4833 if (!strcasecmp(format, "xml")) {
4834 stream->write_function(stream, "<voicemail>\n");
4835 }
4836
4837 vm_execute_sql_callback(profile, profile->mutex, sql, api_list_callback, stream);
4838 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
4839
4840 if (!strcasecmp(format, "xml")) {
4841 stream->write_function(stream, "</voicemail>\n");
4842 }
4843
4844 profile_rwunlock(profile);
4845 } else {
4846 stream->write_function(stream, "%s", "-ERR can't find user or profile.\n");
4847 }
4848
4849 switch_safe_free(id)if (id) {free(id);id=((void*)0);};
4850
4851 return SWITCH_STATUS_SUCCESS;
4852}
4853
4854#define VOICEMAIL_SYNTAX"rss [<host> <port> <uri> <user> <domain>] | [load|unload|reload] <profile> [reloadxml]" "rss [<host> <port> <uri> <user> <domain>] | [load|unload|reload] <profile> [reloadxml]"
4855SWITCH_STANDARD_API(voicemail_api_function)static switch_status_t voicemail_api_function ( const char *cmd
, switch_core_session_t *session, switch_stream_handle_t *stream
)
4856{
4857 char *mydata = NULL((void*)0), *argv[6];
4858 char *host = NULL((void*)0), *port = NULL((void*)0), *uri = NULL((void*)0);
4859 char *user = NULL((void*)0), *domain = NULL((void*)0);
4860 int ct = 0;
4861 vm_profile_t *profile = NULL((void*)0);
4862 char *path_info = NULL((void*)0);
4863 int rss = 0, xarg = 0;
4864 switch_hash_index_t *hi;
4865 void *val = NULL((void*)0);
4866 switch_xml_t xml_root;
4867 const char *err;
4868 int argc = 0;
4869
4870 if (session) {
4871 return SWITCH_STATUS_FALSE;
4872 }
4873
4874 if (stream->param_event) {
4875 host = switch_event_get_header(stream->param_event, "http-host")switch_event_get_header_idx(stream->param_event, "http-host"
, -1)
;
4876 port = switch_event_get_header(stream->param_event, "http-port")switch_event_get_header_idx(stream->param_event, "http-port"
, -1)
;
4877 uri = switch_event_get_header(stream->param_event, "http-uri")switch_event_get_header_idx(stream->param_event, "http-uri"
, -1)
;
4878 user = switch_event_get_header(stream->param_event, "freeswitch-user")switch_event_get_header_idx(stream->param_event, "freeswitch-user"
, -1)
;
4879 domain = switch_event_get_header(stream->param_event, "freeswitch-domain")switch_event_get_header_idx(stream->param_event, "freeswitch-domain"
, -1)
;
4880 path_info = switch_event_get_header(stream->param_event, "http-path-info")switch_event_get_header_idx(stream->param_event, "http-path-info"
, -1)
;
4881 }
4882
4883 if (!zstr(cmd)_zstr(cmd)) {
4884 mydata = strdup(cmd)(__extension__ (__builtin_constant_p (cmd) && ((size_t
)(const void *)((cmd) + 1) - (size_t)(const void *)(cmd) == 1
) ? (((const char *) (cmd))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen (cmd) + 1; char *
__retval = (char *) malloc (__len); if (__retval != ((void*)0
)) __retval = (char *) memcpy (__retval, cmd, __len); __retval
; })) : __strdup (cmd)))
;
4885 switch_assert(mydata)((mydata) ? (void) (0) : __assert_fail ("mydata", "mod_voicemail.c"
, 4885, __PRETTY_FUNCTION__))
;
4886 argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
4887 }
4888
4889 if (argc > 0) {
4890 if (!strcasecmp(argv[0], "rss")) {
4891 rss++;
4892 xarg++;
4893 } else if (argc > 1 && !strcasecmp(argv[0], "load")) {
4894 if (argc > 2 && !strcasecmp(argv[2], "reloadxml")) {
4895 if ((xml_root = switch_xml_open_root(1, &err))) {
4896 switch_xml_free(xml_root);
4897 }
4898 stream->write_function(stream, "Reload XML [%s]\n", err);
4899 }
4900 if ((profile = get_profile(argv[1]))) {
4901 profile_rwunlock(profile);
4902 }
4903 stream->write_function(stream, "+OK load complete\n");
4904 goto done;
4905 } else if (argc > 1 && !strcasecmp(argv[0], "unload")) {
4906 destroy_profile(argv[1], SWITCH_FALSE);
4907 stream->write_function(stream, "+OK unload complete\n");
4908 goto done;
4909 } else if (argc > 1 && !strcasecmp(argv[0], "reload")) {
4910 destroy_profile(argv[1], SWITCH_FALSE);
4911 if (argc > 2 && !strcasecmp(argv[2], "reloadxml")) {
4912 if ((xml_root = switch_xml_open_root(1, &err))) {
4913 switch_xml_free(xml_root);
4914 }
4915 stream->write_function(stream, "Reload XML [%s]\n", err);
4916 }
4917 if ((profile = get_profile(argv[1]))) {
4918 profile_rwunlock(profile);
4919 }
4920 stream->write_function(stream, "+OK reload complete\n");
4921 goto done;
4922
4923 } else if (!strcasecmp(argv[0], "status")) {
4924 stream->write_function(stream, "============================\n");
4925 switch_mutex_lock(globals.mutex);
4926 for (hi = switch_core_hash_first(globals.profile_hash)switch_core_hash_first_iter(globals.profile_hash, ((void*)0)); hi; hi = switch_core_hash_next(&hi)) {
4927 switch_core_hash_this(hi, NULL((void*)0), NULL((void*)0), &val);
4928 profile = (vm_profile_t *) val;
4929 stream->write_function(stream, "Profile: %s\n", profile->name);
4930 }
4931 switch_mutex_unlock(globals.mutex);
4932 stream->write_function(stream, "============================\n");
4933 goto done;
4934 }
4935 }
4936
4937 if (!host) {
4938 if (argc - rss < 5) {
4939 goto error;
4940 }
4941 host = argv[xarg++];
4942 port = argv[xarg++];
4943 uri = argv[xarg++];
4944 user = argv[xarg++];
4945 domain = argv[xarg++];
4946 }
4947
4948 if (!(host && port && uri && user && domain)) {
4949 goto error;
4950 }
4951
4952 if (!(profile = get_profile(domain))) {
4953 profile = get_profile("default");
4954 }
4955
4956 if (!profile) {
4957 switch_hash_index_t *index;
4958 void *value;
4959
4960 switch_mutex_lock(globals.mutex);
4961 for (index = switch_core_hash_first(globals.profile_hash)switch_core_hash_first_iter(globals.profile_hash, ((void*)0)); index; index = switch_core_hash_next(&index)) {
4962 switch_core_hash_this(index, NULL((void*)0), NULL((void*)0), &value);
4963 profile = (vm_profile_t *) value;
4964 if (profile) {
4965 switch_thread_rwlock_rdlock(profile->rwlock);
4966 break;
4967 }
4968 }
4969 switch_safe_free(index)if (index) {free(index);index=((void*)0);};
4970 switch_mutex_unlock(globals.mutex);
4971 }
4972
4973 if (!profile) {
4974 stream->write_function(stream, "Can't find profile.\n");
4975 goto error;
4976 }
4977
4978 if (path_info) {
4979 if (!strncasecmp(path_info, "get/", 4)) {
4980 do_play(profile, user, domain, path_info + 4, stream);
4981 } else if (!strncasecmp(path_info, "del/", 4)) {
4982 do_del(profile, user, domain, path_info + 4, stream);
4983 } else if (!strncasecmp(path_info, "web", 3)) {
4984 do_web(profile, user, domain, host, port, uri, stream);
4985 }
4986 }
4987
4988 if (rss || (path_info && !strncasecmp(path_info, "rss", 3))) {
4989 do_rss(profile, user, domain, host, port, uri, stream);
4990 }
4991
4992 profile_rwunlock(profile);
4993 goto done;
4994
4995 error:
4996 if (host) {
4997 if (!ct) {
4998 stream->write_function(stream, "Content-type: text/html\n\n<h2>");
4999 }
5000 }
5001 stream->write_function(stream, "Error: %s\n", VOICEMAIL_SYNTAX"rss [<host> <port> <uri> <user> <domain>] | [load|unload|reload] <profile> [reloadxml]");
5002
5003 done:
5004 switch_safe_free(mydata)if (mydata) {free(mydata);mydata=((void*)0);};
5005 return SWITCH_STATUS_SUCCESS;
5006}
5007
5008struct msg_get_callback {
5009 switch_event_t *my_params;
5010};
5011typedef struct msg_get_callback msg_get_callback_t;
5012
5013static int message_get_callback(void *pArg, int argc, char **argv, char **columnNames)
5014{
5015 msg_get_callback_t *cbt = (msg_get_callback_t *) pArg;
5016
5017 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-Received-Epoch", "%s", argv[0]);
5018 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-Read-Epoch", "%s", argv[1]);
5019 /* switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, user, argv[2], 255); */
5020 /* switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, domain, argv[3], 255); */
5021 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-UUID", "%s", argv[4]);
5022 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-Caller-Name", "%s", argv[5]);
5023 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-Caller-Number", "%s", argv[6]);
5024 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-Folder", "%s", argv[7]);
5025 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-File-Path", "%s", argv[8]);
5026 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-Duration", "%s", argv[9]);
5027 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-Flags", "%s", argv[10]);
5028 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-Read-Flags", "%s", argv[11]);
5029 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, "VM-Message-Forwarded-By", "%s", argv[12]);
5030
5031 return 0;
5032}
5033
5034struct msg_lst_callback {
5035 char *buf;
5036 size_t len;
5037 switch_event_t *my_params;
5038};
5039typedef struct msg_lst_callback msg_lst_callback_t;
5040
5041static int message_list_callback(void *pArg, int argc, char **argv, char **columnNames)
5042{
5043 msg_lst_callback_t *cbt = (msg_lst_callback_t *) pArg;
5044 char *varname = NULL((void*)0);
5045 /* Message # never start with 0 */
5046 varname = switch_mprintf("VM-List-Message-%ld-UUID", ++cbt->len);
5047 switch_event_add_header(cbt->my_params, SWITCH_STACK_BOTTOM, varname, "%s", argv[0]);
5048 switch_safe_free(varname)if (varname) {free(varname);varname=((void*)0);};
5049 return 0;
5050}
5051
5052static int message_purge_callback(void *pArg, int argc, char **argv, char **columnNames)
5053{
5054 const char *profile_name = argv[0];
5055 const char *uuid = argv[1];
5056 const char *id = argv[2];
5057 const char *domain = argv[3];
5058 const char *file_path = argv[4];
5059 char *sql;
5060 vm_profile_t *profile = get_profile(profile_name);
5061
5062 if (unlink(file_path) != 0) {
5063 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 5063, ((void*)0)
, SWITCH_LOG_WARNING, "Failed to delete file [%s]\n", file_path);
5064 } else {
5065 sql = switch_mprintf("DELETE FROM voicemail_msgs WHERE username='%q' AND domain='%q' AND uuid = '%q'", id, domain, uuid);
5066 vm_execute_sql(profile, sql, profile->mutex);
5067 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5068 }
5069 profile_rwunlock(profile);
5070
5071 return 0;
5072}
5073
5074/* Preference API */
5075#define VM_FSDB_PREF_GREETING_SET_USAGE"<profile> <domain> <user> <slot> [file-path]" "<profile> <domain> <user> <slot> [file-path]"
5076SWITCH_STANDARD_API(vm_fsdb_pref_greeting_set_function)static switch_status_t vm_fsdb_pref_greeting_set_function ( const
char *cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5077{
5078 int slot = -1;
5079 const char *file_path = NULL((void*)0);
5080 char *sql = NULL((void*)0);
5081 char res[254] = "";
5082
5083 char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5084 vm_profile_t *profile = NULL((void*)0);
5085
5086 char *argv[6] = { 0 };
5087 char *mycmd = NULL((void*)0);
5088
5089 switch_memory_pool_t *pool;
5090
5091 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5091)
;
5092
5093 if (!zstr(cmd)_zstr(cmd)) {
5094 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5094)
;
5095 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5096 }
5097
5098 if (argv[0])
5099 profile_name = argv[0];
5100 if (argv[1])
5101 domain = argv[1];
5102 if (argv[2])
5103 id = argv[2];
5104 if (argv[3])
5105 slot = atoi(argv[3]);
5106 if (argv[4])
5107 file_path = argv[4];
5108
5109 if (!profile_name || !domain || !id || !slot) {
5110 stream->write_function(stream, "-ERR Missing Arguments\n");
5111 goto done;
5112 }
5113
5114 if (!(profile = get_profile(profile_name))) {
5115 stream->write_function(stream, "-ERR Profile not found\n");
5116 goto done;
5117 } else {
5118 char *dir_path = switch_core_sprintf(pool, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir,
5119 SWITCH_PATH_SEPARATOR"/",
5120 SWITCH_PATH_SEPARATOR"/",
5121 profile->name, SWITCH_PATH_SEPARATOR"/", domain, SWITCH_PATH_SEPARATOR"/", id);
5122 char *final_file_path = switch_core_sprintf(pool, "%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR"/", slot, profile->file_ext);
5123
5124 switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS0x0400 | 0x0200 | 0x0100 | 0x0040 | 0x0010, pool);
5125
5126 if (file_path) {
5127 if (switch_file_exists(file_path, pool) != SWITCH_STATUS_SUCCESS) {
5128 stream->write_function(stream, "-ERR Filename doesn't exist\n");
5129 profile_rwunlock(profile);
5130 goto done;
5131 }
5132
5133 switch_file_rename(file_path, final_file_path, pool);
5134 }
5135
5136 if (switch_file_exists(final_file_path, pool) == SWITCH_STATUS_SUCCESS) {
5137
5138 sql = switch_mprintf("SELECT count(*) FROM voicemail_prefs WHERE username = '%q' AND domain = '%q'", id, domain);
5139 vm_execute_sql2str(profile, profile->mutex, sql, res, sizeof(res));
5140 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5141
5142 if (atoi(res) == 0) {
5143 sql = switch_mprintf("INSERT INTO voicemail_prefs (username, domain, greeting_path) VALUES('%q', '%q', '%q')", id, domain, final_file_path);
5144 } else {
5145 sql = switch_mprintf("UPDATE voicemail_prefs SET greeting_path = '%q' WHERE username = '%q' AND domain = '%q'", final_file_path, id, domain);
5146 }
5147 vm_execute_sql(profile, sql, profile->mutex);
5148 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5149 } else {
5150 stream->write_function(stream, "-ERR Recording doesn't exist [%s]\n", final_file_path);
5151 }
5152 profile_rwunlock(profile);
5153 }
5154
5155 stream->write_function(stream, "-OK\n");
5156done:
5157 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5157)
;
5158 return SWITCH_STATUS_SUCCESS;
5159}
5160
5161#define VM_FSDB_PREF_GREETING_GET_USAGE"<format> <profile> <domain> <user> [slot]" "<format> <profile> <domain> <user> [slot]"
5162SWITCH_STANDARD_API(vm_fsdb_pref_greeting_get_function)static switch_status_t vm_fsdb_pref_greeting_get_function ( const
char *cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5163{
5164 /* int slot = -1; not implemented yet */
5165 char *sql = NULL((void*)0);
5166 char res[254] = "";
5167
5168 char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5169 vm_profile_t *profile = NULL((void*)0);
5170
5171 char *argv[6] = { 0 };
5172 char *mycmd = NULL((void*)0);
5173
5174 switch_memory_pool_t *pool;
5175
5176 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5176)
;
5177
5178 if (!zstr(cmd)_zstr(cmd)) {
5179 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5179)
;
5180 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5181 }
5182
5183 if (argv[1])
5184 profile_name = argv[1];
5185 if (argv[2])
5186 domain = argv[2];
5187 if (argv[3])
5188 id = argv[3];
5189/* if (argv[4])
5190 slot = atoi(argv[4]);
5191not implemented yet
5192*/
5193
5194 if (!profile_name || !domain || !id) {
5195 stream->write_function(stream, "-ERR Missing Arguments\n");
5196 goto done;
5197 }
5198
5199 if (!(profile = get_profile(profile_name))) {
5200 stream->write_function(stream, "-ERR Profile not found\n");
5201 goto done;
5202 }
5203 sql = switch_mprintf("select greeting_path from voicemail_prefs WHERE domain = '%q' AND username = '%q'", domain, id);
5204
5205 vm_execute_sql2str(profile, profile->mutex, sql, res, sizeof(res));
5206
5207 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5208
5209 profile_rwunlock(profile);
5210
5211 /* TODO If no slot requested, returned currently selected and figure out the slot number from the file name.
5212 * IF slot provided, check if file exist, check if it currently selected */
5213 if (zstr(res)_zstr(res)) {
5214 stream->write_function(stream, "-ERR No greeting found\n");
5215 } else {
5216 switch_event_t *my_params = NULL((void*)0);
5217 char *ebuf = NULL((void*)0);
5218
5219 switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 5219, &my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
5220 switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Preference-Greeting-File-Path", "%s", res);
5221 switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Preference-Greeting-Slot", "%s", "Not Implemented yet");
5222 switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Preference-Greeting-Selected", "%s", "True");
5223 switch_event_serialize_json(my_params, &ebuf);
5224 switch_event_destroy(&my_params);
5225
5226 stream->write_function(stream, "%s", ebuf);
5227 switch_safe_free(ebuf)if (ebuf) {free(ebuf);ebuf=((void*)0);};
5228
5229 }
5230done:
5231 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5231)
;
5232 return SWITCH_STATUS_SUCCESS;
5233}
5234
5235#define VM_FSDB_PREF_RECNAME_SET_USAGE"<profile> <domain> <user> <file-path>" "<profile> <domain> <user> <file-path>"
5236SWITCH_STANDARD_API(vm_fsdb_pref_recname_set_function)static switch_status_t vm_fsdb_pref_recname_set_function ( const
char *cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5237{
5238 const char *file_path = NULL((void*)0);
5239
5240 char *sql = NULL((void*)0);
5241 char res[254] = "";
5242
5243 char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5244 vm_profile_t *profile = NULL((void*)0);
5245
5246 char *argv[6] = { 0 };
5247 char *mycmd = NULL((void*)0);
5248
5249 switch_memory_pool_t *pool;
5250
5251 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5251)
;
5252
5253 if (!zstr(cmd)_zstr(cmd)) {
5254 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5254)
;
5255 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5256 }
5257
5258 if (argv[0])
5259 profile_name = argv[0];
5260 if (argv[1])
5261 domain = argv[1];
5262 if (argv[2])
5263 id = argv[2];
5264 if (argv[3])
5265 file_path = argv[3];
5266
5267 if (!profile_name || !domain || !id || !file_path) {
5268 stream->write_function(stream, "-ERR Missing Arguments\n");
5269 goto done;
5270 }
5271
5272 if (!(profile = get_profile(profile_name))) {
5273 stream->write_function(stream, "-ERR Profile not found\n");
5274 goto done;
5275 }
5276
5277 if (switch_file_exists(file_path, pool) != SWITCH_STATUS_SUCCESS) {
5278 stream->write_function(stream, "-ERR Filename doesn't exist\n");
5279 profile_rwunlock(profile);
5280 goto done;
5281 }
5282
5283 sql = switch_mprintf("SELECT count(*) FROM voicemail_prefs WHERE username = '%q' AND domain = '%q'", id, domain);
5284 vm_execute_sql2str(profile, profile->mutex, sql, res, sizeof(res));
5285 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5286
5287 {
5288 char *dir_path = switch_core_sprintf(pool, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir,
5289 SWITCH_PATH_SEPARATOR"/",
5290 SWITCH_PATH_SEPARATOR"/",
5291 profile->name, SWITCH_PATH_SEPARATOR"/", domain, SWITCH_PATH_SEPARATOR"/", id);
5292 char *final_file_path = switch_core_sprintf(pool, "%s%srecorded_name.%s", dir_path, SWITCH_PATH_SEPARATOR"/", profile->file_ext);
5293
5294 switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS0x0400 | 0x0200 | 0x0100 | 0x0040 | 0x0010, pool);
5295
5296 if (switch_file_exists(file_path, pool) != SWITCH_STATUS_SUCCESS) {
5297 stream->write_function(stream, "-ERR Filename doesn't exist\n");
5298 profile_rwunlock(profile);
5299 goto done;
5300 }
5301
5302 switch_file_rename(file_path, final_file_path, pool);
5303
5304 if (atoi(res) == 0) {
5305 sql = switch_mprintf("INSERT INTO voicemail_prefs (username, domain, name_path) VALUES('%q', '%q', '%q')", id, domain, final_file_path);
5306 } else {
5307 sql = switch_mprintf("UPDATE voicemail_prefs SET name_path = '%q' WHERE username = '%q' AND domain = '%q'", final_file_path, id, domain);
5308 }
5309 vm_execute_sql(profile, sql, profile->mutex);
5310 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5311
5312
5313 }
5314 profile_rwunlock(profile);
5315 stream->write_function(stream, "-OK\n");
5316done:
5317 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5317)
;
5318 return SWITCH_STATUS_SUCCESS;
5319}
5320
5321#define VM_FSDB_PREF_PASSWORD_SET_USAGE"<profile> <domain> <user> <password>" "<profile> <domain> <user> <password>"
5322SWITCH_STANDARD_API(vm_fsdb_pref_password_set_function)static switch_status_t vm_fsdb_pref_password_set_function ( const
char *cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5323{
5324 const char *password = NULL((void*)0);
5325
5326 char *sql = NULL((void*)0);
5327 char res[254] = "";
5328
5329 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5330 vm_profile_t *profile = NULL((void*)0);
5331
5332 char *argv[6] = { 0 };
5333 char *mycmd = NULL((void*)0);
5334
5335 switch_memory_pool_t *pool;
5336
5337 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5337)
;
5338
5339 if (!zstr(cmd)_zstr(cmd)) {
5340 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5340)
;
5341 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5342 }
5343
5344 if (argv[0])
5345 profile_name = argv[0];
5346 if (argv[1])
5347 domain = argv[1];
5348 if (argv[2])
5349 id = argv[2];
5350 if (argv[3])
5351 password = argv[3];
5352
5353 if (!profile_name || !domain || !id || !password) {
5354 stream->write_function(stream, "-ERR Missing Arguments\n");
5355 goto done;
5356 }
5357
5358 if (!(profile = get_profile(profile_name))) {
5359 stream->write_function(stream, "-ERR Profile not found\n");
5360 goto done;
5361 }
5362
5363 sql = switch_mprintf("SELECT count(*) FROM voicemail_prefs WHERE username = '%q' AND domain = '%q'", id, domain);
5364 vm_execute_sql2str(profile, profile->mutex, sql, res, sizeof(res));
5365 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5366
5367 if (atoi(res) == 0) {
5368 sql = switch_mprintf("INSERT INTO voicemail_prefs (username, domain, password) VALUES('%q', '%q', '%q')", id, domain, password);
5369 } else {
5370 sql = switch_mprintf("UPDATE voicemail_prefs SET password = '%q' WHERE username = '%q' AND domain = '%q'", password, id, domain);
5371 }
5372 vm_execute_sql(profile, sql, profile->mutex);
5373 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5374 profile_rwunlock(profile);
5375
5376 stream->write_function(stream, "-OK\n");
5377done:
5378 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5378)
;
5379 return SWITCH_STATUS_SUCCESS;
5380}
5381
5382
5383
5384/* Message API */
5385
5386#define VM_FSDB_MSG_LIST_USAGE"<format> <profile> <domain> <user> <folder> <filter> [msg-order = ASC | DESC]" "<format> <profile> <domain> <user> <folder> <filter> [msg-order = ASC | DESC]"
5387SWITCH_STANDARD_API(vm_fsdb_msg_list_function)static switch_status_t vm_fsdb_msg_list_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5388{
5389 char *sql;
5390 msg_lst_callback_t cbt = { 0 };
5391 char *ebuf = NULL((void*)0);
5392
5393 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0), *folder = NULL((void*)0), *msg_type = NULL((void*)0), *msg_order = NULL((void*)0);
5394 vm_profile_t *profile = NULL((void*)0);
5395
5396 char *argv[7] = { 0 };
5397 char *mycmd = NULL((void*)0);
5398
5399 switch_memory_pool_t *pool;
5400
5401 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5401)
;
5402
5403 if (!zstr(cmd)_zstr(cmd)) {
5404 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5404)
;
5405 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5406 }
5407
5408 if (argv[1])
5409 profile_name = argv[1];
5410 if (argv[2])
5411 domain = argv[2];
5412 if (argv[3])
5413 id = argv[3];
5414 if (argv[4])
5415 folder = argv[4]; /* TODO add Support */
5416 if (argv[5])
5417 msg_type = argv[5];
5418 if (argv[6])
5419 msg_order = argv[6];
5420
5421 if (!profile_name || !domain || !id || !folder || !msg_type) {
5422 stream->write_function(stream, "-ERR Missing Arguments\n");
5423 goto done;
5424 }
5425
5426 if (!msg_order) {
5427 msg_order = "ASC";
5428 } else if (strcasecmp(msg_order, "ASC") || strcasecmp(msg_order, "DESC")) {
5429 stream->write_function(stream, "-ERR Bad Argument: '%s'\n", msg_order);
5430 goto done;
5431 }
5432
5433 if (!(profile = get_profile(profile_name))) {
5434 stream->write_function(stream, "-ERR Profile not found\n");
5435 goto done;
5436 }
5437 if (!strcasecmp(msg_type, "not-read")) {
5438 sql = switch_mprintf("SELECT uuid FROM voicemail_msgs WHERE username = '%q' AND domain = '%q' AND read_epoch = 0 ORDER BY read_flags, created_epoch %q", id, domain, msg_order);
5439 } else if (!strcasecmp(msg_type, "new")) {
5440 sql = switch_mprintf("SELECT uuid FROM voicemail_msgs WHERE username = '%q' AND domain = '%q' AND flags='' ORDER BY read_flags, created_epoch %q", id, domain, msg_order);
5441 } else if (!strcasecmp(msg_type, "save")) {
5442 sql = switch_mprintf("SELECT uuid FROM voicemail_msgs WHERE username = '%q' AND domain = '%q' AND flags='save' ORDER BY read_flags, created_epoch %q", id, domain, msg_order);
5443 } else {
5444 sql = switch_mprintf("SELECT uuid FROM voicemail_msgs WHERE username = '%q' AND domain = '%q' AND read_epoch != 0 ORDER BY read_flags, created_epoch %q", id, domain, msg_order);
5445 }
5446 memset(&cbt, 0, sizeof(cbt));
5447
5448 switch_event_create(&cbt.my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 5448, &cbt.my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
5449
5450 vm_execute_sql_callback(profile, profile->mutex, sql, message_list_callback, &cbt);
5451
5452 profile_rwunlock(profile);
5453
5454 switch_event_add_header(cbt.my_params, SWITCH_STACK_BOTTOM, "VM-List-Count", "%"SWITCH_SIZE_T_FMT"ld", cbt.len);
5455 switch_event_serialize_json(cbt.my_params, &ebuf);
5456 switch_event_destroy(&cbt.my_params);
5457
5458 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5459 stream->write_function(stream, "%s", ebuf);
5460 switch_safe_free(ebuf)if (ebuf) {free(ebuf);ebuf=((void*)0);};
5461done:
5462 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5462)
;
5463 return SWITCH_STATUS_SUCCESS;
5464}
5465
5466#define VM_FSDB_MSG_PURGE_USAGE"<profile> <domain> <user>" "<profile> <domain> <user>"
5467SWITCH_STANDARD_API(vm_fsdb_msg_purge_function)static switch_status_t vm_fsdb_msg_purge_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5468{
5469 char *sql;
5470 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5471 vm_profile_t *profile = NULL((void*)0);
5472
5473 char *argv[6] = { 0 };
5474 char *mycmd = NULL((void*)0);
5475
5476 switch_memory_pool_t *pool;
5477
5478 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5478)
;
5479
5480 if (!zstr(cmd)_zstr(cmd)) {
5481 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5481)
;
5482 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5483 }
5484
5485 if (argv[0])
5486 profile_name = argv[0];
5487 if (argv[1])
5488 domain = argv[1];
5489 if (argv[2])
5490 id = argv[2];
5491
5492 if (!profile_name || !domain || !id) {
5493 stream->write_function(stream, "-ERR Missing Arguments\n");
5494 goto done;
5495 }
5496
5497 if (!(profile = get_profile(profile_name))) {
5498 stream->write_function(stream, "-ERR Profile not found\n");
5499 goto done;
5500 }
5501
5502 sql = switch_mprintf("SELECT '%q', uuid, username, domain, file_path FROM voicemail_msgs WHERE username = '%q' AND domain = '%q' AND flags = 'delete'", profile_name, id, domain);
5503 vm_execute_sql_callback(profile, profile->mutex, sql, message_purge_callback, NULL((void*)0));
5504 update_mwi(profile, id, domain, "inbox", MWI_REASON_PURGE); /* TODO Make inbox value configurable */
5505
5506 profile_rwunlock(profile);
5507
5508 stream->write_function(stream, "-OK\n");
5509
5510done:
5511 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5511)
;
5512 return SWITCH_STATUS_SUCCESS;
5513}
5514
5515#define VM_FSDB_MSG_DELETE_USAGE"<profile> <domain> <user> <uuid>" "<profile> <domain> <user> <uuid>"
5516SWITCH_STANDARD_API(vm_fsdb_msg_delete_function)static switch_status_t vm_fsdb_msg_delete_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5517{
5518 char *sql;
5519 const char *uuid = NULL((void*)0);
5520
5521 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5522 vm_profile_t *profile = NULL((void*)0);
5523
5524 char *argv[6] = { 0 };
5525 char *mycmd = NULL((void*)0);
5526
5527 switch_memory_pool_t *pool;
5528
5529 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5529)
;
5530
5531 if (!zstr(cmd)_zstr(cmd)) {
5532 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5532)
;
5533 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5534 }
5535
5536 if (argv[0])
5537 profile_name = argv[0];
5538 if (argv[1])
5539 domain = argv[1];
5540 if (argv[2])
5541 id = argv[2];
5542 if (argv[3])
5543 uuid = argv[3];
5544
5545 if (!profile_name || !domain || !id || !uuid) {
5546 stream->write_function(stream, "-ERR Missing Arguments\n");
5547 goto done;
5548 }
5549
5550 if (!(profile = get_profile(profile_name))) {
5551 stream->write_function(stream, "-ERR Profile not found\n");
5552 goto done;
5553 }
5554
5555 sql = switch_mprintf("UPDATE voicemail_msgs SET flags = 'delete' WHERE username = '%q' AND domain = '%q' AND uuid = '%q'", id, domain, uuid);
5556 vm_execute_sql(profile, sql, profile->mutex);
5557 profile_rwunlock(profile);
5558
5559 stream->write_function(stream, "-OK\n");
5560
5561done:
5562 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5562)
;
5563 return SWITCH_STATUS_SUCCESS;
5564}
5565
5566#define VM_FSDB_MSG_SAVE_USAGE"<profile> <domain> <user> <uuid>" "<profile> <domain> <user> <uuid>"
5567SWITCH_STANDARD_API(vm_fsdb_msg_save_function)static switch_status_t vm_fsdb_msg_save_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5568{
5569 char *sql;
5570 const char *uuid = NULL((void*)0);
5571
5572 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5573 vm_profile_t *profile = NULL((void*)0);
5574
5575 char *argv[6] = { 0 };
5576 char *mycmd = NULL((void*)0);
5577
5578 switch_memory_pool_t *pool;
5579
5580 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5580)
;
5581
5582 if (!zstr(cmd)_zstr(cmd)) {
5583 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5583)
;
5584 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5585 }
5586
5587 if (argv[0])
5588 profile_name = argv[0];
5589 if (argv[1])
5590 domain = argv[1];
5591 if (argv[2])
5592 id = argv[2];
5593 if (argv[3])
5594 uuid = argv[3];
5595
5596 if (!profile_name || !domain || !id || !uuid) {
5597 stream->write_function(stream, "-ERR Missing Arguments\n");
5598 goto done;
5599 }
5600
5601 if (!(profile = get_profile(profile_name))) {
5602 stream->write_function(stream, "-ERR Profile not found\n");
5603 goto done;
5604 }
5605
5606 sql = switch_mprintf("UPDATE voicemail_msgs SET flags='save' WHERE username='%q' AND domain='%q' AND uuid = '%q'", id, domain, uuid);
5607 vm_execute_sql(profile, sql, profile->mutex);
5608 profile_rwunlock(profile);
5609
5610 stream->write_function(stream, "-OK\n");
5611done:
5612 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5612)
;
5613 return SWITCH_STATUS_SUCCESS;
5614}
5615
5616#define VM_FSDB_MSG_UNDELETE_USAGE"<profile> <domain> <user> <uuid>" "<profile> <domain> <user> <uuid>"
5617SWITCH_STANDARD_API(vm_fsdb_msg_undelete_function)static switch_status_t vm_fsdb_msg_undelete_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5618{
5619 char *sql;
5620 const char *uuid = NULL((void*)0);
5621
5622 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5623 vm_profile_t *profile = NULL((void*)0);
5624
5625 char *argv[6] = { 0 };
5626 char *mycmd = NULL((void*)0);
5627
5628 switch_memory_pool_t *pool;
5629
5630 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5630)
;
5631
5632 if (!zstr(cmd)_zstr(cmd)) {
5633 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5633)
;
5634 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5635 }
5636
5637 if (argv[0])
5638 profile_name = argv[0];
5639 if (argv[1])
5640 domain = argv[1];
5641 if (argv[2])
5642 id = argv[2];
5643 if (argv[3])
5644 uuid = argv[3];
5645
5646 if (!profile_name || !domain || !id || !uuid) {
5647 stream->write_function(stream, "-ERR Missing Arguments\n");
5648 goto done;
5649 }
5650
5651 if (!(profile = get_profile(profile_name))) {
5652 stream->write_function(stream, "-ERR Profile not found\n");
5653 goto done;
5654 }
5655
5656 sql = switch_mprintf("UPDATE voicemail_msgs SET flags='' WHERE username='%q' AND domain='%q' AND uuid = '%q'", id, domain, uuid);
5657 vm_execute_sql(profile, sql, profile->mutex);
5658 profile_rwunlock(profile);
5659
5660 stream->write_function(stream, "-OK\n");
5661done:
5662 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5662)
;
5663 return SWITCH_STATUS_SUCCESS;
5664}
5665
5666#define VM_FSDB_AUTH_LOGIN_USAGE"<profile> <domain> <user> <password>" "<profile> <domain> <user> <password>"
5667SWITCH_STANDARD_API(vm_fsdb_auth_login_function)static switch_status_t vm_fsdb_auth_login_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5668{
5669 char *sql;
5670 char *password = NULL((void*)0);
5671
5672 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5673 vm_profile_t *profile = NULL((void*)0);
5674
5675 char *argv[6] = { 0 };
5676 char *mycmd = NULL((void*)0);
5677
5678 char user_db_password[64] = { 0 };
5679 const char *user_xml_password = NULL((void*)0);
5680 switch_bool_t authorized = SWITCH_FALSE;
5681 switch_event_t *params = NULL((void*)0);
5682 switch_xml_t x_user = NULL((void*)0);
5683 switch_bool_t vm_enabled = SWITCH_TRUE;
5684
5685 switch_memory_pool_t *pool;
5686
5687 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5687)
;
5688
5689 if (!zstr(cmd)_zstr(cmd)) {
5690 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5690)
;
5691 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5692 }
5693
5694 if (argv[0])
5695 profile_name = argv[0];
5696 if (argv[1])
5697 domain = argv[1];
5698 if (argv[2])
5699 id = argv[2];
5700 if (argv[3])
5701 password = argv[3];
5702
5703 if (!profile_name || !domain || !id || !password) {
5704 stream->write_function(stream, "-ERR Missing Arguments\n");
5705 goto done;
5706 }
5707
5708 if (!(profile = get_profile(profile_name))) {
5709 stream->write_function(stream, "-ERR Profile not found\n");
5710 goto done;
5711 }
5712
5713 switch_event_create(&params, SWITCH_EVENT_GENERAL)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 5713, &params, SWITCH_EVENT_GENERAL
, ((void*)0))
;
5714 if (switch_xml_locate_user_merged("id:number-alias", id, domain, NULL((void*)0), &x_user, params) != SWITCH_STATUS_SUCCESS) {
5715 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 5715, (const char*)(session)
, SWITCH_LOG_WARNING, "Can't find user [%s@%s]\n", id, domain);
5716 stream->write_function(stream, "-ERR User not found\n");
5717 } else {
5718 switch_xml_t x_param, x_params;
5719
5720 x_params = switch_xml_child(x_user, "params");
5721
5722 for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
5723 const char *var = switch_xml_attr_soft(x_param, "name");
5724 const char *val = switch_xml_attr_soft(x_param, "value");
5725 if (zstr(var)_zstr(var) || zstr(val)_zstr(val)) {
5726 continue; /* Ignore empty entires */
5727 }
5728
5729 if (!strcasecmp(var, "vm-enabled")) {
5730 vm_enabled = !switch_false(val);
5731 }
5732 if (!strcasecmp(var, "vm-password")) {
5733 user_xml_password = val;
5734 }
5735 }
5736
5737 sql = switch_mprintf("SELECT password FROM voicemail_prefs WHERE username = '%q' AND domain = '%q'", id, domain);
5738 vm_execute_sql2str(profile, profile->mutex, sql, user_db_password, sizeof(user_db_password));
5739 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5740
5741 if (vm_enabled == SWITCH_FALSE) {
5742 stream->write_function(stream, "%s", "-ERR Login Denied");
5743 } else {
5744 if (!zstr(user_db_password)_zstr(user_db_password)) {
5745 if (!strcasecmp(user_db_password, password)) {
5746 authorized = SWITCH_TRUE;
5747 }
5748 if (!profile->db_password_override && !zstr(user_xml_password)_zstr(user_xml_password) && !strcasecmp(user_xml_password, password)) {
5749 authorized = SWITCH_TRUE;
5750 }
5751 } else {
5752 if (!zstr(user_xml_password)_zstr(user_xml_password)) {
5753 if (!strcasecmp(user_xml_password, password)) {
5754 authorized = SWITCH_TRUE;
5755 }
5756 }
5757 }
5758 if (profile->allow_empty_password_auth && zstr(user_db_password)_zstr(user_db_password) && zstr(user_xml_password)_zstr(user_xml_password)) {
5759 authorized = SWITCH_TRUE;
5760 }
5761 if (authorized) {
5762 stream->write_function(stream, "%s", "-OK");
5763 } else {
5764 stream->write_function(stream, "%s", "-ERR");
5765 }
5766 }
5767 }
5768
5769 xml_safe_free(x_user)if (x_user) switch_xml_free(x_user); x_user = ((void*)0);
5770
5771 profile_rwunlock(profile);
5772done:
5773 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5773)
;
5774 return SWITCH_STATUS_SUCCESS;
5775}
5776
5777#define VM_FSDB_MSG_FORWARD_USAGE"<profile> <domain> <user> <uuid> <dst_domain> <dst_user> [prepend_file_location]" "<profile> <domain> <user> <uuid> <dst_domain> <dst_user> [prepend_file_location]"
5778SWITCH_STANDARD_API(vm_fsdb_msg_forward_function)static switch_status_t vm_fsdb_msg_forward_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5779{
5780 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0), *uuid = NULL((void*)0), *dst_domain = NULL((void*)0), *dst_id = NULL((void*)0), *prepend_file_path = NULL((void*)0);
5781 vm_profile_t *profile = NULL((void*)0);
5782 char *argv[7] = { 0 };
5783 char *mycmd = NULL((void*)0);
5784 msg_get_callback_t cbt = { 0 };
5785 char *sql;
5786 switch_memory_pool_t *pool;
5787
5788 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5788)
;
5789
5790 if (!zstr(cmd)_zstr(cmd)) {
5791 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5791)
;
5792 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5793 }
5794
5795 if (argv[0])
5796 profile_name = argv[0];
5797 if (argv[1])
5798 domain = argv[1];
5799 if (argv[2])
5800 id = argv[2];
5801 if (argv[3])
5802 uuid = argv[3];
5803 if (argv[4])
5804 dst_domain = argv[4];
5805 if (argv[5])
5806 dst_id = argv[5];
5807 if (argv[6])
5808 prepend_file_path = argv[6];
5809
5810 if (!profile_name || !domain || !id || !uuid || !dst_domain || !dst_id) {
5811 stream->write_function(stream, "-ERR Missing Arguments\n");
5812 goto done;
5813 }
5814
5815 if (!(profile = get_profile(profile_name))) {
5816 stream->write_function(stream, "-ERR Profile not found\n");
5817 goto done;
5818 } else {
5819 const char *file_path = NULL((void*)0);
5820 sql = switch_mprintf("select created_epoch, read_epoch, username, domain, uuid, cid_name, cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by from voicemail_msgs WHERE username = '%q' AND domain = '%q' AND uuid = '%q' ORDER BY read_flags, created_epoch", id, domain, uuid);
5821 memset(&cbt, 0, sizeof(cbt));
5822 switch_event_create(&cbt.my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 5822, &cbt.my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
5823 vm_execute_sql_callback(profile, profile->mutex, sql, message_get_callback, &cbt);
5824 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5825 file_path = switch_event_get_header(cbt.my_params, "VM-Message-File-Path")switch_event_get_header_idx(cbt.my_params, "VM-Message-File-Path"
, -1)
;
5826 if (file_path && switch_file_exists(file_path, pool) == SWITCH_STATUS_SUCCESS) {
5827 const char *new_file_path = file_path;
5828 const char *cmd = NULL((void*)0);
5829
5830
5831 if (prepend_file_path && switch_file_exists(prepend_file_path, pool) == SWITCH_STATUS_SUCCESS) {
5832 switch_uuid_t tmp_uuid;
5833 char tmp_uuid_str[SWITCH_UUID_FORMATTED_LENGTH256 + 1];
5834 const char *test[3] = { NULL((void*)0) };
5835 test[0] = prepend_file_path;
5836 test[1] = file_path;
5837
5838 switch_uuid_get(&tmp_uuid);
5839 switch_uuid_format(tmp_uuid_str, &tmp_uuid);
5840
5841 new_file_path = switch_core_sprintf(pool, "%s%smsg_%s.wav", SWITCH_GLOBAL_dirs.temp_dir, SWITCH_PATH_SEPARATOR"/", tmp_uuid_str);
5842
5843 if (vm_merge_media_files(test, new_file_path) != SWITCH_STATUS_SUCCESS) {
5844 stream->write_function(stream, "-ERR Error Merging the file\n");
5845 switch_event_destroy(&cbt.my_params);
5846 profile_rwunlock(profile);
5847 goto done;
5848 }
5849
5850 }
5851 cmd = switch_core_sprintf(pool, "%s@%s %s %s '%s'", dst_id, dst_domain, new_file_path, switch_event_get_header(cbt.my_params, "VM-Message-Caller-Number")switch_event_get_header_idx(cbt.my_params, "VM-Message-Caller-Number"
, -1)
, switch_event_get_header(cbt.my_params, "VM-Message-Caller-Name")switch_event_get_header_idx(cbt.my_params, "VM-Message-Caller-Name"
, -1)
);
5852 if (voicemail_inject(cmd, NULL((void*)0)) == SWITCH_STATUS_SUCCESS) {
5853 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 5853, ((void*)0)
, SWITCH_LOG_NOTICE, "Sent Carbon Copy to %s@%s\n", dst_id, dst_domain);
5854 } else {
5855 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 5855, ((void*)0)
, SWITCH_LOG_ERROR, "Failed to Carbon Copy to %s@%s\n", dst_id, dst_domain);
5856 stream->write_function(stream, "-ERR Error Forwarding Message\n");
5857 switch_event_destroy(&cbt.my_params);
5858 profile_rwunlock(profile);
5859 goto done;
5860 }
5861 if (new_file_path != file_path) {
5862 /* TODO UNLINK new-file-path */
5863 }
5864 } else {
5865 stream->write_function(stream, "-ERR Cannot find source msg to forward: %s\n", file_path);
5866 switch_event_destroy(&cbt.my_params);
5867 profile_rwunlock(profile);
5868 goto done;
5869 }
5870
5871 switch_event_destroy(&cbt.my_params);
5872
5873 profile_rwunlock(profile);
5874 }
5875 stream->write_function(stream, "-OK\n");
5876done:
5877 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5877)
;
5878
5879
5880 return SWITCH_STATUS_SUCCESS;
5881}
5882
5883#define VM_FSDB_MSG_GET_USAGE"<format> <profile> <domain> <user> <uuid>" "<format> <profile> <domain> <user> <uuid>"
5884SWITCH_STANDARD_API(vm_fsdb_msg_get_function)static switch_status_t vm_fsdb_msg_get_function ( const char *
cmd, switch_core_session_t *session, switch_stream_handle_t *
stream)
5885{
5886 char *sql;
5887 msg_get_callback_t cbt = { 0 };
5888 char *ebuf = NULL((void*)0);
5889 char *uuid = NULL((void*)0);
5890
5891 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0);
5892 vm_profile_t *profile = NULL((void*)0);
5893
5894 char *argv[6] = { 0 };
5895 char *mycmd = NULL((void*)0);
5896
5897 switch_memory_pool_t *pool;
5898
5899 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5899)
;
5900
5901 if (!zstr(cmd)_zstr(cmd)) {
5902 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5902)
;
5903 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5904 }
5905
5906 if (argv[1])
5907 profile_name = argv[1];
5908 if (argv[2])
5909 domain = argv[2];
5910 if (argv[3])
5911 id = argv[3];
5912 if (argv[4])
5913 uuid = argv[4];
5914
5915 if (!profile_name || !domain || !id || !uuid) {
5916 stream->write_function(stream, "-ERR Missing Arguments\n");
5917 goto done;
5918 }
5919
5920 if (!(profile = get_profile(profile_name))) {
5921 stream->write_function(stream, "-ERR Profile not found\n");
5922 goto done;
5923 }
5924
5925 sql = switch_mprintf("select created_epoch, read_epoch, username, domain, uuid, cid_name, cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by from voicemail_msgs WHERE username = '%q' AND domain = '%q' AND uuid = '%q' ORDER BY read_flags, created_epoch", id, domain, uuid);
5926
5927 memset(&cbt, 0, sizeof(cbt));
5928
5929 switch_event_create(&cbt.my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 5929, &cbt.my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
5930
5931 vm_execute_sql_callback(profile, profile->mutex, sql, message_get_callback, &cbt);
5932
5933 profile_rwunlock(profile);
5934
5935 switch_event_serialize_json(cbt.my_params, &ebuf);
5936 switch_event_destroy(&cbt.my_params);
5937
5938 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
5939 stream->write_function(stream, "%s", ebuf);
5940 switch_safe_free(ebuf)if (ebuf) {free(ebuf);ebuf=((void*)0);};
5941done:
5942 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5942)
;
5943 return SWITCH_STATUS_SUCCESS;
5944}
5945
5946#define VM_FSDB_MSG_EMAIL_USAGE"<profile> <domain> <user> <uuid> <email>" "<profile> <domain> <user> <uuid> <email>"
5947SWITCH_STANDARD_API(vm_fsdb_msg_email_function)static switch_status_t vm_fsdb_msg_email_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
5948{
5949 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0), *uuid = NULL((void*)0), *email = NULL((void*)0);
5950 vm_profile_t *profile = NULL((void*)0);
5951 char *argv[7] = { 0 };
5952 char *mycmd = NULL((void*)0);
5953 msg_get_callback_t cbt = { 0 };
5954 char *sql;
5955 switch_memory_pool_t *pool;
5956
5957 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 5957)
;
5958
5959 if (!zstr(cmd)_zstr(cmd)) {
5960 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 5960)
;
5961 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
5962 }
5963
5964 if (argv[0])
5965 profile_name = argv[0];
5966 if (argv[1])
5967 domain = argv[1];
5968 if (argv[2])
5969 id = argv[2];
5970 if (argv[3])
5971 uuid = argv[3];
5972 if (argv[4])
5973 email = argv[4];
5974
5975 if (!profile_name || !domain || !id || !uuid || !email) {
5976 stream->write_function(stream, "-ERR Missing Arguments\n");
5977 goto done;
5978 }
5979
5980 if (!(profile = get_profile(profile_name))) {
5981 stream->write_function(stream, "-ERR Profile not found\n");
5982 goto done;
5983 } else {
5984 char *from;
5985 char *headers, *header_string;
5986 char *body;
5987 int priority = 3;
5988 switch_size_t retsize;
5989 switch_time_exp_t tm;
5990 char date[80] = "";
5991 int total_new_messages = 0;
5992 int total_saved_messages = 0;
5993 int total_new_urgent_messages = 0;
5994 int total_saved_urgent_messages = 0;
5995 int32_t message_len = 0;
5996 char *p;
5997 switch_time_t l_duration = 0;
5998 switch_core_time_duration_t duration;
5999 char duration_str[80];
6000 char *formatted_cid_num = NULL((void*)0);
6001
6002 sql = switch_mprintf("select created_epoch, read_epoch, username, domain, uuid, cid_name, cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by from voicemail_msgs WHERE username = '%q' AND domain = '%q' AND uuid = '%q' ORDER BY read_flags, created_epoch", id, domain, uuid);
6003 memset(&cbt, 0, sizeof(cbt));
6004 switch_event_create(&cbt.my_params, SWITCH_EVENT_GENERAL)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 6004, &cbt.my_params, SWITCH_EVENT_GENERAL
, ((void*)0))
;
6005 vm_execute_sql_callback(profile, profile->mutex, sql, message_get_callback, &cbt);
6006 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
6007
6008 if (!strcasecmp(switch_event_get_header(cbt.my_params, "VM-Message-Read-Flags")switch_event_get_header_idx(cbt.my_params, "VM-Message-Read-Flags"
, -1)
, URGENT_FLAG_STRING"A_URGENT")) {
6009 priority = 1;
6010 }
6011
6012 message_count(profile, id, domain, switch_event_get_header(cbt.my_params, "VM-Message-Folder")switch_event_get_header_idx(cbt.my_params, "VM-Message-Folder"
, -1)
, &total_new_messages, &total_saved_messages,
6013 &total_new_urgent_messages, &total_saved_urgent_messages);
6014
6015 switch_time_exp_lt(&tm, switch_time_make(atol(switch_event_get_header(cbt.my_params, "VM-Message-Received-Epoch")switch_event_get_header_idx(cbt.my_params, "VM-Message-Received-Epoch"
, -1)
), 0));
6016 switch_strftime(date, &retsize, sizeof(date), profile->date_fmt, &tm);
6017
6018 formatted_cid_num = switch_format_number(switch_event_get_header(cbt.my_params, "VM-Message-Caller-Number")switch_event_get_header_idx(cbt.my_params, "VM-Message-Caller-Number"
, -1)
);
6019
6020 /* Legacy Mod_VoiceMail variable */
6021 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "Message-Type", "forwarded-voicemail");
6022 switch_event_add_header(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_total_new_messages", "%d", total_new_messages);
6023 switch_event_add_header(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_total_saved_messages", "%d", total_saved_messages);
6024 switch_event_add_header(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_urgent_new_messages", "%d", total_new_urgent_messages);
6025 switch_event_add_header(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_urgent_saved_messages", "%d", total_saved_urgent_messages);
6026 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_current_folder", switch_event_get_header(cbt.my_params, "VM-Message-Folder")switch_event_get_header_idx(cbt.my_params, "VM-Message-Folder"
, -1)
);
6027 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_account", id);
6028 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_domain", domain);
6029 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_caller_id_number", switch_event_get_header(cbt.my_params, "VM-Message-Caller-Number")switch_event_get_header_idx(cbt.my_params, "VM-Message-Caller-Number"
, -1)
);
6030 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_formatted_caller_id_number", formatted_cid_num);
6031 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_caller_id_name", switch_event_get_header(cbt.my_params, "VM-Message-Caller-Name")switch_event_get_header_idx(cbt.my_params, "VM-Message-Caller-Name"
, -1)
);
6032 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_file_path", switch_event_get_header(cbt.my_params, "VM-Message-File-Path")switch_event_get_header_idx(cbt.my_params, "VM-Message-File-Path"
, -1)
);
6033 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_read_flags", switch_event_get_header(cbt.my_params, "VM-Message-Read-Flags")switch_event_get_header_idx(cbt.my_params, "VM-Message-Read-Flags"
, -1)
);
6034 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_time", date);
6035 switch_event_add_header(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_priority", "%d", priority);
6036
6037
6038 message_len = atoi(switch_event_get_header(cbt.my_params, "VM-Message-Duration")switch_event_get_header_idx(cbt.my_params, "VM-Message-Duration"
, -1)
);
6039 switch_safe_free(formatted_cid_num)if (formatted_cid_num) {free(formatted_cid_num);formatted_cid_num
=((void*)0);}
;
6040
6041 l_duration = switch_time_make(atol(switch_event_get_header(cbt.my_params, "VM-Message-Duration")switch_event_get_header_idx(cbt.my_params, "VM-Message-Duration"
, -1)
), 0);
6042 switch_core_measure_time(l_duration, &duration);
6043 duration.day += duration.yr * 365;
6044 duration.hr += duration.day * 24;
6045
6046 switch_snprintf(duration_str, sizeof(duration_str), "%.2u:%.2u:%.2u", duration.hr, duration.min, duration.sec);
6047
6048 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_message_len", duration_str);
6049 switch_event_add_header_string(cbt.my_params, SWITCH_STACK_BOTTOM, "voicemail_email", email);
6050
6051 if (zstr(profile->email_from)_zstr(profile->email_from)) {
6052 from = switch_core_sprintf(pool, "%s@%s", id, domain);
6053 } else {
6054 from = switch_event_expand_headers(cbt.my_params, profile->email_from)switch_event_expand_headers_check(cbt.my_params, profile->
email_from, ((void*)0), ((void*)0), 0)
;;
6055 }
6056
6057 if (zstr(profile->email_headers)_zstr(profile->email_headers)) {
6058 headers = switch_core_sprintf(pool,
6059 "From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s\nX-Priority: %d",
6060 id, domain, switch_event_get_header(cbt.my_params, "VM-Message-Caller-Name")switch_event_get_header_idx(cbt.my_params, "VM-Message-Caller-Name"
, -1)
,
6061 switch_event_get_header(cbt.my_params, "VM-Message-Caller-Number")switch_event_get_header_idx(cbt.my_params, "VM-Message-Caller-Number"
, -1)
, priority);
6062 } else {
6063 headers = switch_event_expand_headers(cbt.my_params, profile->email_headers)switch_event_expand_headers_check(cbt.my_params, profile->
email_headers, ((void*)0), ((void*)0), 0)
;
6064 }
6065
6066 p = headers + (strlen(headers) - 1);
6067 if (*p == '\n') {
6068 if (*(p - 1) == '\r') {
6069 p--;
6070 }
6071 *p = '\0';
6072 }
6073
6074 header_string = switch_core_sprintf(pool, "%s\nX-Voicemail-Length: %u", headers, message_len);
6075
6076 if (profile->email_body) {
6077 body = switch_event_expand_headers(cbt.my_params, profile->email_body)switch_event_expand_headers_check(cbt.my_params, profile->
email_body, ((void*)0), ((void*)0), 0)
;
6078 } else {
6079 body = switch_mprintf("%u second Voicemail from %s %s", message_len, switch_event_get_header(cbt.my_params, "VM-Message-Caller-Name")switch_event_get_header_idx(cbt.my_params, "VM-Message-Caller-Name"
, -1)
, switch_event_get_header(cbt.my_params, "VM-Message-Caller-Number")switch_event_get_header_idx(cbt.my_params, "VM-Message-Caller-Number"
, -1)
);
6080 }
6081
6082 switch_simple_email(email, from, header_string, body, switch_event_get_header(cbt.my_params, "VM-Message-File-Path")switch_event_get_header_idx(cbt.my_params, "VM-Message-File-Path"
, -1)
, profile->convert_cmd, profile->convert_ext);
6083 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session)SWITCH_CHANNEL_ID_SESSION, "mod_voicemail.c", (const char *)__func__
, 6083, (const char*)(session)
, SWITCH_LOG_DEBUG, "Sending message to %s\n", email);
6084 switch_safe_free(body)if (body) {free(body);body=((void*)0);};
6085
6086 switch_event_fire(&cbt.my_params)switch_event_fire_detailed("mod_voicemail.c", (const char * )
(const char *)__func__, 6086, &cbt.my_params, ((void*)0))
;
6087
6088
6089 profile_rwunlock(profile);
6090 }
6091 stream->write_function(stream, "-OK\n");
6092done:
6093 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 6093)
;
6094
6095 return SWITCH_STATUS_SUCCESS;
6096}
6097
6098#define VM_FSDB_MSG_COUNT_USAGE"<format> <profile> <domain> <user> <folder>" "<format> <profile> <domain> <user> <folder>"
6099SWITCH_STANDARD_API(vm_fsdb_msg_count_function)static switch_status_t vm_fsdb_msg_count_function ( const char
*cmd, switch_core_session_t *session, switch_stream_handle_t
*stream)
6100{
6101 char *sql;
6102 msg_cnt_callback_t cbt = { 0 };
6103 switch_event_t *my_params = NULL((void*)0);
6104 char *ebuf = NULL((void*)0);
6105
6106 const char *id = NULL((void*)0), *domain = NULL((void*)0), *profile_name = NULL((void*)0), *folder = NULL((void*)0);
6107 vm_profile_t *profile = NULL((void*)0);
6108
6109 char *argv[6] = { 0 };
6110 char *mycmd = NULL((void*)0);
6111
6112 switch_memory_pool_t *pool;
6113
6114 switch_core_new_memory_pool(&pool)switch_core_perform_new_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 6114)
;
6115
6116 if (!zstr(cmd)_zstr(cmd)) {
6117 mycmd = switch_core_strdup(pool, cmd)switch_core_perform_strdup(pool, cmd, "mod_voicemail.c", (const
char *)__func__, 6117)
;
6118 switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
6119 }
6120
6121 if (argv[1])
6122 profile_name = argv[1];
6123 if (argv[2])
6124 domain = argv[2];
6125 if (argv[3])
6126 id = argv[3];
6127 if (argv[4])
6128 folder = argv[4];
6129
6130 if (!profile_name || !domain || !id || !folder) {
6131 stream->write_function(stream, "-ERR Missing Arguments\n");
6132 goto done;
6133 }
6134
6135 if (!(profile = get_profile(profile_name))) {
6136 stream->write_function(stream, "-ERR Profile not found\n");
6137 goto done;
6138 }
6139
6140 sql = switch_mprintf(
6141 "SELECT 1, read_flags, count(read_epoch) FROM voicemail_msgs WHERE username = '%q' AND domain = '%q' AND in_folder = '%q' AND flags = '' AND in_folder = '%q' GROUP BY read_flags "
6142 "UNION "
6143 "SELECT 0, read_flags, count(read_epoch) FROM voicemail_msgs WHERE username = '%q' AND domain = '%q' AND in_folder = '%q' AND flags = 'save' AND in_folder= '%q' GROUP BY read_flags;",
6144 id, domain, "inbox", folder,
6145 id, domain, "inbox", folder);
6146
6147
6148 vm_execute_sql_callback(profile, profile->mutex, sql, message_count_callback, &cbt);
6149
6150 profile_rwunlock(profile);
6151
6152 switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS)switch_event_create_subclass_detailed("mod_voicemail.c", (const
char * )(const char *)__func__, 6152, &my_params, SWITCH_EVENT_REQUEST_PARAMS
, ((void*)0))
;
6153 switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Total-New-Messages", "%d", cbt.total_new_messages + cbt.total_new_urgent_messages);
6154 switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Total-New-Urgent-Messages", "%d", cbt.total_new_urgent_messages);
6155 switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Total-Saved-Messages", "%d", cbt.total_saved_messages + cbt.total_saved_urgent_messages);
6156 switch_event_add_header(my_params, SWITCH_STACK_BOTTOM, "VM-Total-Saved-Urgent-Messages", "%d", cbt.total_saved_urgent_messages);
6157 switch_event_serialize_json(my_params, &ebuf);
6158 switch_event_destroy(&my_params);
6159
6160 switch_safe_free(sql)if (sql) {free(sql);sql=((void*)0);};
6161 stream->write_function(stream, "%s", ebuf);
6162 switch_safe_free(ebuf)if (ebuf) {free(ebuf);ebuf=((void*)0);};
6163done:
6164 switch_core_destroy_memory_pool(&pool)switch_core_perform_destroy_memory_pool(&pool, "mod_voicemail.c"
, (const char *)__func__, 6164)
;
6165 return SWITCH_STATUS_SUCCESS;
6166}
6167
6168SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load)switch_status_t mod_voicemail_load (switch_loadable_module_interface_t
**module_interface, switch_memory_pool_t *pool)
6169{
6170 switch_application_interface_t *app_interface;
6171 switch_api_interface_t *commands_api_interface;
6172 switch_status_t status;
6173
6174 /* create/register custom event message type */
6175 if (switch_event_reserve_subclass(VM_EVENT_MAINT)switch_event_reserve_subclass_detailed("mod_voicemail.c", "vm::maintenance"
)
!= SWITCH_STATUS_SUCCESS) {
6176 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 6176, ((void*)0)
, SWITCH_LOG_ERROR, "Couldn't register subclass %s!\n", VM_EVENT_MAINT"vm::maintenance");
6177 return SWITCH_STATUS_TERM;
6178 }
6179
6180 memset(&globals, 0, sizeof(globals));
6181 globals.pool = pool;
6182
6183 switch_core_hash_init(&globals.profile_hash)switch_core_hash_init_case(&globals.profile_hash, SWITCH_TRUE
)
;
6184 switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED0x1, globals.pool);
6185
6186 switch_mutex_lock(globals.mutex);
6187 globals.running = 1;
6188 switch_mutex_unlock(globals.mutex);
6189
6190 switch_queue_create(&globals.event_queue, VM_EVENT_QUEUE_SIZE50000, globals.pool);
6191
6192 if ((status = load_config()) != SWITCH_STATUS_SUCCESS) {
6193 globals.running = 0;
6194 return status;
6195 }
6196 /* connect my internal structure to the blank pointer passed to me */
6197 *module_interface = switch_loadable_module_create_module_interface(pool, modname);
6198
6199 if (switch_event_bind(modname, SWITCH_EVENT_MESSAGE_QUERY, SWITCH_EVENT_SUBCLASS_ANY((void*)0), vm_event_handler, NULL((void*)0))
6200 != SWITCH_STATUS_SUCCESS) {
6201 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 6201, ((void*)0)
, SWITCH_LOG_ERROR, "Couldn't bind!\n");
6202 return SWITCH_STATUS_GENERR;
6203 }
6204
6205 SWITCH_ADD_APP(app_interface, "voicemail", "Voicemail", VM_DESC, voicemail_function, VM_USAGE, SAF_NONE)for (;;) { app_interface = (switch_application_interface_t *)
switch_loadable_module_create_interface(*module_interface, SWITCH_APPLICATION_INTERFACE
); app_interface->interface_name = "voicemail"; app_interface
->application_function = voicemail_function; app_interface
->short_desc = "Voicemail"; app_interface->long_desc = "voicemail"
; app_interface->syntax = "[check] [auth] <profile_name> <domain_name> [<id>] [uuid]"
; app_interface->flags = SAF_NONE; break; }
;
6206 SWITCH_ADD_API(commands_api_interface, "voicemail", "voicemail", voicemail_api_function, VOICEMAIL_SYNTAX)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "voicemail"; commands_api_interface
->desc = "voicemail"; commands_api_interface->function =
voicemail_api_function; commands_api_interface->syntax = "rss [<host> <port> <uri> <user> <domain>] | [load|unload|reload] <profile> [reloadxml]"
; break; }
;
6207 SWITCH_ADD_API(commands_api_interface, "voicemail_inject", "voicemail_inject", voicemail_inject_api_function, VM_INJECT_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "voicemail_inject"
; commands_api_interface->desc = "voicemail_inject"; commands_api_interface
->function = voicemail_inject_api_function; commands_api_interface
->syntax = "[group=<group>[@domain]|domain=<domain>|<box>[@<domain>]] <sound_file> [<cid_num>] [<cid_name>]"
; break; }
;
6208 SWITCH_ADD_API(commands_api_interface, "vm_inject", "vm_inject", voicemail_inject_api_function, VM_INJECT_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_inject"; commands_api_interface
->desc = "vm_inject"; commands_api_interface->function =
voicemail_inject_api_function; commands_api_interface->syntax
= "[group=<group>[@domain]|domain=<domain>|<box>[@<domain>]] <sound_file> [<cid_num>] [<cid_name>]"
; break; }
;
6209 SWITCH_ADD_API(commands_api_interface, "vm_boxcount", "vm_boxcount", boxcount_api_function, BOXCOUNT_SYNTAX)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_boxcount";
commands_api_interface->desc = "vm_boxcount"; commands_api_interface
->function = boxcount_api_function; commands_api_interface
->syntax = "[profile/]<user>@<domain>[|[new|saved|new-urgent|saved-urgent|all]]"
; break; }
;
6210 SWITCH_ADD_API(commands_api_interface, "vm_prefs", "vm_prefs", prefs_api_function, PREFS_SYNTAX)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_prefs"; commands_api_interface
->desc = "vm_prefs"; commands_api_interface->function =
prefs_api_function; commands_api_interface->syntax = "[profile/]<user>@<domain>[|[name_path|greeting_path|password]]"
; break; }
;
6211 SWITCH_ADD_API(commands_api_interface, "vm_delete", "vm_delete", voicemail_delete_api_function, VM_DELETE_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_delete"; commands_api_interface
->desc = "vm_delete"; commands_api_interface->function =
voicemail_delete_api_function; commands_api_interface->syntax
= "<id>@<domain>[/profile] [<uuid>]"; break
; }
;
6212 SWITCH_ADD_API(commands_api_interface, "vm_read", "vm_read", voicemail_read_api_function, VM_READ_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_read"; commands_api_interface
->desc = "vm_read"; commands_api_interface->function = voicemail_read_api_function
; commands_api_interface->syntax = "<id>@<domain>[/profile] <read|unread> [<uuid>]"
; break; }
;
6213 SWITCH_ADD_API(commands_api_interface, "vm_list", "vm_list", voicemail_list_api_function, VM_LIST_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_list"; commands_api_interface
->desc = "vm_list"; commands_api_interface->function = voicemail_list_api_function
; commands_api_interface->syntax = "<id>@<domain>[/profile] [xml]"
; break; }
;
6214
6215 /* Auth API */
6216 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_auth_login", "vm_fsdb_auth_login", vm_fsdb_auth_login_function, VM_FSDB_AUTH_LOGIN_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_auth_login"
; commands_api_interface->desc = "vm_fsdb_auth_login"; commands_api_interface
->function = vm_fsdb_auth_login_function; commands_api_interface
->syntax = "<profile> <domain> <user> <password>"
; break; }
;
6217
6218 /* Message Targeted API */
6219 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_msg_count", "vm_fsdb_msg_count", vm_fsdb_msg_count_function, VM_FSDB_MSG_COUNT_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_msg_count"
; commands_api_interface->desc = "vm_fsdb_msg_count"; commands_api_interface
->function = vm_fsdb_msg_count_function; commands_api_interface
->syntax = "<format> <profile> <domain> <user> <folder>"
; break; }
;
6220 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_msg_list", "vm_fsdb_msg_list", vm_fsdb_msg_list_function, VM_FSDB_MSG_LIST_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_msg_list"
; commands_api_interface->desc = "vm_fsdb_msg_list"; commands_api_interface
->function = vm_fsdb_msg_list_function; commands_api_interface
->syntax = "<format> <profile> <domain> <user> <folder> <filter> [msg-order = ASC | DESC]"
; break; }
;
6221 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_msg_get", "vm_fsdb_msg_get", vm_fsdb_msg_get_function, VM_FSDB_MSG_GET_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_msg_get"
; commands_api_interface->desc = "vm_fsdb_msg_get"; commands_api_interface
->function = vm_fsdb_msg_get_function; commands_api_interface
->syntax = "<format> <profile> <domain> <user> <uuid>"
; break; }
;
6222 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_msg_delete", "vm_fsdb_msg_delete", vm_fsdb_msg_delete_function, VM_FSDB_MSG_DELETE_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_msg_delete"
; commands_api_interface->desc = "vm_fsdb_msg_delete"; commands_api_interface
->function = vm_fsdb_msg_delete_function; commands_api_interface
->syntax = "<profile> <domain> <user> <uuid>"
; break; }
;
6223 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_msg_undelete", "vm_fsdb_msg_undelete", vm_fsdb_msg_undelete_function, VM_FSDB_MSG_UNDELETE_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_msg_undelete"
; commands_api_interface->desc = "vm_fsdb_msg_undelete"; commands_api_interface
->function = vm_fsdb_msg_undelete_function; commands_api_interface
->syntax = "<profile> <domain> <user> <uuid>"
; break; }
;
6224 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_msg_email", "vm_fsdb_msg_email", vm_fsdb_msg_email_function, VM_FSDB_MSG_EMAIL_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_msg_email"
; commands_api_interface->desc = "vm_fsdb_msg_email"; commands_api_interface
->function = vm_fsdb_msg_email_function; commands_api_interface
->syntax = "<profile> <domain> <user> <uuid> <email>"
; break; }
;
6225 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_msg_purge", "vm_fsdb_msg_purge", vm_fsdb_msg_purge_function, VM_FSDB_MSG_PURGE_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_msg_purge"
; commands_api_interface->desc = "vm_fsdb_msg_purge"; commands_api_interface
->function = vm_fsdb_msg_purge_function; commands_api_interface
->syntax = "<profile> <domain> <user>"; break
; }
;
6226 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_msg_save", "vm_fsdb_msg_save", vm_fsdb_msg_save_function, VM_FSDB_MSG_SAVE_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_msg_save"
; commands_api_interface->desc = "vm_fsdb_msg_save"; commands_api_interface
->function = vm_fsdb_msg_save_function; commands_api_interface
->syntax = "<profile> <domain> <user> <uuid>"
; break; }
;
6227 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_msg_forward", "vm_fsdb_msg_forward", vm_fsdb_msg_forward_function, VM_FSDB_MSG_FORWARD_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_msg_forward"
; commands_api_interface->desc = "vm_fsdb_msg_forward"; commands_api_interface
->function = vm_fsdb_msg_forward_function; commands_api_interface
->syntax = "<profile> <domain> <user> <uuid> <dst_domain> <dst_user> [prepend_file_location]"
; break; }
;
6228
6229 /* Preferences */
6230 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_pref_greeting_set", "vm_fsdb_pref_greeting_set", vm_fsdb_pref_greeting_set_function, VM_FSDB_PREF_GREETING_SET_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_pref_greeting_set"
; commands_api_interface->desc = "vm_fsdb_pref_greeting_set"
; commands_api_interface->function = vm_fsdb_pref_greeting_set_function
; commands_api_interface->syntax = "<profile> <domain> <user> <slot> [file-path]"
; break; }
;
6231 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_pref_greeting_get", "vm_fsdb_pref_greeting_get", vm_fsdb_pref_greeting_get_function, VM_FSDB_PREF_GREETING_GET_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_pref_greeting_get"
; commands_api_interface->desc = "vm_fsdb_pref_greeting_get"
; commands_api_interface->function = vm_fsdb_pref_greeting_get_function
; commands_api_interface->syntax = "<format> <profile> <domain> <user> [slot]"
; break; }
;
6232 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_pref_recname_set", "vm_fsdb_pref_recname_set", vm_fsdb_pref_recname_set_function, VM_FSDB_PREF_RECNAME_SET_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_pref_recname_set"
; commands_api_interface->desc = "vm_fsdb_pref_recname_set"
; commands_api_interface->function = vm_fsdb_pref_recname_set_function
; commands_api_interface->syntax = "<profile> <domain> <user> <file-path>"
; break; }
;
6233 SWITCH_ADD_API(commands_api_interface, "vm_fsdb_pref_password_set", "vm_fsdb_pref_password_set", vm_fsdb_pref_password_set_function, VM_FSDB_PREF_PASSWORD_SET_USAGE)for (;;) { commands_api_interface = (switch_api_interface_t *
)switch_loadable_module_create_interface(*module_interface, SWITCH_API_INTERFACE
); commands_api_interface->interface_name = "vm_fsdb_pref_password_set"
; commands_api_interface->desc = "vm_fsdb_pref_password_set"
; commands_api_interface->function = vm_fsdb_pref_password_set_function
; commands_api_interface->syntax = "<profile> <domain> <user> <password>"
; break; }
;
6234
6235 return SWITCH_STATUS_SUCCESS;
6236}
6237
6238
6239SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_voicemail_shutdown)switch_status_t mod_voicemail_shutdown (void)
6240{
6241 switch_hash_index_t *hi = NULL((void*)0);
6242 vm_profile_t *profile;
6243 void *val = NULL((void*)0);
6244 const void *key;
6245 switch_ssize_t keylen;
6246 int sanity = 0;
6247
6248 switch_mutex_lock(globals.mutex);
6249 if (globals.running == 1) {
6250 globals.running = 0;
6251 }
6252 switch_mutex_unlock(globals.mutex);
6253
6254 switch_event_free_subclass(VM_EVENT_MAINT)switch_event_free_subclass_detailed("mod_voicemail.c", "vm::maintenance"
)
;
6255 switch_event_unbind_callback(vm_event_handler);
6256
6257 while (globals.threads) {
6258 switch_cond_next();
6259 if (++sanity >= 60000) {
6260 break;
6261 }
6262 }
6263
6264 switch_mutex_lock(globals.mutex);
6265 while ((hi = switch_core_hash_first_iter( globals.profile_hash, hi))) {
6266 switch_core_hash_this(hi, &key, &keylen, &val);
6267 profile = (vm_profile_t *) val;
6268
6269 switch_core_hash_delete(globals.profile_hash, profile->name);
6270
6271 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 6271, ((void*)0)
, SWITCH_LOG_DEBUG, "Waiting for write lock (Profile %s)\n", profile->name);
6272 switch_thread_rwlock_wrlock(profile->rwlock);
6273
6274 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_voicemail.c", (const char *)__func__
, 6274, ((void*)0)
, SWITCH_LOG_DEBUG, "Destroying Profile %s\n", profile->name);
6275
6276 switch_core_destroy_memory_pool(&profile->pool)switch_core_perform_destroy_memory_pool(&profile->pool
, "mod_voicemail.c", (const char *)__func__, 6276)
;
6277 profile = NULL((void*)0);
6278 }
6279 switch_core_hash_destroy(&globals.profile_hash);
6280 switch_mutex_unlock(globals.mutex);
6281 switch_mutex_destroy(globals.mutex);
6282
6283 return SWITCH_STATUS_SUCCESS;
6284}
6285
6286
6287/* For Emacs:
6288 * Local Variables:
6289 * mode:c
6290 * indent-tabs-mode:t
6291 * tab-width:4
6292 * c-basic-offset:4
6293 * End:
6294 * For VIM:
6295 * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet:
6296 */