File: | src/mod/applications/mod_voicemail/mod_voicemail.c |
Location: | line 4450, column 10 |
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 | */ |