File: | src/mod/applications/mod_voicemail/mod_voicemail.c |
Location: | line 4497, column 2 |
Description: | Potential leak of memory pointed to by '__retval' |
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; | |||||||
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 | */ |