]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
BOUNTY-13
authorAnthony Minessale <anthony.minessale@gmail.com>
Wed, 13 Jan 2010 01:32:01 +0000 (01:32 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Wed, 13 Jan 2010 01:32:01 +0000 (01:32 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16270 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/applications/mod_voicemail/mod_voicemail.c

index f3d4556e0c1348ce4afa6d01f4b08ff8a17f9e06..fa641ad5a1f4a1edbe84251e8f16a4c10bb25c8e 100644 (file)
@@ -248,7 +248,8 @@ static char vm_sql[] =
        "   file_path     VARCHAR(255),\n" 
        "   message_len   INTEGER,\n" 
        "   flags         VARCHAR(255),\n" 
-       "   read_flags    VARCHAR(255)\n" 
+       "   read_flags    VARCHAR(255),\n" 
+       "   forwarded_by  VARCHAR(255)\n" 
        ");\n";
 
 static char vm_pref_sql[] =
@@ -267,6 +268,7 @@ static char *vm_index_list[] = {
        "create index voicemail_msgs_idx4 on voicemail_msgs(uuid)",
        "create index voicemail_msgs_idx5 on voicemail_msgs(in_folder)",
        "create index voicemail_msgs_idx6 on voicemail_msgs(read_flags)",
+       "create index voicemail_msgs_idx7 on voicemail_msgs(forwarded_by)",
        "create index voicemail_prefs_idx1 on voicemail_prefs(username)",
        "create index voicemail_prefs_idx2 on voicemail_prefs(domain)",
        NULL
@@ -299,7 +301,7 @@ static void destroy_profile(const char *profile_name, switch_bool_t block)
                if (switch_thread_rwlock_trywrlock(profile->rwlock) != SWITCH_STATUS_SUCCESS) {
                        /* Lock failed, set the destroy flag so it'll be destroyed whenever its not in use anymore */
                        switch_set_flag(profile, PFLAG_DESTROY);
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[%s] Profile is in use, memory will be freed whenever its not longer in use\n", profile->name);
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[%s] Profile is in use, memory will be freed whenever its no longer in use\n", profile->name);
                        return;
                }
        }
@@ -689,7 +691,9 @@ static vm_profile_t * load_profile(const char *profile_name)
                        goto end;
                }
                
-               switch_cache_db_test_reactive(dbh, "select count(message_len) from voicemail_msgs", "drop table voicemail_msgs", vm_sql);
+               switch_cache_db_test_reactive(dbh, "select count(forwarded_by) from voicemail_msgs", NULL, "alter table voicemail_msgs add forwarded_by varchar(255)");
+               switch_cache_db_test_reactive(dbh, "select count(forwarded_by) from voicemail_msgs", "drop table voicemail_msgs", vm_sql);
+               
                switch_cache_db_test_reactive(dbh, "select count(username) from voicemail_prefs", "drop table voicemail_prefs", vm_pref_sql);
                switch_cache_db_test_reactive(dbh, "select count(password) from voicemail_prefs", NULL, "alter table voicemail_prefs add password varchar(255)");
                
@@ -1203,6 +1207,7 @@ struct listen_callback {
        char message_len[255];
        char flags[255];
        char read_flags[255];
+       char forwarded_by[255];
        char *email;
        int index;
        int want;
@@ -1233,6 +1238,7 @@ static int listen_callback(void *pArg, int argc, char **argv, char **columnNames
        switch_copy_string(cbt->message_len, argv[9], 255);
        switch_copy_string(cbt->flags, argv[10], 255);
        switch_copy_string(cbt->read_flags, argv[11], 255);
+       switch_copy_string(cbt->forwarded_by, argv[12], 255);
 
        return -1;
 }
@@ -2264,16 +2270,17 @@ static void voicemail_check_main(switch_core_session_t *session, vm_profile_t *p
 
 
 static switch_status_t deliver_vm(vm_profile_t *profile, 
-                                                               switch_xml_t x_user, 
-                                                               const char *domain_name, 
-                                                               const char *path, 
-                                                               uint32_t message_len,
-                                                               const char *read_flags,
-                                                               switch_event_t *params, 
-                                                               switch_memory_pool_t *pool, 
-                                                               const char *caller_id_name, 
-                                                               const char *caller_id_number,
-                                                               switch_bool_t copy)
+                                                                 switch_xml_t x_user, 
+                                                                 const char *domain_name, 
+                                                                 const char *path, 
+                                                                 uint32_t message_len,
+                                                                 const char *read_flags,
+                                                                 switch_event_t *params, 
+                                                                 switch_memory_pool_t *pool, 
+                                                                 const char *caller_id_name, 
+                                                                 const char *caller_id_number,
+                                                                 const char *forwarded_by,
+                                                                 switch_bool_t copy)
 {
        char *file_path = NULL, *dir_path = NULL;
        const char *myid = switch_xml_attr(x_user, "id");
@@ -2413,10 +2420,10 @@ static switch_status_t deliver_vm(vm_profile_t *profile,
                switch_event_fire(&message_event);
 
                usql = switch_mprintf("insert into voicemail_msgs(created_epoch, read_epoch, username, domain, uuid, cid_name, "
-                                                         "cid_number, in_folder, file_path, message_len, flags, read_flags) "
-                                                         "values(%ld,0,'%q','%q','%q','%q','%q','%q','%q','%u','','%q')", (long) switch_epoch_time_now(NULL),
+                                                         "cid_number, in_folder, file_path, message_len, flags, read_flags, forwarded_by) "
+                                                         "values(%ld,0,'%q','%q','%q','%q','%q','%q','%q','%u','','%q','%q')", (long) switch_epoch_time_now(NULL),
                                                          myid, domain_name, uuid_str, caller_id_name, caller_id_number,
-                                                         myfolder, file_path, message_len, read_flags);
+                                                         myfolder, file_path, message_len, read_flags, switch_str_nil(forwarded_by));
 
                vm_execute_sql(profile, usql, profile->mutex);
                switch_safe_free(usql);
@@ -2618,9 +2625,10 @@ static switch_status_t voicemail_inject(const char *data)
        switch_status_t status = SWITCH_STATUS_SUCCESS;
        int isgroup = 0, isall = 0;
        int argc = 0;
-       char *argv[4];
+       char *argv[5] = { 0 };
        char *box, *path, *cid_num, *cid_name;
        switch_memory_pool_t *pool = NULL;
+       char *forwarded_by = NULL;
 
        if (zstr(data)) {
                status = SWITCH_STATUS_FALSE;
@@ -2640,6 +2648,7 @@ static switch_status_t voicemail_inject(const char *data)
        path = argv[1];
        cid_num = argv[2] ? argv[2] : "anonymous";
        cid_name = argv[3] ? argv[3] : "anonymous";
+       forwarded_by = argv[4];
 
        user = box;
        
@@ -2695,6 +2704,9 @@ static switch_status_t voicemail_inject(const char *data)
                        }
                }
 
+               if (forwarded_by) {
+                       switch_event_add_header_string(my_params, SWITCH_STACK_BOTTOM, "Forwarded-By", forwarded_by);
+               }
                switch_event_add_header_string(my_params, SWITCH_STACK_BOTTOM, "domain", domain);
                switch_event_add_header_string(my_params, SWITCH_STACK_BOTTOM, "purpose", "publish-vm");
                
@@ -2724,14 +2736,14 @@ static switch_status_t voicemail_inject(const char *data)
 
                                                                if (switch_xml_locate_user_in_domain(uname, x_domain, &ux, NULL) == SWITCH_STATUS_SUCCESS) {
                                                                        switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS);
-                                                                       status = deliver_vm(profile, ux, domain, path, 0, "B", my_params, pool, cid_name, cid_num, SWITCH_TRUE);
+                                                                       status = deliver_vm(profile, ux, domain, path, 0, "B", my_params, pool, cid_name, cid_num, forwarded_by, SWITCH_TRUE);
                                                                        switch_event_destroy(&my_params);
                                                                }
                                                                continue;
                                                        }
                                                        
                                                        switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS);
