File: | src/mod/applications/mod_voicemail/mod_voicemail.c |
Location: | line 3456, column 6 |
Description: | Value stored to 'send_notify' is never read |
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 | |
47 | SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load)switch_status_t mod_voicemail_load (switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool); |
48 | SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_voicemail_shutdown)switch_status_t mod_voicemail_shutdown (void); |
49 | SWITCH_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 | |
55 | static switch_status_t voicemail_inject(const char *data, switch_core_session_t *session); |
56 | |
57 | static const char *global_cf = "voicemail.conf"; |
58 | static 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 | |
69 | typedef enum { |
70 | VM_DATE_FIRST, |
71 | VM_DATE_LAST, |
72 | VM_DATE_NEVER |
73 | } date_location_t; |
74 | |
75 | typedef enum { |
76 | PFLAG_DESTROY = 1 << 0 |
77 | } vm_flags_t; |
78 | |
79 | typedef enum { |
80 | VM_MOVE_NEXT, |
81 | VM_MOVE_PREV, |
82 | VM_MOVE_SAME |
83 | } msg_move_t; |
84 | |
85 | typedef 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 | |
94 | struct mwi_reason_table { |
95 | const char *name; |
96 | int state; |
97 | }; |
98 | |
99 | static 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 | |
111 | struct 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 | }; |
191 | typedef struct vm_profile vm_profile_t; |
192 | |
193 | const 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 | |
208 | switch_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 | |
228 | static 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 | |
255 | char *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 | |
272 | end: |
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 | |
285 | static switch_bool_t vm_execute_sql_callback(vm_profile_t *profile, switch_mutex_t *mutex, char *sql, switch_core_db_callback_func_t callback, |
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 | |
321 | static 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 | |
334 | static 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 | |
340 | static 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 | |
355 | static 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 | |
361 | static 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 */ |
393 | static switch_xml_config_string_options_t config_dtmf = { NULL((void*)0), 2, "[0-9#\\*]" }; |
394 | static switch_xml_config_string_options_t config_dtmf_optional = { NULL((void*)0), 2, "[0-9#\\*]?" }; |
395 | static switch_xml_config_string_options_t config_login_keys = { NULL((void*)0), 16, "[0-9#\\*]*" }; |
396 | static switch_xml_config_string_options_t config_file_ext = { NULL((void*)0), 10, NULL((void*)0) }; |
397 | static switch_xml_config_int_options_t config_int_0_10000 = { SWITCH_TRUE, 0, SWITCH_TRUE, 10000 }; |
398 | static switch_xml_config_int_options_t config_int_0_1000 = { SWITCH_TRUE, 0, SWITCH_TRUE, 1000 }; |
399 | static switch_xml_config_int_options_t config_int_digit_timeout = { SWITCH_TRUE, 0, SWITCH_TRUE, 30000 }; |
400 | static switch_xml_config_int_options_t config_int_max_logins = { SWITCH_TRUE, 0, SWITCH_TRUE, 10 }; |
401 | static switch_xml_config_int_options_t config_int_ht_0 = { SWITCH_TRUE, 0 }; |
402 | |
403 | static 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 | |
411 | static 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 | |
448 | static 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 | |
485 | static 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 | |
524 | static 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 | */ |
541 | vm_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 | |
699 | static 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 | |
810 | static 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 | |
828 | static 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 | |
840 | static 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 | |
875 | static 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 | |
897 | struct 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 | }; |
904 | typedef struct call_control cc_t; |
905 | |
906 | static 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 | |
981 | struct prefs_callback { |
982 | char name_path[255]; |
983 | char greeting_path[255]; |
984 | char password[255]; |
985 | }; |
986 | typedef struct prefs_callback prefs_callback_t; |
987 | |
988 | static 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 | |
1000 | typedef 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 | |
1046 | static 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 | |
1092 | struct callback { |
1093 | char *buf; |
1094 | size_t len; |
1095 | int matches; |
1096 | }; |
1097 | typedef struct callback callback_t; |
1098 | |
1099 | struct 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 | }; |
1108 | typedef struct msg_cnt_callback msg_cnt_callback_t; |
1109 | |
1110 | |
1111 | static 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 | |
1136 | static 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 | |
1146 | static 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 | |
1157 | typedef enum { |
1158 | MSG_NONE, |
1159 | MSG_NEW, |
1160 | MSG_SAVED |
1161 | } msg_type_t; |
1162 | |
1163 | |
1164 | switch_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 | |
1184 | static 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 | |
1306 | struct 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 | }; |
1328 | typedef struct listen_callback listen_callback_t; |
1329 | |
1330 | static 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 | |
1355 | static 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(¶ms, SWITCH_EVENT_GENERAL)switch_event_create_subclass_detailed("mod_voicemail.c", (const char * )(const char *)__func__, 1361, ¶ms, 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(¶ms); |
1370 | return ret; |
1371 | } |
1372 | |
1373 | static 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 */ |
1418 | switch_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 | } |
1457 | end: |
1458 | return status; |
1459 | } |
1460 | |
1461 | #define VM_STARTSAMPLES1024 * 32 1024 * 32 |
1462 | |
1463 | static 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 | |
1582 | static 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 | |
1912 | static 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 | |
1963 | static 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(¶ms, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const char * )(const char *)__func__, 2052, ¶ms, 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(¶ms)switch_event_fire_detailed("mod_voicemail.c", (const char * ) (const char *)__func__, 2061, ¶ms, ((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(¶ms, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const char * )(const char *)__func__, 2243, ¶ms, 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(¶ms)switch_event_fire_detailed("mod_voicemail.c", (const char * ) (const char *)__func__, 2249, ¶ms, ((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(¶ms, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const char * )(const char *)__func__, 2276, ¶ms, 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(¶ms)switch_event_fire_detailed("mod_voicemail.c", (const char * ) (const char *)__func__, 2282, ¶ms, ((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(¶ms, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const char * )(const char *)__func__, 2299, ¶ms, 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(¶ms); |
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(¶ms, SWITCH_EVENT_CUSTOM, VM_EVENT_MAINT)switch_event_create_subclass_detailed("mod_voicemail.c", (const char * )(const char *)__func__, 2348, ¶ms, 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(¶ms)switch_event_fire_detailed("mod_voicemail.c", (const char * ) (const char *)__func__, 2354, ¶ms, ((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(¶ms, SWITCH_EVENT_GENERAL)switch_event_create_subclass_detailed("mod_voicemail.c", (const char * )(const char *)__func__, 2435, ¶ms, 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(¶ms); |
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 | |
2692 | static 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 | |
3136 | static 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 | |
3341 | static 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; |
Value stored to 'send_notify' is never read | |
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 | |
3715 | SWITCH_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]]" |
3800 | SWITCH_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]]" |
3883 | SWITCH_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 | |
3972 | static 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 | |
4045 | static int EVENT_THREAD_RUNNING = 0; |
4046 | static int EVENT_THREAD_STARTED = 0; |
4047 | |
4048 | void *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 | |
4103 | void 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 | |
4128 | void 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 | |
4141 | struct 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 | |
4157 | static 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 | |
4167 | static 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 | |
4209 | static 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 | |
4235 | static 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 | |
4269 | static 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 | |
4355 | static 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 | |
4474 | static 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" : ""))))); |
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 ); |
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 | |
4528 | static 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>]" |
4578 | SWITCH_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 | |
4589 | static 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>]" |
4599 | SWITCH_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>]" |
4671 | SWITCH_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 | |
4757 | static 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]" |
4783 | SWITCH_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]" |
4855 | SWITCH_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 | |
5008 | struct msg_get_callback { |
5009 | switch_event_t *my_params; |
5010 | }; |
5011 | typedef struct msg_get_callback msg_get_callback_t; |
5012 | |
5013 | static 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 | |
5034 | struct msg_lst_callback { |
5035 | char *buf; |
5036 | size_t len; |
5037 | switch_event_t *my_params; |
5038 | }; |
5039 | typedef struct msg_lst_callback msg_lst_callback_t; |
5040 | |
5041 | static 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 | |
5052 | static 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]" |
5076 | SWITCH_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"); |
5156 | done: |
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]" |
5162 | SWITCH_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]); |
5191 | not 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 | } |
5230 | done: |
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>" |
5236 | SWITCH_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"); |
5316 | done: |
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>" |
5322 | SWITCH_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"); |
5377 | done: |
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]" |
5387 | SWITCH_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);}; |
5461 | done: |
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>" |
5467 | SWITCH_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 | |
5510 | done: |
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>" |
5516 | SWITCH_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 | |
5561 | done: |
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>" |
5567 | SWITCH_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"); |
5611 | done: |
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>" |
5617 | SWITCH_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"); |
5661 | done: |
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>" |
5667 | SWITCH_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(¶ms, SWITCH_EVENT_GENERAL)switch_event_create_subclass_detailed("mod_voicemail.c", (const char * )(const char *)__func__, 5713, ¶ms, 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); |
5772 | done: |
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]" |
5778 | SWITCH_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"); |
5876 | done: |
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>" |
5884 | SWITCH_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);}; |
5941 | done: |
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>" |
5947 | SWITCH_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"); |
6092 | done: |
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>" |
6099 | SWITCH_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);}; |
6163 | done: |
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 | |
6168 | SWITCH_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 | |
6239 | SWITCH_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 | */ |