-                                                       status = deliver_vm(profile, ut, domain, path, 0, "B", my_params, pool, cid_name, cid_num, SWITCH_TRUE);
+                                                       status = deliver_vm(profile, ut, domain, path, 0, "B", my_params, pool, cid_name, cid_num, forwarded_by, SWITCH_TRUE);
                                                        switch_event_destroy(&my_params);
                                                }
                                        }
@@ -2752,7 +2764,7 @@ static switch_status_t voicemail_inject(const char *data)
                                                        }
 
                                                        switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS);
-                                                       status = deliver_vm(profile, ut, domain, path, 0, "B", my_params, pool, cid_name, cid_num, SWITCH_TRUE);
+                                                       status = deliver_vm(profile, ut, domain, path, 0, "B", my_params, pool, cid_name, cid_num, forwarded_by, SWITCH_TRUE);
                                                        switch_event_destroy(&my_params);
                                                }
                                        }
@@ -2764,7 +2776,7 @@ static switch_status_t voicemail_inject(const char *data)
 
                        if ((status = switch_xml_locate_user_in_domain(user, x_domain, &ut, &x_group)) == SWITCH_STATUS_SUCCESS) {
                                switch_event_create(&my_params, SWITCH_EVENT_REQUEST_PARAMS);
-                               status = deliver_vm(profile, ut, domain, path, 0, "B", my_params, pool, cid_name, cid_num, SWITCH_TRUE);
+                               status = deliver_vm(profile, ut, domain, path, 0, "B", my_params, pool, cid_name, cid_num, forwarded_by, SWITCH_TRUE);
                                switch_event_destroy(&my_params);
                        } else {
                                status = SWITCH_STATUS_FALSE;
@@ -3100,11 +3112,12 @@ greet_key_press:
        if (x_domain_root) {
                switch_channel_get_variables(channel, &vars);
                status = deliver_vm(profile, x_user, domain_name, file_path, message_len, read_flags, vars, 
-                                                       switch_core_session_get_pool(session), caller_id_name, caller_id_number, SWITCH_FALSE);
+                                                       switch_core_session_get_pool(session), caller_id_name, caller_id_number, NULL, SWITCH_FALSE);
                switch_event_destroy(&vars);
                if (status == SWITCH_STATUS_SUCCESS) {
                        if ((vm_cc = switch_channel_get_variable(channel, "vm_cc"))) {
-                               char *cmd = switch_core_session_sprintf(session, "%s %s %s %s", vm_cc, file_path, caller_id_number, caller_id_name);
+                               char *cmd = switch_core_session_sprintf(session, "%s %s %s %s %s@%s", vm_cc, file_path, caller_id_number, caller_id_name, id, domain_name);
+                               
                                if (voicemail_inject(cmd) == SWITCH_STATUS_SUCCESS) {
                                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "Sent Carbon Copy to %s\n", vm_cc);
                                } else {