From 6d0069a0cf7ac457281f2005fc8b87373d0090db Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Sun, 6 Oct 2013 20:26:24 -0500 Subject: [PATCH 01/80] add missing decel for last spandsp commit --- libs/spandsp/src/spandsp/fax_modems.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/spandsp/src/spandsp/fax_modems.h b/libs/spandsp/src/spandsp/fax_modems.h index 73a85de9b4..2ffb7be7c5 100644 --- a/libs/spandsp/src/spandsp/fax_modems.h +++ b/libs/spandsp/src/spandsp/fax_modems.h @@ -99,6 +99,8 @@ SPAN_DECLARE(void) fax_modems_set_tx_handler(fax_modems_state_t *s, span_tx_hand SPAN_DECLARE(void) fax_modems_set_next_tx_handler(fax_modems_state_t *s, span_tx_handler_t handler, void *user_data); +SPAN_DECLARE(int) fax_modems_set_next_tx_type(fax_modems_state_t *s); + SPAN_DECLARE(int) fax_modems_restart(fax_modems_state_t *s); /*! Get a pointer to the logging context associated with a FAX modems context. From 5ba88abf1413d564fcdb3256a073c9b78f027eb8 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 7 Oct 2013 08:05:10 -0500 Subject: [PATCH 02/80] FS-5848 --resolve --- src/switch_core_session.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/switch_core_session.c b/src/switch_core_session.c index dca86f5558..430b20d013 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -2487,8 +2487,8 @@ void switch_core_session_init(switch_memory_pool_t *pool) switch_queue_create(&session_manager.thread_queue, 100000, session_manager.memory_pool); switch_threadattr_create(&thd_attr, session_manager.memory_pool); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); - switch_thread_create(&session_manager.manager_thread, thd_attr, switch_core_session_thread_pool_manager, NULL, session_manager.memory_pool); session_manager.ready = 1; + switch_thread_create(&session_manager.manager_thread, thd_attr, switch_core_session_thread_pool_manager, NULL, session_manager.memory_pool); } } @@ -2498,15 +2498,16 @@ void switch_core_session_uninit(void) int sanity = 100; switch_status_t st = SWITCH_STATUS_FALSE; - switch_core_hash_destroy(&session_manager.session_table); session_manager.ready = 0; - - switch_thread_join(&st, session_manager.manager_thread); + wake_queue(); while(session_manager.running && --sanity > 0) { switch_queue_interrupt_all(session_manager.thread_queue); switch_yield(100000); } + + switch_thread_join(&st, session_manager.manager_thread); + switch_core_hash_destroy(&session_manager.session_table); } From c0dc8ed6ff75a3b87a27354e26092487874a5d17 Mon Sep 17 00:00:00 2001 From: Brian West Date: Mon, 7 Oct 2013 11:38:08 -0500 Subject: [PATCH 03/80] deal with rtp keep alives --- src/switch_rtp.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index a5b091fe17..c7f15f01f1 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -3961,6 +3961,10 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t status = switch_socket_recvfrom(rtp_session->from_addr, rtp_session->sock_input, 0, (void *) &rtp_session->recv_msg, bytes); + if (*bytes) { + rtp_session->missed_count = 0; + } + if (check_rtcp_and_ice(rtp_session) == -1) { return SWITCH_STATUS_GENERR; } @@ -4641,7 +4645,15 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ ret = -1; goto end; } - + + if (rtp_session->max_missed_packets && read_loops == 1 && !rtp_session->flags[SWITCH_RTP_FLAG_VIDEO]) { + if (bytes) { + rtp_session->missed_count = 0; + } else if (++rtp_session->missed_count >= rtp_session->max_missed_packets) { + ret = -2; + goto end; + } + } if (rtp_session->flags[SWITCH_RTP_FLAG_VIDEO]) { //switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_CRIT, "Read bytes (%i) %ld\n", status, bytes); @@ -4837,15 +4849,6 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ goto end; } - if (rtp_session->max_missed_packets && read_loops == 1 && !rtp_session->flags[SWITCH_RTP_FLAG_VIDEO]) { - if (bytes) { - rtp_session->missed_count = 0; - } else if (++rtp_session->missed_count >= rtp_session->max_missed_packets) { - ret = -2; - goto end; - } - } - check = !bytes; if (rtp_session->flags[SWITCH_RTP_FLAG_FLUSH]) { From b5ca53f2f9cce0b84a07559b57504e399f9bec87 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 Oct 2013 09:40:01 -0500 Subject: [PATCH 04/80] FS-5851 --resolve --- .../applications/mod_dptools/mod_dptools.c | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index b49e1a02ee..1146dc38ca 100755 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -4615,6 +4615,7 @@ static switch_status_t file_string_file_read(switch_file_handle_t *handle, void return status; } + static switch_status_t file_string_file_write(switch_file_handle_t *handle, void *data, size_t *len) { file_string_context_t *context = handle->private_info; @@ -4633,10 +4634,101 @@ static switch_status_t file_string_file_write(switch_file_handle_t *handle, void return status; } +static switch_status_t file_url_file_seek(switch_file_handle_t *handle, unsigned int *cur_sample, int64_t samples, int whence) +{ + switch_file_handle_t *fh = handle->private_info; + return switch_core_file_seek(fh, cur_sample, samples, whence); +} + +static switch_status_t file_url_file_close(switch_file_handle_t *handle) +{ + switch_file_handle_t *fh = handle->private_info; + if (switch_test_flag(fh, SWITCH_FILE_OPEN)) { + switch_core_file_close(fh); + } + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t file_url_file_read(switch_file_handle_t *handle, void *data, size_t *len) +{ + switch_file_handle_t *fh = handle->private_info; + return switch_core_file_read(fh, data, len); +} + +static switch_status_t file_url_file_open(switch_file_handle_t *handle, const char *path) +{ + switch_file_handle_t *fh = switch_core_alloc(handle->memory_pool, sizeof(*fh)); + switch_status_t status; + char *url_host; + char *url_path; + + if (zstr(path)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "NULL path\n"); + return SWITCH_STATUS_FALSE; + } + + /* parse and check host */ + url_host = switch_core_strdup(handle->memory_pool, path); + if (!(url_path = strchr(url_host, '/'))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "missing path\n"); + return SWITCH_STATUS_FALSE; + } + *url_path = '\0'; + /* TODO allow this host */ + if (!zstr(url_host) && strcasecmp(url_host, "localhost")) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "not localhost\n"); + return SWITCH_STATUS_FALSE; + } + + /* decode and check path */ + url_path++; + if (zstr(url_path)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "empty path\n"); + return SWITCH_STATUS_FALSE; + } + if (strstr(url_path, "%2f") || strstr(url_path, "%2F")) { + /* don't allow %2f or %2F encoding (/) */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "encoded slash is not allowed\n"); + return SWITCH_STATUS_FALSE; + } + url_path = switch_core_sprintf(handle->memory_pool, "/%s", url_path); + switch_url_decode(url_path); + + /* TODO convert to native file separators? */ + + handle->private_info = fh; + status = switch_core_file_open(fh, url_path, handle->channels, handle->samplerate, handle->flags, NULL); + if (status == SWITCH_STATUS_SUCCESS) { + handle->samples = fh->samples; + handle->cur_samplerate = fh->samplerate; + handle->cur_channels = fh->channels; + handle->format = fh->format; + handle->sections = fh->sections; + handle->seekable = fh->seekable; + handle->speed = fh->speed; + handle->interval = fh->interval; + handle->max_samples = 0; + + if (switch_test_flag(fh, SWITCH_FILE_NATIVE)) { + switch_set_flag(handle, SWITCH_FILE_NATIVE); + } else { + switch_clear_flag(handle, SWITCH_FILE_NATIVE); + } + } + return status; +} + +static switch_status_t file_url_file_write(switch_file_handle_t *handle, void *data, size_t *len) +{ + switch_file_handle_t *fh = handle->private_info; + return switch_core_file_write(fh, data, len); +} /* Registration */ static char *file_string_supported_formats[SWITCH_MAX_CODECS] = { 0 }; +static char *file_url_supported_formats[SWITCH_MAX_CODECS] = { 0 }; /* /FILE STRING INTERFACE */ @@ -5504,6 +5596,17 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load) file_interface->file_write = file_string_file_write; file_interface->file_seek = file_string_file_seek; + file_url_supported_formats[0] = "file"; + + file_interface = (switch_file_interface_t *) switch_loadable_module_create_interface(*module_interface, SWITCH_FILE_INTERFACE); + file_interface->interface_name = modname; + file_interface->extens = file_url_supported_formats; + file_interface->file_open = file_url_file_open; + file_interface->file_close = file_url_file_close; + file_interface->file_read = file_url_file_read; + file_interface->file_write = file_url_file_write; + file_interface->file_seek = file_url_file_seek; + error_endpoint_interface = (switch_endpoint_interface_t *) switch_loadable_module_create_interface(*module_interface, SWITCH_ENDPOINT_INTERFACE); error_endpoint_interface->interface_name = "error"; From 6e6a77fa86c97499eddda9d9ce2879c5711ef133 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 Oct 2013 21:57:12 +0500 Subject: [PATCH 05/80] FS-5849 --resolve Conflicts: src/mod/applications/mod_conference/mod_conference.c --- .../mod_conference/mod_conference.c | 88 +++++++++++++------ 1 file changed, 63 insertions(+), 25 deletions(-) diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 0fa659f749..90fa698c87 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -286,6 +286,17 @@ struct vid_helper { int up; }; +struct conference_obj; + +/* Record Node */ +typedef struct conference_record { + struct conference_obj *conference; + char *path; + switch_memory_pool_t *pool; + switch_bool_t autorec; + struct conference_record *next; +} conference_record_t; + /* Conference Object */ typedef struct conference_obj { char *name; @@ -352,7 +363,7 @@ typedef struct conference_obj { int pin_retries; int broadcast_chat_messages; int comfort_noise_level; - int is_recording; + int auto_recording; int record_count; int video_running; int ivr_dtmf_timeout; @@ -385,6 +396,7 @@ typedef struct conference_obj { cdr_event_mode_t cdr_event_mode; struct vid_helper vh[2]; struct vid_helper mh; + conference_record_t *rec_node_head; } conference_obj_t; /* Relationship with another member */ @@ -455,13 +467,6 @@ struct conference_member { switch_thread_t *input_thread; }; -/* Record Node */ -typedef struct conference_record { - conference_obj_t *conference; - char *path; - switch_memory_pool_t *pool; -} conference_record_t; - typedef enum { CONF_API_SUB_ARGS_SPLIT, CONF_API_SUB_MEMBER_TARGET, @@ -529,7 +534,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c static switch_status_t chat_send(switch_event_t *message_event); -static void launch_conference_record_thread(conference_obj_t *conference, char *path); +static void launch_conference_record_thread(conference_obj_t *conference, char *path, switch_bool_t autorec); static int launch_conference_video_bridge_thread(conference_member_t *member_a, conference_member_t *member_b); typedef switch_status_t (*conf_api_args_cmd_t) (conference_obj_t *, switch_stream_handle_t *, int, char **); @@ -2066,7 +2071,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v globals.threads++; switch_mutex_unlock(globals.hash_mutex); - conference->is_recording = 0; + conference->auto_recording = 0; conference->record_count = 0; @@ -2168,15 +2173,15 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v } /* Start recording if there's more than one participant. */ - if (conference->auto_record && !conference->is_recording && conference->count > 1) { - conference->is_recording = 1; + if (conference->auto_record && !conference->auto_recording && conference->count > 1) { + conference->auto_recording++; conference->record_count++; imember = conference->members; if (imember) { switch_channel_t *channel = switch_core_session_get_channel(imember->session); char *rfile = switch_channel_expand_variables(channel, conference->auto_record); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Auto recording file: %s\n", rfile); - launch_conference_record_thread(conference, rfile); + launch_conference_record_thread(conference, rfile, SWITCH_TRUE); if (rfile != conference->auto_record) { conference->record_filename = switch_core_strdup(conference->pool, rfile); switch_safe_free(rfile); @@ -3937,7 +3942,7 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th int16_t *data_buf; switch_file_handle_t fh = { 0 }; conference_member_t smember = { 0 }, *member; - conference_record_t *rec = (conference_record_t *) obj; + conference_record_t *rp, *last = NULL, *rec = (conference_record_t *) obj; conference_obj_t *conference = rec->conference; uint32_t samples = switch_samples_per_packet(conference->rate, conference->interval); uint32_t mux_used; @@ -4118,8 +4123,6 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th switch_mutex_unlock(member->audio_out_mutex); } - conference->is_recording = 0; - switch_safe_free(data_buf); switch_core_timer_destroy(&timer); conference_del_member(conference, member); @@ -4138,6 +4141,23 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th switch_event_fire(&event); } + if (rec->autorec && conference->auto_recording) { + conference->auto_recording--; + } + + switch_mutex_lock(conference->flag_mutex); + for (rp = conference->rec_node_head; rp; rp = rp->next) { + if (rec == rp) { + if (last) { + last->next = rp->next; + } else { + conference->rec_node_head = rp->next; + } + } + } + switch_mutex_unlock(conference->flag_mutex); + + if (rec->pool) { switch_memory_pool_t *pool = rec->pool; rec = NULL; @@ -6250,11 +6270,20 @@ static switch_status_t conf_api_sub_transfer(conference_obj_t *conference, switc static switch_status_t conf_api_sub_check_record(conference_obj_t *conference, switch_stream_handle_t *stream, int arc, char **argv) { - if (conference->is_recording) { - stream->write_function(stream, "Record file %s\n", conference->record_filename); - } else { + conference_record_t *rec; + int x = 0; + + switch_mutex_lock(conference->flag_mutex); + for (rec = conference->rec_node_head; rec; rec = rec->next) { + stream->write_function(stream, "Record file %s%s%s\n", rec->path, rec->autorec ? " " : "", rec->autorec ? "(Auto)" : ""); + x++; + } + + if (!x) { stream->write_function(stream, "Conference is not being recorded.\n"); } + switch_mutex_unlock(conference->flag_mutex); + return SWITCH_STATUS_SUCCESS; } @@ -6269,7 +6298,7 @@ static switch_status_t conf_api_sub_record(conference_obj_t *conference, switch_ stream->write_function(stream, "Record file %s\n", argv[2]); conference->record_filename = switch_core_strdup(conference->pool, argv[2]); conference->record_count++; - launch_conference_record_thread(conference, argv[2]); + launch_conference_record_thread(conference, argv[2], SWITCH_FALSE); return SWITCH_STATUS_SUCCESS; } @@ -6355,6 +6384,13 @@ static switch_status_t conf_api_sub_recording(conference_obj_t *conference, swit switch_assert(conference != NULL); switch_assert(stream != NULL); + if (argc <= 3) { + if (strcasecmp(argv[2], "stop") == 0 || strcasecmp(argv[2], "check") == 0) { + argv[3] = "all"; + argc++; + } + } + if (argc <= 3) { /* It means that old syntax is used */ return conf_api_sub_record(conference,stream,argc,argv); @@ -8088,9 +8124,7 @@ static int launch_conference_video_bridge_thread(conference_member_t *member_a, } - - -static void launch_conference_record_thread(conference_obj_t *conference, char *path) +static void launch_conference_record_thread(conference_obj_t *conference, char *path, switch_bool_t autorec) { switch_thread_t *thread; switch_threadattr_t *thd_attr = NULL; @@ -8109,11 +8143,15 @@ static void launch_conference_record_thread(conference_obj_t *conference, char * return; } - conference->is_recording = 1; - rec->conference = conference; rec->path = switch_core_strdup(pool, path); rec->pool = pool; + rec->autorec = autorec; + + switch_mutex_lock(conference->flag_mutex); + rec->next = conference->rec_node_head; + conference->rec_node_head = rec; + switch_mutex_unlock(conference->flag_mutex); switch_threadattr_create(&thd_attr, rec->pool); switch_threadattr_detach_set(thd_attr, 1); From 8aff25e03d6991ffb1d82c9a31fd2f44f93d0c28 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 Oct 2013 12:10:36 -0500 Subject: [PATCH 06/80] FS-5855 please try lastest HEAD --- libs/sofia-sip/.update | 2 +- libs/sofia-sip/libsofia-sip-ua/sdp/sdp_print.c | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 52bf634e8e..36fa387d65 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Thu Sep 19 19:34:50 EDT 2013 +Tue Oct 8 12:10:32 CDT 2013 diff --git a/libs/sofia-sip/libsofia-sip-ua/sdp/sdp_print.c b/libs/sofia-sip/libsofia-sip-ua/sdp/sdp_print.c index 537e9fe606..70a5b23b72 100644 --- a/libs/sofia-sip/libsofia-sip-ua/sdp/sdp_print.c +++ b/libs/sofia-sip/libsofia-sip-ua/sdp/sdp_print.c @@ -640,14 +640,16 @@ static void print_media(sdp_printer_t *p, print_key(p, m->m_key); for (rm = m->m_rtpmaps; rm; rm = rm->rm_next) { - if (!rm->rm_predef || p->pr_all_rtpmaps) - sdp_printf(p, "a=rtpmap:%u %s/%lu%s%s" CRLF, - rm->rm_pt, rm->rm_encoding, rm->rm_rate, - rm->rm_params ? "/" : "", - rm->rm_params ? rm->rm_params : ""); - if (rm->rm_fmtp) - sdp_printf(p, "a=fmtp:%u %s" CRLF, - rm->rm_pt, rm->rm_fmtp); + if (rm->rm_encoding && *rm->rm_encoding && (!rm->rm_predef || p->pr_all_rtpmaps)) { + sdp_printf(p, "a=rtpmap:%u %s/%lu%s%s" CRLF, + rm->rm_pt, rm->rm_encoding, rm->rm_rate, + rm->rm_params ? "/" : "", + rm->rm_params ? rm->rm_params : ""); + } + if (rm->rm_fmtp) { + sdp_printf(p, "a=fmtp:%u %s" CRLF, + rm->rm_pt, rm->rm_fmtp); + } } if (!p->pr_mode_manual && !m->m_rejected && From 9d228e4fe901fc2eb98448eea909411741ad0d81 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 9 Oct 2013 02:42:14 +0500 Subject: [PATCH 07/80] FS-5857 --resolve --- .../mod_conference/mod_conference.c | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 90fa698c87..db38e5c7eb 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -433,6 +433,7 @@ struct conference_member { switch_codec_t write_codec; char *rec_path; switch_time_t rec_time; + conference_record_t *rec; uint8_t *frame; uint8_t *last_frame; uint32_t frame_size; @@ -1221,7 +1222,7 @@ static conference_member_t *conference_member_get(conference_obj_t *conference, } /* stop the specified recording */ -static switch_status_t conference_record_stop(conference_obj_t *conference, char *path) +static switch_status_t conference_record_stop(conference_obj_t *conference, switch_stream_handle_t *stream, char *path) { conference_member_t *member = NULL; int count = 0; @@ -1230,10 +1231,21 @@ static switch_status_t conference_record_stop(conference_obj_t *conference, char switch_mutex_lock(conference->member_mutex); for (member = conference->members; member; member = member->next) { if (switch_test_flag(member, MFLAG_NOCHANNEL) && (!path || !strcmp(path, member->rec_path))) { + if (member->rec && member->rec->autorec) { + stream->write_function(stream, "Stopped AUTO recording file %s (Auto Recording Now Disabled)\n", member->rec_path); + conference->auto_record = 0; + } else { + stream->write_function(stream, "Stopped recording file %s\n", member->rec_path); + } + switch_clear_flag_locked(member, MFLAG_RUNNING); count++; + } } + + conference->record_count -= count; + switch_mutex_unlock(conference->member_mutex); return count; } @@ -3980,7 +3992,7 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th fh.samplerate = conference->rate; member->id = next_member_id(); member->pool = rec->pool; - + member->rec = rec; member->frame_size = SWITCH_RECOMMENDED_BUFFER_SIZE; member->frame = switch_core_alloc(member->pool, member->frame_size); member->mux_frame = switch_core_alloc(member->pool, member->frame_size); @@ -6292,8 +6304,9 @@ static switch_status_t conf_api_sub_record(conference_obj_t *conference, switch_ switch_assert(conference != NULL); switch_assert(stream != NULL); - if (argc <= 2) + if (argc <= 2) { return SWITCH_STATUS_GENERR; + } stream->write_function(stream, "Record file %s\n", argv[2]); conference->record_filename = switch_core_strdup(conference->pool, argv[2]); @@ -6304,7 +6317,7 @@ static switch_status_t conf_api_sub_record(conference_obj_t *conference, switch_ static switch_status_t conf_api_sub_norecord(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv) { - int all; + int all, before = conference->record_count, ttl = 0; switch_event_t *event; switch_assert(conference != NULL); @@ -6314,15 +6327,10 @@ static switch_status_t conf_api_sub_norecord(conference_obj_t *conference, switc return SWITCH_STATUS_GENERR; all = (strcasecmp(argv[2], "all") == 0); - stream->write_function(stream, "Stop recording file %s\n", argv[2]); - if (!conference_record_stop(conference, all ? NULL : argv[2]) && !all) { + + if (!conference_record_stop(conference, stream, all ? NULL : argv[2]) && !all) { stream->write_function(stream, "non-existant recording '%s'\n", argv[2]); } else { - if (all) { - conference->record_count = 0; - } else { - conference->record_count--; - } if (test_eflag(conference, EFLAG_RECORD) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); @@ -6333,6 +6341,9 @@ static switch_status_t conf_api_sub_norecord(conference_obj_t *conference, switc } } + ttl = before - conference->record_count; + stream->write_function(stream, "Stopped recording %d file%s\n", ttl, ttl == 1 ? "" : "s"); + return SWITCH_STATUS_SUCCESS; } @@ -6384,7 +6395,7 @@ static switch_status_t conf_api_sub_recording(conference_obj_t *conference, swit switch_assert(conference != NULL); switch_assert(stream != NULL); - if (argc <= 3) { + if (argc > 2 && argc <= 3) { if (strcasecmp(argv[2], "stop") == 0 || strcasecmp(argv[2], "check") == 0) { argv[3] = "all"; argc++; From 25a942e12cd90978d984180ce703d6d783e21ccf Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Wed, 9 Oct 2013 22:37:01 +0800 Subject: [PATCH 08/80] Updated the MSVC version of spandsp.h to follow the generated one --- libs/spandsp/src/msvc/spandsp.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/spandsp/src/msvc/spandsp.h b/libs/spandsp/src/msvc/spandsp.h index b98aa66aa4..fb7b1431b1 100644 --- a/libs/spandsp/src/msvc/spandsp.h +++ b/libs/spandsp/src/msvc/spandsp.h @@ -36,9 +36,10 @@ #define SPANDSP_USE_EXPORT_CAPABILITY 1 -#undef SPANDSP_SUPPORT_T42 #undef SPANDSP_SUPPORT_T43 +#undef SPANDSP_SUPPORT_V32BIS #undef SPANDSP_SUPPORT_V34 +#undef SPANDSP_SUPPORT_TIFF_FX #include #include From 87831d167268aede272d5d5a1afb34887a762d00 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 Oct 2013 20:08:49 +0000 Subject: [PATCH 09/80] Document purpose of sofia profile aliasing --- src/mod/endpoints/mod_sofia/conf/sofia.conf.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml b/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml index 411ea3e44e..1b64f63bc7 100644 --- a/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml +++ b/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml @@ -64,6 +64,10 @@ + From 396d2c6cb1f0d52c14394ed09c0f4159e0a61f4a Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Wed, 9 Oct 2013 17:39:33 -0400 Subject: [PATCH 10/80] FS-5865 mod_rayo: send IQ result after join/unjoin completes --- src/mod/event_handlers/mod_rayo/mod_rayo.c | 155 +++++++++++++++------ 1 file changed, 109 insertions(+), 46 deletions(-) diff --git a/src/mod/event_handlers/mod_rayo/mod_rayo.c b/src/mod/event_handlers/mod_rayo/mod_rayo.c index e232ac8d38..92257aa2f6 100644 --- a/src/mod/event_handlers/mod_rayo/mod_rayo.c +++ b/src/mod/event_handlers/mod_rayo/mod_rayo.c @@ -128,6 +128,8 @@ struct rayo_call { switch_time_t idle_start_time; /** 1 if joined to call, 2 if joined to mixer */ int joined; + /** pending join */ + iks *pending_join_request; /** ID of joined party TODO this will be many mixers / calls */ const char *joined_id; /** set if response needs to be sent to IQ request */ @@ -937,6 +939,14 @@ static void rayo_call_cleanup(struct rayo_actor *actor) RAYO_SEND_MESSAGE_DUP(actor, rayo_call_get_dcp_jid(call), revent); } + /* lost the race: pending join failed... send IQ result to client now. */ + if (call->pending_join_request) { + iks *result = iks_new_error_detailed(call->pending_join_request, STANZA_ERROR_ITEM_NOT_FOUND, "call ended"); + RAYO_SEND_REPLY(call, iks_find_attrib_soft(call->pending_join_request, "from"), result); + iks_delete(call->pending_join_request); + call->pending_join_request = NULL; + } + iks_delete(revent); switch_event_destroy(&event); } @@ -1068,6 +1078,7 @@ static struct rayo_call *rayo_call_init(struct rayo_call *call, switch_memory_po call->joined = 0; call->joined_id = NULL; call->ringing_sent = 0; + call->pending_join_request = NULL; switch_core_hash_init(&call->pcps, pool); switch_safe_free(call_jid); @@ -1292,6 +1303,17 @@ static struct rayo_peer_server *rayo_peer_server_create(const char *jid) return rserver; } +/** + * Check if message sender has control of offered call. + * @param call the Rayo call + * @param msg the message + * @return 1 if sender has call control, 0 if sender does not have control + */ +static int has_call_control(struct rayo_call *call, struct rayo_message *msg) +{ + return (!strcmp(rayo_call_get_dcp_jid(call), msg->from_jid) || is_internal_message(msg) || is_admin_client_message(msg)); +} + /** * Check if message sender has control of offered call. Take control if nobody else does. * @param call the Rayo call @@ -1299,7 +1321,7 @@ static struct rayo_peer_server *rayo_peer_server_create(const char *jid) * @param msg the message * @return 1 if sender has call control */ -static int has_call_control(struct rayo_call *call, switch_core_session_t *session, struct rayo_message *msg) +static int take_call_control(struct rayo_call *call, switch_core_session_t *session, struct rayo_message *msg) { int control = 0; @@ -1313,7 +1335,7 @@ static int has_call_control(struct rayo_call *call, switch_core_session_t *sessi control = 1; switch_log_printf(SWITCH_CHANNEL_UUID_LOG(rayo_call_get_uuid(call)), SWITCH_LOG_INFO, "%s has control of call\n", rayo_call_get_dcp_jid(call)); } - } else if (!strcmp(rayo_call_get_dcp_jid(call), msg->from_jid) || is_internal_message(msg) || is_admin_client_message(msg)) { + } else if (has_call_control(call, msg)) { control = 1; } @@ -1358,7 +1380,7 @@ static iks *rayo_call_command_ok(struct rayo_call *call, switch_core_session_t * if (bad) { response = iks_new_error(node, STANZA_ERROR_BAD_REQUEST); - } else if (!has_call_control(call, session, msg)) { + } else if (!take_call_control(call, session, msg)) { response = iks_new_error(node, STANZA_ERROR_CONFLICT); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s, %s conflict\n", msg->from_jid, RAYO_JID(call)); } @@ -1711,13 +1733,14 @@ static iks *on_rayo_hangup(struct rayo_actor *call, struct rayo_message *msg, vo * Join calls together * @param call the call that joins * @param session the session - * @param node the join request + * @param msg the rayo join message * @param call_uri to join * @param media mode (direct/bridge) * @return the response */ -static iks *join_call(struct rayo_call *call, switch_core_session_t *session, iks *node, const char *call_uri, const char *media) +static iks *join_call(struct rayo_call *call, switch_core_session_t *session, struct rayo_message *msg, const char *call_uri, const char *media) { + iks *node = msg->payload; iks *response = NULL; /* take call out of media path if media = "direct" */ const char *bypass = !strcmp("direct", media) ? "true" : "false"; @@ -1727,6 +1750,9 @@ static iks *join_call(struct rayo_call *call, switch_core_session_t *session, ik if (!b_call) { /* not a rayo call */ response = iks_new_error_detailed(node, STANZA_ERROR_SERVICE_UNAVAILABLE, "b-leg is not a rayo call"); + } else if (!has_call_control(b_call, msg)) { + /* not allowed to join to this call */ + response = iks_new_error(node, STANZA_ERROR_NOT_ALLOWED); } else if (b_call->joined) { /* don't support multiple joined calls */ response = iks_new_error_detailed(node, STANZA_ERROR_CONFLICT, "multiple joined calls not supported"); @@ -1737,10 +1763,11 @@ static iks *join_call(struct rayo_call *call, switch_core_session_t *session, ik if (switch_false(bypass)) { switch_channel_pre_answer(switch_core_session_get_channel(session)); } - if (switch_ivr_uuid_bridge(rayo_call_get_uuid(call), rayo_call_get_uuid(b_call)) == SWITCH_STATUS_SUCCESS) { - response = iks_new_iq_result(node); - } else { + call->pending_join_request = iks_copy(node); + if (switch_ivr_uuid_bridge(rayo_call_get_uuid(call), rayo_call_get_uuid(b_call)) != SWITCH_STATUS_SUCCESS) { response = iks_new_error_detailed(node, STANZA_ERROR_INTERNAL_SERVER_ERROR, "failed to bridge call"); + iks_delete(call->pending_join_request); + call->pending_join_request = NULL; } RAYO_UNLOCK(b_call); } @@ -1763,13 +1790,14 @@ static void exec_conference_api(switch_core_session_t *session, const char *conf * Join call to a mixer * @param call the call that joins * @param session the session - * @param node the join request + * @param msg the join request * @param mixer_name the mixer to join * @param direction the media direction * @return the response */ -static iks *join_mixer(struct rayo_call *call, switch_core_session_t *session, iks *node, const char *mixer_name, const char *direction) +static iks *join_mixer(struct rayo_call *call, switch_core_session_t *session, struct rayo_message *msg, const char *mixer_name, const char *direction) { + iks *node = msg->payload; iks *response = NULL; if (call->joined_id) { @@ -1806,14 +1834,13 @@ static iks *join_mixer(struct rayo_call *call, switch_core_session_t *session, i * Handle request * @param call the Rayo call * @param session the session - * @param node the node + * @param msg the rayo join message */ static iks *on_rayo_join(struct rayo_actor *call, struct rayo_message *msg, void *session_data) { - iks *node = msg->payload; switch_core_session_t *session = (switch_core_session_t *)session_data; iks *response = NULL; - iks *join = iks_find(node, "join"); + iks *join = iks_find(msg->payload, "join"); const char *join_id; const char *mixer_name; const char *call_uri; @@ -1821,7 +1848,7 @@ static iks *on_rayo_join(struct rayo_actor *call, struct rayo_message *msg, void /* validate input attributes */ if (!VALIDATE_RAYO_JOIN(join)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Bad join attrib\n"); - response = iks_new_error(node, STANZA_ERROR_BAD_REQUEST); + response = iks_new_error(msg->payload, STANZA_ERROR_BAD_REQUEST); goto done; } mixer_name = iks_find_attrib(join, "mixer-name"); @@ -1835,29 +1862,35 @@ static iks *on_rayo_join(struct rayo_actor *call, struct rayo_message *msg, void /* can't join both mixer and call */ if (!zstr(mixer_name) && !zstr(call_uri)) { - response = iks_new_error_detailed(node, STANZA_ERROR_BAD_REQUEST, "mixer-name and call-uri are mutually exclusive"); + response = iks_new_error_detailed(msg->payload, STANZA_ERROR_BAD_REQUEST, "mixer-name and call-uri are mutually exclusive"); goto done; } /* need to join *something* */ if (zstr(mixer_name) && zstr(call_uri)) { - response = iks_new_error_detailed(node, STANZA_ERROR_BAD_REQUEST, "mixer-name or call-uri is required"); + response = iks_new_error_detailed(msg->payload, STANZA_ERROR_BAD_REQUEST, "mixer-name or call-uri is required"); goto done; } if ((RAYO_CALL(call)->joined == JOINED_CALL) || (RAYO_CALL(call)->joined == JOINED_MIXER && strcmp(RAYO_CALL(call)->joined_id, join_id))) { /* already joined */ - response = iks_new_error_detailed(node, STANZA_ERROR_CONFLICT, "call is already joined"); + response = iks_new_error_detailed(msg->payload, STANZA_ERROR_CONFLICT, "call is already joined"); + goto done; + } + + if (RAYO_CALL(call)->pending_join_request) { + /* don't allow concurrent join requests */ + response = iks_new_error_detailed(msg->payload, STANZA_ERROR_UNEXPECTED_REQUEST, "(un)join request is pending"); goto done; } if (!zstr(mixer_name)) { /* join conference */ - response = join_mixer(RAYO_CALL(call), session, node, mixer_name, iks_find_attrib(join, "direction")); + response = join_mixer(RAYO_CALL(call), session, msg, mixer_name, iks_find_attrib(join, "direction")); } else { /* bridge calls */ - response = join_call(RAYO_CALL(call), session, node, call_uri, iks_find_attrib(join, "media")); + response = join_call(RAYO_CALL(call), session, msg, call_uri, iks_find_attrib(join, "media")); } done: @@ -1868,12 +1901,13 @@ done: * unjoin call to a bridge * @param call the call that unjoined * @param session the session - * @param node the unjoin request + * @param msg the unjoin request * @param call_uri the b-leg xmpp URI * @return the response */ -static iks *unjoin_call(struct rayo_call *call, switch_core_session_t *session, iks *node, const char *call_uri) +static iks *unjoin_call(struct rayo_call *call, switch_core_session_t *session, struct rayo_message *msg, const char *call_uri) { + iks *node = msg->payload; iks *response = NULL; const char *bleg_uuid = switch_channel_get_variable(switch_core_session_get_channel(session), SWITCH_BRIDGE_UUID_VARIABLE); const char *bleg_uri = switch_core_session_sprintf(session, "xmpp:%s@%s", bleg_uuid ? bleg_uuid : "", RAYO_JID(globals.server)); @@ -1881,7 +1915,7 @@ static iks *unjoin_call(struct rayo_call *call, switch_core_session_t *session, /* bleg must match call_uri */ if (!zstr(bleg_uri) && !strcmp(bleg_uri, call_uri)) { /* unbridge call */ - response = iks_new_iq_result(node); + call->pending_join_request = iks_copy(node); switch_ivr_park_session(session); } else { /* not bridged or wrong b-leg URI */ @@ -1895,15 +1929,16 @@ static iks *unjoin_call(struct rayo_call *call, switch_core_session_t *session, * unjoin call to a mixer * @param call the call that unjoined * @param session the session - * @param node the unjoin request + * @param msg the unjoin request * @param mixer_name the mixer name * @return the response */ -static iks *unjoin_mixer(struct rayo_call *call, switch_core_session_t *session, iks *node, const char *mixer_name) +static iks *unjoin_mixer(struct rayo_call *call, switch_core_session_t *session, struct rayo_message *msg, const char *mixer_name) { switch_channel_t *channel = switch_core_session_get_channel(session); const char *conf_member_id = switch_channel_get_variable(channel, "conference_member_id"); const char *conf_name = switch_channel_get_variable(channel, "conference_name"); + iks *node = msg->payload; iks *response = NULL; /* not conferenced, or wrong conference */ @@ -1935,31 +1970,33 @@ done: */ static iks *on_rayo_unjoin(struct rayo_actor *call, struct rayo_message *msg, void *session_data) { - iks *node = msg->payload; switch_core_session_t *session = (switch_core_session_t *)session_data; iks *response = NULL; - iks *unjoin = iks_find(node, "unjoin"); + iks *unjoin = iks_find(msg->payload, "unjoin"); const char *call_uri = iks_find_attrib(unjoin, "call-uri"); const char *mixer_name = iks_find_attrib(unjoin, "mixer-name"); if (!zstr(call_uri) && !zstr(mixer_name)) { - response = iks_new_error(node, STANZA_ERROR_BAD_REQUEST); + response = iks_new_error(msg->payload, STANZA_ERROR_BAD_REQUEST); + } else if (RAYO_CALL(call)->pending_join_request) { + /* need to let pending request finish first */ + response = iks_new_error_detailed(msg->payload, STANZA_ERROR_UNEXPECTED_REQUEST, "(un)join request is pending"); } else if (!RAYO_CALL(call)->joined) { /* not joined to anything */ - response = iks_new_error(node, STANZA_ERROR_SERVICE_UNAVAILABLE); + response = iks_new_error(msg->payload, STANZA_ERROR_SERVICE_UNAVAILABLE); } else if (!zstr(call_uri)) { - response = unjoin_call(RAYO_CALL(call), session, node, call_uri); + response = unjoin_call(RAYO_CALL(call), session, msg, call_uri); } else if (!zstr(mixer_name)) { - response = unjoin_mixer(RAYO_CALL(call), session, node, mixer_name); + response = unjoin_mixer(RAYO_CALL(call), session, msg, mixer_name); } else { /* unjoin everything */ if (RAYO_CALL(call)->joined == JOINED_MIXER) { - response = unjoin_mixer(RAYO_CALL(call), session, node, RAYO_CALL(call)->joined_id); + response = unjoin_mixer(RAYO_CALL(call), session, msg, RAYO_CALL(call)->joined_id); } else if (RAYO_CALL(call)->joined == JOINED_CALL) { - response = unjoin_call(RAYO_CALL(call), session, node, RAYO_CALL(call)->joined_id); + response = unjoin_call(RAYO_CALL(call), session, msg, RAYO_CALL(call)->joined_id); } else { /* shouldn't happen */ - response = iks_new_error(node, STANZA_ERROR_INTERNAL_SERVER_ERROR); + response = iks_new_error(msg->payload, STANZA_ERROR_INTERNAL_SERVER_ERROR); } } @@ -2661,16 +2698,29 @@ static void on_call_bridge_event(struct rayo_client *rclient, switch_event_t *ev struct rayo_call *b_call; if (call) { - /* send A-leg event */ - iks *revent = iks_new_presence("joined", RAYO_NS, - switch_event_get_header(event, "variable_rayo_call_jid"), - switch_event_get_header(event, "variable_rayo_dcp_jid")); - iks *joined = iks_find(revent, "joined"); - iks_insert_attrib_printf(joined, "call-uri", "xmpp:%s@%s", b_uuid, RAYO_JID(globals.server)); + iks *revent; + iks *joined; call->joined = JOINED_CALL; call->joined_id = switch_core_strdup(RAYO_POOL(call), b_uuid); + /* send IQ result to client now. */ + switch_mutex_lock(RAYO_ACTOR(call)->mutex); + if (call->pending_join_request) { + iks *result = iks_new_iq_result(call->pending_join_request); + RAYO_SEND_REPLY(call, iks_find_attrib_soft(call->pending_join_request, "from"), result); + iks_delete(call->pending_join_request); + call->pending_join_request = NULL; + } + switch_mutex_unlock(RAYO_ACTOR(call)->mutex); + + /* send A-leg event */ + revent = iks_new_presence("joined", RAYO_NS, + switch_event_get_header(event, "variable_rayo_call_jid"), + switch_event_get_header(event, "variable_rayo_dcp_jid")); + joined = iks_find(revent, "joined"); + iks_insert_attrib_printf(joined, "call-uri", "xmpp:%s@%s", b_uuid, RAYO_JID(globals.server)); + RAYO_SEND_MESSAGE(call, RAYO_JID(rclient), revent); /* send B-leg event */ @@ -2703,17 +2753,30 @@ static void on_call_unbridge_event(struct rayo_client *rclient, switch_event_t * struct rayo_call *b_call; if (call) { - /* send A-leg event */ - iks *revent = iks_new_presence("unjoined", RAYO_NS, - switch_event_get_header(event, "variable_rayo_call_jid"), - switch_event_get_header(event, "variable_rayo_dcp_jid")); - iks *joined = iks_find(revent, "unjoined"); - iks_insert_attrib_printf(joined, "call-uri", "xmpp:%s@%s", b_uuid, RAYO_JID(globals.server)); - RAYO_SEND_MESSAGE(call, RAYO_JID(rclient), revent); + iks *revent; + iks *joined; call->joined = 0; call->joined_id = NULL; + /* send IQ result to client now. */ + switch_mutex_lock(RAYO_ACTOR(call)->mutex); + if (call->pending_join_request) { + iks *result = iks_new_iq_result(call->pending_join_request); + RAYO_SEND_REPLY(call, iks_find_attrib_soft(call->pending_join_request, "from"), result); + iks_delete(call->pending_join_request); + call->pending_join_request = NULL; + } + switch_mutex_unlock(RAYO_ACTOR(call)->mutex); + + /* send A-leg event */ + revent = iks_new_presence("unjoined", RAYO_NS, + switch_event_get_header(event, "variable_rayo_call_jid"), + switch_event_get_header(event, "variable_rayo_dcp_jid")); + joined = iks_find(revent, "unjoined"); + iks_insert_attrib_printf(joined, "call-uri", "xmpp:%s@%s", b_uuid, RAYO_JID(globals.server)); + RAYO_SEND_MESSAGE(call, RAYO_JID(rclient), revent); + /* send B-leg event */ b_call = RAYO_CALL_LOCATE_BY_ID(b_uuid); if (b_call) { From 55ed8c7b139571472e71fb383d6829af9c3ce1ee Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 Oct 2013 04:40:56 +0500 Subject: [PATCH 11/80] FS-5861 --resolve --- src/mod/applications/mod_dptools/mod_dptools.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 1146dc38ca..5fe2c57e5b 100755 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -283,10 +283,17 @@ SWITCH_STANDARD_APP(clear_digit_action_function) { //switch_channel_t *channel = switch_core_session_get_channel(session); switch_ivr_dmachine_t *dmachine; - char *realm = switch_core_session_strdup(session, data); + char *realm = NULL; char *target_str; switch_digit_action_target_t target = DIGIT_TARGET_SELF; + if (zstr(realm)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "clear_digit_action called with no args"); + return; + } + + realm = switch_core_session_strdup(session, data); + if ((target_str = strchr(realm, ','))) { *target_str++ = '\0'; target = str2target(target_str); From ca0e8eaf5323d3fff553455fd45da4e944994de5 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Thu, 10 Oct 2013 11:48:57 -0400 Subject: [PATCH 12/80] FS-5866 --- src/mod/codecs/mod_com_g729/Makefile.am | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mod/codecs/mod_com_g729/Makefile.am b/src/mod/codecs/mod_com_g729/Makefile.am index a0d8b861df..e6586e159f 100644 --- a/src/mod/codecs/mod_com_g729/Makefile.am +++ b/src/mod/codecs/mod_com_g729/Makefile.am @@ -15,11 +15,11 @@ install: $(LICSERVER) $(VALIDATOR) $(MOD) $(LICSERVER) $(VALIDATOR) $(MOD): $(G729INSTALLER) $(SHELL) $(G729INSTALLER) $(bindir) $(moddir) nobanner - $(ECHO) - $(ECHO) - $(ECHO) Now you can activate your license by running $(MAKE) mod_com_g729-activate - $(ECHO) - $(ECHO) + @echo + @echo + @echo Now you can activate your license by running $(MAKE) mod_com_g729-activate + @echo + @echo $(G729INSTALLER): rm -f $(top_srcdir)/libs/fsg729-*-installer* From 1cd6d44b0616aa7702f6e173d6d8d40acae6b3f7 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 Oct 2013 22:22:59 +0500 Subject: [PATCH 13/80] move shutdown of session to after switch_event --- src/switch_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_core.c b/src/switch_core.c index 7a8edfeec8..8cefdd2e63 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -2614,7 +2614,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_destroy(void) switch_nat_shutdown(); } switch_xml_destroy(); - switch_core_session_uninit(); switch_console_shutdown(); switch_channel_global_uninit(); @@ -2624,6 +2623,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_destroy(void) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Finalizing Shutdown.\n"); switch_log_shutdown(); + switch_core_session_uninit(); switch_core_unset_variables(); switch_core_memory_stop(); From 9990be42099ccb33a36fae18fd401c4d160d1c1b Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Fri, 11 Oct 2013 23:42:06 +0800 Subject: [PATCH 14/80] Avoid use of config.h in build environment tools in spandsp --- libs/spandsp/src/fax.c | 2 +- libs/spandsp/src/make_at_dictionary.c | 4 ---- libs/spandsp/src/make_cielab_luts.c | 9 --------- libs/spandsp/src/make_math_fixed_tables.c | 4 ---- libs/spandsp/src/make_modem_filter.c | 10 ---------- libs/spandsp/src/make_t43_gray_code_tables.c | 4 ---- libs/spandsp/tests/super_tone_tx_tests.c | 1 - 7 files changed, 1 insertion(+), 33 deletions(-) diff --git a/libs/spandsp/src/fax.c b/libs/spandsp/src/fax.c index 90409da7a4..8d8b3b25bc 100644 --- a/libs/spandsp/src/fax.c +++ b/libs/spandsp/src/fax.c @@ -255,7 +255,6 @@ static void fax_set_rx_type(void *user_data, int type, int bit_rate, int short_t { case T30_MODEM_V21: fax_modems_start_slow_modem(t, FAX_MODEM_V21_RX); - fax_modems_set_rx_handler(t, (span_rx_handler_t) &fsk_rx, &t->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &t->v21_rx); break; case T30_MODEM_V17: fax_modems_start_fast_modem(t, FAX_MODEM_V17_RX, bit_rate, short_train, use_hdlc); @@ -286,6 +285,7 @@ static void fax_set_tx_type(void *user_data, int type, int bit_rate, int short_t span_log(&s->logging, SPAN_LOG_FLOW, "Set tx type %d\n", type); if (t->current_tx_type == type) return; + switch (type) { case T30_MODEM_PAUSE: diff --git a/libs/spandsp/src/make_at_dictionary.c b/libs/spandsp/src/make_at_dictionary.c index 7f05dd9b14..3a881af992 100644 --- a/libs/spandsp/src/make_at_dictionary.c +++ b/libs/spandsp/src/make_at_dictionary.c @@ -24,10 +24,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif - #include #include #include diff --git a/libs/spandsp/src/make_cielab_luts.c b/libs/spandsp/src/make_cielab_luts.c index 5fca6c7236..b143817d85 100644 --- a/libs/spandsp/src/make_cielab_luts.c +++ b/libs/spandsp/src/make_cielab_luts.c @@ -25,22 +25,13 @@ /*! \file */ -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif - #include #include #include #include #include #include -#if defined(HAVE_TGMATH_H) -#include -#endif -#if defined(HAVE_MATH_H) #include -#endif typedef struct { diff --git a/libs/spandsp/src/make_math_fixed_tables.c b/libs/spandsp/src/make_math_fixed_tables.c index 64b33ca328..075cb15bd2 100644 --- a/libs/spandsp/src/make_math_fixed_tables.c +++ b/libs/spandsp/src/make_math_fixed_tables.c @@ -24,10 +24,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif - #include #include #include diff --git a/libs/spandsp/src/make_modem_filter.c b/libs/spandsp/src/make_modem_filter.c index b0faed4a02..ec290c3e07 100644 --- a/libs/spandsp/src/make_modem_filter.c +++ b/libs/spandsp/src/make_modem_filter.c @@ -24,10 +24,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif - #include #include #include @@ -35,18 +31,12 @@ #include #include #include -#if defined(HAVE_TGMATH_H) -#include -#endif -#if defined(HAVE_MATH_H) #include -#endif #if defined(HAVE_STDBOOL_H) #include #else #include "spandsp/stdbool.h" #endif -#include "floating_fudge.h" #if defined(__sunos) || defined(__solaris) || defined(__sun) #include #endif diff --git a/libs/spandsp/src/make_t43_gray_code_tables.c b/libs/spandsp/src/make_t43_gray_code_tables.c index 041b907d79..90117c5d83 100644 --- a/libs/spandsp/src/make_t43_gray_code_tables.c +++ b/libs/spandsp/src/make_t43_gray_code_tables.c @@ -24,10 +24,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif - #include #include #include diff --git a/libs/spandsp/tests/super_tone_tx_tests.c b/libs/spandsp/tests/super_tone_tx_tests.c index 561b333c36..9f32ea6c78 100644 --- a/libs/spandsp/tests/super_tone_tx_tests.c +++ b/libs/spandsp/tests/super_tone_tx_tests.c @@ -41,7 +41,6 @@ #include #include #include -#include #include #if defined(HAVE_LIBXML_XMLMEMORY_H) From 40aeedcbe4ae8daa6867f0105147d0618fb2a96d Mon Sep 17 00:00:00 2001 From: Brian West Date: Fri, 11 Oct 2013 17:20:46 -0500 Subject: [PATCH 15/80] url_decode the cid_name when you vm_cc --- src/mod/applications/mod_voicemail/mod_voicemail.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c index cb54af30bf..22de3bf1cb 100644 --- a/src/mod/applications/mod_voicemail/mod_voicemail.c +++ b/src/mod/applications/mod_voicemail/mod_voicemail.c @@ -3078,10 +3078,17 @@ static switch_status_t deliver_vm(vm_profile_t *profile, vm_cc_num = switch_separate_string(vm_cc_dup, ',', vm_cc_list, (sizeof(vm_cc_list) / sizeof(vm_cc_list[0]))); for (vm_cc_i=0; vm_cc_i Date: Fri, 11 Oct 2013 17:23:47 -0500 Subject: [PATCH 16/80] doh, use the decoded value --- src/mod/applications/mod_voicemail/mod_voicemail.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c index 22de3bf1cb..07d4d2fe95 100644 --- a/src/mod/applications/mod_voicemail/mod_voicemail.c +++ b/src/mod/applications/mod_voicemail/mod_voicemail.c @@ -3086,7 +3086,7 @@ static switch_status_t deliver_vm(vm_profile_t *profile, cmd = switch_mprintf("%s %s %s '%s' %s@%s %s", vm_cc_current, file_path, caller_id_number, - caller_id_name, myid, domain_name, read_flags); + val, myid, domain_name, read_flags); free(val); From 5fd0255523e579f7214140b47f1bbfd6344190c2 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 Oct 2013 17:58:57 +0000 Subject: [PATCH 17/80] Force preference on ssmtp if no MTA is installed FS-5872 --resolve --- debian/control-modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control-modules b/debian/control-modules index 679082187c..61f0b33a80 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -229,7 +229,7 @@ Description: Voicemail detection Module: applications/mod_voicemail Description: Voicemail This module provides a voicemail system. -Depends: mail-transport-agent +Depends: ssmtp | mail-transport-agent Module: applications/mod_voicemail_ivr Description: Voicemail IVR From e7287f901fd63736fb26db1d217ebeffbb1e38a2 Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Sat, 12 Oct 2013 16:40:29 -0500 Subject: [PATCH 18/80] fix windows build for recent spandsp commit --- libs/spandsp/src/make_modem_filter.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/spandsp/src/make_modem_filter.c b/libs/spandsp/src/make_modem_filter.c index ec290c3e07..bd9427e24f 100644 --- a/libs/spandsp/src/make_modem_filter.c +++ b/libs/spandsp/src/make_modem_filter.c @@ -41,6 +41,10 @@ #include #endif +#if defined (_MSC_VER) + #define __inline__ __inline +#endif + #include "spandsp/telephony.h" #include "spandsp/complex.h" #include "filter_tools.h" From 323d4c73d1d0b4b3ccb8b4f47808f43b160e1cd3 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 14 Oct 2013 13:06:41 -0500 Subject: [PATCH 19/80] remove timestamp and raw_rtp flag from loopback frames --- src/mod/endpoints/mod_loopback/mod_loopback.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index 41f5849655..c6cbfc8994 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -709,6 +709,10 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch } tech_pvt->write_frame = (switch_frame_t *) pop; + + switch_clear_flag(tech_pvt->write_frame, SFF_RAW_RTP); + tech_pvt->write_frame->timestamp = 0; + tech_pvt->write_frame->codec = &tech_pvt->read_codec; *frame = tech_pvt->write_frame; tech_pvt->packet_count++; From 230e005a0816cea796fe3fcc7090100cca139346 Mon Sep 17 00:00:00 2001 From: Brian West Date: Mon, 14 Oct 2013 17:36:17 -0500 Subject: [PATCH 20/80] Fix my snafu and allow [:port] [[: 0 && iport < 0xFFFF) { + port = (switch_port_t) iport; + } + } else if (!zstr(src_ip)) { + ip = src_ip; } - if (pip) { - switch_copy_string(ip_buf, pip, sizeof(ip_buf)); + if ( !zstr(src_ip) ) { + switch_copy_string(ip_buf, src_ip, sizeof(ip_buf)); } else { switch_find_local_ip(ip_buf, sizeof(ip_buf), NULL, AF_INET); } @@ -6150,7 +6157,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load) SWITCH_ADD_API(commands_api_interface, "sql_escape", "Escape a string to prevent sql injection", sql_escape, SQL_ESCAPE_SYNTAX); SWITCH_ADD_API(commands_api_interface, "status", "Show current status", status_function, ""); SWITCH_ADD_API(commands_api_interface, "strftime_tz", "Display formatted time of timezone", strftime_tz_api_function, " [|][format string]"); - SWITCH_ADD_API(commands_api_interface, "stun", "Execute STUN lookup", stun_function, "[:port]"); + SWITCH_ADD_API(commands_api_interface, "stun", "Execute STUN lookup", stun_function, "[:port] [[: [count]"); SWITCH_ADD_API(commands_api_interface, "timer_test", "Exercise FS timer", timer_test_function, TIMER_TEST_SYNTAX); From 850c154bd4bfc3da604ce139614979402c73c8f1 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 15 Oct 2013 04:57:57 +0500 Subject: [PATCH 21/80] fix vid switching in webrtc --- .../mod_conference/mod_conference.c | 19 ++++++++++-- src/switch_rtp.c | 31 ++++++++++++------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index db38e5c7eb..06677e33cd 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -1599,7 +1599,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe static void conference_set_video_floor_holder(conference_obj_t *conference, conference_member_t *member, switch_bool_t force) { switch_event_t *event; - conference_member_t *old_member = NULL; + conference_member_t *old_member = NULL, *imember = NULL; int old_id = 0; if (!member) { @@ -1623,8 +1623,6 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf switch_mutex_lock(conference->mutex); if (!member) { - conference_member_t *imember; - for (imember = conference->members; imember; imember = imember->next) { if (imember != conference->video_floor_holder && imember->channel && switch_channel_test_flag(imember->channel, CF_VIDEO)) { member = imember; @@ -1648,6 +1646,20 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf //switch_channel_clear_flag(old_member->channel, CF_VIDEO_PASSIVE); } + for (imember = conference->members; imember; imember = imember->next) { + if (!imember->channel || !switch_channel_test_flag(imember->channel, CF_VIDEO)) { + continue; + } + switch_channel_clear_flag(imember->channel, CF_VIDEO_ECHO); + + if (imember == conference->video_floor_holder) { + switch_channel_set_flag(imember->channel, CF_VIDEO_PASSIVE); + } else { + switch_channel_clear_flag(imember->channel, CF_VIDEO_PASSIVE); + } + switch_core_session_refresh_video(imember->session); + } + switch_set_flag(conference, CFLAG_FLOOR_CHANGE); switch_mutex_unlock(conference->mutex); @@ -7505,6 +7517,7 @@ SWITCH_STANDARD_APP(conference_function) switch_channel_set_flag(channel, CF_CONFERENCE); switch_channel_set_flag(channel, CF_VIDEO_PASSIVE); + if (switch_channel_answer(channel) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Channel answer failed.\n"); goto end; diff --git a/src/switch_rtp.c b/src/switch_rtp.c index c7f15f01f1..47590b1430 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -54,7 +54,7 @@ #include #include -#define FIR_COUNTDOWN 50 +#define FIR_COUNTDOWN 25 #define READ_INC(rtp_session) switch_mutex_lock(rtp_session->read_mutex); rtp_session->reading++ #define READ_DEC(rtp_session) switch_mutex_unlock(rtp_session->read_mutex); rtp_session->reading-- @@ -1527,6 +1527,20 @@ static int check_rtcp_and_ice(switch_rtp_t *rtp_session) int rtcp_ok = 1; switch_time_t now = switch_micro_time_now(); + + if (rtp_session->fir_countdown) { + if (rtp_session->fir_countdown == FIR_COUNTDOWN) { + do_flush(rtp_session, SWITCH_TRUE); + } + + if (rtp_session->fir_countdown == FIR_COUNTDOWN || rtp_session->fir_countdown == 1) { + send_fir(rtp_session); + //send_pli(rtp_session); + } + + rtp_session->fir_countdown--; + } + if (rtp_session->flags[SWITCH_RTP_FLAG_AUTO_CNG] && rtp_session->send_msg.header.ts && rtp_session->timer.samplecount >= (rtp_session->last_write_samplecount + (rtp_session->samples_per_interval * 60))) { uint8_t data[10] = { 0 }; @@ -4621,8 +4635,10 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ pt = 100000; } + poll_status = switch_poll(rtp_session->read_pollfd, 1, &fdr, pt); - + + if (rtp_session->dtmf_data.out_digit_dur > 0) { return_cng_frame(); } @@ -5282,15 +5298,6 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_zerocopy_read_frame(switch_rtp_t *rtp return SWITCH_STATUS_FALSE; } - if (rtp_session->fir_countdown) { - rtp_session->fir_countdown--; - - if (rtp_session->fir_countdown == FIR_COUNTDOWN / 2 || rtp_session->fir_countdown == 0) { - send_fir(rtp_session); - //send_pli(rtp_session); - } - } - bytes = rtp_common_read(rtp_session, &frame->payload, &frame->flags, io_flags); frame->data = RTP_BODY(rtp_session); @@ -5524,7 +5531,7 @@ static int rtp_common_write(switch_rtp_t *rtp_session, rtp_session->ts_norm.delta_percent = (double)((double)rtp_session->ts_norm.delta / (double)rtp_session->ts_norm.delta_avg) * 100.0f; - if (rtp_session->ts_norm.delta_ct > 50 && rtp_session->ts_norm.delta_percent > 125.0) { + if (rtp_session->ts_norm.delta_ct > 50 && rtp_session->ts_norm.delta_percent > 150.0) { //printf("%s diff %d %d (%.2f)\n", switch_core_session_get_name(rtp_session->session), //rtp_session->ts_norm.delta, rtp_session->ts_norm.delta_avg, rtp_session->ts_norm.delta_percent); switch_rtp_video_refresh(rtp_session); From 968ac0830555d519a60af0ddc21cce0adf8db87f Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 15 Oct 2013 12:08:30 +0000 Subject: [PATCH 22/80] Add mod_format_cdr to Debian packaging --- debian/control-modules | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/debian/control-modules b/debian/control-modules index 61f0b33a80..cd7acb2c73 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -478,6 +478,10 @@ Module: event_handlers/mod_event_zmq Description: mod_event_zmq Adds mod_event_zmq. +Module: event_handlers/mod_format_cdr +Description: mod_format_cdr + Adds mod_format_cdr. + Module: event_handlers/mod_json_cdr Description: mod_json_cdr Adds mod_json_cdr. From 81e805165a9bce63010f7e80c59e95145fece490 Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Tue, 15 Oct 2013 23:39:59 +0800 Subject: [PATCH 23/80] Eliminate some warnings in a Windows build --- libs/libg722_1/src/tables.c | 526 ++++++++++++++++++------------------ 1 file changed, 263 insertions(+), 263 deletions(-) diff --git a/libs/libg722_1/src/tables.c b/libs/libg722_1/src/tables.c index a0eed803bf..cf15bd3f73 100644 --- a/libs/libg722_1/src/tables.c +++ b/libs/libg722_1/src/tables.c @@ -63,70 +63,70 @@ const int16_t int_region_standard_deviation_table[REGION_POWER_TABLE_SIZE] = #else const float region_standard_deviation_table[REGION_POWER_TABLE_SIZE] = { - 2.441406247570224e-04, - 3.452669826719395e-04, - 4.882812495545411e-04, - 6.905339654011486e-04, - 9.765624991900746e-04, - 1.381067930916839e-03, - 1.953124998542134e-03, - 2.762135862062757e-03, - 3.906249997408239e-03, - 5.524271724583683e-03, - 7.812499995464418e-03, - 1.104854345008369e-02, - 1.562499999222472e-02, - 2.209708690200003e-02, - 3.124999998704119e-02, - 4.419417380766535e-02, - 6.249999997926591e-02, - 8.838834762266132e-02, - 1.249999999688989e-01, - 1.767766952599839e-01, - 2.499999999585318e-01, - 3.535533905492901e-01, - 4.999999999585318e-01, - 7.071067811572251e-01, - 1.000000000000000e+00, - 1.414213562431740e+00, - 2.000000000165873e+00, - 2.828427125098059e+00, - 4.000000000663491e+00, - 5.656854250665278e+00, - 8.000000001990472e+00, - 1.131370850226887e+01, - 1.600000000530792e+01, - 2.262741700641438e+01, - 3.200000001326981e+01, - 4.525483401658204e+01, - 6.400000003184756e+01, - 9.050966804067060e+01, - 1.280000000743110e+02, - 1.810193360963542e+02, - 2.560000001698536e+02, - 3.620386722227349e+02, - 5.120000003821707e+02, - 7.240773445055215e+02, - 1.024000000849268e+03, - 1.448154689131149e+03, - 2.048000001868390e+03, - 2.896309378502505e+03, - 4.096000004076487e+03, - 5.792618757485434e+03, - 8.192000008832390e+03, - 1.158523751593169e+04, - 1.638400001902361e+04, - 2.317047503378509e+04, - 3.276800004076484e+04, - 4.634095007141347e+04, - 6.553600008696507e+04, - 9.268190015051374e+04, - 1.310720001848009e+05, - 1.853638003164007e+05, - 2.621440003913428e+05, - 3.707276006635486e+05, - 5.242880008261676e+05, - 7.414552013885899e+05 + 2.441406247570224e-04f, + 3.452669826719395e-04f, + 4.882812495545411e-04f, + 6.905339654011486e-04f, + 9.765624991900746e-04f, + 1.381067930916839e-03f, + 1.953124998542134e-03f, + 2.762135862062757e-03f, + 3.906249997408239e-03f, + 5.524271724583683e-03f, + 7.812499995464418e-03f, + 1.104854345008369e-02f, + 1.562499999222472e-02f, + 2.209708690200003e-02f, + 3.124999998704119e-02f, + 4.419417380766535e-02f, + 6.249999997926591e-02f, + 8.838834762266132e-02f, + 1.249999999688989e-01f, + 1.767766952599839e-01f, + 2.499999999585318e-01f, + 3.535533905492901e-01f, + 4.999999999585318e-01f, + 7.071067811572251e-01f, + 1.000000000000000e+00f, + 1.414213562431740e+00f, + 2.000000000165873e+00f, + 2.828427125098059e+00f, + 4.000000000663491e+00f, + 5.656854250665278e+00f, + 8.000000001990472e+00f, + 1.131370850226887e+01f, + 1.600000000530792e+01f, + 2.262741700641438e+01f, + 3.200000001326981e+01f, + 4.525483401658204e+01f, + 6.400000003184756e+01f, + 9.050966804067060e+01f, + 1.280000000743110e+02f, + 1.810193360963542e+02f, + 2.560000001698536e+02f, + 3.620386722227349e+02f, + 5.120000003821707e+02f, + 7.240773445055215e+02f, + 1.024000000849268e+03f, + 1.448154689131149e+03f, + 2.048000001868390e+03f, + 2.896309378502505e+03f, + 4.096000004076487e+03f, + 5.792618757485434e+03f, + 8.192000008832390e+03f, + 1.158523751593169e+04f, + 1.638400001902361e+04f, + 2.317047503378509e+04f, + 3.276800004076484e+04f, + 4.634095007141347e+04f, + 6.553600008696507e+04f, + 9.268190015051374e+04f, + 1.310720001848009e+05f, + 1.853638003164007e+05f, + 2.621440003913428e+05f, + 3.707276006635486e+05f, + 5.242880008261676e+05f, + 7.414552013885899e+05f }; #endif @@ -144,70 +144,70 @@ const int16_t standard_deviation_inverse_table[REGION_POWER_TABLE_SIZE] = #else const float standard_deviation_inverse_table[REGION_POWER_TABLE_SIZE] = { - 4.096000004076488e+03, - 2.896309378502504e+03, - 2.048000001868390e+03, - 1.448154689131149e+03, - 1.024000000849268e+03, - 7.240773445055215e+02, - 5.120000003821708e+02, - 3.620386722227349e+02, - 2.560000001698537e+02, - 1.810193360963542e+02, - 1.280000000743110e+02, - 9.050966804067060e+01, - 6.400000003184756e+01, - 4.525483401658203e+01, - 3.200000001326982e+01, - 2.262741700641438e+01, - 1.600000000530793e+01, - 1.131370850226887e+01, - 8.000000001990474e+00, - 5.656854250665277e+00, - 4.000000000663491e+00, - 2.828427125098059e+00, - 2.000000000165873e+00, - 1.414213562431740e+00, - 1.000000000000000e+00, - 7.071067811572251e-01, - 4.999999999585318e-01, - 3.535533905492901e-01, - 2.499999999585318e-01, - 1.767766952599838e-01, - 1.249999999688989e-01, - 8.838834762266132e-02, - 6.249999997926592e-02, - 4.419417380766535e-02, - 3.124999998704120e-02, - 2.209708690200002e-02, - 1.562499999222472e-02, - 1.104854345008369e-02, - 7.812499995464418e-03, - 5.524271724583683e-03, - 3.906249997408239e-03, - 2.762135862062757e-03, - 1.953124998542134e-03, - 1.381067930916839e-03, - 9.765624991900747e-04, - 6.905339654011486e-04, - 4.882812495545411e-04, - 3.452669826719394e-04, - 2.441406247570224e-04, - 1.726334913216520e-04, - 1.220703123683871e-04, - 8.631674565366727e-05, - 6.103515617913153e-05, - 4.315837282325419e-05, - 3.051757808703478e-05, - 2.157918640983742e-05, - 1.525878904225187e-05, - 1.078959320402385e-05, - 7.629394520493171e-06, - 5.394796601564505e-06, - 3.814697259930213e-06, - 2.697398300558537e-06, - 1.907348629806920e-06, - 1.348699150167414e-06 + 4.096000004076488e+03f, + 2.896309378502504e+03f, + 2.048000001868390e+03f, + 1.448154689131149e+03f, + 1.024000000849268e+03f, + 7.240773445055215e+02f, + 5.120000003821708e+02f, + 3.620386722227349e+02f, + 2.560000001698537e+02f, + 1.810193360963542e+02f, + 1.280000000743110e+02f, + 9.050966804067060e+01f, + 6.400000003184756e+01f, + 4.525483401658203e+01f, + 3.200000001326982e+01f, + 2.262741700641438e+01f, + 1.600000000530793e+01f, + 1.131370850226887e+01f, + 8.000000001990474e+00f, + 5.656854250665277e+00f, + 4.000000000663491e+00f, + 2.828427125098059e+00f, + 2.000000000165873e+00f, + 1.414213562431740e+00f, + 1.000000000000000e+00f, + 7.071067811572251e-01f, + 4.999999999585318e-01f, + 3.535533905492901e-01f, + 2.499999999585318e-01f, + 1.767766952599838e-01f, + 1.249999999688989e-01f, + 8.838834762266132e-02f, + 6.249999997926592e-02f, + 4.419417380766535e-02f, + 3.124999998704120e-02f, + 2.209708690200002e-02f, + 1.562499999222472e-02f, + 1.104854345008369e-02f, + 7.812499995464418e-03f, + 5.524271724583683e-03f, + 3.906249997408239e-03f, + 2.762135862062757e-03f, + 1.953124998542134e-03f, + 1.381067930916839e-03f, + 9.765624991900747e-04f, + 6.905339654011486e-04f, + 4.882812495545411e-04f, + 3.452669826719394e-04f, + 2.441406247570224e-04f, + 1.726334913216520e-04f, + 1.220703123683871e-04f, + 8.631674565366727e-05f, + 6.103515617913153e-05f, + 4.315837282325419e-05f, + 3.051757808703478e-05f, + 2.157918640983742e-05f, + 1.525878904225187e-05f, + 1.078959320402385e-05f, + 7.629394520493171e-06f, + 5.394796601564505e-06f, + 3.814697259930213e-06f, + 2.697398300558537e-06f, + 1.907348629806920e-06f, + 1.348699150167414e-06f }; #endif @@ -239,14 +239,14 @@ const float step_size[NUM_CATEGORIES] = const float step_size_inverse_table[NUM_CATEGORIES] = { - 2.82805443e+00, - 2.00000000e+00, - 1.41422713e+00, - 1.00000000e+00, - 7.07113564e-01, - 5.00000000e-01, - 3.53556782e-01, - 3.53556782e-01 + 2.82805443e+00f, + 2.00000000e+00f, + 1.41422713e+00f, + 1.00000000e+00f, + 7.07113564e-01f, + 5.00000000e-01f, + 3.53556782e-01f, + 3.53556782e-01f }; #endif @@ -277,137 +277,137 @@ const float dead_zone[NUM_CATEGORIES] = #if !defined(G722_1_USE_FIXED_POINT) const float region_power_table[REGION_POWER_TABLE_SIZE] = { - 5.96046448e-08, - 1.19209290e-07, - 2.38418579e-07, - 4.76837158e-07, - 9.53674316e-07, - 1.90734863e-06, - 3.81469727e-06, - 7.62939453e-06, - 1.52587891e-05, - 3.05175781e-05, - 6.10351562e-05, - 1.22070312e-04, - 2.44140625e-04, - 4.88281250e-04, - 9.76562500e-04, - 1.95312500e-03, - 3.90625000e-03, - 7.81250000e-03, - 1.56250000e-02, - 3.12500000e-02, - 6.25000000e-02, - 1.25000000e-01, - 2.50000000e-01, - 5.00000000e-01, - 1.00000000e+00, - 2.00000000e+00, - 4.00000000e+00, - 8.00000000e+00, - 1.60000000e+01, - 3.20000000e+01, - 6.40000000e+01, - 1.28000000e+02, - 2.56000000e+02, - 5.12000000e+02, - 1.02400000e+03, - 2.04800000e+03, - 4.09600000e+03, - 8.19200000e+03, - 1.63840000e+04, - 3.27680000e+04, - 6.55360000e+04, - 1.31072000e+05, - 2.62144000e+05, - 5.24288000e+05, - 1.04857600e+06, - 2.09715200e+06, - 4.19430400e+06, - 8.38860800e+06, - 1.67772160e+07, - 3.35544320e+07, - 6.71088640e+07, - 1.34217728e+08, - 2.68435456e+08, - 5.36870912e+08, - 1.07374182e+09, - 2.14748365e+09, - 4.29496730e+09, - 8.58993459e+09, - 1.71798692e+10, - 3.43597384e+10, - 6.87194767e+10, - 1.37438953e+11, - 2.74877907e+11, - 5.49755814e+11 + 5.96046448e-08f, + 1.19209290e-07f, + 2.38418579e-07f, + 4.76837158e-07f, + 9.53674316e-07f, + 1.90734863e-06f, + 3.81469727e-06f, + 7.62939453e-06f, + 1.52587891e-05f, + 3.05175781e-05f, + 6.10351562e-05f, + 1.22070312e-04f, + 2.44140625e-04f, + 4.88281250e-04f, + 9.76562500e-04f, + 1.95312500e-03f, + 3.90625000e-03f, + 7.81250000e-03f, + 1.56250000e-02f, + 3.12500000e-02f, + 6.25000000e-02f, + 1.25000000e-01f, + 2.50000000e-01f, + 5.00000000e-01f, + 1.00000000e+00f, + 2.00000000e+00f, + 4.00000000e+00f, + 8.00000000e+00f, + 1.60000000e+01f, + 3.20000000e+01f, + 6.40000000e+01f, + 1.28000000e+02f, + 2.56000000e+02f, + 5.12000000e+02f, + 1.02400000e+03f, + 2.04800000e+03f, + 4.09600000e+03f, + 8.19200000e+03f, + 1.63840000e+04f, + 3.27680000e+04f, + 6.55360000e+04f, + 1.31072000e+05f, + 2.62144000e+05f, + 5.24288000e+05f, + 1.04857600e+06f, + 2.09715200e+06f, + 4.19430400e+06f, + 8.38860800e+06f, + 1.67772160e+07f, + 3.35544320e+07f, + 6.71088640e+07f, + 1.34217728e+08f, + 2.68435456e+08f, + 5.36870912e+08f, + 1.07374182e+09f, + 2.14748365e+09f, + 4.29496730e+09f, + 8.58993459e+09f, + 1.71798692e+10f, + 3.43597384e+10f, + 6.87194767e+10f, + 1.37438953e+11f, + 2.74877907e+11f, + 5.49755814e+11f }; const float region_power_table_boundary[REGION_POWER_TABLE_SIZE - 1] = { - 8.42936956e-08, - 1.68587391e-07, - 3.37174782e-07, - 6.74349565e-07, - 1.34869913e-06, - 2.69739826e-06, - 5.39479652e-06, - 1.07895930e-05, - 2.15791861e-05, - 4.31583721e-05, - 8.63167443e-05, - 1.72633489e-04, - 3.45266977e-04, - 6.90533954e-04, - 1.38106791e-03, - 2.76213582e-03, - 5.52427163e-03, - 1.10485433e-02, - 2.20970865e-02, - 4.41941731e-02, - 8.83883461e-02, - 1.76776692e-01, - 3.53553385e-01, - 7.07106769e-01, - 1.41421354e+00, - 2.82842708e+00, - 5.65685415e+00, - 1.13137083e+01, - 2.26274166e+01, - 4.52548332e+01, - 9.05096664e+01, - 1.81019333e+02, - 3.62038666e+02, - 7.24077332e+02, - 1.44815466e+03, - 2.89630933e+03, - 5.79261865e+03, - 1.15852373e+04, - 2.31704746e+04, - 4.63409492e+04, - 9.26818984e+04, - 1.85363797e+05, - 3.70727594e+05, - 7.41455188e+05, - 1.48291038e+06, - 2.96582075e+06, - 5.93164150e+06, - 1.18632830e+07, - 2.37265660e+07, - 4.74531320e+07, - 9.49062640e+07, - 1.89812528e+08, - 3.79625056e+08, - 7.59250112e+08, - 1.51850022e+09, - 3.03700045e+09, - 6.07400090e+09, - 1.21480018e+10, - 2.42960036e+10, - 4.85920072e+10, - 9.71840143e+10, - 1.94368029e+11, - 3.88736057e+11 + 8.42936956e-08f, + 1.68587391e-07f, + 3.37174782e-07f, + 6.74349565e-07f, + 1.34869913e-06f, + 2.69739826e-06f, + 5.39479652e-06f, + 1.07895930e-05f, + 2.15791861e-05f, + 4.31583721e-05f, + 8.63167443e-05f, + 1.72633489e-04f, + 3.45266977e-04f, + 6.90533954e-04f, + 1.38106791e-03f, + 2.76213582e-03f, + 5.52427163e-03f, + 1.10485433e-02f, + 2.20970865e-02f, + 4.41941731e-02f, + 8.83883461e-02f, + 1.76776692e-01f, + 3.53553385e-01f, + 7.07106769e-01f, + 1.41421354e+00f, + 2.82842708e+00f, + 5.65685415e+00f, + 1.13137083e+01f, + 2.26274166e+01f, + 4.52548332e+01f, + 9.05096664e+01f, + 1.81019333e+02f, + 3.62038666e+02f, + 7.24077332e+02f, + 1.44815466e+03f, + 2.89630933e+03f, + 5.79261865e+03f, + 1.15852373e+04f, + 2.31704746e+04f, + 4.63409492e+04f, + 9.26818984e+04f, + 1.85363797e+05f, + 3.70727594e+05f, + 7.41455188e+05f, + 1.48291038e+06f, + 2.96582075e+06f, + 5.93164150e+06f, + 1.18632830e+07f, + 2.37265660e+07f, + 4.74531320e+07f, + 9.49062640e+07f, + 1.89812528e+08f, + 3.79625056e+08f, + 7.59250112e+08f, + 1.51850022e+09f, + 3.03700045e+09f, + 6.07400090e+09f, + 1.21480018e+10f, + 2.42960036e+10f, + 4.85920072e+10f, + 9.71840143e+10f, + 1.94368029e+11f, + 3.88736057e+11f }; #endif From 7c99132c8aed98864d7b287222b33b2288e22b41 Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Tue, 15 Oct 2013 23:51:54 +0800 Subject: [PATCH 24/80] Eliminate a warnign in G.722.1 --- libs/libg722_1/src/decoderf.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libs/libg722_1/src/decoderf.c b/libs/libg722_1/src/decoderf.c index e0e8e61743..1fcb2ff78d 100644 --- a/libs/libg722_1/src/decoderf.c +++ b/libs/libg722_1/src/decoderf.c @@ -263,7 +263,6 @@ static void decode_vector_quantized_mlt_indices(g722_1_decode_state_t *s, int signs_index; int bit; int num_sign_bits; - int num_bits; int ran_out_of_bits_flag; int random_word; const int16_t *decoder_table_ptr; @@ -282,7 +281,6 @@ static void decode_vector_quantized_mlt_indices(g722_1_decode_state_t *s, for (n = 0; n < num_vecs; n++) { - num_bits = 0; index = 0; do { @@ -450,7 +448,7 @@ static void decode_vector_quantized_mlt_indices(g722_1_decode_state_t *s, if (category == NUM_CATEGORIES - 1) { - noifillpos = standard_deviation*0.70711; + noifillpos = standard_deviation*0.70711f; noifillneg = -noifillpos; /* This assumes region_size = 20 */ From 44d5d43b3b8e141d194fc39465ed79e779f0f4b5 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 15 Oct 2013 09:16:36 -0700 Subject: [PATCH 25/80] FS-5819: configure fix for new clang detection and adjust cflags for building with newest clang --- build/config/ax_compiler_vendor.m4 | 2 +- configure.in | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/build/config/ax_compiler_vendor.m4 b/build/config/ax_compiler_vendor.m4 index a24a58da0f..b506b78aae 100644 --- a/build/config/ax_compiler_vendor.m4 +++ b/build/config/ax_compiler_vendor.m4 @@ -3,7 +3,7 @@ AC_DEFUN([AX_COMPILER_VENDOR], AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown # note: don't check for gcc first since some other compilers define __GNUC__ - for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do + for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")" AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ #if !($vencpp) diff --git a/configure.in b/configure.in index c24897e5e4..ecca14cf11 100644 --- a/configure.in +++ b/configure.in @@ -172,11 +172,19 @@ SWITCH_AM_LDFLAGS="-lm" #set SOLINK variable based on compiler and host if test "x${ax_cv_c_compiler_vendor}" = "xsun" ; then SOLINK="-Bdynamic -dy -G" -elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then +elif test "x${ax_cv_c_compiler_vendor}" = "xclang" ; then case "$host" in - *darwin12.*|*darwin11.*|*darwin10.*) + *darwin*) SOLINK="-dynamic -force-flat-namespace" ;; + *) + AC_ERROR([Please update configure.in with SOLINK values for your compiler]) + ;; + + esac +elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then + case "$host" in +# older Xcode test for darwin, Xcode 4/5 use clang above *darwin*) SOLINK="-dynamic -bundle -force-flat-namespace" ;; @@ -190,7 +198,6 @@ elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then else AC_ERROR([Please update configure.in with SOLINK values for your compiler]) fi - # set DYNAMIC_LIB_EXTEN # we should really be using libtool so we don't need to do this case "$host" in @@ -727,6 +734,16 @@ if test x"$ac_cv_gcc_declaration_after_statement" = xyes; then fi CFLAGS="$saved_CFLAGS" +# Next check added for Xcode 5 and systems with clang 5 llvm 3.3 or above, extended offset must be off +AC_CACHE_CHECK([whether compiler supports -Wextended-offsetof], [ac_cv_clang_extended_offsetof], [ +AC_TRY_COMPILE([],[return 0;],[ac_cv_clang_extended_offsetof=yes],[ac_cv_clang_extended_offsetof=no]) +]) +AC_MSG_RESULT($ac_cv_clang_extended_offsetof) +if test x"$ac_cv_clang_extended_offsetof" = xyes; then + APR_ADDTO(CFLAGS, -Wno-extended-offsetof) +fi + + # Tested and fixed lot of modules, but some are untested. Will be added back when the core team decide it ready # Untested modules : mod_osp mod_soundtouch mod_sangoma_codec mod_dingaling mod_opal mod_skypopen mod_h323 mod_khomp # mod_unimrcp mod_cepstral mod_erlang_event mod_snmp mod_perl mod_java mod_managed From f236ca113d8ed216cabda3b4356dc29d5beb3b2a Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 15 Oct 2013 09:34:15 -0700 Subject: [PATCH 26/80] FS-5819: configure fix for new clang detection and adjust cflags for building with newest clang --- libs/openzap/configure.ac | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libs/openzap/configure.ac b/libs/openzap/configure.ac index d2c23c1091..9b41d26953 100644 --- a/libs/openzap/configure.ac +++ b/libs/openzap/configure.ac @@ -80,6 +80,15 @@ esac #set SOLINK variable based on compiler and host if test "x${ax_cv_c_compiler_vendor}" = "xsun" ; then SOLINK="-Bdynamic -dy -G" +elif test "x${ax_cv_c_compiler_vendor}" = "xclang" ; then + case "$host" in + *darwin*) + SOLINK="-dynamic -bundle -force-flat-namespace" + ;; + *) + AC_ERROR([Please update configure.in with SOLINK values for your compiler]) + ;; + esac elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then case "$host" in *darwin*) From 84324ab7b16ecbce17395c0ea6f121af4aa33076 Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Wed, 16 Oct 2013 00:47:29 +0800 Subject: [PATCH 27/80] Eliminate some more warnings --- .../src/floating/bv16/bv16encoder.c | 8 +- .../src/floating/bv16/bv16excquan.c | 6 +- .../src/floating/bv16/bv16lspquan.c | 99 +++++++++---------- .../src/floating/bv32/bv32encoder.c | 10 +- .../src/floating/bv32/bv32excquan.c | 6 +- .../src/floating/bv32/bv32lspquan.c | 8 +- 6 files changed, 61 insertions(+), 76 deletions(-) diff --git a/libs/broadvoice/src/floating/bv16/bv16encoder.c b/libs/broadvoice/src/floating/bv16/bv16encoder.c index 2eccf7124c..a57cfc5733 100644 --- a/libs/broadvoice/src/floating/bv16/bv16encoder.c +++ b/libs/broadvoice/src/floating/bv16/bv16encoder.c @@ -20,8 +20,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id: bv16encoder.c,v 1.1.1.1 2009/11/19 12:10:48 steveu Exp $ */ /*! \file */ @@ -169,10 +167,10 @@ BV_DECLARE(int) bv16_encode(bv16_encode_state_t *cs, /* Refine the pitch period in the neighborhood of coarse pitch period also calculate the pitch predictor tap for single-tap predictor */ pp = refinepitch(dq, cpp, &ppt); - bs.ppidx = pp - MINPP; + bs.ppidx = (int16_t) (pp - MINPP); /* Vector quantize 3 pitch predictor taps with minimum residual energy */ - bs.bqidx = pitchtapquan(dq, pp, bq, &lg); + bs.bqidx = (int16_t) pitchtapquan(dq, pp, bq, &lg); /* Get coefficients of long-term noise feedback filter */ if (ppt > 1.0) @@ -184,7 +182,7 @@ BV_DECLARE(int) bv16_encode(bv16_encode_state_t *cs, /* Gain quantization */ lg = (lg < FRSZ) ? 0 : log(lg/FRSZ)/log(2.0); - bs.gidx = gainquan(&gainq, lg, cs->lgpm, cs->prevlg, cs->level); + bs.gidx = (int16_t) gainquan(&gainq, lg, cs->lgpm, cs->prevlg, cs->level); /* Level estimation */ dummy = estl_alpha; diff --git a/libs/broadvoice/src/floating/bv16/bv16excquan.c b/libs/broadvoice/src/floating/bv16/bv16excquan.c index 2004b229cc..1fbc6d9ef4 100644 --- a/libs/broadvoice/src/floating/bv16/bv16excquan.c +++ b/libs/broadvoice/src/floating/bv16/bv16excquan.c @@ -22,8 +22,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id: bv16excquan.c,v 1.1.1.1 2009/11/19 12:10:48 steveu Exp $ */ /*! \file */ @@ -241,9 +239,9 @@ void excquan(int16_t *idx, /* quantizer codebook index for uq[] vector */ /* The best codevector has been found; assign vq codebook index */ if (sign == 1.0F) - idx[iv++] = jmin; + idx[iv++] = (int16_t) jmin; else - idx[iv++] = jmin + CBSZ; /* MSB of index is sign bit */ + idx[iv++] = (int16_t) (jmin + CBSZ); /* MSB of index is sign bit */ fp3 = &cb[jmin*VDIM]; /* fp3 points to start of best codevector */ for (n = 0; n < VDIM; n++) diff --git a/libs/broadvoice/src/floating/bv16/bv16lspquan.c b/libs/broadvoice/src/floating/bv16/bv16lspquan.c index 73904fe192..7246099641 100644 --- a/libs/broadvoice/src/floating/bv16/bv16lspquan.c +++ b/libs/broadvoice/src/floating/bv16/bv16lspquan.c @@ -21,8 +21,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id: bv16lspquan.c,v 1.1.1.1 2009/11/19 12:10:48 steveu Exp $ */ /*! \file */ @@ -36,30 +34,26 @@ #include "bv16externs.h" #include "bvcommon.h" -void vqmse( - Float *xq, - int16_t *idx, - Float *x, - const Float *cb, - int vdim, - int cbsz); +void vqmse(Float *xq, + int16_t *idx, + Float *x, + const Float *cb, + int vdim, + int cbsz); -void svqwmse( - Float *xq, - int16_t *idx, - Float *x, - Float *xa, - Float *w, - const Float *cb, - int vdim, - int cbsz); +void svqwmse(Float *xq, + int16_t *idx, + Float *x, + Float *xa, + Float *w, + const Float *cb, + int vdim, + int cbsz); -void lspquan( - Float *lspq, - int16_t *lspidx, - Float *lsp, - Float *lsppm -) +void lspquan(Float *lspq, + int16_t *lspidx, + Float *lsp, + Float *lsppm) { Float d[LPCO]; Float w[LPCO]; @@ -75,7 +69,7 @@ void lspquan( int i; int k; - /* calculate the weights for weighted mean-square error distortion */ + /* Calculate the weights for weighted mean-square error distortion */ for (i = 0; i < LPCO - 1; i++) d[i] = lsp[i + 1] - lsp[i]; /* LSP difference vector */ w[0] = 1.0F/d[0]; @@ -119,7 +113,7 @@ void lspquan( for (i = 0; i < LPCO; i++) lspe[i] = lspeq1[i] + lspeq2[i]; - /* update lsp ma predictor memory */ + /* Update lsp ma predictor memory */ i = LPCO * LSPPORDER - 1; fp1 = &lsppm[i]; fp2 = &lsppm[i - 1]; @@ -131,20 +125,20 @@ void lspquan( fp2--; } - /* calculate quantized lsp */ + /* Calculate quantized lsp */ for (i = 0; i < LPCO; i++) lspq[i] = lspa[i] + lspeq2[i]; - /* ensure correct ordering of lsp to guarantee lpc filter stability */ + /* Ensure correct ordering of lsp to guarantee lpc filter stability */ stblz_lsp(lspq, LPCO); } -void vqmse(Float *xq, /* VQ output vector (quantized version of input vector) */ - int16_t *idx, /* VQ codebook index for the nearest neighbor */ - Float *x, /* input vector */ - const Float *cb, /* VQ codebook */ - int vdim, /* vector dimension */ - int cbsz) /* codebook size (number of codevectors) */ +void vqmse(Float *xq, /* VQ output vector (quantized version of input vector) */ + int16_t *idx, /* VQ codebook index for the nearest neighbor */ + Float *x, /* input vector */ + const Float *cb, /* VQ codebook */ + int vdim, /* vector dimension */ + int cbsz) /* codebook size (number of codevectors) */ { const Float *fp1; Float dmin; @@ -166,7 +160,7 @@ void vqmse(Float *xq, /* VQ output vector (quantized version of input vector) if (d < dmin) { dmin = d; - *idx = j; + *idx = (int16_t) j; } } @@ -176,23 +170,24 @@ void vqmse(Float *xq, /* VQ output vector (quantized version of input vector) } /* Signed WMSE VQ */ -void svqwmse( - Float *xq, /* VQ output vector (quantized version of input vector) */ - int16_t *idx, /* VQ codebook index for the nearest neighbor */ - Float *x, /* input vector */ - Float *xa, /* approximation prior to current stage */ - Float *w, /* weights for weighted Mean-Square Error */ - const Float *cb, /* VQ codebook */ - int vdim, /* vector dimension */ - int cbsz /* codebook size (number of codevectors) */ -) +void svqwmse(Float *xq, /* VQ output vector (quantized version of input vector) */ + int16_t *idx, /* VQ codebook index for the nearest neighbor */ + Float *x, /* input vector */ + Float *xa, /* approximation prior to current stage */ + Float *w, /* weights for weighted Mean-Square Error */ + const Float *cb, /* VQ codebook */ + int vdim, /* vector dimension */ + int cbsz) /* codebook size (number of codevectors) */ { const Float *fp1; const Float *fp2; Float dmin; Float d; Float xqc[STBLDIM]; - int j, k, stbl, sign=1; + int j; + int k; + int stbl; + int sign = 1; Float e; fp1 = cb; @@ -211,17 +206,17 @@ void svqwmse( d += w[k]*e*e; } - /* check candidate - negative sign */ + /* Check candidate - negative sign */ if (d < dmin) { for (k = 0; k < STBLDIM; k++) xqc[k] = xa[k] - *fp2++; - /* check stability - negative sign */ + /* Check stability - negative sign */ stbl = stblchck(xqc, STBLDIM); if (stbl > 0) { dmin = d; - *idx = j; + *idx = (int16_t) j; sign = -1; } } @@ -237,18 +232,18 @@ void svqwmse( d += w[k]*e*e; } - /* check candidate - positive sign */ + /* Check candidate - positive sign */ if (d < dmin) { for (k = 0; k < STBLDIM; k++) xqc[k] = xa[k] + *fp2++; - /* check stability - positive sign */ + /* Check stability - positive sign */ stbl = stblchck(xqc, STBLDIM); if (stbl > 0) { dmin = d; - *idx = j; + *idx = (int16_t) j; sign = +1; } } diff --git a/libs/broadvoice/src/floating/bv32/bv32encoder.c b/libs/broadvoice/src/floating/bv32/bv32encoder.c index d6ec9b7306..5cd56509b8 100644 --- a/libs/broadvoice/src/floating/bv32/bv32encoder.c +++ b/libs/broadvoice/src/floating/bv32/bv32encoder.c @@ -20,8 +20,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id: bv32encoder.c,v 1.1.1.1 2009/11/19 12:10:48 steveu Exp $ */ /*! \file */ @@ -161,10 +159,10 @@ BV_DECLARE(int) bv32_encode(bv32_encode_state_t *cs, /* Refine the pitch period in the neighborhood of coarse pitch period also calculate the pitch predictor tap for single-tap predictor */ pp = bv32_refinepitch(dq, cpp, &ppt); - bs.ppidx = pp - MINPP; + bs.ppidx = (int16_t) (pp - MINPP); /* vq 3 pitch predictor taps with minimum residual energy */ - bs.bqidx = bv32_pitchtapquan(dq, pp, bq); + bs.bqidx = (int16_t) bv32_pitchtapquan(dq, pp, bq); /* get coefficients for long-term noise feedback filter */ if (ppt > 1.0) @@ -190,9 +188,9 @@ BV_DECLARE(int) bv32_encode(bv32_encode_state_t *cs, /* Log-gain quantization within each sub-frame */ lg = (ee < TMinE) ? MinE : log(ee/SFRSZ)/log(2.0); - bs.gidx[issf] = bv32_gainquan(gainq + issf, lg, cs->lgpm, cs->prevlg, cs->level); + bs.gidx[issf] = (int16_t) bv32_gainquan(gainq + issf, lg, cs->lgpm, cs->prevlg, cs->level); - /* Level estimation */ + /* Level Estimation */ bv32_estlevel(cs->prevlg[0], &cs->level, &cs->lmax, &cs->lmin, &cs->lmean, &cs->x1); /* Scale the excitation codebook */ diff --git a/libs/broadvoice/src/floating/bv32/bv32excquan.c b/libs/broadvoice/src/floating/bv32/bv32excquan.c index 6f25831bf2..2ea6dbf958 100644 --- a/libs/broadvoice/src/floating/bv32/bv32excquan.c +++ b/libs/broadvoice/src/floating/bv32/bv32excquan.c @@ -20,8 +20,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id: bv32excquan.c,v 1.1.1.1 2009/11/19 12:10:48 steveu Exp $ */ /*! \file */ @@ -186,9 +184,9 @@ void bv32_excquan(Float *qv, /* output quantized excitation signal vector */ /* THE BEST CODEVECTOR HAS BEEN FOUND; ASSIGN VQ CODEBOOK INDEX */ if (sign == 1.0F) - idx[iv++] = jmin; + idx[iv++] = (int16_t) jmin; else - idx[iv++] = jmin + CBSZ; /* MSB of index is sign bit */ + idx[iv++] = (int16_t) (jmin + CBSZ); /* MSB of index is sign bit */ /* BORROW zbuf[] TO STORE FINAL VQ OUTPUT VECTOR WITH CORRECT SIGN */ fp3 = &cb[jmin*VDIM]; /* fp3 points to start of best codevector */ diff --git a/libs/broadvoice/src/floating/bv32/bv32lspquan.c b/libs/broadvoice/src/floating/bv32/bv32lspquan.c index 72727e7579..7e78f77715 100644 --- a/libs/broadvoice/src/floating/bv32/bv32lspquan.c +++ b/libs/broadvoice/src/floating/bv32/bv32lspquan.c @@ -20,8 +20,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id: bv32lspquan.c,v 1.1.1.1 2009/11/19 12:10:48 steveu Exp $ */ /*! \file */ @@ -153,7 +151,7 @@ static void vqmse(Float *xq, /* VQ output vector (quantized version of input if (d < dmin) { dmin = d; - *idx = j; + *idx = (int16_t) j; } } @@ -211,7 +209,7 @@ static void vqwmse_stbl(Float *xq, /* VQ output vector (quantized version of if (d < dmin) { dmin = d; - *idx = j; + *idx = (int16_t) j; } } } @@ -256,7 +254,7 @@ static void vqwmse(Float *xq, /* VQ output vector (quantized version of inp if (d < dmin) { dmin = d; - *idx = j; + *idx = (int16_t) j; } } From 15ca745cd448d7ff3289321c94b91b9415883c91 Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Wed, 16 Oct 2013 00:53:18 +0800 Subject: [PATCH 28/80] Eliminate more warnings --- libs/broadvoice/src/bitpack16.c | 14 ++++++-------- libs/broadvoice/src/bitpack32.c | 18 ++++++++---------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/libs/broadvoice/src/bitpack16.c b/libs/broadvoice/src/bitpack16.c index 703db648e7..4e134baf33 100644 --- a/libs/broadvoice/src/bitpack16.c +++ b/libs/broadvoice/src/bitpack16.c @@ -20,8 +20,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id: bitpack16.c,v 1.1.1.1 2009/11/19 12:10:48 steveu Exp $ */ /*! \file */ @@ -80,12 +78,12 @@ void bv16_bitunpack(const uint8_t *PackedStream, struct BV16_Bit_Stream *BitStru stream = PackedStream; bitstream_init(&bs); - BitStruct->lspidx[0] = bitstream_get(&bs, &stream, 7); - BitStruct->lspidx[1] = bitstream_get(&bs, &stream, 7); - BitStruct->ppidx = bitstream_get(&bs, &stream, 7); - BitStruct->bqidx = bitstream_get(&bs, &stream, 5); - BitStruct->gidx = bitstream_get(&bs, &stream, 4); + BitStruct->lspidx[0] = (int16_t) bitstream_get(&bs, &stream, 7); + BitStruct->lspidx[1] = (int16_t) bitstream_get(&bs, &stream, 7); + BitStruct->ppidx = (int16_t) bitstream_get(&bs, &stream, 7); + BitStruct->bqidx = (int16_t) bitstream_get(&bs, &stream, 5); + BitStruct->gidx = (int16_t) bitstream_get(&bs, &stream, 4); for (i = 0; i < 10; i++) - BitStruct->qvidx[i] = bitstream_get(&bs, &stream, 5); + BitStruct->qvidx[i] = (int16_t) bitstream_get(&bs, &stream, 5); } diff --git a/libs/broadvoice/src/bitpack32.c b/libs/broadvoice/src/bitpack32.c index eafc53306b..2d3596b22f 100644 --- a/libs/broadvoice/src/bitpack32.c +++ b/libs/broadvoice/src/bitpack32.c @@ -20,8 +20,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id: bitpack32.c,v 1.1.1.1 2009/11/19 12:10:48 steveu Exp $ */ /*! \file */ @@ -82,15 +80,15 @@ void bv32_bitunpack(const uint8_t *PackedStream, struct BV32_Bit_Stream *BitStru stream = PackedStream; bitstream_init(&bs); - BitStruct->lspidx[0] = bitstream_get(&bs, &stream, 7); - BitStruct->lspidx[1] = bitstream_get(&bs, &stream, 5); - BitStruct->lspidx[2] = bitstream_get(&bs, &stream, 5); + BitStruct->lspidx[0] = (int16_t) bitstream_get(&bs, &stream, 7); + BitStruct->lspidx[1] = (int16_t) bitstream_get(&bs, &stream, 5); + BitStruct->lspidx[2] = (int16_t) bitstream_get(&bs, &stream, 5); - BitStruct->ppidx = bitstream_get(&bs, &stream, 8); - BitStruct->bqidx = bitstream_get(&bs, &stream, 5); - BitStruct->gidx[0] = bitstream_get(&bs, &stream, 5); - BitStruct->gidx[1] = bitstream_get(&bs, &stream, 5); + BitStruct->ppidx = (int16_t) bitstream_get(&bs, &stream, 8); + BitStruct->bqidx = (int16_t) bitstream_get(&bs, &stream, 5); + BitStruct->gidx[0] = (int16_t) bitstream_get(&bs, &stream, 5); + BitStruct->gidx[1] = (int16_t) bitstream_get(&bs, &stream, 5); for (i = 0; i < 20; i++) - BitStruct->qvidx[i] = bitstream_get(&bs, &stream, 6); + BitStruct->qvidx[i] = (int16_t) bitstream_get(&bs, &stream, 6); } From 348e9ba1d11f9be922ad3f40b5a3a564d6c58259 Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Wed, 16 Oct 2013 01:33:37 +0800 Subject: [PATCH 29/80] Eliminate a few more warnings in Windows builds --- libs/spandsp/src/make_cielab_luts.c | 2 +- libs/spandsp/src/make_math_fixed_tables.c | 10 ++++----- libs/spandsp/src/t38_gateway.c | 26 ++++++++++------------- libs/spandsp/src/t43.c | 1 + libs/spandsp/src/t4_rx.c | 1 + libs/spandsp/src/t4_tx.c | 6 +----- 6 files changed, 20 insertions(+), 26 deletions(-) diff --git a/libs/spandsp/src/make_cielab_luts.c b/libs/spandsp/src/make_cielab_luts.c index b143817d85..dc5172817d 100644 --- a/libs/spandsp/src/make_cielab_luts.c +++ b/libs/spandsp/src/make_cielab_luts.c @@ -72,7 +72,7 @@ int main(int argc, char *argv[]) r = floorf(r*256.0f); - srgb = (r < 0) ? 0 : (r <= 255) ? r : 255; + srgb = (uint8_t) ((r < 0) ? 0 : (r <= 255) ? r : 255); printf((i < 4095) ? " %d,\n" : " %d\n", srgb); } diff --git a/libs/spandsp/src/make_math_fixed_tables.c b/libs/spandsp/src/make_math_fixed_tables.c index 075cb15bd2..8e290b44ce 100644 --- a/libs/spandsp/src/make_math_fixed_tables.c +++ b/libs/spandsp/src/make_math_fixed_tables.c @@ -42,7 +42,7 @@ int main(int argc, char *argv[]) for (i = 0; i < 129; i++) { val = 32768.0*128.0/(128 + i) + 0.5; - ival = val; + ival = (int) val; if (i < 128) printf(" %6d,\n", ival); else @@ -54,7 +54,7 @@ int main(int argc, char *argv[]) printf("{\n"); for (i = 64; i <= 256; i++) { - ival = sqrt(i/256.0)*65536.0 + 0.5; + ival = (int) (sqrt(i/256.0)*65536.0 + 0.5); if (ival > 65535) ival = 65535; if (i < 256) @@ -68,7 +68,7 @@ int main(int argc, char *argv[]) printf("{\n"); for (i = 128; i <= 256; i++) { - ival = log10(i/256.0)*32768.0 - 0.5; + ival = (int) (log10(i/256.0)*32768.0 - 0.5); if (i <= 255) printf(" %6d,\n", ival); else @@ -81,7 +81,7 @@ int main(int argc, char *argv[]) for (i = 0; i <= 256; i++) { val = sin(i*3.1415926535/512.0)*32768.0; - ival = val + 0.5; + ival = (int) (val + 0.5); if (ival > 32767) ival = 32767; if (i <= 255) @@ -96,7 +96,7 @@ int main(int argc, char *argv[]) for (i = 0; i <= 256; i++) { val = atan(i/256.0)*65536.0/(2.0*3.1415926535); - ival = val + 0.5; + ival = (int) (val + 0.5); /* Nudge the result away from zero, so things sit consistently on the correct side of the axes. */ if (ival == 0) diff --git a/libs/spandsp/src/t38_gateway.c b/libs/spandsp/src/t38_gateway.c index c41df87c75..d89e21e0c4 100644 --- a/libs/spandsp/src/t38_gateway.c +++ b/libs/spandsp/src/t38_gateway.c @@ -258,7 +258,6 @@ static int set_next_tx_type(t38_gateway_state_t *s) int indicator; fax_modems_state_t *t; t38_gateway_hdlc_state_t *u; - int bit_rate; int short_train; int use_hdlc; @@ -348,20 +347,18 @@ static int set_next_tx_type(t38_gateway_state_t *s) break; case T38_IND_V27TER_2400_TRAINING: case T38_IND_V27TER_4800_TRAINING: - bit_rate = t->tx_bit_rate = (indicator == T38_IND_V27TER_4800_TRAINING) ? 4800 : 2400; silence_gen_alter(&t->silence_gen, ms_to_samples(75)); - fax_modems_start_fast_modem(t, FAX_MODEM_V27TER_TX, bit_rate, s->core.short_train, use_hdlc); + fax_modems_start_fast_modem(t, FAX_MODEM_V27TER_TX, t->tx_bit_rate, s->core.short_train, use_hdlc); fax_modems_set_tx_handler(t, (span_tx_handler_t) &silence_gen, &t->silence_gen); fax_modems_set_next_tx_handler(t, (span_tx_handler_t) &v27ter_tx, &t->fast_modems.v27ter_tx); fax_modems_set_rx_active(t, true); break; case T38_IND_V29_7200_TRAINING: case T38_IND_V29_9600_TRAINING: - bit_rate = t->tx_bit_rate = (indicator == T38_IND_V29_9600_TRAINING) ? 9600 : 7200; silence_gen_alter(&t->silence_gen, ms_to_samples(75)); - fax_modems_start_fast_modem(t, FAX_MODEM_V29_TX, bit_rate, s->core.short_train, use_hdlc); + fax_modems_start_fast_modem(t, FAX_MODEM_V29_TX, t->tx_bit_rate, s->core.short_train, use_hdlc); fax_modems_set_tx_handler(t, (span_tx_handler_t) &silence_gen, &t->silence_gen); fax_modems_set_next_tx_handler(t, (span_tx_handler_t) &v29_tx, &t->fast_modems.v29_tx); fax_modems_set_rx_active(t, true); @@ -379,37 +376,36 @@ static int set_next_tx_type(t38_gateway_state_t *s) { case T38_IND_V17_7200_SHORT_TRAINING: short_train = true; - bit_rate = 7200; + t->tx_bit_rate = 7200; break; case T38_IND_V17_7200_LONG_TRAINING: - bit_rate = 7200; + t->tx_bit_rate = 7200; break; case T38_IND_V17_9600_SHORT_TRAINING: short_train = true; - bit_rate = 9600; + t->tx_bit_rate = 9600; break; case T38_IND_V17_9600_LONG_TRAINING: - bit_rate = 9600; + t->tx_bit_rate = 9600; break; case T38_IND_V17_12000_SHORT_TRAINING: short_train = true; - bit_rate = 12000; + t->tx_bit_rate = 12000; break; case T38_IND_V17_12000_LONG_TRAINING: - bit_rate = 12000; + t->tx_bit_rate = 12000; break; case T38_IND_V17_14400_SHORT_TRAINING: short_train = true; - bit_rate = 14400; + t->tx_bit_rate = 14400; break; case T38_IND_V17_14400_LONG_TRAINING: - bit_rate = 14400; + t->tx_bit_rate = 14400; break; } /*endswitch*/ - t->tx_bit_rate = bit_rate; silence_gen_alter(&t->silence_gen, ms_to_samples(75)); - fax_modems_start_fast_modem(t, FAX_MODEM_V17_TX, bit_rate, short_train, use_hdlc); + fax_modems_start_fast_modem(t, FAX_MODEM_V17_TX, t->tx_bit_rate, short_train, use_hdlc); fax_modems_set_tx_handler(t, (span_tx_handler_t) &silence_gen, &t->silence_gen); fax_modems_set_next_tx_handler(t, (span_tx_handler_t) &v17_tx, &t->fast_modems.v17_tx); fax_modems_set_rx_active(t, true); diff --git a/libs/spandsp/src/t43.c b/libs/spandsp/src/t43.c index ec7e67ea3a..b4d8b2b86b 100644 --- a/libs/spandsp/src/t43.c +++ b/libs/spandsp/src/t43.c @@ -763,6 +763,7 @@ SPAN_DECLARE(int) t43_decode_put(t43_decode_state_t *s, const uint8_t data[], si /* Now deal the bit-planes, one after another. */ total_len = 0; + result = 0; while (s->current_bit_plane < s->t85.bit_planes) { j = s->current_bit_plane; diff --git a/libs/spandsp/src/t4_rx.c b/libs/spandsp/src/t4_rx.c index 69a98193a1..f14521b5f0 100644 --- a/libs/spandsp/src/t4_rx.c +++ b/libs/spandsp/src/t4_rx.c @@ -219,6 +219,7 @@ static int set_tiff_directory_info(t4_rx_state_t *s) bits_per_sample = 1; samples_per_pixel = 1; photometric = PHOTOMETRIC_MINISWHITE; + output_t4_options = 0; switch (t->compression) { case T4_COMPRESSION_T4_1D: diff --git a/libs/spandsp/src/t4_tx.c b/libs/spandsp/src/t4_tx.c index 0d66d5690a..49bcd90915 100644 --- a/libs/spandsp/src/t4_tx.c +++ b/libs/spandsp/src/t4_tx.c @@ -762,10 +762,7 @@ static int tiff_row_read_handler(void *user_data, uint8_t buf[], size_t len) if (s->tiff.row >= s->tiff.image_length) return 0; if (s->tiff.image_buffer == NULL) - { - exit(2); return 0; - } memcpy(buf, &s->tiff.image_buffer[s->tiff.row*len], len); s->tiff.row++; @@ -1158,7 +1155,6 @@ static int read_tiff_image(t4_tx_state_t *s) { int total_len; int i; - int len; int alter_image; uint8_t *t; @@ -1204,7 +1200,7 @@ static int read_tiff_image(t4_tx_state_t *s) { if (alter_image) { - if ((len = read_tiff_t43_image(s)) < 0) + if ( read_tiff_t43_image(s) < 0) return -1; s->pack_buf = s->tiff.image_buffer; } From ca32b7e357cf6a0d0e9ff6d9685c37d48aba436b Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Tue, 15 Oct 2013 14:17:33 -0400 Subject: [PATCH 30/80] FS-5865 --resolve mod_rayo: fix join/unjoin IQ result for mixers --- src/mod/event_handlers/mod_rayo/mod_rayo.c | 173 +++++++++++++++++---- 1 file changed, 142 insertions(+), 31 deletions(-) diff --git a/src/mod/event_handlers/mod_rayo/mod_rayo.c b/src/mod/event_handlers/mod_rayo/mod_rayo.c index 92257aa2f6..df1ce007c9 100644 --- a/src/mod/event_handlers/mod_rayo/mod_rayo.c +++ b/src/mod/event_handlers/mod_rayo/mod_rayo.c @@ -941,10 +941,11 @@ static void rayo_call_cleanup(struct rayo_actor *actor) /* lost the race: pending join failed... send IQ result to client now. */ if (call->pending_join_request) { - iks *result = iks_new_error_detailed(call->pending_join_request, STANZA_ERROR_ITEM_NOT_FOUND, "call ended"); - RAYO_SEND_REPLY(call, iks_find_attrib_soft(call->pending_join_request, "from"), result); - iks_delete(call->pending_join_request); + iks *request = call->pending_join_request; + iks *result = iks_new_error_detailed(request, STANZA_ERROR_ITEM_NOT_FOUND, "call ended"); call->pending_join_request = NULL; + RAYO_SEND_REPLY(call, iks_find_attrib_soft(request, "from"), result); + iks_delete(call->pending_join_request); } iks_delete(revent); @@ -1765,9 +1766,11 @@ static iks *join_call(struct rayo_call *call, switch_core_session_t *session, st } call->pending_join_request = iks_copy(node); if (switch_ivr_uuid_bridge(rayo_call_get_uuid(call), rayo_call_get_uuid(b_call)) != SWITCH_STATUS_SUCCESS) { - response = iks_new_error_detailed(node, STANZA_ERROR_INTERNAL_SERVER_ERROR, "failed to bridge call"); - iks_delete(call->pending_join_request); + iks *request = call->pending_join_request; + iks *result = iks_new_error_detailed(request, STANZA_ERROR_ITEM_NOT_FOUND, "failed to bridge call"); call->pending_join_request = NULL; + RAYO_SEND_REPLY(call, iks_find_attrib_soft(request, "from"), result); + iks_delete(call->pending_join_request); } RAYO_UNLOCK(b_call); } @@ -1776,14 +1779,66 @@ static iks *join_call(struct rayo_call *call, switch_core_session_t *session, st /** * Execute command on session's conference + * @param session to execute conference API on + * @param conf_name of conference + * @param command to send to conference + * @param node IQ request + * @return response on failure */ -static void exec_conference_api(switch_core_session_t *session, const char *conf_name, const char *command) +static iks *exec_conference_api(switch_core_session_t *session, const char *conf_name, const char *command, iks *node) { + iks *response = NULL; switch_stream_handle_t stream = { 0 }; const char *conf_member_id = switch_channel_get_variable(switch_core_session_get_channel(session), "conference_member_id"); SWITCH_STANDARD_STREAM(stream); switch_api_execute("conference", switch_core_session_sprintf(session, "%s %s %s", conf_name, command, conf_member_id), NULL, &stream); + if (!zstr(stream.data) && strncmp("OK", stream.data, 2)) { + response = iks_new_error_detailed_printf(node, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", stream.data); + } switch_safe_free(stream.data); + return response; +} + +/** + * Execute conference app on session + * @param session to execute conference API on + * @param command to send to conference (conference name, member flags, etc) + * @param node IQ request + * @return response on failure + */ +static iks *exec_conference_app(switch_core_session_t *session, const char *command, iks *node) +{ + iks *response = NULL; + switch_event_t *execute_event = NULL; + switch_channel_t *channel = switch_core_session_get_channel(session); + + /* conference requires local media on channel */ + if (!switch_channel_media_ready(channel) && switch_channel_pre_answer(channel) != SWITCH_STATUS_SUCCESS) { + /* shit */ + response = iks_new_error_detailed(node, STANZA_ERROR_INTERNAL_SERVER_ERROR, "failed to start media"); + return response; + } + + /* send execute conference event to session */ + if (switch_event_create(&execute_event, SWITCH_EVENT_COMMAND) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(execute_event, SWITCH_STACK_BOTTOM, "call-command", "execute"); + switch_event_add_header_string(execute_event, SWITCH_STACK_BOTTOM, "execute-app-name", "conference"); + switch_event_add_header_string(execute_event, SWITCH_STACK_BOTTOM, "execute-app-arg", command); + //switch_event_add_header_string(execute_event, SWITCH_STACK_BOTTOM, "event_uuid", uuid); + switch_event_add_header_string(execute_event, SWITCH_STACK_BOTTOM, "event-lock", "true"); + if (!switch_channel_test_flag(channel, CF_PROXY_MODE)) { + switch_channel_set_flag(channel, CF_BLOCK_BROADCAST_UNTIL_MEDIA); + } + + if (switch_core_session_queue_private_event(session, &execute_event, SWITCH_FALSE) != SWITCH_STATUS_SUCCESS) { + response = iks_new_error_detailed(node, STANZA_ERROR_INTERNAL_SERVER_ERROR, "failed to join mixer (queue event failed)"); + if (execute_event) { + switch_event_destroy(&execute_event); + } + return response; + } + } + return response; } /** @@ -1803,14 +1858,20 @@ static iks *join_mixer(struct rayo_call *call, switch_core_session_t *session, s if (call->joined_id) { /* adjust join conference params */ if (!strcmp("duplex", direction)) { - exec_conference_api(session, mixer_name, "unmute"); - exec_conference_api(session, mixer_name, "undeaf"); + if ((response = exec_conference_api(session, mixer_name, "unmute", node)) || + (response = exec_conference_api(session, mixer_name, "undeaf", node))) { + return response; + } } else if (!strcmp("recv", direction)) { - exec_conference_api(session, mixer_name, "mute"); - exec_conference_api(session, mixer_name, "undeaf"); + if ((response = exec_conference_api(session, mixer_name, "mute", node)) || + (response = exec_conference_api(session, mixer_name, "undeaf", node))) { + return response; + } } else { - exec_conference_api(session, mixer_name, "unmute"); - exec_conference_api(session, mixer_name, "deaf"); + if ((response = exec_conference_api(session, mixer_name, "unmute", node)) || + (response = exec_conference_api(session, mixer_name, "deaf", node))) { + return response; + } } response = iks_new_iq_result(node); } else { @@ -1821,10 +1882,12 @@ static iks *join_mixer(struct rayo_call *call, switch_core_session_t *session, s } else if (!strcmp("recv", direction)) { conf_args = switch_core_session_sprintf(session, "%s+flags{mute}", conf_args); } - if (switch_core_session_execute_application_async(session, "conference", conf_args) == SWITCH_STATUS_SUCCESS) { - response = iks_new_iq_result(node); - } else { - response = iks_new_error_detailed(node, STANZA_ERROR_INTERNAL_SERVER_ERROR, "failed execute conference app"); + + call->pending_join_request = iks_copy(node); + response = exec_conference_app(session, conf_args, node); + if (response) { + iks_delete(call->pending_join_request); + call->pending_join_request = NULL; } } return response; @@ -1951,11 +2014,12 @@ static iks *unjoin_mixer(struct rayo_call *call, switch_core_session_t *session, goto done; } - /* ack command */ - response = iks_new_iq_result(node); - /* kick the member */ - exec_conference_api(session, mixer_name, "hup"); + response = exec_conference_api(session, mixer_name, "hup", node); + if (!response) { + /* ack command */ + response = iks_new_iq_result(node); + } done: @@ -2538,6 +2602,15 @@ static void on_mixer_add_member_event(struct rayo_mixer *mixer, switch_event_t * call->joined = JOINED_MIXER; call->joined_id = switch_core_strdup(RAYO_POOL(call), rayo_mixer_get_name(mixer)); + /* send IQ result to client now. */ + if (call->pending_join_request) { + iks *request = call->pending_join_request; + iks *result = iks_new_iq_result(request); + call->pending_join_request = NULL; + RAYO_SEND_REPLY(call, iks_find_attrib_soft(request, "from"), result); + iks_delete(request); + } + /* send mixer joined event to member DCP */ add_member_event = iks_new_presence("joined", RAYO_NS, RAYO_JID(call), call->dcp_jid); x = iks_find(add_member_event, "joined"); @@ -2705,14 +2778,13 @@ static void on_call_bridge_event(struct rayo_client *rclient, switch_event_t *ev call->joined_id = switch_core_strdup(RAYO_POOL(call), b_uuid); /* send IQ result to client now. */ - switch_mutex_lock(RAYO_ACTOR(call)->mutex); if (call->pending_join_request) { - iks *result = iks_new_iq_result(call->pending_join_request); - RAYO_SEND_REPLY(call, iks_find_attrib_soft(call->pending_join_request, "from"), result); - iks_delete(call->pending_join_request); + iks *request = call->pending_join_request; + iks *result = iks_new_iq_result(request); call->pending_join_request = NULL; + RAYO_SEND_REPLY(call, iks_find_attrib_soft(request, "from"), result); + iks_delete(request); } - switch_mutex_unlock(RAYO_ACTOR(call)->mutex); /* send A-leg event */ revent = iks_new_presence("joined", RAYO_NS, @@ -2760,14 +2832,13 @@ static void on_call_unbridge_event(struct rayo_client *rclient, switch_event_t * call->joined_id = NULL; /* send IQ result to client now. */ - switch_mutex_lock(RAYO_ACTOR(call)->mutex); if (call->pending_join_request) { - iks *result = iks_new_iq_result(call->pending_join_request); - RAYO_SEND_REPLY(call, iks_find_attrib_soft(call->pending_join_request, "from"), result); - iks_delete(call->pending_join_request); + iks *request = call->pending_join_request; + iks *result = iks_new_iq_result(request); call->pending_join_request = NULL; + RAYO_SEND_REPLY(call, iks_find_attrib_soft(request, "from"), result); + iks_delete(request); } - switch_mutex_unlock(RAYO_ACTOR(call)->mutex); /* send A-leg event */ revent = iks_new_presence("unjoined", RAYO_NS, @@ -2793,6 +2864,36 @@ static void on_call_unbridge_event(struct rayo_client *rclient, switch_event_t * } } +/** + * Handle call execute application event + * @param rclient the Rayo client + * @param event the execute event + */ +static void on_call_execute_event(struct rayo_client *rclient, switch_event_t *event) +{ + struct rayo_call *call = RAYO_CALL_LOCATE_BY_ID(switch_event_get_header(event, "Unique-ID")); + if (call) { + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(RAYO_ID(call)), SWITCH_LOG_DEBUG, "Application %s execute\n", switch_event_get_header(event, "Application")); + RAYO_UNLOCK(call); + } +} + +/** + * Handle call execute application complete event + * @param rclient the Rayo client + * @param event the execute complete event + */ +static void on_call_execute_complete_event(struct rayo_client *rclient, switch_event_t *event) +{ + struct rayo_call *call = RAYO_CALL_LOCATE_BY_ID(switch_event_get_header(event, "Unique-ID")); + if (call) { + const char *app = switch_event_get_header(event, "Application"); + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(RAYO_ID(call)), SWITCH_LOG_DEBUG, "Application %s execute complete: %s \n", + app, + switch_event_get_header(event, "Application-Response")); + RAYO_UNLOCK(call); + } +} /** * Handle events to deliver to client connection @@ -2819,6 +2920,12 @@ static void rayo_client_handle_event(struct rayo_client *rclient, switch_event_t case SWITCH_EVENT_CHANNEL_UNBRIDGE: on_call_unbridge_event(rclient, event); break; + case SWITCH_EVENT_CHANNEL_EXECUTE: + on_call_execute_event(rclient, event); + break; + case SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE: + on_call_execute_complete_event(rclient, event); + break; default: /* don't care */ break; @@ -2944,7 +3051,9 @@ static switch_status_t rayo_call_on_read_frame(switch_core_session_t *session, s switch_time_t idle_start = call->idle_start_time; int idle_duration_ms = (now - idle_start) / 1000; /* detect idle session (rayo-client has stopped controlling call) and terminate call */ - if (!rayo_call_is_joined(call) && idle_duration_ms > globals.max_idle_ms) { + if (rayo_call_is_joined(call)) { + call->idle_start_time = now; + } else if (idle_duration_ms > globals.max_idle_ms) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Ending abandoned call. idle_duration_ms = %i ms\n", idle_duration_ms); switch_channel_hangup(channel, RAYO_CAUSE_HANGUP); } @@ -3891,6 +4000,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_rayo_load) switch_event_bind(modname, SWITCH_EVENT_CHANNEL_ANSWER, NULL, route_call_event, NULL); switch_event_bind(modname, SWITCH_EVENT_CHANNEL_BRIDGE, NULL, route_call_event, NULL); switch_event_bind(modname, SWITCH_EVENT_CHANNEL_UNBRIDGE, NULL, route_call_event, NULL); + switch_event_bind(modname, SWITCH_EVENT_CHANNEL_EXECUTE, NULL, route_call_event, NULL); + switch_event_bind(modname, SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE, NULL, route_call_event, NULL); switch_event_bind(modname, SWITCH_EVENT_CHANNEL_DESTROY, NULL, on_call_end_event, NULL); From 778ac5341a233fc9ca51b14718a674ea6ed09af4 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Tue, 15 Oct 2013 15:50:45 -0400 Subject: [PATCH 31/80] FS-5773 --resolve mod_ssml: allow rendering of documents if TTS is not configured --- src/mod/formats/mod_ssml/mod_ssml.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/mod/formats/mod_ssml/mod_ssml.c b/src/mod/formats/mod_ssml/mod_ssml.c index cb29c5e79d..8b172721c7 100644 --- a/src/mod/formats/mod_ssml/mod_ssml.c +++ b/src/mod/formats/mod_ssml/mod_ssml.c @@ -692,11 +692,14 @@ static int get_file_from_macro(struct ssml_parser *parsed_data, char *to_say) static int get_file_from_voice(struct ssml_parser *parsed_data, char *to_say) { struct ssml_node *cur_node = parsed_data->cur_node; - char *file = switch_core_sprintf(parsed_data->pool, "%s%s", cur_node->tts_voice->prefix, to_say); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding <%s>: \"%s\"\n", cur_node->tag_name, file); - parsed_data->files[parsed_data->num_files].name = file; - parsed_data->files[parsed_data->num_files++].prefix = NULL; - return 1; + if (cur_node->tts_voice) { + char *file = switch_core_sprintf(parsed_data->pool, "%s%s", cur_node->tts_voice->prefix, to_say); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding <%s>: \"%s\"\n", cur_node->tag_name, file); + parsed_data->files[parsed_data->num_files].name = file; + parsed_data->files[parsed_data->num_files++].prefix = NULL; + return 1; + } + return 0; } /** @@ -708,7 +711,7 @@ static int process_cdata_tts(struct ssml_parser *parsed_data, char *data, size_t if (!len) { return IKS_OK; } - if (cur_node && cur_node->tts_voice && parsed_data->num_files < parsed_data->max_files) { + if (cur_node && parsed_data->num_files < parsed_data->max_files) { int i = 0; int empty = 1; char *to_say; @@ -728,7 +731,9 @@ static int process_cdata_tts(struct ssml_parser *parsed_data, char *data, size_t to_say[len] = '\0'; if (!cur_node->say_macro || !get_file_from_macro(parsed_data, to_say)) { /* use voice instead */ - get_file_from_voice(parsed_data, to_say); + if (!get_file_from_voice(parsed_data, to_say)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "No TTS voices available to render text!\n"); + } } free(to_say); return IKS_OK; From c7ccf84a145ced2cbfb478e5da55272745896b01 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 15 Oct 2013 13:07:38 -0700 Subject: [PATCH 32/80] FS-5819: configure fix for new clang detection --- configure.in | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/configure.in b/configure.in index ecca14cf11..3fcea77267 100644 --- a/configure.in +++ b/configure.in @@ -734,16 +734,17 @@ if test x"$ac_cv_gcc_declaration_after_statement" = xyes; then fi CFLAGS="$saved_CFLAGS" -# Next check added for Xcode 5 and systems with clang 5 llvm 3.3 or above, extended offset must be off -AC_CACHE_CHECK([whether compiler supports -Wextended-offsetof], [ac_cv_clang_extended_offsetof], [ -AC_TRY_COMPILE([],[return 0;],[ac_cv_clang_extended_offsetof=yes],[ac_cv_clang_extended_offsetof=no]) -]) -AC_MSG_RESULT($ac_cv_clang_extended_offsetof) -if test x"$ac_cv_clang_extended_offsetof" = xyes; then - APR_ADDTO(CFLAGS, -Wno-extended-offsetof) +if test "x${ax_cv_c_compiler_vendor}" = "xclang" ; then + # Next check added for Xcode 5 and systems with clang 5 llvm 3.3 or above, extended offset must be off + AC_CACHE_CHECK([whether compiler supports -Wextended-offsetof], [ac_cv_clang_extended_offsetof], [ + AC_TRY_COMPILE([],[return 0;],[ac_cv_clang_extended_offsetof=yes],[ac_cv_clang_extended_offsetof=no]) + ]) + AC_MSG_RESULT($ac_cv_clang_extended_offsetof) + if test x"$ac_cv_clang_extended_offsetof" = xyes; then + APR_ADDTO(CFLAGS, -Wno-extended-offsetof) + fi fi - # Tested and fixed lot of modules, but some are untested. Will be added back when the core team decide it ready # Untested modules : mod_osp mod_soundtouch mod_sangoma_codec mod_dingaling mod_opal mod_skypopen mod_h323 mod_khomp # mod_unimrcp mod_cepstral mod_erlang_event mod_snmp mod_perl mod_java mod_managed From 4a172402d2f10aba78317ccb192c891b393117bd Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 16 Oct 2013 02:24:32 +0500 Subject: [PATCH 33/80] some refactoring and plumbing for 1.4 --- src/include/private/switch_core_pvt.h | 2 +- src/include/switch_channel.h | 2 + src/include/switch_core.h | 7 +- src/include/switch_core_media.h | 3 + src/include/switch_event.h | 33 +- src/include/switch_json.h | 52 +- src/include/switch_loadable_module.h | 34 +- src/include/switch_module_interfaces.h | 18 + src/include/switch_rtp.h | 1 + src/include/switch_types.h | 27 +- src/mod/endpoints/mod_alsa/mod_alsa.c | 3 - .../endpoints/mod_dingaling/mod_dingaling.c | 6 +- .../mod_gsmopen/mod_gsmopen.c | 5 - src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp | 5 - src/mod/endpoints/mod_h323/mod_h323.cpp | 1 - src/mod/endpoints/mod_loopback/mod_loopback.c | 4 +- src/mod/endpoints/mod_opal/mod_opal.cpp | 2 +- .../endpoints/mod_portaudio/mod_portaudio.c | 5 - .../endpoints/mod_reference/mod_reference.c | 5 - src/mod/endpoints/mod_rtmp/mod_rtmp.c | 7 - src/mod/endpoints/mod_skinny/mod_skinny.c | 3 +- src/mod/endpoints/mod_skypopen/mod_skypopen.c | 11 +- src/mod/endpoints/mod_sofia/mod_sofia.c | 56 +- src/mod/endpoints/mod_sofia/rtp.c | 2 +- src/mod/endpoints/mod_sofia/sofia_glue.c | 3 - src/mod/endpoints/mod_unicall/mod_unicall.c | 5 - src/switch_channel.c | 30 +- src/switch_core_codec.c | 2 + src/switch_core_io.c | 4 +- src/switch_core_media.c | 407 +++++--- src/switch_core_session.c | 17 +- src/switch_core_sqldb.c | 27 +- src/switch_core_state_machine.c | 49 + src/switch_event.c | 876 +++++++++++++++++- src/switch_json.c | 39 +- src/switch_loadable_module.c | 137 +++ src/switch_rtp.c | 126 ++- 37 files changed, 1729 insertions(+), 287 deletions(-) diff --git a/src/include/private/switch_core_pvt.h b/src/include/private/switch_core_pvt.h index f6d3474386..bff9b72a78 100644 --- a/src/include/private/switch_core_pvt.h +++ b/src/include/private/switch_core_pvt.h @@ -144,7 +144,7 @@ struct switch_core_session { int stream_count; char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1]; - void *private_info; + void *private_info[SWITCH_CORE_SESSION_MAX_PRIVATES]; switch_queue_t *event_queue; switch_queue_t *message_queue; switch_queue_t *signal_data_queue; diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index 2e53ef6107..234b692114 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -633,6 +633,8 @@ SWITCH_DECLARE(int) switch_channel_test_app_flag_key(const char *app, switch_cha SWITCH_DECLARE(void) switch_channel_set_bridge_time(switch_channel_t *channel); SWITCH_DECLARE(void) switch_channel_set_hangup_time(switch_channel_t *channel); SWITCH_DECLARE(switch_call_direction_t) switch_channel_direction(switch_channel_t *channel); +SWITCH_DECLARE(void) switch_channel_set_direction(switch_channel_t *channel, switch_call_direction_t direction); + SWITCH_DECLARE(switch_core_session_t *) switch_channel_get_session(switch_channel_t *channel); SWITCH_DECLARE(char *) switch_channel_get_flag_string(switch_channel_t *channel); SWITCH_DECLARE(char *) switch_channel_get_cap_string(switch_channel_t *channel); diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 064ab56324..11340c211c 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -1070,7 +1070,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_receive_event(_In_ switch_co \param session the session to retrieve from \return a pointer to the private data */ -SWITCH_DECLARE(void *) switch_core_session_get_private(_In_ switch_core_session_t *session); +SWITCH_DECLARE(void *) switch_core_session_get_private_class(_In_ switch_core_session_t *session, _In_ switch_pvt_class_t index); +#define switch_core_session_get_private(_s) switch_core_session_get_private_class(_s, SWITCH_PVT_PRIMARY) /*! \brief Add private user data to a session @@ -1078,7 +1079,8 @@ SWITCH_DECLARE(void *) switch_core_session_get_private(_In_ switch_core_session_ \param private_info the used data to add \return SWITCH_STATUS_SUCCESS if data is added */ -SWITCH_DECLARE(switch_status_t) switch_core_session_set_private(_In_ switch_core_session_t *session, _In_ void *private_info); +SWITCH_DECLARE(switch_status_t) switch_core_session_set_private_class(_In_ switch_core_session_t *session, _In_ void *private_info, _In_ switch_pvt_class_t index); +#define switch_core_session_set_private(_s, _p) switch_core_session_set_private_class(_s, _p, SWITCH_PVT_PRIMARY) /*! \brief Add a logical stream to a session @@ -2575,6 +2577,7 @@ SWITCH_DECLARE(int) switch_system(const char *cmd, switch_bool_t wait); SWITCH_DECLARE(int) switch_stream_system_fork(const char *cmd, switch_stream_handle_t *stream); SWITCH_DECLARE(int) switch_stream_system(const char *cmd, switch_stream_handle_t *stream); +SWITCH_DECLARE(switch_call_direction_t) switch_ice_direction(switch_core_session_t *session); SWITCH_END_EXTERN_C #endif diff --git a/src/include/switch_core_media.h b/src/include/switch_core_media.h index 122f9f2b65..9641718f07 100644 --- a/src/include/switch_core_media.h +++ b/src/include/switch_core_media.h @@ -207,6 +207,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_write_frame(switch_core_sessio SWITCH_DECLARE(int) switch_core_media_check_nat(switch_media_handle_t *smh, const char *network_ip); SWITCH_DECLARE(switch_status_t) switch_core_media_choose_port(switch_core_session_t *session, switch_media_type_t type, int force); +SWITCH_DECLARE(switch_status_t) switch_core_media_choose_ports(switch_core_session_t *session, switch_bool_t audio, switch_bool_t video); SWITCH_DECLARE(void) switch_core_media_check_dtmf_type(switch_core_session_t *session); SWITCH_DECLARE(void) switch_core_media_absorb_sdp(switch_core_session_t *session); SWITCH_DECLARE(switch_status_t) switch_core_media_proxy_remote_addr(switch_core_session_t *session, const char *sdp_str); @@ -219,6 +220,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess SWITCH_DECLARE(void)switch_core_media_set_local_sdp(switch_core_session_t *session, const char *sdp_str, switch_bool_t dup); SWITCH_DECLARE(void) switch_core_media_patch_sdp(switch_core_session_t *session); SWITCH_DECLARE(void) switch_core_media_set_udptl_image_sdp(switch_core_session_t *session, switch_t38_options_t *t38_options, int insist); +SWITCH_DECLARE(switch_core_media_params_t *) switch_core_media_get_mparams(switch_media_handle_t *smh); SWITCH_DECLARE(void) switch_core_media_prepare_codecs(switch_core_session_t *session, switch_bool_t force); SWITCH_DECLARE(void) switch_core_media_start_udptl(switch_core_session_t *session, switch_t38_options_t *t38_options); SWITCH_DECLARE(switch_status_t) switch_core_media_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg); @@ -254,6 +256,7 @@ SWITCH_DECLARE(void) switch_core_media_init(void); SWITCH_DECLARE(void) switch_core_media_deinit(void); SWITCH_DECLARE(void) switch_core_media_set_stats(switch_core_session_t *session); SWITCH_DECLARE(void) switch_core_session_wake_video_thread(switch_core_session_t *session); +SWITCH_DECLARE(void) switch_core_session_clear_crypto(switch_core_session_t *session); SWITCH_END_EXTERN_C #endif diff --git a/src/include/switch_event.h b/src/include/switch_event.h index 48c942dfaa..be60c17cd9 100644 --- a/src/include/switch_event.h +++ b/src/include/switch_event.h @@ -309,10 +309,11 @@ SWITCH_DECLARE(switch_status_t) switch_event_free_subclass_detailed(const char * \return SWITCH_STATUS_SUCCESS if the operation was successful \note you must free the resulting string when you are finished with it */ -SWITCH_DECLARE(switch_status_t) switch_event_binary_deserialize(switch_event_t **eventp, void **data, switch_size_t len, switch_bool_t destroy); +SWITCH_DECLARE(switch_status_t) switch_event_binary_deserialize(switch_event_t **eventp, void **data, switch_size_t len, switch_bool_t duplicate); SWITCH_DECLARE(switch_status_t) switch_event_binary_serialize(switch_event_t *event, void **data, switch_size_t *len); SWITCH_DECLARE(switch_status_t) switch_event_serialize(switch_event_t *event, char **str, switch_bool_t encode); SWITCH_DECLARE(switch_status_t) switch_event_serialize_json(switch_event_t *event, char **str); +SWITCH_DECLARE(switch_status_t) switch_event_serialize_json_obj(switch_event_t *event, cJSON **json); SWITCH_DECLARE(switch_status_t) switch_event_create_json(switch_event_t **event, const char *json); SWITCH_DECLARE(switch_status_t) switch_event_create_brackets(char *data, char a, char b, char c, switch_event_t **event, char **new_data, switch_bool_t dup); SWITCH_DECLARE(switch_status_t) switch_event_create_array_pair(switch_event_t **event, char **names, char **vals, int len); @@ -420,8 +421,38 @@ SWITCH_DECLARE(void) switch_event_deliver(switch_event_t **event); SWITCH_DECLARE(char *) switch_event_build_param_string(switch_event_t *event, const char *prefix, switch_hash_t *vars_map); SWITCH_DECLARE(int) switch_event_check_permission_list(switch_event_t *list, const char *name); SWITCH_DECLARE(void) switch_event_add_presence_data_cols(switch_channel_t *channel, switch_event_t *event, const char *prefix); +SWITCH_DECLARE(void) switch_json_add_presence_data_cols(switch_event_t *event, cJSON *json, const char *prefix); + SWITCH_DECLARE(void) switch_event_launch_dispatch_threads(uint32_t max); +SWITCH_DECLARE(uint32_t) switch_event_channel_broadcast(const char *event_channel, cJSON **json, const char *key, switch_event_channel_id_t id); +SWITCH_DECLARE(uint32_t) switch_event_channel_unbind(const char *event_channel, switch_event_channel_func_t func); +SWITCH_DECLARE(switch_status_t) switch_event_channel_bind(const char *event_channel, switch_event_channel_func_t func, switch_event_channel_id_t *id); + + +typedef void (*switch_live_array_command_handler_t)(switch_live_array_t *la, const char *cmd, const char *sessid, cJSON *jla, void *user_data); + +#define NO_EVENT_CHANNEL_ID 0 +#define SWITCH_EVENT_CHANNEL_GLOBAL "__global__" + +SWITCH_DECLARE(switch_status_t) switch_live_array_clear(switch_live_array_t *la); +SWITCH_DECLARE(switch_status_t) switch_live_array_bootstrap(switch_live_array_t *la, const char *sessid, switch_event_channel_id_t channel_id); +SWITCH_DECLARE(switch_status_t) switch_live_array_destroy(switch_live_array_t **live_arrayP); +SWITCH_DECLARE(switch_status_t) switch_live_array_create(const char *event_channel, const char *name, + switch_event_channel_id_t channel_id, switch_live_array_t **live_arrayP); +SWITCH_DECLARE(cJSON *) switch_live_array_get(switch_live_array_t *la, const char *name); +SWITCH_DECLARE(cJSON *) switch_live_array_get_idx(switch_live_array_t *la, int idx); +SWITCH_DECLARE(switch_status_t) switch_live_array_del(switch_live_array_t *la, const char *name); +SWITCH_DECLARE(switch_status_t) switch_live_array_add(switch_live_array_t *la, const char *name, int index, cJSON **obj, switch_bool_t destroy); +SWITCH_DECLARE(switch_status_t) switch_live_array_visible(switch_live_array_t *la, switch_bool_t visible, switch_bool_t force); +SWITCH_DECLARE(switch_bool_t) switch_live_array_isnew(switch_live_array_t *la); +SWITCH_DECLARE(void) switch_live_array_lock(switch_live_array_t *la); +SWITCH_DECLARE(void) switch_live_array_unlock(switch_live_array_t *la); +SWITCH_DECLARE(void) switch_live_array_set_user_data(switch_live_array_t *la, void *user_data); +SWITCH_DECLARE(void) switch_live_array_set_command_handler(switch_live_array_t *la, switch_live_array_command_handler_t command_handler); +SWITCH_DECLARE(void) switch_live_array_parse_json(cJSON *json, switch_event_channel_id_t channel_id); + + ///\} SWITCH_END_EXTERN_C diff --git a/src/include/switch_json.h b/src/include/switch_json.h index 00f4e23df4..e1d7f1e51b 100755 --- a/src/include/switch_json.h +++ b/src/include/switch_json.h @@ -76,7 +76,8 @@ SWITCH_DECLARE(int) cJSON_GetArraySize(cJSON *array); /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ SWITCH_DECLARE(cJSON *)cJSON_GetArrayItem(cJSON *array,int item); /* Get item "string" from object. Case insensitive. */ -SWITCH_DECLARE(cJSON *)cJSON_GetObjectItem(cJSON *object,const char *string); +SWITCH_DECLARE(cJSON *)cJSON_GetObjectItem(const cJSON *object,const char *string); +SWITCH_DECLARE(const char *)cJSON_GetObjectCstr(const cJSON *object, const char *string); /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ SWITCH_DECLARE(const char *)cJSON_GetErrorPtr(void); @@ -127,6 +128,55 @@ SWITCH_DECLARE(cJSON *) cJSON_Duplicate(cJSON *item,int recurse); #define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) #define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) +SWITCH_DECLARE(cJSON *) cJSON_CreateStringPrintf(const char *fmt, ...); + +static inline cJSON *json_add_child_obj(cJSON *json, const char *name, cJSON *obj) +{ + cJSON *new_json = NULL; + + switch_assert(json); + + if (obj) { + new_json = obj; + } else { + new_json = cJSON_CreateObject(); + } + + switch_assert(new_json); + + cJSON_AddItemToObject(json, name, new_json); + + return new_json; +} + +static inline cJSON *json_add_child_array(cJSON *json, const char *name) +{ + cJSON *new_json = NULL; + + switch_assert(json); + + new_json = cJSON_CreateArray(); + switch_assert(new_json); + + cJSON_AddItemToObject(json, name, new_json); + + return new_json; +} + +static inline cJSON *json_add_child_string(cJSON *json, const char *name, const char *val) +{ + cJSON *new_json = NULL; + + switch_assert(json); + + new_json = cJSON_CreateString(val); + switch_assert(new_json); + + cJSON_AddItemToObject(json, name, new_json); + + return new_json; +} + #ifdef __cplusplus } #endif diff --git a/src/include/switch_loadable_module.h b/src/include/switch_loadable_module.h index 43e692c05b..e76e0e5ab1 100644 --- a/src/include/switch_loadable_module.h +++ b/src/include/switch_loadable_module.h @@ -69,6 +69,8 @@ SWITCH_BEGIN_EXTERN_C switch_chat_application_interface_t *chat_application_interface; /*! the table of api functions the module has implemented */ switch_api_interface_t *api_interface; + /*! the table of json api functions the module has implemented */ + switch_json_api_interface_t *json_api_interface; /*! the table of file formats the module has implemented */ switch_file_interface_t *file_interface; /*! the table of speech interfaces the module has implemented */ @@ -189,6 +191,13 @@ SWITCH_DECLARE(switch_status_t) switch_core_execute_chat_app(switch_event_t *mes */ SWITCH_DECLARE(switch_api_interface_t *) switch_loadable_module_get_api_interface(const char *name); +/*! + \brief Retrieve the JSON API interface by it's registered name + \param name the name of the API + \return the desired API interface + */ +SWITCH_DECLARE(switch_json_api_interface_t *) switch_loadable_module_get_json_api_interface(const char *name); + /*! \brief Retrieve the file format interface by it's registered name \param name the name of the file format @@ -275,6 +284,16 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_ */ SWITCH_DECLARE(switch_status_t) switch_api_execute(const char *cmd, const char *arg, switch_core_session_t *session, switch_stream_handle_t *stream); +/*! + \brief Execute a registered JSON API command + \param json the name of the JSON API command to execute + \param arg the optional arguement to the command + \param session an optional session + \param stream stream for output + \return the status returned by the API call +*/ +SWITCH_DECLARE(switch_status_t) switch_json_api_execute(cJSON *json, switch_core_session_t *session, cJSON **retval); + /*! \brief Load a module \param dir the directory where the module resides @@ -328,6 +347,16 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void); break; \ } +#define SWITCH_ADD_JSON_API(json_api_int, int_name, descript, funcptr, syntax_string) \ + for (;;) { \ + json_api_int = (switch_json_api_interface_t *)switch_loadable_module_create_interface(*module_interface, SWITCH_JSON_API_INTERFACE); \ + json_api_int->interface_name = int_name; \ + json_api_int->desc = descript; \ + json_api_int->function = funcptr; \ + json_api_int->syntax = syntax_string; \ + break; \ + } + #define SWITCH_ADD_CHAT(chat_int, int_name, funcptr) \ for (;;) { \ chat_int = (switch_chat_interface_t *)switch_loadable_module_create_interface(*module_interface, SWITCH_CHAT_INTERFACE); \ @@ -510,8 +539,9 @@ static inline switch_bool_t switch_core_codec_ready(switch_codec_t *codec) } - - +SWITCH_DECLARE(switch_core_recover_callback_t) switch_core_get_secondary_recover_callback(const char *key); +SWITCH_DECLARE(switch_status_t) switch_core_register_secondary_recover_callback(const char *key, switch_core_recover_callback_t cb); +SWITCH_DECLARE(void) switch_core_unregister_secondary_recover_callback(const char *key); SWITCH_END_EXTERN_C #endif diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h index b6f4f11554..ad6b4aefd4 100644 --- a/src/include/switch_module_interfaces.h +++ b/src/include/switch_module_interfaces.h @@ -743,6 +743,24 @@ struct switch_api_interface { struct switch_api_interface *next; }; + +/*! \brief A module interface to implement a json api function */ +struct switch_json_api_interface { + /*! the name of the interface */ + const char *interface_name; + /*! a description of the api function */ + const char *desc; + /*! function the api call uses */ + switch_json_api_function_t function; + /*! an example of the api syntax */ + const char *syntax; + switch_thread_rwlock_t *rwlock; + int refs; + switch_mutex_t *reflock; + switch_loadable_module_interface_t *parent; + struct switch_json_api_interface *next; +}; + #define PROTECT_INTERFACE(_it) if (_it) {switch_mutex_lock(_it->reflock); switch_thread_rwlock_rdlock(_it->parent->rwlock); switch_thread_rwlock_rdlock(_it->rwlock); _it->refs++; _it->parent->refs++; switch_mutex_unlock(_it->reflock);} //if (!strcmp(_it->interface_name, "user")) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "+++++++++++LOCK %s %d/%d\n", _it->interface_name, _it->refs, _it->parent->refs); #define UNPROTECT_INTERFACE(_it) if (_it) {switch_mutex_lock(_it->reflock); switch_thread_rwlock_unlock(_it->rwlock); switch_thread_rwlock_unlock(_it->parent->rwlock); _it->refs--; _it->parent->refs--; switch_mutex_unlock(_it->reflock);} //if (!strcmp(_it->interface_name, "user")) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "---------UNLOCK %s %d/%d\n", _it->interface_name, _it->refs, _it->parent->refs); diff --git a/src/include/switch_rtp.h b/src/include/switch_rtp.h index f704d943d1..bd509cc29a 100644 --- a/src/include/switch_rtp.h +++ b/src/include/switch_rtp.h @@ -508,6 +508,7 @@ SWITCH_DECLARE(switch_byte_t) switch_rtp_check_auto_adj(switch_rtp_t *rtp_sessio SWITCH_DECLARE(void) switch_rtp_set_interdigit_delay(switch_rtp_t *rtp_session, uint32_t delay); SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, dtls_fingerprint_t *local_fp, dtls_fingerprint_t *remote_fp, dtls_type_t type); +SWITCH_DECLARE(switch_status_t) switch_rtp_del_dtls(switch_rtp_t *rtp_session, dtls_type_t type); SWITCH_DECLARE(int) switch_rtp_has_dtls(void); SWITCH_DECLARE(void) switch_rtp_video_refresh(switch_rtp_t *rtp_session); diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 27a88dcc73..ee42de2eee 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -38,6 +38,7 @@ #define SWITCH_TYPES_H #include +#include SWITCH_BEGIN_EXTERN_C #define SWITCH_ENT_ORIGINATE_DELIM ":_:" @@ -223,8 +224,16 @@ SWITCH_BEGIN_EXTERN_C #define SWITCH_DEFAULT_FILE_BUFFER_LEN 65536 #define SWITCH_DTMF_LOG_LEN 1000 #define SWITCH_MAX_TRANS 2000 +#define SWITCH_CORE_SESSION_MAX_PRIVATES 2 + typedef uint8_t switch_byte_t; +typedef enum { + SWITCH_PVT_PRIMARY = 0, + SWITCH_PVT_SECONDARY +} switch_pvt_class_t; + + /*! \enum switch_dtmf_source_t \brief DTMF sources @@ -357,7 +366,8 @@ typedef enum { SWITCH_ASR_INTERFACE, SWITCH_MANAGEMENT_INTERFACE, SWITCH_LIMIT_INTERFACE, - SWITCH_CHAT_APPLICATION_INTERFACE + SWITCH_CHAT_APPLICATION_INTERFACE, + SWITCH_JSON_API_INTERFACE, } switch_module_interface_name_t; typedef enum { @@ -653,6 +663,7 @@ typedef enum { SWITCH_RTP_FLAG_ENABLE_RTCP, SWITCH_RTP_FLAG_RTCP_MUX, SWITCH_RTP_FLAG_KILL_JB, + SWITCH_RTP_FLAG_VIDEO_BREAK, SWITCH_RTP_FLAG_INVALID } switch_rtp_flag_t; @@ -2000,6 +2011,7 @@ typedef struct switch_codec_interface switch_codec_interface_t; typedef struct switch_application_interface switch_application_interface_t; typedef struct switch_chat_application_interface switch_chat_application_interface_t; typedef struct switch_api_interface switch_api_interface_t; +typedef struct switch_json_api_interface switch_json_api_interface_t; typedef struct switch_file_interface switch_file_interface_t; typedef struct switch_speech_interface switch_speech_interface_t; typedef struct switch_asr_interface switch_asr_interface_t; @@ -2083,6 +2095,12 @@ typedef switch_status_t (*switch_api_function_t) (_In_opt_z_ const char *cmd, _I #define SWITCH_STANDARD_API(name) static switch_status_t name (_In_opt_z_ const char *cmd, _In_opt_ switch_core_session_t *session, _In_ switch_stream_handle_t *stream) + +typedef switch_status_t (*switch_json_api_function_t) (const cJSON *json, _In_opt_ switch_core_session_t *session, cJSON **json_reply); + + +#define SWITCH_STANDARD_JSON_API(name) static switch_status_t name (const cJSON *json, _In_opt_ switch_core_session_t *session, cJSON **json_reply) + typedef switch_status_t (*switch_input_callback_function_t) (switch_core_session_t *session, void *input, switch_input_type_t input_type, void *buf, unsigned int buflen); typedef switch_status_t (*switch_read_frame_callback_function_t) (switch_core_session_t *session, switch_frame_t *frame, void *user_data); @@ -2236,6 +2254,13 @@ struct sql_queue_manager; struct switch_media_handle_s; typedef struct switch_media_handle_s switch_media_handle_t; +typedef uint32_t switch_event_channel_id_t; +typedef void (*switch_event_channel_func_t)(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id); + +struct switch_live_array_s; +typedef struct switch_live_array_s switch_live_array_t; + + SWITCH_END_EXTERN_C #endif diff --git a/src/mod/endpoints/mod_alsa/mod_alsa.c b/src/mod/endpoints/mod_alsa/mod_alsa.c index dcdf215fe4..55f4ca4ba3 100644 --- a/src/mod/endpoints/mod_alsa/mod_alsa.c +++ b/src/mod/endpoints/mod_alsa/mod_alsa.c @@ -297,9 +297,6 @@ static switch_status_t channel_on_init(switch_core_session_t *session) switch_set_flag_locked(tech_pvt, TFLAG_IO); - /* Move channel's state machine to ROUTING */ - switch_channel_set_state(channel, CS_ROUTING); - return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_dingaling/mod_dingaling.c b/src/mod/endpoints/mod_dingaling/mod_dingaling.c index 5fe5d89000..e7ecaaf949 100644 --- a/src/mod/endpoints/mod_dingaling/mod_dingaling.c +++ b/src/mod/endpoints/mod_dingaling/mod_dingaling.c @@ -1916,6 +1916,7 @@ static switch_status_t channel_on_init(switch_core_session_t *session) { switch_channel_t *channel = switch_core_session_get_channel(session); struct private_object *tech_pvt = NULL; + switch_status_t status = SWITCH_STATUS_SUCCESS; tech_pvt = switch_core_session_get_private(session); switch_assert(tech_pvt != NULL); @@ -1928,11 +1929,10 @@ static switch_status_t channel_on_init(switch_core_session_t *session) if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { switch_channel_mark_answered(channel); } - /* Move channel's state machine to ROUTING */ - switch_channel_set_state(channel, CS_ROUTING); + status = SWITCH_STATUS_SUCCESS; } - return SWITCH_STATUS_SUCCESS; + return status; } static switch_status_t channel_on_routing(switch_core_session_t *session) diff --git a/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/mod_gsmopen.c b/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/mod_gsmopen.c index 9f25ee1d96..f6c9605cb2 100644 --- a/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/mod_gsmopen.c +++ b/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/mod_gsmopen.c @@ -586,11 +586,6 @@ static switch_status_t channel_on_init(switch_core_session_t *session) //ERRORA("%s CHANNEL INIT\n", GSMOPEN_P_LOG, tech_pvt->name); switch_set_flag(tech_pvt, TFLAG_IO); - /* Move channel's state machine to ROUTING. This means the call is trying - to get from the initial start where the call because, to the point - where a destination has been identified. If the channel is simply - left in the initial state, nothing will happen. */ - switch_channel_set_state(channel, CS_ROUTING); switch_mutex_lock(globals.mutex); globals.calls++; diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp index 9e78b8f55b..b3b3c1546c 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp @@ -416,11 +416,6 @@ static switch_status_t channel_on_init(switch_core_session_t *session) switch_set_flag(tech_pvt, TFLAG_IO); switch_mutex_unlock(tech_pvt->flag_mutex); - /* Move channel's state machine to ROUTING. This means the call is trying - to get from the initial start where the call because, to the point - where a destination has been identified. If the channel is simply - left in the initial state, nothing will happen. */ - switch_channel_set_state(channel, CS_ROUTING); switch_mutex_lock(globals.mutex); globals.calls++; diff --git a/src/mod/endpoints/mod_h323/mod_h323.cpp b/src/mod/endpoints/mod_h323/mod_h323.cpp index 17619129cf..adaf38deb1 100644 --- a/src/mod/endpoints/mod_h323/mod_h323.cpp +++ b/src/mod/endpoints/mod_h323/mod_h323.cpp @@ -1655,7 +1655,6 @@ switch_status_t FSH323Connection::on_init() } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Started routing for connection [%p]\n",this); - switch_channel_set_state(channel, CS_ROUTING); return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index c6cbfc8994..ee354ad90b 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -231,6 +231,7 @@ static switch_status_t channel_on_init(switch_core_session_t *session) switch_caller_profile_t *caller_profile; switch_event_t *vars = NULL; const char *var; + switch_status_t status = SWITCH_STATUS_FALSE; tech_pvt = switch_core_session_get_private(session); switch_assert(tech_pvt != NULL); @@ -354,11 +355,12 @@ static switch_status_t channel_on_init(switch_core_session_t *session) } switch_channel_set_variable(channel, "loopback_leg", switch_test_flag(tech_pvt, TFLAG_BLEG) ? "B" : "A"); + status = SWITCH_STATUS_SUCCESS; switch_channel_set_state(channel, CS_ROUTING); end: - return SWITCH_STATUS_SUCCESS; + return status; } static void do_reset(loopback_private_t *tech_pvt) diff --git a/src/mod/endpoints/mod_opal/mod_opal.cpp b/src/mod/endpoints/mod_opal/mod_opal.cpp index 633bcdbd3a..6f0fb3addd 100644 --- a/src/mod/endpoints/mod_opal/mod_opal.cpp +++ b/src/mod/endpoints/mod_opal/mod_opal.cpp @@ -853,7 +853,7 @@ switch_status_t FSConnection::on_init() return SWITCH_STATUS_FALSE; PTRACE(4, "mod_opal\tStarted routing for connection " << *this); - switch_channel_set_state(m_fsChannel, CS_ROUTING); + return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_portaudio/mod_portaudio.c b/src/mod/endpoints/mod_portaudio/mod_portaudio.c index 9ce6730d9e..7f66558c61 100644 --- a/src/mod/endpoints/mod_portaudio/mod_portaudio.c +++ b/src/mod/endpoints/mod_portaudio/mod_portaudio.c @@ -282,11 +282,6 @@ SWITCH_STANDARD_API(pa_cmd); */ static switch_status_t channel_on_init(switch_core_session_t *session) { - switch_channel_t *channel = switch_core_session_get_channel(session); - - /* Move channel's state machine to ROUTING */ - switch_channel_set_state(channel, CS_ROUTING); - return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_reference/mod_reference.c b/src/mod/endpoints/mod_reference/mod_reference.c index 08c27da0eb..ece46f8d63 100644 --- a/src/mod/endpoints/mod_reference/mod_reference.c +++ b/src/mod/endpoints/mod_reference/mod_reference.c @@ -141,11 +141,6 @@ static switch_status_t channel_on_init(switch_core_session_t *session) assert(channel != NULL); switch_set_flag_locked(tech_pvt, TFLAG_IO); - /* Move channel's state machine to ROUTING. This means the call is trying - to get from the initial start where the call because, to the point - where a destination has been identified. If the channel is simply - left in the initial state, nothing will happen. */ - switch_channel_set_state(channel, CS_ROUTING); switch_mutex_lock(globals.mutex); globals.calls++; switch_mutex_unlock(globals.mutex); diff --git a/src/mod/endpoints/mod_rtmp/mod_rtmp.c b/src/mod/endpoints/mod_rtmp/mod_rtmp.c index 339ce81873..e25f38b861 100644 --- a/src/mod/endpoints/mod_rtmp/mod_rtmp.c +++ b/src/mod/endpoints/mod_rtmp/mod_rtmp.c @@ -163,13 +163,6 @@ switch_status_t rtmp_on_init(switch_core_session_t *session) switch_set_flag_locked(tech_pvt, TFLAG_IO); - /* Move channel's state machine to ROUTING. This means the call is trying - to get from the initial start where the call because, to the point - where a destination has been identified. If the channel is simply - left in the initial state, nothing will happen. */ - switch_channel_set_state(channel, CS_ROUTING); - - switch_mutex_lock(rsession->profile->mutex); rsession->profile->calls++; switch_mutex_unlock(rsession->profile->mutex); diff --git a/src/mod/endpoints/mod_skinny/mod_skinny.c b/src/mod/endpoints/mod_skinny/mod_skinny.c index cc94f1129f..0e1e700264 100644 --- a/src/mod/endpoints/mod_skinny/mod_skinny.c +++ b/src/mod/endpoints/mod_skinny/mod_skinny.c @@ -648,7 +648,8 @@ switch_status_t channel_on_init(switch_core_session_t *session) switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s CHANNEL INIT\n", switch_channel_get_name(channel)); - return SWITCH_STATUS_SUCCESS; + /* This does not set the state to routing like most modules do, this now happens in the default state handeler so return FALSE TO BLOCK IT*/ + return SWITCH_STATUS_FALSE; } struct channel_on_routing_helper { diff --git a/src/mod/endpoints/mod_skypopen/mod_skypopen.c b/src/mod/endpoints/mod_skypopen/mod_skypopen.c index 024942e00e..b586bd0489 100644 --- a/src/mod/endpoints/mod_skypopen/mod_skypopen.c +++ b/src/mod/endpoints/mod_skypopen/mod_skypopen.c @@ -457,11 +457,6 @@ static switch_status_t channel_on_init(switch_core_session_t *session) switch_set_flag(tech_pvt, TFLAG_IO); switch_mutex_unlock(tech_pvt->flag_mutex); - /* Move channel's state machine to ROUTING. This means the call is trying - to get from the initial start where the call because, to the point - where a destination has been identified. If the channel is simply - left in the initial state, nothing will happen. */ - switch_channel_set_state(channel, CS_ROUTING); DEBUGA_SKYPE("%s CHANNEL INIT %s\n", SKYPOPEN_P_LOG, tech_pvt->name, switch_core_session_get_uuid(session)); switch_copy_string(tech_pvt->session_uuid_str, switch_core_session_get_uuid(session), sizeof(tech_pvt->session_uuid_str)); @@ -670,11 +665,11 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session) static switch_status_t channel_on_routing(switch_core_session_t *session) { - switch_channel_t *channel = NULL; + //switch_channel_t *channel = NULL; private_t *tech_pvt = NULL; - channel = switch_core_session_get_channel(session); - switch_assert(channel != NULL); + //channel = switch_core_session_get_channel(session); + //switch_assert(channel != NULL); tech_pvt = switch_core_session_get_private(session); switch_assert(tech_pvt != NULL); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index a4c8913ee5..b99c7aae96 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -102,20 +102,6 @@ static switch_status_t sofia_on_init(switch_core_session_t *session) } } - - - if (switch_channel_test_flag(tech_pvt->channel, CF_RECOVERING_BRIDGE)) { - switch_channel_set_state(channel, CS_RESET); - } else { - if (switch_channel_test_flag(tech_pvt->channel, CF_RECOVERING)) { - switch_channel_set_state(channel, CS_EXECUTE); - } else { - /* Move channel's state machine to ROUTING */ - switch_channel_set_state(channel, CS_ROUTING); - assert(switch_channel_get_state(channel) != CS_INIT); - } - } - end: switch_mutex_unlock(tech_pvt->sofia_mutex); @@ -156,43 +142,6 @@ static switch_status_t sofia_on_reset(switch_core_session_t *session) switch_channel_get_name(switch_core_session_get_channel(session))); - if (switch_channel_test_flag(tech_pvt->channel, CF_RECOVERING_BRIDGE)) { - switch_core_session_t *other_session = NULL; - const char *uuid = switch_core_session_get_uuid(session); - - if (switch_channel_test_flag(channel, CF_BRIDGE_ORIGINATOR)) { - const char *other_uuid = switch_channel_get_partner_uuid(channel); - int x = 0; - - if (other_uuid) { - for (x = 0; other_session == NULL && x < 20; x++) { - if (!switch_channel_up(channel)) { - break; - } - other_session = switch_core_session_locate(other_uuid); - switch_yield(100000); - } - } - - if (other_session) { - switch_channel_t *other_channel = switch_core_session_get_channel(other_session); - switch_channel_clear_flag(channel, CF_BRIDGE_ORIGINATOR); - switch_channel_wait_for_state_timeout(other_channel, CS_RESET, 5000); - switch_channel_wait_for_flag(other_channel, CF_MEDIA_ACK, SWITCH_TRUE, 2000, NULL); - - if (switch_channel_test_flag(channel, CF_PROXY_MODE) && switch_channel_test_flag(other_channel, CF_PROXY_MODE)) { - switch_ivr_signal_bridge(session, other_session); - } else { - switch_ivr_uuid_bridge(uuid, other_uuid); - } - switch_core_session_rwunlock(other_session); - } - } - - switch_channel_clear_flag(tech_pvt->channel, CF_RECOVERING_BRIDGE); - } - - return SWITCH_STATUS_SUCCESS; } @@ -221,12 +170,11 @@ static switch_status_t sofia_on_execute(switch_core_session_t *session) switch_channel_t *channel = switch_core_session_get_channel(session); switch_assert(tech_pvt != NULL); - switch_channel_clear_flag(tech_pvt->channel, CF_RECOVERING); - if (!sofia_test_flag(tech_pvt, TFLAG_HOLD_LOCK)) { sofia_clear_flag_locked(tech_pvt, TFLAG_SIP_HOLD); switch_channel_clear_flag(channel, CF_LEG_HOLDING); } + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s SOFIA EXECUTE\n", switch_channel_get_name(switch_core_session_get_channel(session))); @@ -873,8 +821,6 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session) tech_pvt->session_refresher = nua_no_refresher; } - - if (sofia_use_soa(tech_pvt)) { nua_respond(tech_pvt->nh, SIP_200_OK, NUTAG_AUTOANSWER(0), diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index ea4921052e..953ea6d8f0 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -300,7 +300,7 @@ static switch_status_t channel_on_init(switch_core_session_t *session) switch_channel_set_state(channel, CS_CONSUME_MEDIA); - return SWITCH_STATUS_SUCCESS; + return SWITCH_STATUS_FALSE; } static switch_status_t channel_on_destroy(switch_core_session_t *session) diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index f569a12dd2..833a725d44 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -1907,9 +1907,6 @@ int sofia_recover_callback(switch_core_session_t *session) switch_channel_get_name(channel), use_uuid); } } - - switch_core_media_recover_session(session); - } r++; diff --git a/src/mod/endpoints/mod_unicall/mod_unicall.c b/src/mod/endpoints/mod_unicall/mod_unicall.c index 18cd5d11d5..35c3cde286 100644 --- a/src/mod/endpoints/mod_unicall/mod_unicall.c +++ b/src/mod/endpoints/mod_unicall/mod_unicall.c @@ -850,11 +850,6 @@ static switch_status_t unicall_on_init(switch_core_session_t *session) switch_set_flag_locked(tech_pvt, TFLAG_IO); - /* Move channel's state machine to ROUTING. This means the call is trying - to get from the initial state to the point where a destination has been - identified. If the channel is simply left in the initial state, nothing - will happen. */ - switch_channel_set_state(channel, CS_ROUTING); switch_mutex_lock(globals.mutex); globals.calls++; switch_mutex_unlock(globals.mutex); diff --git a/src/switch_channel.c b/src/switch_channel.c index ae94061c26..76d3d49f97 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -385,6 +385,13 @@ SWITCH_DECLARE(switch_channel_timetable_t *) switch_channel_get_timetable(switch return times; } +SWITCH_DECLARE(void) switch_channel_set_direction(switch_channel_t *channel, switch_call_direction_t direction) +{ + if (!switch_core_session_in_thread(channel->session)) { + channel->direction = direction; + } +} + SWITCH_DECLARE(switch_call_direction_t) switch_channel_direction(switch_channel_t *channel) { return channel->direction; @@ -491,6 +498,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_queue_dtmf(switch_channel_t *chan switch_zmalloc(dt, sizeof(*dt)); *dt = new_dtmf; + while (switch_queue_trypush(channel->dtmf_queue, dt) != SWITCH_STATUS_SUCCESS) { if (switch_queue_trypop(channel->dtmf_queue, &pop) == SWITCH_STATUS_SUCCESS) { free(pop); @@ -509,6 +517,8 @@ SWITCH_DECLARE(switch_status_t) switch_channel_queue_dtmf(switch_channel_t *chan switch_mutex_unlock(channel->dtmf_mutex); + switch_core_media_break(channel->session, SWITCH_MEDIA_TYPE_AUDIO); + return status; } @@ -2951,19 +2961,33 @@ SWITCH_DECLARE(void) switch_channel_invert_cid(switch_channel_t *channel) SWITCH_DECLARE(void) switch_channel_flip_cid(switch_channel_t *channel) { switch_event_t *event; + const char *tmp = NULL; switch_mutex_lock(channel->profile_mutex); if (channel->caller_profile->callee_id_name) { + tmp = channel->caller_profile->caller_id_name; switch_channel_set_variable(channel, "pre_transfer_caller_id_name", channel->caller_profile->caller_id_name); channel->caller_profile->caller_id_name = switch_core_strdup(channel->caller_profile->pool, channel->caller_profile->callee_id_name); } - channel->caller_profile->callee_id_name = SWITCH_BLANK_STRING; + + if (switch_channel_test_flag(channel, CF_BRIDGED)) { + channel->caller_profile->callee_id_name = SWITCH_BLANK_STRING; + } else if (tmp) { + channel->caller_profile->callee_id_name = tmp; + } if (channel->caller_profile->callee_id_number) { + tmp = channel->caller_profile->caller_id_number; switch_channel_set_variable(channel, "pre_transfer_caller_id_number", channel->caller_profile->caller_id_number); channel->caller_profile->caller_id_number = switch_core_strdup(channel->caller_profile->pool, channel->caller_profile->callee_id_number); } - channel->caller_profile->callee_id_number = SWITCH_BLANK_STRING; + + if (switch_channel_test_flag(channel, CF_BRIDGED)) { + channel->caller_profile->callee_id_number = SWITCH_BLANK_STRING; + } else if (tmp) { + channel->caller_profile->callee_id_number = tmp; + } + switch_mutex_unlock(channel->profile_mutex); @@ -3260,7 +3284,7 @@ static void check_secure(switch_channel_t *channel) { const char *var, *sec; - if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND) { + if (!switch_channel_media_ready(channel) && switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND) { if ((sec = switch_channel_get_variable(channel, "rtp_secure_media")) && switch_true(sec)) { if (!(var = switch_channel_get_variable(channel, "rtp_has_crypto"))) { switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_WARNING, "rtp_secure_media invalid in this context.\n"); diff --git a/src/switch_core_codec.c b/src/switch_core_codec.c index 0c27fdcb46..bd3b521a98 100644 --- a/src/switch_core_codec.c +++ b/src/switch_core_codec.c @@ -171,8 +171,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_set_real_read_codec(switch_c } switch_channel_set_variable(channel, "read_codec", session->read_impl.iananame); + switch_channel_set_variable(channel, "original_read_codec", session->read_impl.iananame); switch_snprintf(tmp, sizeof(tmp), "%d", session->read_impl.actual_samples_per_second); switch_channel_set_variable(channel, "read_rate", tmp); + switch_channel_set_variable(channel, "original_read_rate", tmp); session->raw_read_frame.codec = session->read_codec; session->raw_write_frame.codec = session->read_codec; diff --git a/src/switch_core_io.c b/src/switch_core_io.c index aad6192ece..47f6289a73 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -638,8 +638,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Codec init error!\n"); goto done; default: - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Codec %s decoder error!\n", - session->read_codec->codec_interface->interface_name); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Codec %s decoder error! [%d]\n", + session->read_codec->codec_interface->interface_name, status); goto done; } } diff --git a/src/switch_core_media.c b/src/switch_core_media.c index d8553d0766..b412a518f5 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -509,6 +509,31 @@ SWITCH_DECLARE(const char *)switch_core_media_get_codec_string(switch_core_sessi return !zstr(preferred) ? preferred : fallback; } +SWITCH_DECLARE(void) switch_core_session_clear_crypto(switch_core_session_t *session) +{ + int i; + switch_media_handle_t *smh; + + const char *vars[] = { "rtp_last_audio_local_crypto_key", + "srtp_remote_audio_crypto_key", + "srtp_remote_audio_crypto_tag", + "srtp_remote_video_crypto_key", + "srtp_remote_video_crypto_tag", + "rtp_secure_media", + NULL}; + + for(i = 0; vars[i] ;i++) { + switch_channel_set_variable(session->channel, vars[i], NULL); + } + + if (!(smh = session->media_handle)) { + return; + } + + memset(&smh->engines[SWITCH_MEDIA_TYPE_AUDIO].ssec, 0, sizeof(smh->engines[SWITCH_MEDIA_TYPE_AUDIO].ssec)); + memset(&smh->engines[SWITCH_MEDIA_TYPE_VIDEO].ssec, 0, sizeof(smh->engines[SWITCH_MEDIA_TYPE_VIDEO].ssec)); + +} SWITCH_DECLARE(const char *) switch_core_session_local_crypto_key(switch_core_session_t *session, switch_media_type_t type) { @@ -1036,15 +1061,23 @@ SWITCH_DECLARE(switch_status_t) switch_media_handle_create(switch_media_handle_t *smhp = NULL; + if (zstr(params->sdp_username)) { + params->sdp_username = "FreeSWITCH"; + } + + if ((session->media_handle = switch_core_session_alloc(session, (sizeof(*smh))))) { session->media_handle->session = session; *smhp = session->media_handle; switch_set_flag(session->media_handle, SMF_INIT); session->media_handle->media_flags[SCMF_RUNNING] = 1; session->media_handle->engines[SWITCH_MEDIA_TYPE_AUDIO].read_frame.buflen = SWITCH_RTP_MAX_BUF_LEN; + session->media_handle->engines[SWITCH_MEDIA_TYPE_AUDIO].type = SWITCH_MEDIA_TYPE_AUDIO; session->media_handle->engines[SWITCH_MEDIA_TYPE_VIDEO].read_frame.buflen = SWITCH_RTP_MAX_BUF_LEN; + session->media_handle->engines[SWITCH_MEDIA_TYPE_VIDEO].type = SWITCH_MEDIA_TYPE_VIDEO; session->media_handle->mparams = params; + switch_mutex_init(&session->media_handle->mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session)); session->media_handle->engines[SWITCH_MEDIA_TYPE_AUDIO].ssrc = @@ -1098,18 +1131,18 @@ SWITCH_DECLARE(int32_t) switch_media_handle_test_media_flag(switch_media_handle_ SWITCH_DECLARE(switch_status_t) switch_core_session_media_handle_ready(switch_core_session_t *session) { - if (session->media_handle && switch_test_flag(session->media_handle, SMF_INIT)) { return SWITCH_STATUS_SUCCESS; } - + return SWITCH_STATUS_FALSE; } + SWITCH_DECLARE(switch_media_handle_t *) switch_core_session_get_media_handle(switch_core_session_t *session) { - if (switch_core_session_media_handle_ready(session)) { + if (switch_core_session_media_handle_ready(session) == SWITCH_STATUS_SUCCESS) { return session->media_handle; } @@ -1125,6 +1158,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_clear_media_handle(switch_co return SWITCH_STATUS_SUCCESS; } +SWITCH_DECLARE(switch_core_media_params_t *) switch_core_media_get_mparams(switch_media_handle_t *smh) +{ + switch_assert(smh); + return smh->mparams; +} SWITCH_DECLARE(void) switch_core_media_prepare_codecs(switch_core_session_t *session, switch_bool_t force) { @@ -1753,8 +1791,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_video_codec(switch_core_se switch_core_session_set_video_write_codec(session, &v_engine->write_codec); - switch_channel_set_variable_printf(session->channel, "rtp_last_video_codec_string", "%s@%dh@%di", - v_engine->codec_params.iananame, v_engine->codec_params.rm_rate, v_engine->codec_params.codec_ms); + switch_channel_set_variable_printf(session->channel, "rtp_last_video_codec_string", "%s@%dh", + v_engine->codec_params.rm_encoding, v_engine->codec_params.rm_rate); if (switch_rtp_ready(v_engine->rtp_session)) { @@ -2018,12 +2056,26 @@ static int dtls_ok(switch_core_session_t *session) #pragma warning(disable:4702) #endif +//? +SWITCH_DECLARE(switch_call_direction_t) switch_ice_direction(switch_core_session_t *session) +{ + switch_call_direction_t r = switch_channel_direction(session->channel); + + if ((switch_channel_test_flag(session->channel, CF_REINVITE) || switch_channel_test_flag(session->channel, CF_RECOVERING)) + && switch_channel_test_flag(session->channel, CF_WEBRTC)) { + r = SWITCH_CALL_DIRECTION_OUTBOUND; + } + + return r; +} + //? static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_session_t *sdp, sdp_media_t *m) { switch_rtp_engine_t *engine = &smh->engines[type]; sdp_attribute_t *attr; int i = 0, got_rtcp_mux = 0; + const char *val; if (engine->ice_in.chosen[0] && engine->ice_in.chosen[1] && !switch_channel_test_flag(smh->session->channel, CF_REINVITE)) { return; @@ -2078,6 +2130,12 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ } else if (!engine->remote_ssrc && !strcasecmp(attr->a_name, "ssrc") && attr->a_value) { engine->remote_ssrc = (uint32_t) atol(attr->a_value); + + if (engine->rtp_session && engine->remote_ssrc) { + switch_rtp_set_remote_ssrc(engine->rtp_session, engine->remote_ssrc); + } + + #ifdef RTCP_MUX } else if (!strcasecmp(attr->a_name, "rtcp-mux")) { engine->rtcp_mux = SWITCH_TRUE; @@ -2139,7 +2197,8 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ engine->ice_in.cands[engine->ice_in.cand_idx][cid].priority = atol(fields[3]); engine->ice_in.cands[engine->ice_in.cand_idx][cid].con_addr = switch_core_session_strdup(smh->session, fields[4]); engine->ice_in.cands[engine->ice_in.cand_idx][cid].con_port = (switch_port_t)atoi(fields[5]); - + + j = 6; while(j < argc && fields[j+1]) { @@ -2155,6 +2214,7 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ j += 2; } + if (engine->ice_in.chosen[cid]) { engine->ice_in.cands[engine->ice_in.chosen[cid]][cid].ready++; @@ -2206,6 +2266,19 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ } } + /* Got RTP but not RTCP, probably mux */ + if (engine->ice_in.chosen[0] && !engine->ice_in.chosen[1] && got_rtcp_mux) { + engine->ice_in.chosen[1] = engine->ice_in.chosen[0]; + + memcpy(&engine->ice_in.cands[engine->ice_in.chosen[1]][1], &engine->ice_in.cands[engine->ice_in.chosen[0]][0], + sizeof(engine->ice_in.cands[engine->ice_in.chosen[0]][0])); + engine->ice_in.cands[engine->ice_in.chosen[1]][1].ready++; + + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_NOTICE, + "No %s RTCP candidate found; defaulting to the same as RTP [%s:%d]\n", type2str(type), + engine->ice_in.cands[engine->ice_in.chosen[1]][1].con_addr, engine->ice_in.cands[engine->ice_in.chosen[1]][1].con_port); + } + /* look for any candidates and hope for auto-adjust */ if (!engine->ice_in.chosen[0] || !engine->ice_in.chosen[1]) { for (i = 0; i <= engine->ice_in.cand_idx && (!engine->ice_in.chosen[0] || !engine->ice_in.chosen[1]); i++) { @@ -2246,7 +2319,9 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ engine->codec_params.remote_sdp_ip = switch_core_session_strdup(smh->session, (char *) engine->ice_in.cands[engine->ice_in.chosen[0]][0].con_addr); engine->codec_params.remote_sdp_port = (switch_port_t) engine->ice_in.cands[engine->ice_in.chosen[0]][0].con_port; - + if (engine->remote_rtcp_port) { + engine->remote_rtcp_port = engine->codec_params.remote_sdp_port; + } switch_snprintf(tmp, sizeof(tmp), "%d", engine->codec_params.remote_sdp_port); switch_channel_set_variable(smh->session->channel, SWITCH_REMOTE_MEDIA_IP_VARIABLE, engine->codec_params.remote_sdp_ip); @@ -2271,6 +2346,7 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ if (switch_channel_test_flag(smh->session->channel, CF_REINVITE)) { + if (switch_rtp_ready(engine->rtp_session) && engine->ice_in.cands[engine->ice_in.chosen[0]][0].ready) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_INFO, "RE-Activating %s ICE\n", type2str(type)); @@ -2284,7 +2360,7 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ ICE_GOOGLE_JINGLE, NULL #else - switch_channel_direction(smh->session->channel) == + switch_ice_direction(smh->session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &engine->ice_in #endif @@ -2295,7 +2371,37 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ } + if (engine->rtp_session && ((val = switch_channel_get_variable(smh->session->channel, + type == SWITCH_MEDIA_TYPE_VIDEO ? + "rtcp_video_interval_msec" : "rtcp_audio_interval_msec")) + || (val = type == SWITCH_MEDIA_TYPE_VIDEO ? + smh->mparams->rtcp_video_interval_msec : smh->mparams->rtcp_audio_interval_msec))) { + + const char *rport = switch_channel_get_variable(smh->session->channel, + type == SWITCH_MEDIA_TYPE_VIDEO ? "rtp_remote_video_rtcp_port" : "rtp_remote_audio_rtcp_port"); + switch_port_t remote_rtcp_port = engine->remote_rtcp_port; + if (!remote_rtcp_port && rport) { + remote_rtcp_port = (switch_port_t)atoi(rport); + } + + if (!strcasecmp(val, "passthru")) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_INFO, "Activating %s RTCP PASSTHRU PORT %d\n", + type2str(type), remote_rtcp_port); + switch_rtp_activate_rtcp(engine->rtp_session, -1, remote_rtcp_port, engine->rtcp_mux > 0); + } else { + int interval = atoi(val); + if (interval < 100 || interval > 500000) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_ERROR, + "Invalid rtcp interval spec [%d] must be between 100 and 500000\n", interval); + interval = 10000; + } + + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_INFO, "Activating %s RTCP PORT %d\n", type2str(type), remote_rtcp_port); + switch_rtp_activate_rtcp(engine->rtp_session, interval, remote_rtcp_port, engine->rtcp_mux > 0); + } + } + if (engine->ice_in.cands[engine->ice_in.chosen[1]][1].ready) { if (!strcmp(engine->ice_in.cands[engine->ice_in.chosen[1]][1].con_addr, engine->ice_in.cands[engine->ice_in.chosen[0]][0].con_addr) && engine->ice_in.cands[engine->ice_in.chosen[1]][1].con_port == engine->ice_in.cands[engine->ice_in.chosen[0]][0].con_port) { @@ -2313,7 +2419,7 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ ICE_GOOGLE_JINGLE, NULL #else - switch_channel_direction(smh->session->channel) == + switch_ice_direction(smh->session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &engine->ice_in #endif @@ -3350,6 +3456,116 @@ SWITCH_DECLARE(int) switch_core_media_toggle_hold(switch_core_session_t *session return changed; } +static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, void *obj) +{ + struct media_helper *mh = obj; + switch_core_session_t *session = mh->session; + switch_channel_t *channel = switch_core_session_get_channel(session); + switch_status_t status; + switch_frame_t *read_frame; + switch_media_handle_t *smh; + + if (!(smh = session->media_handle)) { + return NULL; + } + + switch_core_session_read_lock(session); + + mh->up = 1; + switch_mutex_lock(mh->cond_mutex); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread started. Echo is %s\n", + switch_channel_get_name(session->channel), switch_channel_test_flag(channel, CF_VIDEO_ECHO) ? "on" : "off"); + switch_core_session_refresh_video(session); + + while (switch_channel_up_nosig(channel)) { + + if (switch_channel_test_flag(channel, CF_VIDEO_PASSIVE)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread paused. Echo is %s\n", + switch_channel_get_name(session->channel), switch_channel_test_flag(channel, CF_VIDEO_ECHO) ? "on" : "off"); + switch_thread_cond_wait(mh->cond, mh->cond_mutex); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread resumed Echo is %s\n", + switch_channel_get_name(session->channel), switch_channel_test_flag(channel, CF_VIDEO_ECHO) ? "on" : "off"); + switch_core_session_refresh_video(session); + } + + if (switch_channel_test_flag(channel, CF_VIDEO_PASSIVE)) { + continue; + } + + if (!switch_channel_media_up(session->channel)) { + switch_yield(10000); + continue; + } + + + status = switch_core_session_read_video_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); + + if (!SWITCH_READ_ACCEPTABLE(status)) { + switch_cond_next(); + continue; + } + + + if (switch_channel_test_flag(channel, CF_VIDEO_REFRESH_REQ)) { + switch_core_session_refresh_video(session); + switch_channel_clear_flag(channel, CF_VIDEO_REFRESH_REQ); + } + + if (switch_test_flag(read_frame, SFF_CNG)) { + continue; + } + + if (switch_channel_test_flag(channel, CF_VIDEO_ECHO)) { + switch_core_session_write_video_frame(session, read_frame, SWITCH_IO_FLAG_NONE, 0); + } + + } + + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread ended\n", switch_channel_get_name(session->channel)); + + switch_mutex_unlock(mh->cond_mutex); + switch_core_session_rwunlock(session); + + mh->up = 0; + return NULL; +} + + +static switch_status_t start_video_thread(switch_core_session_t *session) +{ + switch_threadattr_t *thd_attr = NULL; + switch_memory_pool_t *pool = switch_core_session_get_pool(session); + switch_rtp_engine_t *v_engine = NULL; + switch_media_handle_t *smh; + + if (!(smh = session->media_handle)) { + return SWITCH_STATUS_FALSE; + } + + v_engine = &smh->engines[SWITCH_MEDIA_TYPE_VIDEO]; + + if (v_engine->media_thread) { + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "%s Starting Video thread\n", switch_core_session_get_name(session)); + + switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->codec_params.agreed_pt); + v_engine->mh.session = session; + switch_threadattr_create(&thd_attr, pool); + switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); + + switch_thread_cond_create(&v_engine->mh.cond, pool); + switch_mutex_init(&v_engine->mh.cond_mutex, SWITCH_MUTEX_NESTED, pool); + switch_mutex_init(&v_engine->read_mutex, SWITCH_MUTEX_NESTED, pool); + switch_thread_create(&v_engine->media_thread, thd_attr, video_helper_thread, &v_engine->mh, switch_core_session_get_pool(session)); + + return SWITCH_STATUS_SUCCESS; +} + + //? #define RA_PTR_LEN 512 @@ -3470,7 +3686,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_proxy_remote_addr(switch_core_ } } - + if (switch_rtp_set_remote_address(v_engine->rtp_session, v_engine->codec_params.remote_sdp_ip, v_engine->codec_params.remote_sdp_port, remote_rtcp_port, SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "VIDEO RTP REPORTS ERROR: [%s]\n", err); @@ -3482,6 +3698,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_proxy_remote_addr(switch_core_ !switch_channel_test_flag(session->channel, CF_WEBRTC)) { /* Reactivate the NAT buster flag. */ switch_rtp_set_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + start_video_thread(session); + } if (switch_media_handle_test_media_flag(smh, SCMF_AUTOFIX_TIMING) || switch_media_handle_test_media_flag(smh, SCMF_AUTOFIX_PT)) { v_engine->check_frames = 0; @@ -3735,6 +3953,24 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_choose_port(switch_core_sessio return SWITCH_STATUS_SUCCESS; } +SWITCH_DECLARE(switch_status_t) switch_core_media_choose_ports(switch_core_session_t *session, switch_bool_t audio, switch_bool_t video) +{ + switch_status_t status = SWITCH_STATUS_SUCCESS; + + if (audio && (status = switch_core_media_choose_port(session, SWITCH_MEDIA_TYPE_AUDIO, 0)) == SWITCH_STATUS_SUCCESS) { + if (video) { + switch_core_media_check_video_codecs(session); + if (switch_channel_test_flag(session->channel, CF_VIDEO_POSSIBLE)) { + switch_core_media_choose_port(session, SWITCH_MEDIA_TYPE_VIDEO, 0); + } + } + } + + return status; +} + + + //? SWITCH_DECLARE(void) switch_core_media_deactivate_rtp(switch_core_session_t *session) { @@ -3882,85 +4118,28 @@ SWITCH_DECLARE(void) switch_core_session_wake_video_thread(switch_core_session_t } } -static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, void *obj) +static void check_dtls_reinvite(switch_core_session_t *session, switch_rtp_engine_t *engine) { - struct media_helper *mh = obj; - switch_core_session_t *session = mh->session; - switch_channel_t *channel = switch_core_session_get_channel(session); - switch_status_t status; - switch_frame_t *read_frame; - switch_media_handle_t *smh; + if (switch_channel_test_flag(session->channel, CF_REINVITE)) { - if (!(smh = session->media_handle)) { - return NULL; + if (!zstr(engine->local_dtls_fingerprint.str) && switch_rtp_has_dtls() && dtls_ok(session)) { + dtls_type_t xtype, dtype = switch_ice_direction(session) == SWITCH_CALL_DIRECTION_INBOUND ? DTLS_TYPE_CLIENT : DTLS_TYPE_SERVER; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "RE-SETTING %s DTLS\n", type2str(engine->type)); + + xtype = DTLS_TYPE_RTP; + if (engine->rtcp_mux > 0) xtype |= DTLS_TYPE_RTCP; + + switch_rtp_add_dtls(engine->rtp_session, &engine->local_dtls_fingerprint, &engine->remote_dtls_fingerprint, dtype | xtype); + + if (engine->rtcp_mux < 1) { + xtype = DTLS_TYPE_RTCP; + switch_rtp_add_dtls(engine->rtp_session, &engine->local_dtls_fingerprint, &engine->remote_dtls_fingerprint, dtype | xtype); + } + + } } - - switch_core_session_read_lock(session); - - mh->up = 1; - switch_mutex_lock(mh->cond_mutex); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread started. Echo is %s\n", - switch_channel_get_name(session->channel), switch_channel_test_flag(channel, CF_VIDEO_ECHO) ? "on" : "off"); - switch_core_session_refresh_video(session); - - while (switch_channel_up_nosig(channel)) { - - if (switch_channel_test_flag(channel, CF_VIDEO_PASSIVE)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread paused. Echo is %s\n", - switch_channel_get_name(session->channel), switch_channel_test_flag(channel, CF_VIDEO_ECHO) ? "on" : "off"); - switch_thread_cond_wait(mh->cond, mh->cond_mutex); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread resumed Echo is %s\n", - switch_channel_get_name(session->channel), switch_channel_test_flag(channel, CF_VIDEO_ECHO) ? "on" : "off"); - switch_core_session_refresh_video(session); - } - - if (switch_channel_test_flag(channel, CF_VIDEO_PASSIVE)) { - continue; - } - - if (!switch_channel_media_up(session->channel)) { - switch_yield(10000); - continue; - } - - - status = switch_core_session_read_video_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); - - if (!SWITCH_READ_ACCEPTABLE(status)) { - switch_cond_next(); - continue; - } - - - if (switch_channel_test_flag(channel, CF_VIDEO_REFRESH_REQ)) { - switch_core_session_refresh_video(session); - switch_channel_clear_flag(channel, CF_VIDEO_REFRESH_REQ); - } - - if (switch_test_flag(read_frame, SFF_CNG)) { - continue; - } - - if (switch_channel_test_flag(channel, CF_VIDEO_ECHO)) { - switch_core_session_write_video_frame(session, read_frame, SWITCH_IO_FLAG_NONE, 0); - } - - } - - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread ended\n", switch_channel_get_name(session->channel)); - - switch_mutex_unlock(mh->cond_mutex); - switch_core_session_rwunlock(session); - - mh->up = 0; - return NULL; } - - - //? SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_session_t *session) @@ -4151,6 +4330,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi switch_rtp_set_flag(a_engine->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); } } + + if (session && a_engine) { + check_dtls_reinvite(session, a_engine); + } + goto video; } @@ -4278,7 +4462,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_channel_direction(session->channel) == + switch_ice_direction(session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &a_engine->ice_in #endif @@ -4331,7 +4515,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_channel_direction(session->channel) == + switch_ice_direction(session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &a_engine->ice_in #endif @@ -4373,6 +4557,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi } } + if (jb_msec < 0 && jb_msec > -10) { + jb_msec = (a_engine->read_codec.implementation->microseconds_per_packet / 1000) * abs(jb_msec); + } + if (jb_msec < 20 || jb_msec > 10000) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid Jitterbuffer spec [%d] must be between 20 and 10000\n", jb_msec); @@ -4535,7 +4723,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi v_engine->codec_params.remote_sdp_port, v_engine->codec_params.agreed_pt, a_engine->read_impl.microseconds_per_packet / 1000); - + start_video_thread(session); switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->codec_params.agreed_pt); } } @@ -4549,7 +4737,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi const char *rport = NULL; switch_port_t remote_rtcp_port = v_engine->remote_rtcp_port; - switch_channel_clear_flag(session->channel, CF_REINVITE); + //switch_channel_clear_flag(session->channel, CF_REINVITE); if (!remote_rtcp_port) { if ((rport = switch_channel_get_variable(session->channel, "rtp_remote_video_rtcp_port"))) { @@ -4568,6 +4756,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi !((val = switch_channel_get_variable(session->channel, "disable_rtp_auto_adjust")) && switch_true(val))) { /* Reactivate the NAT buster flag. */ switch_rtp_set_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + start_video_thread(session); } } @@ -4655,18 +4844,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi if (switch_rtp_ready(v_engine->rtp_session)) { - switch_threadattr_t *thd_attr = NULL; - switch_memory_pool_t *pool = switch_core_session_get_pool(session); - - switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->codec_params.agreed_pt); - v_engine->mh.session = session; - switch_threadattr_create(&thd_attr, pool); - switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); - - switch_thread_cond_create(&v_engine->mh.cond, pool); - switch_mutex_init(&v_engine->mh.cond_mutex, SWITCH_MUTEX_NESTED, pool); - switch_mutex_init(&v_engine->read_mutex, SWITCH_MUTEX_NESTED, pool); - switch_thread_create(&v_engine->media_thread, thd_attr, video_helper_thread, &v_engine->mh, switch_core_session_get_pool(session)); + start_video_thread(session); } if (switch_rtp_ready(v_engine->rtp_session)) { @@ -4700,7 +4878,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_channel_direction(session->channel) == + switch_ice_direction(session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &v_engine->ice_in #endif @@ -4750,7 +4928,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_channel_direction(session->channel) == + switch_ice_direction(session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &v_engine->ice_in @@ -4819,6 +4997,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi video_up: + if (session && v_engine) { + check_dtls_reinvite(session, v_engine); + } + status = SWITCH_STATUS_SUCCESS; end: @@ -5275,7 +5457,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess switch_channel_clear_flag(smh->session->channel, CF_DTLS); } - if (switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { + if (switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND || switch_channel_test_flag(session->channel, CF_RECOVERING)) { if (!switch_channel_test_flag(session->channel, CF_WEBRTC) && switch_true(switch_channel_get_variable(session->channel, "media_webrtc"))) { switch_channel_set_flag(session->channel, CF_WEBRTC); @@ -5460,6 +5642,10 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess rate = a_engine->codec_params.rm_rate; + if (!strcasecmp(a_engine->codec_params.rm_encoding, "opus")) { + a_engine->codec_params.adv_channels = 2; + } + if (a_engine->codec_params.adv_channels > 1) { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d/%d\n", a_engine->codec_params.agreed_pt, a_engine->codec_params.rm_encoding, rate, a_engine->codec_params.adv_channels); @@ -5577,7 +5763,8 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess } - if (a_engine->rtcp_mux < 1 || switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { + if (a_engine->rtcp_mux < 1 || switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND || + switch_channel_test_flag(session->channel, CF_RECOVERING)) { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=candidate:%s 2 %s %u %s %d typ host generation 0\n", tmp1, ice_out->cands[0][0].transport, c2, @@ -5765,7 +5952,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess if (v_engine->codec_params.rm_encoding) { const char *of; - + if (!strcasecmp(v_engine->codec_params.rm_encoding, "VP8")) { vp8 = v_engine->codec_params.pt; } @@ -5866,7 +6053,8 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess } - if (switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND && switch_channel_test_flag(smh->session->channel, CF_DTLS)) { + if ((switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND || switch_channel_test_flag(session->channel, CF_RECOVERING)) + && switch_channel_test_flag(smh->session->channel, CF_DTLS)) { generate_local_fingerprint(smh, SWITCH_MEDIA_TYPE_VIDEO); } @@ -5949,7 +6137,8 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess } - if (v_engine->rtcp_mux < 1 || switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { + if (v_engine->rtcp_mux < 1 || switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND || + switch_channel_test_flag(session->channel, CF_RECOVERING)) { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=candidate:%s 2 %s %u %s %d typ host generation 0\n", tmp1, ice_out->cands[0][0].transport, c2, @@ -7607,8 +7796,6 @@ SWITCH_DECLARE (void) switch_core_media_recover_session(switch_core_session_t *s ip = switch_channel_get_variable(session->channel, SWITCH_LOCAL_MEDIA_IP_VARIABLE); port = switch_channel_get_variable(session->channel, SWITCH_LOCAL_MEDIA_PORT_VARIABLE); - switch_channel_set_flag(session->channel, CF_RECOVERING); - if (switch_channel_test_flag(session->channel, CF_PROXY_MODE) || !(ip && port)) { return; } else { @@ -7728,7 +7915,7 @@ SWITCH_DECLARE (void) switch_core_media_recover_session(switch_core_session_t *s switch_core_session_get_recovery_crypto_key(session, SWITCH_MEDIA_TYPE_VIDEO); - if ((tmp = switch_channel_get_variable(session->channel, "rtp_last_audio_local_crypto_key"))) { + if ((tmp = switch_channel_get_variable(session->channel, "rtp_last_audio_local_crypto_key")) && a_engine->ssec.remote_crypto_key) { int idx = atoi(tmp); a_engine->ssec.local_crypto_key = switch_core_session_strdup(session, tmp); diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 430b20d013..52cb871aa9 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -445,17 +445,26 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(const char *uuid_ } -SWITCH_DECLARE(void *) switch_core_session_get_private(switch_core_session_t *session) +SWITCH_DECLARE(void *) switch_core_session_get_private_class(switch_core_session_t *session, switch_pvt_class_t index) { + if (index >= SWITCH_CORE_SESSION_MAX_PRIVATES) { + return NULL; + } + switch_assert(session != NULL); - return session->private_info; + return session->private_info[index]; } -SWITCH_DECLARE(switch_status_t) switch_core_session_set_private(switch_core_session_t *session, void *private_info) +SWITCH_DECLARE(switch_status_t) switch_core_session_set_private_class(switch_core_session_t *session, void *private_info, switch_pvt_class_t index) { switch_assert(session != NULL); - session->private_info = private_info; + + if (index >= SWITCH_CORE_SESSION_MAX_PRIVATES) { + return SWITCH_STATUS_FALSE; + } + + session->private_info[index] = private_info; return SWITCH_STATUS_SUCCESS; } diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c index a9c8d22fbc..7dd02df818 100644 --- a/src/switch_core_sqldb.c +++ b/src/switch_core_sqldb.c @@ -2717,14 +2717,35 @@ static int recover_callback(void *pArg, int argc, char **argv, char **columnName if (ep->recover_callback) { switch_caller_extension_t *extension = NULL; + switch_channel_t *channel = switch_core_session_get_channel(session); + int r = 0; + if ((r = ep->recover_callback(session)) > 0) { + const char *cbname; - if (ep->recover_callback(session) > 0) { - switch_channel_t *channel = switch_core_session_get_channel(session); + switch_channel_set_flag(session->channel, CF_RECOVERING); + if (switch_channel_get_partner_uuid(channel)) { switch_channel_set_flag(channel, CF_RECOVERING_BRIDGE); - } else { + } + + switch_core_media_recover_session(session); + + if ((cbname = switch_channel_get_variable(channel, "secondary_recovery_module"))) { + switch_core_recover_callback_t recover_callback; + + if ((recover_callback = switch_core_get_secondary_recover_callback(cbname))) { + r = recover_callback(session); + } + } + + + } + + if (r > 0) { + + if (!switch_channel_test_flag(channel, CF_RECOVERING_BRIDGE)) { switch_xml_t callflow, param, x_extension; if ((extension = switch_caller_extension_new(session, "recovery", "recovery")) == 0) { abort(); diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c index 5926e52586..6de6b9798e 100644 --- a/src/switch_core_state_machine.c +++ b/src/switch_core_state_machine.c @@ -38,6 +38,16 @@ static void switch_core_standard_on_init(switch_core_session_t *session) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Standard INIT\n", switch_channel_get_name(session->channel)); + + if (switch_channel_test_flag(session->channel, CF_RECOVERING_BRIDGE)) { + switch_channel_set_state(session->channel, CS_RESET); + } else { + if (switch_channel_test_flag(session->channel, CF_RECOVERING)) { + switch_channel_set_state(session->channel, CS_EXECUTE); + } else { + switch_channel_set_state(session->channel, CS_ROUTING); + } + } } static void switch_core_standard_on_hangup(switch_core_session_t *session) @@ -104,6 +114,43 @@ static void switch_core_standard_on_reset(switch_core_session_t *session) switch_channel_set_variable(session->channel, "call_uuid", switch_core_session_get_uuid(session)); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Standard RESET\n", switch_channel_get_name(session->channel)); + + if (switch_channel_test_flag(session->channel, CF_RECOVERING_BRIDGE)) { + switch_core_session_t *other_session = NULL; + const char *uuid = switch_core_session_get_uuid(session); + + if (switch_channel_test_flag(session->channel, CF_BRIDGE_ORIGINATOR)) { + const char *other_uuid = switch_channel_get_partner_uuid(session->channel); + int x = 0; + + if (other_uuid) { + for (x = 0; other_session == NULL && x < 20; x++) { + if (!switch_channel_up(session->channel)) { + break; + } + other_session = switch_core_session_locate(other_uuid); + switch_yield(100000); + } + } + + if (other_session) { + switch_channel_t *other_channel = switch_core_session_get_channel(other_session); + switch_channel_clear_flag(session->channel, CF_BRIDGE_ORIGINATOR); + switch_channel_wait_for_state_timeout(other_channel, CS_RESET, 5000); + switch_channel_wait_for_flag(other_channel, CF_MEDIA_ACK, SWITCH_TRUE, 2000, NULL); + + if (switch_channel_test_flag(session->channel, CF_PROXY_MODE) && switch_channel_test_flag(other_channel, CF_PROXY_MODE)) { + switch_ivr_signal_bridge(session, other_session); + } else { + switch_ivr_uuid_bridge(uuid, other_uuid); + } + switch_core_session_rwunlock(other_session); + } + } + + switch_channel_clear_flag(session->channel, CF_RECOVERING_BRIDGE); + } + } static void switch_core_standard_on_routing(switch_core_session_t *session) @@ -208,6 +255,8 @@ static void switch_core_standard_on_execute(switch_core_session_t *session) switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Standard EXECUTE\n", switch_channel_get_name(session->channel)); + switch_channel_clear_flag(session->channel, CF_RECOVERING); + switch_channel_set_variable(session->channel, "call_uuid", switch_core_session_get_uuid(session)); if (switch_channel_get_variable(session->channel, "recovered") && !switch_channel_test_flag(session->channel, CF_RECOVERED)) { diff --git a/src/switch_event.c b/src/switch_event.c index 080a331dcd..926b3d85f6 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -67,6 +67,15 @@ struct switch_event_subclass { int bind; }; + +static struct { + switch_event_channel_id_t ID; + switch_thread_rwlock_t *rwlock; + switch_hash_t *hash; + switch_hash_t *lahash; + switch_mutex_t *lamutex; +} event_channel_manager; + #define MAX_DISPATCH_VAL 64 static unsigned int MAX_DISPATCH = MAX_DISPATCH_VAL; static unsigned int SOFT_MAX_DISPATCH = 0; @@ -81,10 +90,12 @@ static switch_memory_pool_t *THRUNTIME_POOL = NULL; static switch_thread_t *EVENT_DISPATCH_QUEUE_THREADS[MAX_DISPATCH_VAL] = { 0 }; static uint8_t EVENT_DISPATCH_QUEUE_RUNNING[MAX_DISPATCH_VAL] = { 0 }; static switch_queue_t *EVENT_DISPATCH_QUEUE = NULL; +static switch_queue_t *EVENT_CHANNEL_DISPATCH_QUEUE = NULL; static switch_mutex_t *EVENT_QUEUE_MUTEX = NULL; static switch_hash_t *CUSTOM_HASH = NULL; static int THREAD_COUNT = 0; static int DISPATCH_THREAD_COUNT = 0; +static int EVENT_CHANNEL_DISPATCH_THREAD_COUNT = 0; static int SYSTEM_RUNNING = 0; static uint64_t EVENT_SEQUENCE_NR = 0; #ifdef SWITCH_EVENT_RECYCLE @@ -92,6 +103,8 @@ static switch_queue_t *EVENT_RECYCLE_QUEUE = NULL; static switch_queue_t *EVENT_HEADER_RECYCLE_QUEUE = NULL; #endif +static void unsub_all_switch_event_channel(void); + static char *my_dup(const char *s) { size_t len = strlen(s) + 1; @@ -518,6 +531,13 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void) SYSTEM_RUNNING = 0; switch_mutex_unlock(EVENT_QUEUE_MUTEX); + unsub_all_switch_event_channel(); + + if (EVENT_CHANNEL_DISPATCH_QUEUE) { + switch_queue_trypush(EVENT_CHANNEL_DISPATCH_QUEUE, NULL); + switch_queue_interrupt_all(EVENT_CHANNEL_DISPATCH_QUEUE); + } + if (runtime.events_use_dispatch) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch queues\n"); @@ -565,6 +585,8 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void) } } + switch_core_hash_destroy(&event_channel_manager.lahash); + switch_core_hash_destroy(&CUSTOM_HASH); switch_core_memory_reclaim_events(); @@ -633,14 +655,6 @@ SWITCH_DECLARE(void) switch_event_launch_dispatch_threads(uint32_t max) SWITCH_DECLARE(switch_status_t) switch_event_init(switch_memory_pool_t *pool) { - //switch_threadattr_t *thd_attr; - - /* - This statement doesn't do anything commenting it out for now. - - switch_assert(switch_arraylen(EVENT_NAMES) == SWITCH_EVENT_ALL + 1); - */ - /* don't need any more dispatch threads than we have CPU's*/ MAX_DISPATCH = (switch_core_cpu_count() / 2) + 1; if (MAX_DISPATCH < 2) { @@ -656,6 +670,13 @@ SWITCH_DECLARE(switch_status_t) switch_event_init(switch_memory_pool_t *pool) switch_mutex_init(&EVENT_QUEUE_MUTEX, SWITCH_MUTEX_NESTED, RUNTIME_POOL); switch_core_hash_init(&CUSTOM_HASH, RUNTIME_POOL); + switch_core_hash_init(&event_channel_manager.lahash, RUNTIME_POOL); + switch_mutex_init(&event_channel_manager.lamutex, SWITCH_MUTEX_NESTED, RUNTIME_POOL); + + switch_thread_rwlock_create(&event_channel_manager.rwlock, RUNTIME_POOL); + switch_core_hash_init(&event_channel_manager.hash, RUNTIME_POOL); + event_channel_manager.ID = 1; + switch_mutex_lock(EVENT_QUEUE_MUTEX); SYSTEM_RUNNING = -1; switch_mutex_unlock(EVENT_QUEUE_MUTEX); @@ -1733,13 +1754,11 @@ SWITCH_DECLARE(switch_status_t) switch_event_create_json(switch_event_t **event, return SWITCH_STATUS_SUCCESS; } -SWITCH_DECLARE(switch_status_t) switch_event_serialize_json(switch_event_t *event, char **str) +SWITCH_DECLARE(switch_status_t) switch_event_serialize_json_obj(switch_event_t *event, cJSON **json) { switch_event_header_t *hp; cJSON *cj; - *str = NULL; - cj = cJSON_CreateObject(); for (hp = event->headers; hp; hp = hp->next) { @@ -1768,12 +1787,27 @@ SWITCH_DECLARE(switch_status_t) switch_event_serialize_json(switch_event_t *even cJSON_AddItemToObject(cj, "_body", cJSON_CreateString(event->body)); } - *str = cJSON_Print(cj); - cJSON_Delete(cj); + *json = cj; return SWITCH_STATUS_SUCCESS; } +SWITCH_DECLARE(switch_status_t) switch_event_serialize_json(switch_event_t *event, char **str) +{ + + cJSON *cj; + *str = NULL; + + if (switch_event_serialize_json_obj(event, &cj) == SWITCH_STATUS_SUCCESS) { + *str = cJSON_PrintUnformatted(cj); + cJSON_Delete(cj); + + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; +} + static switch_xml_t add_xml_header(switch_xml_t xml, char *name, char *value, int offset) { switch_xml_t header = switch_xml_add_child_d(xml, name, offset); @@ -2528,6 +2562,36 @@ SWITCH_DECLARE(int) switch_event_check_permission_list(switch_event_t *list, con return r; } +SWITCH_DECLARE(void) switch_json_add_presence_data_cols(switch_event_t *event, cJSON *json, const char *prefix) +{ + const char *data; + + if (!prefix) prefix = ""; + + if ((data = switch_event_get_header(event, "presence_data_cols"))) { + char *cols[128] = { 0 }; + char header_name[128] = ""; + int col_count = 0, i = 0; + char *data_copy = NULL; + + data_copy = strdup(data); + + col_count = switch_split(data_copy, ':', cols); + + for (i = 0; i < col_count; i++) { + const char *val = NULL; + switch_snprintf(header_name, sizeof(header_name), "%s%s", prefix, cols[i]); + + val = switch_event_get_header(event, cols[i]); + json_add_child_string(json, header_name, val); + } + + switch_safe_free(data_copy); + } + +} + + SWITCH_DECLARE(void) switch_event_add_presence_data_cols(switch_channel_t *channel, switch_event_t *event, const char *prefix) { const char *data; @@ -2557,6 +2621,792 @@ SWITCH_DECLARE(void) switch_event_add_presence_data_cols(switch_channel_t *chann } +struct switch_event_channel_sub_node_head_s; + +typedef struct switch_event_channel_sub_node_s { + switch_event_channel_func_t func; + switch_event_channel_id_t id; + struct switch_event_channel_sub_node_head_s *head; + struct switch_event_channel_sub_node_s *next; +} switch_event_channel_sub_node_t; + +typedef struct switch_event_channel_sub_node_head_s { + switch_event_channel_sub_node_t *node; + switch_event_channel_sub_node_t *tail; + char *event_channel; +} switch_event_channel_sub_node_head_t; + +static uint32_t switch_event_channel_unsub_head(switch_event_channel_func_t func, switch_event_channel_sub_node_head_t *head) +{ + uint32_t x = 0; + + switch_event_channel_sub_node_t *thisnp = NULL, *np, *last = NULL; + + np = head->tail = head->node; + + while (np) { + + thisnp = np; + np = np->next; + + if (!func || thisnp->func == func) { + x++; + + if (last) { + last->next = np; + } else { + head->node = np; + } + + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "UNSUBBING %p [%s]\n", (void *)(intptr_t)thisnp->func, thisnp->head->event_channel); + + + thisnp->func = NULL; + free(thisnp); + } else { + last = thisnp; + head->tail = last; + } + } + + return x; +} + +static void unsub_all_switch_event_channel(void) +{ + switch_hash_index_t *hi; + void *val; + switch_event_channel_sub_node_head_t *head; + + switch_thread_rwlock_wrlock(event_channel_manager.rwlock); + top: + head = NULL; + + for (hi = switch_hash_first(NULL, event_channel_manager.hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, NULL, NULL, &val); + head = (switch_event_channel_sub_node_head_t *) val; + switch_event_channel_unsub_head(NULL, head); + switch_core_hash_delete(event_channel_manager.hash, head->event_channel); + free(head->event_channel); + free(head); + goto top; + } + + switch_thread_rwlock_unlock(event_channel_manager.rwlock); +} + +static uint32_t switch_event_channel_unsub_channel(switch_event_channel_func_t func, const char *event_channel) +{ + switch_event_channel_sub_node_head_t *head; + uint32_t x = 0; + + switch_thread_rwlock_wrlock(event_channel_manager.rwlock); + + if (!event_channel) { + switch_hash_index_t *hi; + void *val; + + for (hi = switch_hash_first(NULL, event_channel_manager.hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, NULL, NULL, &val); + + if (val) { + head = (switch_event_channel_sub_node_head_t *) val; + x += switch_event_channel_unsub_head(func, head); + } + } + + } else { + if ((head = switch_core_hash_find(event_channel_manager.hash, event_channel))) { + x += switch_event_channel_unsub_head(func, head); + } + } + + switch_thread_rwlock_unlock(event_channel_manager.rwlock); + + return x; +} + +static switch_status_t switch_event_channel_sub_channel(const char *event_channel, switch_event_channel_func_t func, switch_event_channel_id_t id) + +{ + switch_event_channel_sub_node_t *node, *np; + switch_event_channel_sub_node_head_t *head; + switch_status_t status = SWITCH_STATUS_FALSE; + + switch_thread_rwlock_wrlock(event_channel_manager.rwlock); + + if (!(head = switch_core_hash_find(event_channel_manager.hash, event_channel))) { + switch_zmalloc(head, sizeof(*head)); + head->event_channel = strdup(event_channel); + switch_core_hash_insert(event_channel_manager.hash, event_channel, head); + + switch_zmalloc(node, sizeof(*node)); + node->func = func; + node->id = id; + + node->head = head; + head->node = node; + head->tail = node; + status = SWITCH_STATUS_SUCCESS; + } else { + int exist = 0; + + for (np = head->node; np; np = np->next) { + if (np->func == func) { + exist = 1; + break; + } + } + + if (!exist) { + switch_zmalloc(node, sizeof(*node)); + + node->func = func; + node->id = id; + node->head = head; + + + if (!head->node) { + head->node = node; + head->tail = node; + } else { + head->tail->next = node; + head->tail = head->tail->next; + } + status = SWITCH_STATUS_SUCCESS; + } + } + + switch_thread_rwlock_unlock(event_channel_manager.rwlock); + + return status; +} + +typedef struct { + char *event_channel; + cJSON *json; + char *key; + switch_event_channel_id_t id; +} event_channel_data_t; + + + +static uint32_t _switch_event_channel_broadcast(const char *event_channel, const char *broadcast_channel, + cJSON *json, const char *key, switch_event_channel_id_t id) +{ + switch_event_channel_sub_node_t *np; + switch_event_channel_sub_node_head_t *head; + uint32_t x = 0; + + switch_thread_rwlock_rdlock(event_channel_manager.rwlock); + if ((head = switch_core_hash_find(event_channel_manager.hash, event_channel))) { + for (np = head->node; np; np = np->next) { + if (np->id == id) { + continue; + } + np->func(broadcast_channel, json, key, id); + x++; + } + } + switch_thread_rwlock_unlock(event_channel_manager.rwlock); + + return x; +} + +static void destroy_ecd(event_channel_data_t **ecdP) +{ + event_channel_data_t *ecd = *ecdP; + *ecdP = NULL; + + switch_safe_free(ecd->event_channel); + switch_safe_free(ecd->key); + if (ecd->json) { + cJSON_Delete(ecd->json); + ecd->json = NULL; + } + + free(ecd); +} + +static void ecd_deliver(event_channel_data_t **ecdP) +{ + event_channel_data_t *ecd = *ecdP; + char *p; + + *ecdP = NULL; + + _switch_event_channel_broadcast(ecd->event_channel, ecd->event_channel, ecd->json, ecd->key, ecd->id); + + if ((p = strchr(ecd->event_channel, '.'))) { + char *main_channel = strdup(ecd->event_channel); + p = strchr(main_channel, '.'); + *p = '\0'; + _switch_event_channel_broadcast(main_channel, ecd->event_channel, ecd->json, ecd->key, ecd->id); + free(main_channel); + } + _switch_event_channel_broadcast(SWITCH_EVENT_CHANNEL_GLOBAL, ecd->event_channel, ecd->json, ecd->key, ecd->id); + + destroy_ecd(&ecd); +} + +static void *SWITCH_THREAD_FUNC switch_event_channel_deliver_thread(switch_thread_t *thread, void *obj) +{ + switch_queue_t *queue = (switch_queue_t *) obj; + void *pop = NULL; + event_channel_data_t *ecd = NULL; + + switch_mutex_lock(EVENT_QUEUE_MUTEX); + THREAD_COUNT++; + EVENT_CHANNEL_DISPATCH_THREAD_COUNT++; + switch_mutex_unlock(EVENT_QUEUE_MUTEX); + + while(SYSTEM_RUNNING) { + + if (switch_queue_pop(queue, &pop) != SWITCH_STATUS_SUCCESS) { + continue; + } + + if (!pop) { + break; + } + + ecd = (event_channel_data_t *) pop; + ecd_deliver(&ecd); + switch_os_yield(); + } + + while (switch_queue_trypop(queue, &pop) == SWITCH_STATUS_SUCCESS) { + ecd = (event_channel_data_t *) pop; + destroy_ecd(&ecd); + } + + switch_mutex_lock(EVENT_QUEUE_MUTEX); + THREAD_COUNT--; + EVENT_CHANNEL_DISPATCH_THREAD_COUNT--; + switch_mutex_unlock(EVENT_QUEUE_MUTEX); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Event Channel Dispatch Thread Ended.\n"); + return NULL; +} + +SWITCH_DECLARE(switch_status_t) switch_event_channel_broadcast(const char *event_channel, cJSON **json, const char *key, switch_event_channel_id_t id) +{ + event_channel_data_t *ecd = NULL; + switch_status_t status = SWITCH_STATUS_SUCCESS; + + if (!SYSTEM_RUNNING) { + cJSON_Delete(*json); + *json = NULL; + return SWITCH_STATUS_FALSE; + } + + switch_zmalloc(ecd, sizeof(*ecd)); + + ecd->event_channel = strdup(event_channel); + ecd->json = *json; + ecd->key = strdup(key); + ecd->id = id; + + *json = NULL; + + if (!EVENT_CHANNEL_DISPATCH_THREAD_COUNT && SYSTEM_RUNNING) { + switch_thread_data_t *td; + + if (!EVENT_CHANNEL_DISPATCH_QUEUE) { + switch_queue_create(&EVENT_CHANNEL_DISPATCH_QUEUE, DISPATCH_QUEUE_LEN * MAX_DISPATCH, THRUNTIME_POOL); + } + + td = malloc(sizeof(*td)); + switch_assert(td); + + td->alloc = 1; + td->func = switch_event_channel_deliver_thread; + td->obj = EVENT_CHANNEL_DISPATCH_QUEUE; + td->pool = NULL; + + switch_thread_pool_launch_thread(&td); + } + + if ((status = switch_queue_trypush(EVENT_CHANNEL_DISPATCH_QUEUE, ecd) != SWITCH_STATUS_SUCCESS)) { + cJSON_Delete(ecd->json); + ecd->json = NULL; + destroy_ecd(&ecd); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Event Channel Queue failure for channel %s\n", event_channel); + } else { + ecd = NULL; + } + + return status; +} + +SWITCH_DECLARE(uint32_t) switch_event_channel_unbind(const char *event_channel, switch_event_channel_func_t func) +{ + return switch_event_channel_unsub_channel(func, event_channel); +} + +SWITCH_DECLARE(switch_status_t) switch_event_channel_bind(const char *event_channel, switch_event_channel_func_t func, switch_event_channel_id_t *id) + +{ + switch_status_t status = SWITCH_STATUS_SUCCESS; + + switch_assert(id); + + if (!*id) { + switch_thread_rwlock_wrlock(event_channel_manager.rwlock); + *id = event_channel_manager.ID++; + switch_thread_rwlock_unlock(event_channel_manager.rwlock); + } + + status = switch_event_channel_sub_channel(event_channel, func, *id); + + return status; +} + +typedef struct la_node_s { + char *name; + cJSON *obj; + struct la_node_s *next; + int pos; +} la_node_t; + +struct switch_live_array_s { + char *event_channel; + char *name; + char *key; + la_node_t *head; + la_node_t *tail; + switch_memory_pool_t *pool; + switch_hash_t *hash; + switch_mutex_t *mutex; + uint32_t serno; + int pos; + switch_bool_t visible; + switch_bool_t new; + switch_event_channel_id_t channel_id; + switch_live_array_command_handler_t command_handler; + void *user_data; +}; + + +SWITCH_DECLARE(switch_status_t) switch_live_array_visible(switch_live_array_t *la, switch_bool_t visible, switch_bool_t force) +{ + switch_status_t status = SWITCH_STATUS_FALSE; + + switch_mutex_lock(la->mutex); + if (la->visible != visible || force) { + cJSON *msg, *data; + + msg = cJSON_CreateObject(); + data = json_add_child_obj(msg, "data", NULL); + + cJSON_AddItemToObject(msg, "eventChannel", cJSON_CreateString(la->event_channel)); + cJSON_AddItemToObject(data, "action", cJSON_CreateString(visible ? "hide" : "show")); + cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(la->serno++)); + + switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, la->channel_id); + + la->visible = visible; + } + switch_mutex_unlock(la->mutex); + + return status; +} + +SWITCH_DECLARE(switch_status_t) switch_live_array_clear(switch_live_array_t *la) +{ + la_node_t *cur, *np; + cJSON *msg, *data; + + switch_mutex_lock(la->mutex); + np = la->head; + + msg = cJSON_CreateObject(); + data = json_add_child_obj(msg, "data", NULL); + + cJSON_AddItemToObject(msg, "eventChannel", cJSON_CreateString(la->event_channel)); + cJSON_AddItemToObject(data, "action", cJSON_CreateString("clear")); + cJSON_AddItemToObject(data, "name", cJSON_CreateString(la->name)); + cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(-1)); + cJSON_AddItemToObject(data, "data", cJSON_CreateObject()); + + switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, la->channel_id); + + while(np) { + cur = np; + cJSON_Delete(cur->obj); + free(cur->name); + free(cur); + np = np->next; + } + + la->head = la->tail = NULL; + + switch_mutex_unlock(la->mutex); + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_DECLARE(switch_status_t) switch_live_array_bootstrap(switch_live_array_t *la, const char *sessid, switch_event_channel_id_t channel_id) +{ + la_node_t *np; + cJSON *msg, *data; + + switch_mutex_lock(la->mutex); + +#if OLD_WAY + msg = cJSON_CreateObject(); + data = json_add_child_obj(msg, "data", NULL); + + cJSON_AddItemToObject(msg, "eventChannel", cJSON_CreateString(la->event_channel)); + cJSON_AddItemToObject(data, "action", cJSON_CreateString("clear")); + cJSON_AddItemToObject(data, "name", cJSON_CreateString(la->name)); + cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(-1)); + cJSON_AddItemToObject(data, "data", cJSON_CreateObject()); + + switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, channel_id); + + for (np = la->head; np; np = np->next) { + msg = cJSON_CreateObject(); + data = json_add_child_obj(msg, "data", NULL); + + cJSON_AddItemToObject(msg, "eventChannel", cJSON_CreateString(la->event_channel)); + cJSON_AddItemToObject(data, "action", cJSON_CreateString("add")); + cJSON_AddItemToObject(data, "name", cJSON_CreateString(la->name)); + cJSON_AddItemToObject(data, "hashKey", cJSON_CreateString(np->name)); + cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(la->serno++)); + cJSON_AddItemToObject(data, "data", cJSON_Duplicate(np->obj, 1)); + if (sessid) { + cJSON_AddItemToObject(msg, "sessid", cJSON_CreateString(sessid)); + } + switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, channel_id); + } +#else + + + msg = cJSON_CreateObject(); + data = json_add_child_obj(msg, "data", NULL); + + cJSON_AddItemToObject(msg, "eventChannel", cJSON_CreateString(la->event_channel)); + cJSON_AddItemToObject(data, "action", cJSON_CreateString("bootObj")); + cJSON_AddItemToObject(data, "name", cJSON_CreateString(la->name)); + cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(la->serno++)); + + if (sessid) { + cJSON_AddItemToObject(msg, "sessid", cJSON_CreateString(sessid)); + } + + data = json_add_child_array(data, "data"); + + for (np = la->head; np; np = np->next) { + cJSON *row = cJSON_CreateArray(); + cJSON_AddItemToArray(row, cJSON_CreateString(np->name)); + cJSON_AddItemToArray(row, cJSON_Duplicate(np->obj, 1)); + cJSON_AddItemToArray(data, row); + } + + switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, channel_id); + + +#endif + + if (!la->visible) { + switch_live_array_visible(la, SWITCH_FALSE, SWITCH_TRUE); + } + + switch_mutex_unlock(la->mutex); + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_DECLARE(switch_status_t) switch_live_array_destroy(switch_live_array_t **live_arrayP) +{ + switch_live_array_t *la = *live_arrayP; + switch_memory_pool_t *pool; + + *live_arrayP = NULL; + + pool = la->pool; + + switch_live_array_clear(la); + + switch_core_hash_destroy(&la->hash); + + switch_mutex_lock(event_channel_manager.lamutex); + switch_core_hash_delete(event_channel_manager.lahash, la->key); + switch_mutex_unlock(event_channel_manager.lamutex); + + switch_core_destroy_memory_pool(&pool); + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_DECLARE(switch_bool_t) switch_live_array_isnew(switch_live_array_t *la) +{ + return la->new; +} + +SWITCH_DECLARE(switch_status_t) switch_live_array_create(const char *event_channel, const char *name, + switch_event_channel_id_t channel_id, switch_live_array_t **live_arrayP) +{ + switch_live_array_t *la = NULL; + switch_memory_pool_t *pool; + char *key = NULL; + + switch_core_new_memory_pool(&pool); + key = switch_core_sprintf(pool, "%s.%s", event_channel, name); + + switch_mutex_lock(event_channel_manager.lamutex); + la = switch_core_hash_find(event_channel_manager.lahash, key); + switch_mutex_unlock(event_channel_manager.lamutex); + + if (la) { + la->new = SWITCH_FALSE; + } else { + la = switch_core_alloc(pool, sizeof(*la)); + la->pool = pool; + la->serno = 1; + la->visible = SWITCH_TRUE; + la->event_channel = switch_core_strdup(la->pool, event_channel); + la->name = switch_core_strdup(la->pool, name); + la->key = key; + la->new = SWITCH_TRUE; + la->channel_id = channel_id; + switch_core_hash_init(&la->hash, la->pool); + switch_mutex_init(&la->mutex, SWITCH_MUTEX_NESTED, la->pool); + + switch_mutex_lock(event_channel_manager.lamutex); + switch_core_hash_insert(event_channel_manager.lahash, la->key, la); + switch_mutex_unlock(event_channel_manager.lamutex); + } + + *live_arrayP = la; + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_DECLARE(cJSON *) switch_live_array_get(switch_live_array_t *la, const char *name) +{ + la_node_t *node; + cJSON *dup = NULL; + + switch_mutex_lock(la->mutex); + if ((node = switch_core_hash_find(la->hash, name))) { + dup = cJSON_Duplicate(node->obj, 1); + } + switch_mutex_unlock(la->mutex); + + return dup; +} + +SWITCH_DECLARE(cJSON *) switch_live_array_get_idx(switch_live_array_t *la, int idx) +{ + la_node_t *node; + cJSON *dup = NULL; + + switch_mutex_lock(la->mutex); + for (node = la->head; node; node = node->next) { + if (node->pos == idx) { + dup = cJSON_Duplicate(node->obj, 1); + break; + } + } + switch_mutex_unlock(la->mutex); + + return dup; +} + +SWITCH_DECLARE(void) switch_live_array_lock(switch_live_array_t *la) +{ + switch_mutex_lock(la->mutex); +} + +SWITCH_DECLARE(void) switch_live_array_unlock(switch_live_array_t *la) +{ + switch_mutex_unlock(la->mutex); +} + +SWITCH_DECLARE(switch_status_t) switch_live_array_del(switch_live_array_t *la, const char *name) +{ + switch_status_t status = SWITCH_STATUS_FALSE; + la_node_t *node, *cur, *np, *last = NULL; + cJSON *msg, *data = NULL; + + switch_mutex_lock(la->mutex); + if ((node = switch_core_hash_find(la->hash, name))) { + np = la->head; + + while(np) { + cur = np; + np = np->next; + + if (cur == node) { + if (last) { + last->next = cur->next; + } else { + la->head = cur->next; + } + switch_core_hash_delete(la->hash, name); + + msg = cJSON_CreateObject(); + data = json_add_child_obj(msg, "data", NULL); + + cJSON_AddItemToObject(msg, "eventChannel", cJSON_CreateString(la->event_channel)); + cJSON_AddItemToObject(data, "name", cJSON_CreateString(la->name)); + cJSON_AddItemToObject(data, "action", cJSON_CreateString("del")); + cJSON_AddItemToObject(data, "hashKey", cJSON_CreateString(cur->name)); + cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(la->serno++)); + cJSON_AddItemToObject(data, "data", cur->obj); + cur->obj = NULL; + + switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, la->channel_id); + free(cur->name); + free(cur); + } else { + cur->pos = la->pos++; + la->tail = cur; + last = cur; + } + } + } + switch_mutex_unlock(la->mutex); + + return status; +} + +SWITCH_DECLARE(switch_status_t) switch_live_array_add(switch_live_array_t *la, const char *name, int index, cJSON **obj, switch_bool_t duplicate) +{ + la_node_t *node; + switch_status_t status = SWITCH_STATUS_SUCCESS; + const char *action = "add"; + cJSON *msg = NULL, *data = NULL; + + switch_mutex_lock(la->mutex); + + if ((node = switch_core_hash_find(la->hash, name))) { + + action = "modify"; + + if (node->obj) { + if (duplicate) { + cJSON_Delete(node->obj); + node->obj = NULL; + } + } + } else { + switch_zmalloc(node, sizeof(*node)); + + node->name = strdup(name); + switch_core_hash_insert(la->hash, name, node); + + if (index > -1 && index < la->pos && la->head) { + la_node_t *np, *last = NULL; + int i = 0; + + for(np = la->head; np; np = np->next) { + + if (i == index) { + if (last) { + node->next = last->next; + last->next = node; + np = node; + } else { + node->next = la->head; + la->head = node; + np = node; + } + } + + np->pos = i; + la->tail = np; + last = np; + i++; + } + + + } else { + + node->pos = la->pos++; + index = node->pos; + + if (!la->head) { + la->head = node; + } else { + la->tail->next = node; + } + + la->tail = node; + } + } + + if (duplicate) { + node->obj = cJSON_Duplicate(*obj, 1); + } else { + node->obj = *obj; + } + + msg = cJSON_CreateObject(); + data = json_add_child_obj(msg, "data", NULL); + + cJSON_AddItemToObject(msg, "eventChannel", cJSON_CreateString(la->event_channel)); + cJSON_AddItemToObject(data, "action", cJSON_CreateString(action)); + + if (index > -1) { + cJSON_AddItemToObject(data, "arrIndex", cJSON_CreateNumber(index)); + } + + cJSON_AddItemToObject(data, "name", cJSON_CreateString(la->name)); + cJSON_AddItemToObject(data, "hashKey", cJSON_CreateString(node->name)); + cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(la->serno++)); + cJSON_AddItemToObject(data, "data", cJSON_Duplicate(node->obj, 1)); + + switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, la->channel_id); + + switch_mutex_unlock(la->mutex); + + return status; +} + +SWITCH_DECLARE(void) switch_live_array_set_user_data(switch_live_array_t *la, void *user_data) +{ + switch_assert(la); + la->user_data = user_data; +} + +SWITCH_DECLARE(void) switch_live_array_set_command_handler(switch_live_array_t *la, switch_live_array_command_handler_t command_handler) +{ + switch_assert(la); + la->command_handler = command_handler; +} + + +SWITCH_DECLARE(void) switch_live_array_parse_json(cJSON *json, switch_event_channel_id_t channel_id) +{ + const char *context = NULL, *name = NULL; + switch_live_array_t *la = NULL; + cJSON *jla = NULL; + + if ((jla = cJSON_GetObjectItem(json, "data")) && (jla = cJSON_GetObjectItem(jla, "liveArray"))) { + + if ((context = cJSON_GetObjectCstr(jla, "context")) && (name = cJSON_GetObjectCstr(jla, "name"))) { + const char *command = cJSON_GetObjectCstr(jla, "command"); + const char *sessid = cJSON_GetObjectCstr(json, "sessid"); + + if (command) { + switch_live_array_create(context, name, channel_id, &la); + + if (!strcasecmp(command, "bootstrap")) { + switch_live_array_bootstrap(la, sessid, channel_id); + } else { + if (la->command_handler) { + la->command_handler(la, command, sessid, jla, la->user_data); + } + } + } + } + } + +} /* For Emacs: * Local Variables: diff --git a/src/switch_json.c b/src/switch_json.c index 3819cda2d2..4467692dba 100644 --- a/src/switch_json.c +++ b/src/switch_json.c @@ -487,7 +487,20 @@ static char *print_object(cJSON *item,int depth,int fmt) /* Get Array size/item / object item. */ SWITCH_DECLARE(int) cJSON_GetArraySize(cJSON *array) {cJSON *c=array->child;int i=0;while(c)i++,c=c->next;return i;} SWITCH_DECLARE(cJSON *)cJSON_GetArrayItem(cJSON *array,int item) {cJSON *c=array->child; while (c && item>0) item--,c=c->next; return c;} -SWITCH_DECLARE(cJSON *)cJSON_GetObjectItem(cJSON *object,const char *string) {cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;} +SWITCH_DECLARE(cJSON *)cJSON_GetObjectItem(const cJSON *object,const char *string) {cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;} + + +SWITCH_DECLARE(const char *)cJSON_GetObjectCstr(const cJSON *object, const char *string) +{ + cJSON *cj = cJSON_GetObjectItem(object, string); + + if (!cj || cj->type != cJSON_String || !cj->valuestring) return NULL; + + return cj->valuestring; +} + + + /* Utility for array list handling. */ static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;} @@ -554,3 +567,27 @@ SWITCH_DECLARE(cJSON *) cJSON_Duplicate(cJSON *item,int recurse) } return newitem; } + + +SWITCH_DECLARE(cJSON *) cJSON_CreateStringPrintf(const char *fmt, ...) +{ + va_list ap; + char *str; + cJSON *item; + + va_start(ap, fmt); + str = switch_vmprintf(fmt, ap); + va_end(ap); + + if (!str) return NULL; + + if ((item = cJSON_New_Item())) { + item->type=cJSON_String; + item->valuestring = str; + } else { + free(str); + } + + return item; +} + diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index 8ffe90ea11..c9fdda1da7 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -65,6 +65,7 @@ struct switch_loadable_module_container { switch_hash_t *application_hash; switch_hash_t *chat_application_hash; switch_hash_t *api_hash; + switch_hash_t *json_api_hash; switch_hash_t *file_hash; switch_hash_t *speech_hash; switch_hash_t *asr_hash; @@ -73,6 +74,7 @@ struct switch_loadable_module_container { switch_hash_t *say_hash; switch_hash_t *management_hash; switch_hash_t *limit_hash; + switch_hash_t *secondary_recover_hash; switch_mutex_t *mutex; switch_memory_pool_t *pool; }; @@ -318,6 +320,29 @@ static switch_status_t switch_loadable_module_process(char *key, switch_loadable } } + if (new_module->module_interface->json_api_interface) { + const switch_json_api_interface_t *ptr; + + for (ptr = new_module->module_interface->json_api_interface; ptr; ptr = ptr->next) { + if (!ptr->interface_name) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Failed to load JSON api interface from %s due to no interface name.\n", key); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Adding JSON API Function '%s'\n", ptr->interface_name); + if (switch_event_create(&event, SWITCH_EVENT_MODULE_LOAD) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "type", "json_api"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "name", ptr->interface_name); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "description", switch_str_nil(ptr->desc)); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "syntax", switch_str_nil(ptr->syntax)); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "key", new_module->key); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "filename", new_module->filename); + switch_event_fire(&event); + added++; + } + switch_core_hash_insert(loadable_modules.json_api_hash, ptr->interface_name, (const void *) ptr); + } + } + } + if (new_module->module_interface->file_interface) { const switch_file_interface_t *ptr; @@ -1047,6 +1072,36 @@ static switch_status_t switch_loadable_module_unprocess(switch_loadable_module_t } } + if (old_module->module_interface->json_api_interface) { + const switch_json_api_interface_t *ptr; + + for (ptr = old_module->module_interface->json_api_interface; ptr; ptr = ptr->next) { + if (ptr->interface_name) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Deleting API Function '%s'\n", ptr->interface_name); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write lock interface '%s' to wait for existing references.\n", + ptr->interface_name); + + if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { + switch_thread_rwlock_unlock(ptr->rwlock); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); + } + + + if (switch_event_create(&event, SWITCH_EVENT_MODULE_UNLOAD) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "type", "api"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "name", ptr->interface_name); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "description", switch_str_nil(ptr->desc)); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "syntax", switch_str_nil(ptr->syntax)); + switch_event_fire(&event); + removed++; + } + switch_core_hash_delete(loadable_modules.json_api_hash, ptr->interface_name); + } + } + } + if (old_module->module_interface->file_interface) { const switch_file_interface_t *ptr; @@ -1721,6 +1776,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init(switch_bool_t autolo switch_core_hash_init_nocase(&loadable_modules.application_hash, loadable_modules.pool); switch_core_hash_init_nocase(&loadable_modules.chat_application_hash, loadable_modules.pool); switch_core_hash_init_nocase(&loadable_modules.api_hash, loadable_modules.pool); + switch_core_hash_init_nocase(&loadable_modules.json_api_hash, loadable_modules.pool); switch_core_hash_init(&loadable_modules.file_hash, loadable_modules.pool); switch_core_hash_init_nocase(&loadable_modules.speech_hash, loadable_modules.pool); switch_core_hash_init_nocase(&loadable_modules.asr_hash, loadable_modules.pool); @@ -1730,6 +1786,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init(switch_bool_t autolo switch_core_hash_init_nocase(&loadable_modules.management_hash, loadable_modules.pool); switch_core_hash_init_nocase(&loadable_modules.limit_hash, loadable_modules.pool); switch_core_hash_init_nocase(&loadable_modules.dialplan_hash, loadable_modules.pool); + switch_core_hash_init(&loadable_modules.secondary_recover_hash, loadable_modules.pool); switch_mutex_init(&loadable_modules.mutex, SWITCH_MUTEX_NESTED, loadable_modules.pool); if (!autoload) return SWITCH_STATUS_SUCCESS; @@ -1945,6 +2002,7 @@ SWITCH_DECLARE(void) switch_loadable_module_shutdown(void) switch_core_hash_destroy(&loadable_modules.application_hash); switch_core_hash_destroy(&loadable_modules.chat_application_hash); switch_core_hash_destroy(&loadable_modules.api_hash); + switch_core_hash_destroy(&loadable_modules.json_api_hash); switch_core_hash_destroy(&loadable_modules.file_hash); switch_core_hash_destroy(&loadable_modules.speech_hash); switch_core_hash_destroy(&loadable_modules.asr_hash); @@ -2014,6 +2072,7 @@ HASH_FUNC(timer) HASH_FUNC(application) HASH_FUNC(chat_application) HASH_FUNC(api) +HASH_FUNC(json_api) HASH_FUNC(file) HASH_FUNC(speech) HASH_FUNC(asr) @@ -2369,6 +2428,46 @@ SWITCH_DECLARE(switch_status_t) switch_api_execute(const char *cmd, const char * return status; } +SWITCH_DECLARE(switch_status_t) switch_json_api_execute(cJSON *json, switch_core_session_t *session, cJSON **retval) +{ + switch_json_api_interface_t *json_api; + switch_status_t status; + cJSON *function, *json_reply = NULL; + + switch_assert(json); + + function = cJSON_GetObjectItem(json, "command"); + + if (function && function->valuestring + && cJSON_GetObjectItem(json, "data") && (json_api = switch_loadable_module_get_json_api_interface(function->valuestring)) != 0) { + if ((status = json_api->function(json, session, &json_reply)) != SWITCH_STATUS_SUCCESS) { + cJSON_AddItemToObject(json, "status", cJSON_CreateString("error")); + cJSON_AddItemToObject(json, "message", cJSON_CreateString("The command returned an error")); + } else { + cJSON_AddItemToObject(json, "status", cJSON_CreateString("success")); + } + + if (!json_reply) { + json_reply = cJSON_CreateNull(); + } + + if (retval) { + *retval = json_reply; + } else { + cJSON_AddItemToObject(json, "response", json_reply); + } + + UNPROTECT_INTERFACE(json_api); + } else { + status = SWITCH_STATUS_FALSE; + cJSON_AddItemToObject(json, "status", cJSON_CreateString("error")); + cJSON_AddItemToObject(json, "message", cJSON_CreateString("Invalid request or non-existant command")); + cJSON_AddItemToObject(json, "response", cJSON_CreateNull()); + } + + return status; +} + SWITCH_DECLARE(switch_loadable_module_interface_t *) switch_loadable_module_create_module_interface(switch_memory_pool_t *pool, const char *name) { @@ -2425,6 +2524,9 @@ SWITCH_DECLARE(void *) switch_loadable_module_create_interface(switch_loadable_m case SWITCH_API_INTERFACE: ALLOC_INTERFACE(api) + case SWITCH_JSON_API_INTERFACE: + ALLOC_INTERFACE(json_api) + case SWITCH_FILE_INTERFACE: ALLOC_INTERFACE(file) @@ -2549,7 +2651,42 @@ SWITCH_DECLARE(void) switch_say_file(switch_say_file_handle_t *sh, const char *f va_end(ap); } +SWITCH_DECLARE(switch_core_recover_callback_t) switch_core_get_secondary_recover_callback(const char *key) +{ + switch_core_recover_callback_t cb; + switch_mutex_lock(loadable_modules.mutex); + cb = (switch_core_recover_callback_t) (intptr_t) switch_core_hash_find(loadable_modules.secondary_recover_hash, key); + switch_mutex_unlock(loadable_modules.mutex); + + return cb; +} + + +SWITCH_DECLARE(switch_status_t) switch_core_register_secondary_recover_callback(const char *key, switch_core_recover_callback_t cb) +{ + switch_status_t status = SWITCH_STATUS_SUCCESS; + + switch_assert(cb); + + switch_mutex_lock(loadable_modules.mutex); + if (switch_core_hash_find(loadable_modules.secondary_recover_hash, key)) { + status = SWITCH_STATUS_FALSE; + } else { + switch_core_hash_insert(loadable_modules.secondary_recover_hash, key, (void *)(intptr_t) cb); + } + switch_mutex_unlock(loadable_modules.mutex); + + return status; +} + + +SWITCH_DECLARE(void) switch_core_unregister_secondary_recover_callback(const char *key) +{ + switch_mutex_lock(loadable_modules.mutex); + switch_core_hash_delete(loadable_modules.secondary_recover_hash, key); + switch_mutex_unlock(loadable_modules.mutex); +} /* For Emacs: diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 47590b1430..c3027b8ba3 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -61,7 +61,7 @@ #define WRITE_INC(rtp_session) switch_mutex_lock(rtp_session->write_mutex); rtp_session->writing++ #define WRITE_DEC(rtp_session) switch_mutex_unlock(rtp_session->write_mutex); rtp_session->writing-- -#define RTP_STUN_FREQ 2000000 +#define RTP_STUN_FREQ 1000000 #define rtp_header_len 12 #define RTP_START_PORT 16384 #define RTP_END_PORT 32768 @@ -713,7 +713,7 @@ static switch_status_t ice_out(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice) elapsed = (unsigned int) ((switch_micro_time_now() - rtp_session->last_stun) / 1000); if (elapsed > 30000) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_ERROR, "No stun for a long time!\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_ERROR, "No %s stun for a long time!\n", rtp_type(rtp_session)); rtp_session->last_stun = switch_micro_time_now(); //status = SWITCH_STATUS_GENERR; //goto end; @@ -912,7 +912,7 @@ static void handle_ice(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice, void *d char *host = NULL; ice->missed_count++; - //switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_CRIT, "missed %d\n", ice->missed_count); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_WARNING, "missed %d\n", ice->missed_count); if (elapsed > 20000 && pri) { int i, j; @@ -991,6 +991,8 @@ static void handle_ice(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice, void *d } if (ice->missed_count > 5) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_WARNING, "missed too many: %d, looking for new ICE dest.\n", + ice->missed_count); ice->rready = 0; ok = 1; } @@ -1039,6 +1041,7 @@ static void handle_ice(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice, void *d char buf[80] = ""; char buf2[80] = ""; const char *err = ""; + int i = 0; ice->missed_count = 0; ice->rready = 1; @@ -1049,6 +1052,21 @@ static void handle_ice(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice, void *d host2 = switch_get_addr(buf2, sizeof(buf2), ice->addr); port2 = switch_sockaddr_get_port(ice->addr); + for (i = 0; i <= ice->ice_params->cand_idx; i++) { + if (ice->ice_params->cands[i][ice->proto].con_port == port) { + if (!strcmp(ice->ice_params->cands[i][ice->proto].con_addr, host) && + !strcmp(ice->ice_params->cands[i][ice->proto].cand_type, "relay")) { + + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_WARNING, + "Skiping RELAY stun/%s/dtls port change from %s:%u to %s:%u\n", is_rtcp ? "rtcp" : "rtp", + host2, port2, + host, port); + + goto end; + } + } + } + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_NOTICE, "Auto Changing stun/%s/dtls port from %s:%u to %s:%u\n", is_rtcp ? "rtcp" : "rtp", host2, port2, @@ -1056,7 +1074,8 @@ static void handle_ice(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice, void *d ice->ice_params->cands[ice->ice_params->chosen[ice->proto]][ice->proto].con_addr = switch_core_strdup(rtp_session->pool, host); ice->ice_params->cands[ice->ice_params->chosen[ice->proto]][ice->proto].con_port = port; - + ice->missed_count = 0; + switch_sockaddr_info_get(&ice->addr, host, SWITCH_UNSPEC, port, 0, rtp_session->pool); if (!is_rtcp || rtp_session->flags[SWITCH_RTP_FLAG_RTCP_MUX]) { @@ -1369,7 +1388,7 @@ static void send_fir(switch_rtp_t *rtp_session) fir->ssrc = htonl(rtp_session->remote_ssrc); fir->seq = ++rtp_session->fir_seq; fir->r1 = fir->r2 = fir->r3 = 0; - + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG1, "Sending RTCP FIR %d\n", rtp_session->fir_seq); rtcp_bytes = sizeof(switch_rtcp_ext_hdr_t) + sizeof(rtcp_fir_t); @@ -2377,6 +2396,26 @@ static int dtls_state_handshake(switch_rtp_t *rtp_session, switch_dtls_t *dtls) return 0; } +static void free_dtls(switch_dtls_t **dtlsp) +{ + switch_dtls_t *dtls; + + if (!dtlsp) { + return; + } + + dtls = *dtlsp; + *dtlsp = NULL; + + if (dtls->ssl) { + SSL_free(dtls->ssl); + } + + if (dtls->ssl_ctx) { + SSL_CTX_free(dtls->ssl_ctx); + } +} + static int do_dtls(switch_rtp_t *rtp_session, switch_dtls_t *dtls) { int r = 0, ret = 0, len; @@ -2384,16 +2423,17 @@ static int do_dtls(switch_rtp_t *rtp_session, switch_dtls_t *dtls) switch_size_t bytes; if (dtls->bytes) { + + //if (dtls->state == DS_READY) { + // + //} + if ((ret = BIO_write(dtls->read_bio, dtls->data, dtls->bytes)) != (int)dtls->bytes) { ret = SSL_get_error(dtls->ssl, ret); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_ERROR, "%s DTLS packet read err %d\n", rtp_type(rtp_session), ret); dtls_set_state(dtls, DS_FAIL); return -1; } - - if (dtls->state == DS_READY) { - dtls_set_state(dtls, DS_HANDSHAKE); - } } if (SSL_read(dtls->ssl, dtls->data, dtls->bytes) == (int)dtls->bytes) { @@ -2453,6 +2493,30 @@ SWITCH_DECLARE(int) switch_rtp_has_dtls(void) { #endif } +SWITCH_DECLARE(switch_status_t) switch_rtp_del_dtls(switch_rtp_t *rtp_session, dtls_type_t type) +{ + + if (!rtp_session->dtls && !rtp_session->rtcp_dtls) { + return SWITCH_STATUS_FALSE; + } + + if ((type & DTLS_TYPE_RTP)) { + if (rtp_session->dtls && rtp_session->dtls == rtp_session->rtcp_dtls) { + rtp_session->rtcp_dtls = NULL; + } + + if (rtp_session->dtls) { + free_dtls(&rtp_session->dtls); + } + } + + if ((type & DTLS_TYPE_RTCP) && rtp_session->rtcp_dtls) { + free_dtls(&rtp_session->rtcp_dtls); + } + + return SWITCH_STATUS_SUCCESS; +} + SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, dtls_fingerprint_t *local_fp, dtls_fingerprint_t *remote_fp, dtls_type_t type) { switch_dtls_t *dtls; @@ -2471,6 +2535,8 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, d switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_CRIT, "INVALID TYPE!\n"); } + switch_rtp_del_dtls(rtp_session, type); + if ((type & DTLS_TYPE_RTP) && (type & DTLS_TYPE_RTCP)) { kind = "RTP/RTCP"; } else if ((type & DTLS_TYPE_RTP)) { @@ -2487,8 +2553,6 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, d return SWITCH_STATUS_FALSE; } - - dtls = switch_core_alloc(rtp_session->pool, sizeof(*dtls)); @@ -2579,6 +2643,8 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, d SSL_set_connect_state(dtls->ssl); } + rtp_session->flags[SWITCH_RTP_FLAG_VIDEO_BREAK] = 1; + switch_rtp_break(rtp_session); return SWITCH_STATUS_SUCCESS; @@ -3328,6 +3394,12 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_activate_ice(switch_rtp_t *rtp_sessio rtp_session->rtp_bugs |= RTP_BUG_ACCEPT_ANY_PACKETS; + + if (rtp_session->flags[SWITCH_RTP_FLAG_VIDEO]) { + rtp_session->flags[SWITCH_RTP_FLAG_VIDEO_BREAK] = 1; + switch_rtp_break(rtp_session); + } + return SWITCH_STATUS_SUCCESS; } @@ -3360,7 +3432,10 @@ SWITCH_DECLARE(void) switch_rtp_break(switch_rtp_t *rtp_session) if (rtp_session->flags[SWITCH_RTP_FLAG_VIDEO]) { int ret = 1; - if (rtp_session->session) { + if (rtp_session->flags[SWITCH_RTP_FLAG_VIDEO_BREAK]) { + rtp_session->flags[SWITCH_RTP_FLAG_VIDEO_BREAK] = 0; + ret = 0; + } else if (rtp_session->session) { switch_channel_t *channel = switch_core_session_get_channel(rtp_session->session); if (switch_channel_test_flag(channel, CF_VIDEO_BREAK)) { switch_channel_clear_flag(channel, CF_VIDEO_BREAK); @@ -3369,6 +3444,8 @@ SWITCH_DECLARE(void) switch_rtp_break(switch_rtp_t *rtp_session) } if (ret) return; + + switch_rtp_video_refresh(rtp_session); } switch_mutex_lock(rtp_session->flag_mutex); @@ -3429,27 +3506,6 @@ SWITCH_DECLARE(uint8_t) switch_rtp_ready(switch_rtp_t *rtp_session) return ret; } -static void free_dtls(switch_dtls_t **dtlsp) -{ - switch_dtls_t *dtls; - - if (!dtlsp) { - return; - } - - dtls = *dtlsp; - *dtlsp = NULL; - - if (dtls->ssl) { - SSL_free(dtls->ssl); - } - - if (dtls->ssl_ctx) { - SSL_CTX_free(dtls->ssl_ctx); - } -} - - SWITCH_DECLARE(void) switch_rtp_destroy(switch_rtp_t **rtp_session) { void *pop; @@ -4635,7 +4691,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ pt = 100000; } - + poll_status = switch_poll(rtp_session->read_pollfd, 1, &fdr, pt); @@ -4651,10 +4707,12 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ } + if (poll_status == SWITCH_STATUS_SUCCESS) { if (read_pretriggered) { read_pretriggered = 0; } else { + status = read_rtp_packet(rtp_session, &bytes, flags, SWITCH_TRUE); if (status == SWITCH_STATUS_GENERR) { From c94dd25e4eb5b3205970fbe0669de19dfba5bd8b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 15 Oct 2013 15:31:28 -0500 Subject: [PATCH 34/80] swigall --- .../mod_java/src/org/freeswitch/swig/API.java | 4 +- .../org/freeswitch/swig/freeswitchJNI.java | 2 +- .../languages/mod_java/switch_swig_wrap.cpp | 7 +- src/mod/languages/mod_lua/mod_lua_wrap.cpp | 11 +- .../languages/mod_managed/freeswitch_wrap.cxx | 746 +++++++++++++++++- src/mod/languages/mod_managed/managed/swig.cs | 722 ++++++++++++++++- src/mod/languages/mod_perl/mod_perl_wrap.cpp | 18 +- .../languages/mod_python/mod_python_wrap.cpp | 15 +- 8 files changed, 1479 insertions(+), 46 deletions(-) diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/API.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/API.java index 283518f1d6..5fd3da9bb0 100644 --- a/src/mod/languages/mod_java/src/org/freeswitch/swig/API.java +++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/API.java @@ -33,8 +33,8 @@ public class API { swigCPtr = 0; } - public API() { - this(freeswitchJNI.new_API(), true); + public API(CoreSession s) { + this(freeswitchJNI.new_API(CoreSession.getCPtr(s), s), true); } public String execute(String command, String data) { diff --git a/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java b/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java index 8069552b94..111f128863 100644 --- a/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java +++ b/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java @@ -19,7 +19,7 @@ class freeswitchJNI { public final static native void delete_IVRMenu(long jarg1); public final static native void IVRMenu_bindAction(long jarg1, IVRMenu jarg1_, String jarg2, String jarg3, String jarg4); public final static native void IVRMenu_execute(long jarg1, IVRMenu jarg1_, long jarg2, CoreSession jarg2_, String jarg3); - public final static native long new_API(); + public final static native long new_API(long jarg1, CoreSession jarg1_); public final static native void delete_API(long jarg1); public final static native String API_execute(long jarg1, API jarg1_, String jarg2, String jarg3); public final static native String API_executeString(long jarg1, API jarg1_, String jarg2); diff --git a/src/mod/languages/mod_java/switch_swig_wrap.cpp b/src/mod/languages/mod_java/switch_swig_wrap.cpp index eaf160ba9c..76de068715 100644 --- a/src/mod/languages/mod_java/switch_swig_wrap.cpp +++ b/src/mod/languages/mod_java/switch_swig_wrap.cpp @@ -521,13 +521,16 @@ SWIGEXPORT void JNICALL Java_org_freeswitch_swig_freeswitchJNI_IVRMenu_1execute( } -SWIGEXPORT jlong JNICALL Java_org_freeswitch_swig_freeswitchJNI_new_1API(JNIEnv *jenv, jclass jcls) { +SWIGEXPORT jlong JNICALL Java_org_freeswitch_swig_freeswitchJNI_new_1API(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { jlong jresult = 0 ; + CoreSession *arg1 = (CoreSession *) NULL ; API *result = 0 ; (void)jenv; (void)jcls; - result = (API *)new API(); + (void)jarg1_; + arg1 = *(CoreSession **)&jarg1; + result = (API *)new API(arg1); *(API **)&jresult = result; return jresult; } diff --git a/src/mod/languages/mod_lua/mod_lua_wrap.cpp b/src/mod/languages/mod_lua/mod_lua_wrap.cpp index 130eab949a..591cef641a 100644 --- a/src/mod/languages/mod_lua/mod_lua_wrap.cpp +++ b/src/mod/languages/mod_lua/mod_lua_wrap.cpp @@ -1877,10 +1877,17 @@ static swig_lua_class _wrap_class_IVRMenu = { "IVRMenu", &SWIGTYPE_p_IVRMenu,_wr static int _wrap_new_API(lua_State* L) { int SWIG_arg = -1; + CoreSession *arg1 = (CoreSession *) NULL ; API *result = 0 ; - SWIG_check_num_args("API",0,0) - result = (API *)new API(); + SWIG_check_num_args("API",0,1) + if(lua_gettop(L)>=1 && !SWIG_isptrtype(L,1)) SWIG_fail_arg("API",1,"CoreSession *"); + if(lua_gettop(L)>=1){ + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_CoreSession,0))){ + SWIG_fail_ptr("new_API",1,SWIGTYPE_p_CoreSession); + } + } + result = (API *)new API(arg1); SWIG_arg=0; SWIG_NewPointerObj(L,result,SWIGTYPE_p_API,1); SWIG_arg++; return SWIG_arg; diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.cxx index 756259d4d2..2c57e207a4 100644 --- a/src/mod/languages/mod_managed/freeswitch_wrap.cxx +++ b/src/mod/languages/mod_managed/freeswitch_wrap.cxx @@ -2081,6 +2081,17 @@ SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_MAX_TRANS_get() { } +SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_CORE_SESSION_MAX_PRIVATES_get() { + int jresult ; + int result; + + result = (int) 2; + + jresult = result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_dtmf_t_digit_set(void * jarg1, char jarg2) { switch_dtmf_t *arg1 = (switch_dtmf_t *) 0 ; char arg2 ; @@ -10217,27 +10228,31 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_receive_event(void * jarg1 } -SWIGEXPORT void * SWIGSTDCALL CSharp_switch_core_session_get_private(void * jarg1) { +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_core_session_get_private_class(void * jarg1, int jarg2) { void * jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_pvt_class_t arg2 ; void *result = 0 ; arg1 = (switch_core_session_t *)jarg1; - result = (void *)switch_core_session_get_private(arg1); + arg2 = (switch_pvt_class_t)jarg2; + result = (void *)switch_core_session_get_private_class(arg1,arg2); jresult = (void *)result; return jresult; } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_set_private(void * jarg1, void * jarg2) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_set_private_class(void * jarg1, void * jarg2, int jarg3) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; void *arg2 = (void *) 0 ; + switch_pvt_class_t arg3 ; switch_status_t result; arg1 = (switch_core_session_t *)jarg1; arg2 = (void *)jarg2; - result = (switch_status_t)switch_core_session_set_private(arg1,arg2); + arg3 = (switch_pvt_class_t)jarg3; + result = (switch_status_t)switch_core_session_set_private_class(arg1,arg2,arg3); jresult = result; return jresult; } @@ -11486,14 +11501,14 @@ SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_db_test_reactive(void * jarg1, ch } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_perform_file_open(char * jarg1, char * jarg2, int jarg3, void * jarg4, char * jarg5, unsigned char jarg6, unsigned long jarg7, unsigned int jarg8, void * jarg9) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_perform_file_open(char * jarg1, char * jarg2, int jarg3, void * jarg4, char * jarg5, unsigned long jarg6, unsigned long jarg7, unsigned int jarg8, void * jarg9) { int jresult ; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; switch_file_handle_t *arg4 = (switch_file_handle_t *) 0 ; char *arg5 = (char *) 0 ; - uint8_t arg6 ; + uint32_t arg6 ; uint32_t arg7 ; unsigned int arg8 ; switch_memory_pool_t *arg9 = (switch_memory_pool_t *) 0 ; @@ -11504,7 +11519,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_perform_file_open(char * jarg1, ch arg3 = (int)jarg3; arg4 = (switch_file_handle_t *)jarg4; arg5 = (char *)jarg5; - arg6 = (uint8_t)jarg6; + arg6 = (uint32_t)jarg6; arg7 = (uint32_t)jarg7; arg8 = (unsigned int)jarg8; arg9 = (switch_memory_pool_t *)jarg9; @@ -14032,6 +14047,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_stream_system_fork(char * jarg1, void * } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ice_direction(void * jarg1) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_call_direction_t result; + + arg1 = (switch_core_session_t *)jarg1; + result = (switch_call_direction_t)switch_ice_direction(arg1); + jresult = result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_loadable_module_interface_module_name_set(void * jarg1, char * jarg2) { switch_loadable_module_interface *arg1 = (switch_loadable_module_interface *) 0 ; char *arg2 = (char *) 0 ; @@ -14222,6 +14249,29 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_loadable_module_interface_api_interf } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_loadable_module_interface_json_api_interface_set(void * jarg1, void * jarg2) { + switch_loadable_module_interface *arg1 = (switch_loadable_module_interface *) 0 ; + switch_json_api_interface_t *arg2 = (switch_json_api_interface_t *) 0 ; + + arg1 = (switch_loadable_module_interface *)jarg1; + arg2 = (switch_json_api_interface_t *)jarg2; + if (arg1) (arg1)->json_api_interface = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_loadable_module_interface_json_api_interface_get(void * jarg1) { + void * jresult ; + switch_loadable_module_interface *arg1 = (switch_loadable_module_interface *) 0 ; + switch_json_api_interface_t *result = 0 ; + + arg1 = (switch_loadable_module_interface *)jarg1; + result = (switch_json_api_interface_t *) ((arg1)->json_api_interface); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_loadable_module_interface_file_interface_set(void * jarg1, void * jarg2) { switch_loadable_module_interface *arg1 = (switch_loadable_module_interface *) 0 ; switch_file_interface_t *arg2 = (switch_file_interface_t *) 0 ; @@ -14679,6 +14729,18 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_loadable_module_get_api_interface(ch } +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_loadable_module_get_json_api_interface(char * jarg1) { + void * jresult ; + char *arg1 = (char *) 0 ; + switch_json_api_interface_t *result = 0 ; + + arg1 = (char *)jarg1; + result = (switch_json_api_interface_t *)switch_loadable_module_get_json_api_interface((char const *)arg1); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void * SWIGSTDCALL CSharp_switch_loadable_module_get_file_interface(char * jarg1) { void * jresult ; char *arg1 = (char *) 0 ; @@ -14825,6 +14887,22 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_api_execute(char * jarg1, char * jarg2, } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_json_api_execute(void * jarg1, void * jarg2, void * jarg3) { + int jresult ; + cJSON *arg1 = (cJSON *) 0 ; + switch_core_session_t *arg2 = (switch_core_session_t *) 0 ; + cJSON **arg3 = (cJSON **) 0 ; + switch_status_t result; + + arg1 = (cJSON *)jarg1; + arg2 = (switch_core_session_t *)jarg2; + arg3 = (cJSON **)jarg3; + result = (switch_status_t)switch_json_api_execute(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_loadable_module_load_module(char * jarg1, char * jarg2, int jarg3, void * jarg4) { int jresult ; char *arg1 = (char *) 0 ; @@ -14953,6 +15031,40 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_codec_ready(void * jarg1) { } +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_core_get_secondary_recover_callback(char * jarg1) { + void * jresult ; + char *arg1 = (char *) 0 ; + switch_core_recover_callback_t result; + + arg1 = (char *)jarg1; + result = (switch_core_recover_callback_t)switch_core_get_secondary_recover_callback((char const *)arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_register_secondary_recover_callback(char * jarg1, void * jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + switch_core_recover_callback_t arg2 = (switch_core_recover_callback_t) 0 ; + switch_status_t result; + + arg1 = (char *)jarg1; + arg2 = (switch_core_recover_callback_t)jarg2; + result = (switch_status_t)switch_core_register_secondary_recover_callback((char const *)arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_unregister_secondary_recover_callback(char * jarg1) { + char *arg1 = (char *) 0 ; + + arg1 = (char *)jarg1; + switch_core_unregister_secondary_recover_callback((char const *)arg1); +} + + SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_CMD_CHUNK_LEN_get() { int jresult ; int result; @@ -21457,25 +21569,25 @@ SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_file_handle_native_rate_get(v } -SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_handle_channels_set(void * jarg1, unsigned char jarg2) { +SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_handle_channels_set(void * jarg1, unsigned long jarg2) { switch_file_handle *arg1 = (switch_file_handle *) 0 ; - uint8_t arg2 ; + uint32_t arg2 ; arg1 = (switch_file_handle *)jarg1; - arg2 = (uint8_t)jarg2; + arg2 = (uint32_t)jarg2; if (arg1) (arg1)->channels = arg2; } -SWIGEXPORT unsigned char SWIGSTDCALL CSharp_switch_file_handle_channels_get(void * jarg1) { - unsigned char jresult ; +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_file_handle_channels_get(void * jarg1) { + unsigned long jresult ; switch_file_handle *arg1 = (switch_file_handle *) 0 ; - uint8_t result; + uint32_t result; arg1 = (switch_file_handle *)jarg1; - result = (uint8_t) ((arg1)->channels); - jresult = result; + result = (uint32_t) ((arg1)->channels); + jresult = (unsigned long)result; return jresult; } @@ -22331,6 +22443,52 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_file_handle_params_get(void * jarg1) } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_handle_cur_channels_set(void * jarg1, unsigned long jarg2) { + switch_file_handle *arg1 = (switch_file_handle *) 0 ; + uint32_t arg2 ; + + arg1 = (switch_file_handle *)jarg1; + arg2 = (uint32_t)jarg2; + if (arg1) (arg1)->cur_channels = arg2; + +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_file_handle_cur_channels_get(void * jarg1) { + unsigned long jresult ; + switch_file_handle *arg1 = (switch_file_handle *) 0 ; + uint32_t result; + + arg1 = (switch_file_handle *)jarg1; + result = (uint32_t) ((arg1)->cur_channels); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_handle_cur_samplerate_set(void * jarg1, unsigned long jarg2) { + switch_file_handle *arg1 = (switch_file_handle *) 0 ; + uint32_t arg2 ; + + arg1 = (switch_file_handle *)jarg1; + arg2 = (uint32_t)jarg2; + if (arg1) (arg1)->cur_samplerate = arg2; + +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_file_handle_cur_samplerate_get(void * jarg1) { + unsigned long jresult ; + switch_file_handle *arg1 = (switch_file_handle *) 0 ; + uint32_t result; + + arg1 = (switch_file_handle *)jarg1; + result = (uint32_t) ((arg1)->cur_samplerate); + jresult = (unsigned long)result; + return jresult; +} + + SWIGEXPORT void * SWIGSTDCALL CSharp_new_switch_file_handle() { void * jresult ; switch_file_handle *result = 0 ; @@ -27405,6 +27563,250 @@ SWIGEXPORT void SWIGSTDCALL CSharp_delete_switch_api_interface(void * jarg1) { } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_api_interface_interface_name_set(void * jarg1, char * jarg2) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + arg2 = (char *)jarg2; + { + if (arg2) { + arg1->interface_name = (char const *) (new char[strlen((const char *)arg2)+1]); + strcpy((char *)arg1->interface_name, (const char *)arg2); + } else { + arg1->interface_name = 0; + } + } +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_switch_json_api_interface_interface_name_get(void * jarg1) { + char * jresult ; + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + char *result = 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + result = (char *) ((arg1)->interface_name); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_api_interface_desc_set(void * jarg1, char * jarg2) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + arg2 = (char *)jarg2; + { + if (arg2) { + arg1->desc = (char const *) (new char[strlen((const char *)arg2)+1]); + strcpy((char *)arg1->desc, (const char *)arg2); + } else { + arg1->desc = 0; + } + } +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_switch_json_api_interface_desc_get(void * jarg1) { + char * jresult ; + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + char *result = 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + result = (char *) ((arg1)->desc); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_api_interface_function_set(void * jarg1, void * jarg2) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_json_api_function_t arg2 = (switch_json_api_function_t) 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + arg2 = (switch_json_api_function_t)jarg2; + if (arg1) (arg1)->function = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_json_api_interface_function_get(void * jarg1) { + void * jresult ; + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_json_api_function_t result; + + arg1 = (switch_json_api_interface *)jarg1; + result = (switch_json_api_function_t) ((arg1)->function); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_api_interface_syntax_set(void * jarg1, char * jarg2) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + arg2 = (char *)jarg2; + { + if (arg2) { + arg1->syntax = (char const *) (new char[strlen((const char *)arg2)+1]); + strcpy((char *)arg1->syntax, (const char *)arg2); + } else { + arg1->syntax = 0; + } + } +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_switch_json_api_interface_syntax_get(void * jarg1) { + char * jresult ; + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + char *result = 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + result = (char *) ((arg1)->syntax); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_api_interface_rwlock_set(void * jarg1, void * jarg2) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_thread_rwlock_t *arg2 = (switch_thread_rwlock_t *) 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + arg2 = (switch_thread_rwlock_t *)jarg2; + if (arg1) (arg1)->rwlock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_json_api_interface_rwlock_get(void * jarg1) { + void * jresult ; + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_thread_rwlock_t *result = 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + result = (switch_thread_rwlock_t *) ((arg1)->rwlock); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_api_interface_refs_set(void * jarg1, int jarg2) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + int arg2 ; + + arg1 = (switch_json_api_interface *)jarg1; + arg2 = (int)jarg2; + if (arg1) (arg1)->refs = arg2; + +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_json_api_interface_refs_get(void * jarg1) { + int jresult ; + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + int result; + + arg1 = (switch_json_api_interface *)jarg1; + result = (int) ((arg1)->refs); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_api_interface_reflock_set(void * jarg1, void * jarg2) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_json_api_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_api_interface_parent_set(void * jarg1, void * jarg2) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + arg2 = (switch_loadable_module_interface_t *)jarg2; + if (arg1) (arg1)->parent = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_json_api_interface_parent_get(void * jarg1) { + void * jresult ; + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_loadable_module_interface_t *result = 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + result = (switch_loadable_module_interface_t *) ((arg1)->parent); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_api_interface_next_set(void * jarg1, void * jarg2) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_json_api_interface *arg2 = (switch_json_api_interface *) 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + arg2 = (switch_json_api_interface *)jarg2; + if (arg1) (arg1)->next = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_json_api_interface_next_get(void * jarg1) { + void * jresult ; + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + switch_json_api_interface *result = 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + result = (switch_json_api_interface *) ((arg1)->next); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_new_switch_json_api_interface() { + void * jresult ; + switch_json_api_interface *result = 0 ; + + result = (switch_json_api_interface *)new switch_json_api_interface(); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_switch_json_api_interface(void * jarg1) { + switch_json_api_interface *arg1 = (switch_json_api_interface *) 0 ; + + arg1 = (switch_json_api_interface *)jarg1; + delete arg1; + +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_slin_data_session_set(void * jarg1, void * jarg2) { switch_slin_data *arg1 = (switch_slin_data *) 0 ; switch_core_session_t *arg2 = (switch_core_session_t *) 0 ; @@ -29422,6 +29824,16 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_direction(void * jarg1) { } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_direction(void * jarg1, int jarg2) { + switch_channel_t *arg1 = (switch_channel_t *) 0 ; + switch_call_direction_t arg2 ; + + arg1 = (switch_channel_t *)jarg1; + arg2 = (switch_call_direction_t)jarg2; + switch_channel_set_direction(arg1,arg2); +} + + SWIGEXPORT void * SWIGSTDCALL CSharp_switch_channel_get_session(void * jarg1) { void * jresult ; switch_channel_t *arg1 = (switch_channel_t *) 0 ; @@ -31255,6 +31667,20 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_event_serialize_json(void * jarg1, void } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_event_serialize_json_obj(void * jarg1, void * jarg2) { + int jresult ; + switch_event_t *arg1 = (switch_event_t *) 0 ; + cJSON **arg2 = (cJSON **) 0 ; + switch_status_t result; + + arg1 = (switch_event_t *)jarg1; + arg2 = (cJSON **)jarg2; + result = (switch_status_t)switch_event_serialize_json_obj(arg1,arg2); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_event_create_json(void * jarg1, char * jarg2) { int jresult ; switch_event_t **arg1 = (switch_event_t **) 0 ; @@ -31459,6 +31885,18 @@ SWIGEXPORT void SWIGSTDCALL CSharp_switch_event_add_presence_data_cols(void * ja } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_json_add_presence_data_cols(void * jarg1, void * jarg2, char * jarg3) { + switch_event_t *arg1 = (switch_event_t *) 0 ; + cJSON *arg2 = (cJSON *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (switch_event_t *)jarg1; + arg2 = (cJSON *)jarg2; + arg3 = (char *)jarg3; + switch_json_add_presence_data_cols(arg1,arg2,(char const *)arg3); +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_event_launch_dispatch_threads(unsigned long jarg1) { uint32_t arg1 ; @@ -31467,6 +31905,270 @@ SWIGEXPORT void SWIGSTDCALL CSharp_switch_event_launch_dispatch_threads(unsigned } +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_event_channel_broadcast(char * jarg1, void * jarg2, char * jarg3, unsigned long jarg4) { + unsigned long jresult ; + char *arg1 = (char *) 0 ; + cJSON **arg2 = (cJSON **) 0 ; + char *arg3 = (char *) 0 ; + switch_event_channel_id_t arg4 ; + uint32_t result; + + arg1 = (char *)jarg1; + arg2 = (cJSON **)jarg2; + arg3 = (char *)jarg3; + arg4 = (switch_event_channel_id_t)jarg4; + result = (uint32_t)switch_event_channel_broadcast((char const *)arg1,arg2,(char const *)arg3,arg4); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_event_channel_unbind(char * jarg1, void * jarg2) { + unsigned long jresult ; + char *arg1 = (char *) 0 ; + switch_event_channel_func_t arg2 = (switch_event_channel_func_t) 0 ; + uint32_t result; + + arg1 = (char *)jarg1; + arg2 = (switch_event_channel_func_t)jarg2; + result = (uint32_t)switch_event_channel_unbind((char const *)arg1,arg2); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_event_channel_bind(char * jarg1, void * jarg2, void * jarg3) { + int jresult ; + char *arg1 = (char *) 0 ; + switch_event_channel_func_t arg2 = (switch_event_channel_func_t) 0 ; + switch_event_channel_id_t *arg3 = (switch_event_channel_id_t *) 0 ; + switch_status_t result; + + arg1 = (char *)jarg1; + arg2 = (switch_event_channel_func_t)jarg2; + arg3 = (switch_event_channel_id_t *)jarg3; + result = (switch_status_t)switch_event_channel_bind((char const *)arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_NO_EVENT_CHANNEL_ID_get() { + int jresult ; + int result; + + result = (int) 0; + + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_EVENT_CHANNEL_GLOBAL_get() { + char * jresult ; + char *result = 0 ; + + result = (char *) "__global__"; + + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_live_array_clear(void * jarg1) { + int jresult ; + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + switch_status_t result; + + arg1 = (switch_live_array_t *)jarg1; + result = (switch_status_t)switch_live_array_clear(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_live_array_bootstrap(void * jarg1, char * jarg2, unsigned long jarg3) { + int jresult ; + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + char *arg2 = (char *) 0 ; + switch_event_channel_id_t arg3 ; + switch_status_t result; + + arg1 = (switch_live_array_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (switch_event_channel_id_t)jarg3; + result = (switch_status_t)switch_live_array_bootstrap(arg1,(char const *)arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_live_array_destroy(void * jarg1) { + int jresult ; + switch_live_array_t **arg1 = (switch_live_array_t **) 0 ; + switch_status_t result; + + arg1 = (switch_live_array_t **)jarg1; + result = (switch_status_t)switch_live_array_destroy(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_live_array_create(char * jarg1, char * jarg2, unsigned long jarg3, void * jarg4) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + switch_event_channel_id_t arg3 ; + switch_live_array_t **arg4 = (switch_live_array_t **) 0 ; + switch_status_t result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (switch_event_channel_id_t)jarg3; + arg4 = (switch_live_array_t **)jarg4; + result = (switch_status_t)switch_live_array_create((char const *)arg1,(char const *)arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_live_array_get(void * jarg1, char * jarg2) { + void * jresult ; + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + char *arg2 = (char *) 0 ; + cJSON *result = 0 ; + + arg1 = (switch_live_array_t *)jarg1; + arg2 = (char *)jarg2; + result = (cJSON *)switch_live_array_get(arg1,(char const *)arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_live_array_get_idx(void * jarg1, int jarg2) { + void * jresult ; + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + int arg2 ; + cJSON *result = 0 ; + + arg1 = (switch_live_array_t *)jarg1; + arg2 = (int)jarg2; + result = (cJSON *)switch_live_array_get_idx(arg1,arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_live_array_del(void * jarg1, char * jarg2) { + int jresult ; + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + char *arg2 = (char *) 0 ; + switch_status_t result; + + arg1 = (switch_live_array_t *)jarg1; + arg2 = (char *)jarg2; + result = (switch_status_t)switch_live_array_del(arg1,(char const *)arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_live_array_add(void * jarg1, char * jarg2, int jarg3, void * jarg4, int jarg5) { + int jresult ; + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + char *arg2 = (char *) 0 ; + int arg3 ; + cJSON **arg4 = (cJSON **) 0 ; + switch_bool_t arg5 ; + switch_status_t result; + + arg1 = (switch_live_array_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (int)jarg3; + arg4 = (cJSON **)jarg4; + arg5 = (switch_bool_t)jarg5; + result = (switch_status_t)switch_live_array_add(arg1,(char const *)arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_live_array_visible(void * jarg1, int jarg2, int jarg3) { + int jresult ; + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + switch_bool_t arg2 ; + switch_bool_t arg3 ; + switch_status_t result; + + arg1 = (switch_live_array_t *)jarg1; + arg2 = (switch_bool_t)jarg2; + arg3 = (switch_bool_t)jarg3; + result = (switch_status_t)switch_live_array_visible(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_live_array_isnew(void * jarg1) { + int jresult ; + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + switch_bool_t result; + + arg1 = (switch_live_array_t *)jarg1; + result = (switch_bool_t)switch_live_array_isnew(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_live_array_lock(void * jarg1) { + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + + arg1 = (switch_live_array_t *)jarg1; + switch_live_array_lock(arg1); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_live_array_unlock(void * jarg1) { + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + + arg1 = (switch_live_array_t *)jarg1; + switch_live_array_unlock(arg1); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_live_array_set_user_data(void * jarg1, void * jarg2) { + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + void *arg2 = (void *) 0 ; + + arg1 = (switch_live_array_t *)jarg1; + arg2 = (void *)jarg2; + switch_live_array_set_user_data(arg1,arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_live_array_set_command_handler(void * jarg1, void * jarg2) { + switch_live_array_t *arg1 = (switch_live_array_t *) 0 ; + switch_live_array_command_handler_t arg2 = (switch_live_array_command_handler_t) 0 ; + + arg1 = (switch_live_array_t *)jarg1; + arg2 = (switch_live_array_command_handler_t)jarg2; + switch_live_array_set_command_handler(arg1,arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_live_array_parse_json(void * jarg1, unsigned long jarg2) { + cJSON *arg1 = (cJSON *) 0 ; + switch_event_channel_id_t arg2 ; + + arg1 = (cJSON *)jarg1; + arg2 = (switch_event_channel_id_t)jarg2; + switch_live_array_parse_json(arg1,arg2); +} + + SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_RESAMPLE_QUALITY_get() { int jresult ; int result; @@ -36317,6 +37019,20 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_rtp_add_dtls(void * jarg1, void * jarg2 } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_rtp_del_dtls(void * jarg1, int jarg2) { + int jresult ; + switch_rtp_t *arg1 = (switch_rtp_t *) 0 ; + dtls_type_t arg2 ; + switch_status_t result; + + arg1 = (switch_rtp_t *)jarg1; + arg2 = (dtls_type_t)jarg2; + result = (switch_status_t)switch_rtp_del_dtls(arg1,arg2); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_rtp_has_dtls() { int jresult ; int result; diff --git a/src/mod/languages/mod_managed/managed/swig.cs b/src/mod/languages/mod_managed/managed/swig.cs index f260022a00..50ac5a3245 100644 --- a/src/mod/languages/mod_managed/managed/swig.cs +++ b/src/mod/languages/mod_managed/managed/swig.cs @@ -1901,14 +1901,14 @@ public class freeswitch { return ret; } - public static SWIGTYPE_p_void switch_core_session_get_private(SWIGTYPE_p_switch_core_session session) { - IntPtr cPtr = freeswitchPINVOKE.switch_core_session_get_private(SWIGTYPE_p_switch_core_session.getCPtr(session)); + public static SWIGTYPE_p_void switch_core_session_get_private_class(SWIGTYPE_p_switch_core_session session, switch_pvt_class_t index) { + IntPtr cPtr = freeswitchPINVOKE.switch_core_session_get_private_class(SWIGTYPE_p_switch_core_session.getCPtr(session), (int)index); SWIGTYPE_p_void ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_void(cPtr, false); return ret; } - public static switch_status_t switch_core_session_set_private(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_void private_info) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_set_private(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_void.getCPtr(private_info)); + public static switch_status_t switch_core_session_set_private_class(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_void private_info, switch_pvt_class_t index) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_set_private_class(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_void.getCPtr(private_info), (int)index); return ret; } @@ -2348,7 +2348,7 @@ public class freeswitch { freeswitchPINVOKE.switch_core_db_test_reactive(SWIGTYPE_p_sqlite3.getCPtr(db), test_sql, drop_sql, reactive_sql); } - public static switch_status_t switch_core_perform_file_open(string file, string func, int line, switch_file_handle fh, string file_path, byte channels, uint rate, uint flags, SWIGTYPE_p_apr_pool_t pool) { + public static switch_status_t switch_core_perform_file_open(string file, string func, int line, switch_file_handle fh, string file_path, uint channels, uint rate, uint flags, SWIGTYPE_p_apr_pool_t pool) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_perform_file_open(file, func, line, switch_file_handle.getCPtr(fh), file_path, channels, rate, flags, SWIGTYPE_p_apr_pool_t.getCPtr(pool)); return ret; } @@ -3141,6 +3141,11 @@ public class freeswitch { return ret; } + public static switch_call_direction_t switch_ice_direction(SWIGTYPE_p_switch_core_session session) { + switch_call_direction_t ret = (switch_call_direction_t)freeswitchPINVOKE.switch_ice_direction(SWIGTYPE_p_switch_core_session.getCPtr(session)); + return ret; + } + public static switch_status_t switch_loadable_module_init(switch_bool_t autoload) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_loadable_module_init((int)autoload); return ret; @@ -3217,6 +3222,12 @@ public class freeswitch { return ret; } + public static switch_json_api_interface switch_loadable_module_get_json_api_interface(string name) { + IntPtr cPtr = freeswitchPINVOKE.switch_loadable_module_get_json_api_interface(name); + switch_json_api_interface ret = (cPtr == IntPtr.Zero) ? null : new switch_json_api_interface(cPtr, false); + return ret; + } + public static switch_file_interface switch_loadable_module_get_file_interface(string name) { IntPtr cPtr = freeswitchPINVOKE.switch_loadable_module_get_file_interface(name); switch_file_interface ret = (cPtr == IntPtr.Zero) ? null : new switch_file_interface(cPtr, false); @@ -3280,6 +3291,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_json_api_execute(SWIGTYPE_p_cJSON json, SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_p_cJSON retval) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_json_api_execute(SWIGTYPE_p_cJSON.getCPtr(json), SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_p_cJSON.getCPtr(retval)); + return ret; + } + public static switch_status_t switch_loadable_module_load_module(string dir, string fname, switch_bool_t runtime, ref string err) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_loadable_module_load_module(dir, fname, (int)runtime, ref err); return ret; @@ -3314,6 +3330,21 @@ public class freeswitch { return ret; } + public static SWIGTYPE_p_f_p_switch_core_session__int switch_core_get_secondary_recover_callback(string key) { + IntPtr cPtr = freeswitchPINVOKE.switch_core_get_secondary_recover_callback(key); + SWIGTYPE_p_f_p_switch_core_session__int ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_core_session__int(cPtr, false); + return ret; + } + + public static switch_status_t switch_core_register_secondary_recover_callback(string key, SWIGTYPE_p_f_p_switch_core_session__int cb) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_register_secondary_recover_callback(key, SWIGTYPE_p_f_p_switch_core_session__int.getCPtr(cb)); + return ret; + } + + public static void switch_core_unregister_secondary_recover_callback(string key) { + freeswitchPINVOKE.switch_core_unregister_secondary_recover_callback(key); + } + public static void switch_console_loop() { freeswitchPINVOKE.switch_console_loop(); } @@ -4550,6 +4581,10 @@ public class freeswitch { return ret; } + public static void switch_channel_set_direction(SWIGTYPE_p_switch_channel channel, switch_call_direction_t direction) { + freeswitchPINVOKE.switch_channel_set_direction(SWIGTYPE_p_switch_channel.getCPtr(channel), (int)direction); + } + public static SWIGTYPE_p_switch_core_session switch_channel_get_session(SWIGTYPE_p_switch_channel channel) { IntPtr cPtr = freeswitchPINVOKE.switch_channel_get_session(SWIGTYPE_p_switch_channel.getCPtr(channel)); SWIGTYPE_p_switch_core_session ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_core_session(cPtr, false); @@ -4915,8 +4950,8 @@ public class freeswitch { return ret; } - public static switch_status_t switch_event_binary_deserialize(SWIGTYPE_p_p_switch_event eventp, SWIGTYPE_p_p_void data, SWIGTYPE_p_switch_size_t len, switch_bool_t destroy) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_event_binary_deserialize(SWIGTYPE_p_p_switch_event.getCPtr(eventp), SWIGTYPE_p_p_void.getCPtr(data), SWIGTYPE_p_switch_size_t.getCPtr(len), (int)destroy); + public static switch_status_t switch_event_binary_deserialize(SWIGTYPE_p_p_switch_event eventp, SWIGTYPE_p_p_void data, SWIGTYPE_p_switch_size_t len, switch_bool_t duplicate) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_event_binary_deserialize(SWIGTYPE_p_p_switch_event.getCPtr(eventp), SWIGTYPE_p_p_void.getCPtr(data), SWIGTYPE_p_switch_size_t.getCPtr(len), (int)duplicate); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); return ret; } @@ -4936,6 +4971,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_event_serialize_json_obj(switch_event arg0, SWIGTYPE_p_p_cJSON json) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_event_serialize_json_obj(switch_event.getCPtr(arg0), SWIGTYPE_p_p_cJSON.getCPtr(json)); + return ret; + } + public static switch_status_t switch_event_create_json(SWIGTYPE_p_p_switch_event arg0, string json) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_event_create_json(SWIGTYPE_p_p_switch_event.getCPtr(arg0), json); return ret; @@ -4994,10 +5034,101 @@ public class freeswitch { freeswitchPINVOKE.switch_event_add_presence_data_cols(SWIGTYPE_p_switch_channel.getCPtr(channel), switch_event.getCPtr(arg1), prefix); } + public static void switch_json_add_presence_data_cols(switch_event arg0, SWIGTYPE_p_cJSON json, string prefix) { + freeswitchPINVOKE.switch_json_add_presence_data_cols(switch_event.getCPtr(arg0), SWIGTYPE_p_cJSON.getCPtr(json), prefix); + } + public static void switch_event_launch_dispatch_threads(uint max) { freeswitchPINVOKE.switch_event_launch_dispatch_threads(max); } + public static uint switch_event_channel_broadcast(string event_channel, SWIGTYPE_p_p_cJSON json, string key, uint id) { + uint ret = freeswitchPINVOKE.switch_event_channel_broadcast(event_channel, SWIGTYPE_p_p_cJSON.getCPtr(json), key, id); + return ret; + } + + public static uint switch_event_channel_unbind(string event_channel, SWIGTYPE_p_f_p_q_const__char_p_cJSON_p_q_const__char_unsigned_long__void func) { + uint ret = freeswitchPINVOKE.switch_event_channel_unbind(event_channel, SWIGTYPE_p_f_p_q_const__char_p_cJSON_p_q_const__char_unsigned_long__void.getCPtr(func)); + return ret; + } + + public static switch_status_t switch_event_channel_bind(string event_channel, SWIGTYPE_p_f_p_q_const__char_p_cJSON_p_q_const__char_unsigned_long__void func, SWIGTYPE_p_unsigned_long id) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_event_channel_bind(event_channel, SWIGTYPE_p_f_p_q_const__char_p_cJSON_p_q_const__char_unsigned_long__void.getCPtr(func), SWIGTYPE_p_unsigned_long.getCPtr(id)); + return ret; + } + + public static switch_status_t switch_live_array_clear(SWIGTYPE_p_switch_live_array_s la) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_live_array_clear(SWIGTYPE_p_switch_live_array_s.getCPtr(la)); + return ret; + } + + public static switch_status_t switch_live_array_bootstrap(SWIGTYPE_p_switch_live_array_s la, string sessid, uint channel_id) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_live_array_bootstrap(SWIGTYPE_p_switch_live_array_s.getCPtr(la), sessid, channel_id); + return ret; + } + + public static switch_status_t switch_live_array_destroy(SWIGTYPE_p_p_switch_live_array_s live_arrayP) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_live_array_destroy(SWIGTYPE_p_p_switch_live_array_s.getCPtr(live_arrayP)); + return ret; + } + + public static switch_status_t switch_live_array_create(string event_channel, string name, uint channel_id, SWIGTYPE_p_p_switch_live_array_s live_arrayP) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_live_array_create(event_channel, name, channel_id, SWIGTYPE_p_p_switch_live_array_s.getCPtr(live_arrayP)); + return ret; + } + + public static SWIGTYPE_p_cJSON switch_live_array_get(SWIGTYPE_p_switch_live_array_s la, string name) { + IntPtr cPtr = freeswitchPINVOKE.switch_live_array_get(SWIGTYPE_p_switch_live_array_s.getCPtr(la), name); + SWIGTYPE_p_cJSON ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_cJSON(cPtr, false); + return ret; + } + + public static SWIGTYPE_p_cJSON switch_live_array_get_idx(SWIGTYPE_p_switch_live_array_s la, int idx) { + IntPtr cPtr = freeswitchPINVOKE.switch_live_array_get_idx(SWIGTYPE_p_switch_live_array_s.getCPtr(la), idx); + SWIGTYPE_p_cJSON ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_cJSON(cPtr, false); + return ret; + } + + public static switch_status_t switch_live_array_del(SWIGTYPE_p_switch_live_array_s la, string name) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_live_array_del(SWIGTYPE_p_switch_live_array_s.getCPtr(la), name); + return ret; + } + + public static switch_status_t switch_live_array_add(SWIGTYPE_p_switch_live_array_s la, string name, int index, SWIGTYPE_p_p_cJSON obj, switch_bool_t destroy) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_live_array_add(SWIGTYPE_p_switch_live_array_s.getCPtr(la), name, index, SWIGTYPE_p_p_cJSON.getCPtr(obj), (int)destroy); + return ret; + } + + public static switch_status_t switch_live_array_visible(SWIGTYPE_p_switch_live_array_s la, switch_bool_t visible, switch_bool_t force) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_live_array_visible(SWIGTYPE_p_switch_live_array_s.getCPtr(la), (int)visible, (int)force); + return ret; + } + + public static switch_bool_t switch_live_array_isnew(SWIGTYPE_p_switch_live_array_s la) { + switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_live_array_isnew(SWIGTYPE_p_switch_live_array_s.getCPtr(la)); + return ret; + } + + public static void switch_live_array_lock(SWIGTYPE_p_switch_live_array_s la) { + freeswitchPINVOKE.switch_live_array_lock(SWIGTYPE_p_switch_live_array_s.getCPtr(la)); + } + + public static void switch_live_array_unlock(SWIGTYPE_p_switch_live_array_s la) { + freeswitchPINVOKE.switch_live_array_unlock(SWIGTYPE_p_switch_live_array_s.getCPtr(la)); + } + + public static void switch_live_array_set_user_data(SWIGTYPE_p_switch_live_array_s la, SWIGTYPE_p_void user_data) { + freeswitchPINVOKE.switch_live_array_set_user_data(SWIGTYPE_p_switch_live_array_s.getCPtr(la), SWIGTYPE_p_void.getCPtr(user_data)); + } + + public static void switch_live_array_set_command_handler(SWIGTYPE_p_switch_live_array_s la, SWIGTYPE_p_f_p_switch_live_array_s_p_q_const__char_p_q_const__char_p_cJSON_p_void__void command_handler) { + freeswitchPINVOKE.switch_live_array_set_command_handler(SWIGTYPE_p_switch_live_array_s.getCPtr(la), SWIGTYPE_p_f_p_switch_live_array_s_p_q_const__char_p_q_const__char_p_cJSON_p_void__void.getCPtr(command_handler)); + } + + public static void switch_live_array_parse_json(SWIGTYPE_p_cJSON json, uint channel_id) { + freeswitchPINVOKE.switch_live_array_parse_json(SWIGTYPE_p_cJSON.getCPtr(json), channel_id); + } + public static switch_status_t switch_resample_perform_create(SWIGTYPE_p_p_switch_audio_resampler_t new_resampler, uint from_rate, uint to_rate, uint to_size, int quality, uint channels, string file, string func, int line) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_resample_perform_create(SWIGTYPE_p_p_switch_audio_resampler_t.getCPtr(new_resampler), from_rate, to_rate, to_size, quality, channels, file, func, line); return ret; @@ -6104,6 +6235,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_rtp_del_dtls(SWIGTYPE_p_switch_rtp rtp_session, dtls_type_t type) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_rtp_del_dtls(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), (int)type); + return ret; + } + public static int switch_rtp_has_dtls() { int ret = freeswitchPINVOKE.switch_rtp_has_dtls(); return ret; @@ -6818,6 +6954,7 @@ public class freeswitch { public static readonly int SWITCH_DEFAULT_FILE_BUFFER_LEN = freeswitchPINVOKE.SWITCH_DEFAULT_FILE_BUFFER_LEN_get(); public static readonly int SWITCH_DTMF_LOG_LEN = freeswitchPINVOKE.SWITCH_DTMF_LOG_LEN_get(); public static readonly int SWITCH_MAX_TRANS = freeswitchPINVOKE.SWITCH_MAX_TRANS_get(); + public static readonly int SWITCH_CORE_SESSION_MAX_PRIVATES = freeswitchPINVOKE.SWITCH_CORE_SESSION_MAX_PRIVATES_get(); public static readonly int SWITCH_MAX_STACKS = freeswitchPINVOKE.SWITCH_MAX_STACKS_get(); public static readonly int SWITCH_THREAD_STACKSIZE = freeswitchPINVOKE.SWITCH_THREAD_STACKSIZE_get(); public static readonly int SWITCH_SYSTEM_THREAD_STACKSIZE = freeswitchPINVOKE.SWITCH_SYSTEM_THREAD_STACKSIZE_get(); @@ -6874,6 +7011,8 @@ public class freeswitch { public static readonly int SWITCH_CMD_CHUNK_LEN = freeswitchPINVOKE.SWITCH_CMD_CHUNK_LEN_get(); public static readonly int SWITCH_SMAX = freeswitchPINVOKE.SWITCH_SMAX_get(); public static readonly int SWITCH_SMIN = freeswitchPINVOKE.SWITCH_SMIN_get(); + public static readonly int NO_EVENT_CHANNEL_ID = freeswitchPINVOKE.NO_EVENT_CHANNEL_ID_get(); + public static readonly string SWITCH_EVENT_CHANNEL_GLOBAL = freeswitchPINVOKE.SWITCH_EVENT_CHANNEL_GLOBAL_get(); public static readonly int SWITCH_RESAMPLE_QUALITY = freeswitchPINVOKE.SWITCH_RESAMPLE_QUALITY_get(); public static readonly int SWITCH_RTP_MAX_BUF_LEN = freeswitchPINVOKE.SWITCH_RTP_MAX_BUF_LEN_get(); public static readonly int SWITCH_RTCP_MAX_BUF_LEN = freeswitchPINVOKE.SWITCH_RTCP_MAX_BUF_LEN_get(); @@ -7561,6 +7700,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_MAX_TRANS_get")] public static extern int SWITCH_MAX_TRANS_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_CORE_SESSION_MAX_PRIVATES_get")] + public static extern int SWITCH_CORE_SESSION_MAX_PRIVATES_get(); + [DllImport("mod_managed", EntryPoint="CSharp_switch_dtmf_t_digit_set")] public static extern void switch_dtmf_t_digit_set(HandleRef jarg1, char jarg2); @@ -9532,11 +9674,11 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_receive_event")] public static extern int switch_core_session_receive_event(HandleRef jarg1, HandleRef jarg2); - [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_get_private")] - public static extern IntPtr switch_core_session_get_private(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_get_private_class")] + public static extern IntPtr switch_core_session_get_private_class(HandleRef jarg1, int jarg2); - [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_set_private")] - public static extern int switch_core_session_set_private(HandleRef jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_set_private_class")] + public static extern int switch_core_session_set_private_class(HandleRef jarg1, HandleRef jarg2, int jarg3); [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_add_stream")] public static extern int switch_core_session_add_stream(HandleRef jarg1, HandleRef jarg2); @@ -9800,7 +9942,7 @@ class freeswitchPINVOKE { public static extern void switch_core_db_test_reactive(HandleRef jarg1, string jarg2, string jarg3, string jarg4); [DllImport("mod_managed", EntryPoint="CSharp_switch_core_perform_file_open")] - public static extern int switch_core_perform_file_open(string jarg1, string jarg2, int jarg3, HandleRef jarg4, string jarg5, byte jarg6, uint jarg7, uint jarg8, HandleRef jarg9); + public static extern int switch_core_perform_file_open(string jarg1, string jarg2, int jarg3, HandleRef jarg4, string jarg5, uint jarg6, uint jarg7, uint jarg8, HandleRef jarg9); [DllImport("mod_managed", EntryPoint="CSharp_switch_core_file_read")] public static extern int switch_core_file_read(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3); @@ -10393,6 +10535,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_stream_system_fork")] public static extern int switch_stream_system_fork(string jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ice_direction")] + public static extern int switch_ice_direction(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_interface_module_name_set")] public static extern void switch_loadable_module_interface_module_name_set(HandleRef jarg1, string jarg2); @@ -10441,6 +10586,12 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_interface_api_interface_get")] public static extern IntPtr switch_loadable_module_interface_api_interface_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_interface_json_api_interface_set")] + public static extern void switch_loadable_module_interface_json_api_interface_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_interface_json_api_interface_get")] + public static extern IntPtr switch_loadable_module_interface_json_api_interface_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_interface_file_interface_set")] public static extern void switch_loadable_module_interface_file_interface_set(HandleRef jarg1, HandleRef jarg2); @@ -10555,6 +10706,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_get_api_interface")] public static extern IntPtr switch_loadable_module_get_api_interface(string jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_get_json_api_interface")] + public static extern IntPtr switch_loadable_module_get_json_api_interface(string jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_get_file_interface")] public static extern IntPtr switch_loadable_module_get_file_interface(string jarg1); @@ -10588,6 +10742,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_api_execute")] public static extern int switch_api_execute(string jarg1, string jarg2, HandleRef jarg3, HandleRef jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_execute")] + public static extern int switch_json_api_execute(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_load_module")] public static extern int switch_loadable_module_load_module(string jarg1, string jarg2, int jarg3, ref string jarg4); @@ -10609,6 +10766,15 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_codec_ready")] public static extern int switch_core_codec_ready(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_get_secondary_recover_callback")] + public static extern IntPtr switch_core_get_secondary_recover_callback(string jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_register_secondary_recover_callback")] + public static extern int switch_core_register_secondary_recover_callback(string jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_unregister_secondary_recover_callback")] + public static extern void switch_core_unregister_secondary_recover_callback(string jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_CMD_CHUNK_LEN_get")] public static extern int SWITCH_CMD_CHUNK_LEN_get(); @@ -12134,10 +12300,10 @@ class freeswitchPINVOKE { public static extern uint switch_file_handle_native_rate_get(HandleRef jarg1); [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_channels_set")] - public static extern void switch_file_handle_channels_set(HandleRef jarg1, byte jarg2); + public static extern void switch_file_handle_channels_set(HandleRef jarg1, uint jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_channels_get")] - public static extern byte switch_file_handle_channels_get(HandleRef jarg1); + public static extern uint switch_file_handle_channels_get(HandleRef jarg1); [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_format_set")] public static extern void switch_file_handle_format_set(HandleRef jarg1, uint jarg2); @@ -12343,6 +12509,18 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_params_get")] public static extern IntPtr switch_file_handle_params_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_cur_channels_set")] + public static extern void switch_file_handle_cur_channels_set(HandleRef jarg1, uint jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_cur_channels_get")] + public static extern uint switch_file_handle_cur_channels_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_cur_samplerate_set")] + public static extern void switch_file_handle_cur_samplerate_set(HandleRef jarg1, uint jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_cur_samplerate_get")] + public static extern uint switch_file_handle_cur_samplerate_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_new_switch_file_handle")] public static extern IntPtr new_switch_file_handle(); @@ -13633,6 +13811,66 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_delete_switch_api_interface")] public static extern void delete_switch_api_interface(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_interface_name_set")] + public static extern void switch_json_api_interface_interface_name_set(HandleRef jarg1, string jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_interface_name_get")] + public static extern string switch_json_api_interface_interface_name_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_desc_set")] + public static extern void switch_json_api_interface_desc_set(HandleRef jarg1, string jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_desc_get")] + public static extern string switch_json_api_interface_desc_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_function_set")] + public static extern void switch_json_api_interface_function_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_function_get")] + public static extern IntPtr switch_json_api_interface_function_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_syntax_set")] + public static extern void switch_json_api_interface_syntax_set(HandleRef jarg1, string jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_syntax_get")] + public static extern string switch_json_api_interface_syntax_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_rwlock_set")] + public static extern void switch_json_api_interface_rwlock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_rwlock_get")] + public static extern IntPtr switch_json_api_interface_rwlock_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_refs_set")] + public static extern void switch_json_api_interface_refs_set(HandleRef jarg1, int jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_refs_get")] + public static extern int switch_json_api_interface_refs_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_reflock_set")] + public static extern void switch_json_api_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_reflock_get")] + public static extern IntPtr switch_json_api_interface_reflock_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_parent_set")] + public static extern void switch_json_api_interface_parent_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_parent_get")] + public static extern IntPtr switch_json_api_interface_parent_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_next_set")] + public static extern void switch_json_api_interface_next_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_api_interface_next_get")] + public static extern IntPtr switch_json_api_interface_next_get(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_new_switch_json_api_interface")] + public static extern IntPtr new_switch_json_api_interface(); + + [DllImport("mod_managed", EntryPoint="CSharp_delete_switch_json_api_interface")] + public static extern void delete_switch_json_api_interface(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_slin_data_session_set")] public static extern void switch_slin_data_session_set(HandleRef jarg1, HandleRef jarg2); @@ -14089,6 +14327,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_direction")] public static extern int switch_channel_direction(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_direction")] + public static extern void switch_channel_set_direction(HandleRef jarg1, int jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_get_session")] public static extern IntPtr switch_channel_get_session(HandleRef jarg1); @@ -14503,6 +14744,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_event_serialize_json")] public static extern int switch_event_serialize_json(HandleRef jarg1, ref string jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_event_serialize_json_obj")] + public static extern int switch_event_serialize_json_obj(HandleRef jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_event_create_json")] public static extern int switch_event_create_json(HandleRef jarg1, string jarg2); @@ -14539,9 +14783,72 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_event_add_presence_data_cols")] public static extern void switch_event_add_presence_data_cols(HandleRef jarg1, HandleRef jarg2, string jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_switch_json_add_presence_data_cols")] + public static extern void switch_json_add_presence_data_cols(HandleRef jarg1, HandleRef jarg2, string jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_switch_event_launch_dispatch_threads")] public static extern void switch_event_launch_dispatch_threads(uint jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_event_channel_broadcast")] + public static extern uint switch_event_channel_broadcast(string jarg1, HandleRef jarg2, string jarg3, uint jarg4); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_event_channel_unbind")] + public static extern uint switch_event_channel_unbind(string jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_event_channel_bind")] + public static extern int switch_event_channel_bind(string jarg1, HandleRef jarg2, HandleRef jarg3); + + [DllImport("mod_managed", EntryPoint="CSharp_NO_EVENT_CHANNEL_ID_get")] + public static extern int NO_EVENT_CHANNEL_ID_get(); + + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_EVENT_CHANNEL_GLOBAL_get")] + public static extern string SWITCH_EVENT_CHANNEL_GLOBAL_get(); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_clear")] + public static extern int switch_live_array_clear(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_bootstrap")] + public static extern int switch_live_array_bootstrap(HandleRef jarg1, string jarg2, uint jarg3); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_destroy")] + public static extern int switch_live_array_destroy(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_create")] + public static extern int switch_live_array_create(string jarg1, string jarg2, uint jarg3, HandleRef jarg4); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_get")] + public static extern IntPtr switch_live_array_get(HandleRef jarg1, string jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_get_idx")] + public static extern IntPtr switch_live_array_get_idx(HandleRef jarg1, int jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_del")] + public static extern int switch_live_array_del(HandleRef jarg1, string jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_add")] + public static extern int switch_live_array_add(HandleRef jarg1, string jarg2, int jarg3, HandleRef jarg4, int jarg5); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_visible")] + public static extern int switch_live_array_visible(HandleRef jarg1, int jarg2, int jarg3); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_isnew")] + public static extern int switch_live_array_isnew(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_lock")] + public static extern void switch_live_array_lock(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_unlock")] + public static extern void switch_live_array_unlock(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_set_user_data")] + public static extern void switch_live_array_set_user_data(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_set_command_handler")] + public static extern void switch_live_array_set_command_handler(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_live_array_parse_json")] + public static extern void switch_live_array_parse_json(HandleRef jarg1, uint jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_RESAMPLE_QUALITY_get")] public static extern int SWITCH_RESAMPLE_QUALITY_get(); @@ -15553,6 +15860,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_add_dtls")] public static extern int switch_rtp_add_dtls(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3, int jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_del_dtls")] + public static extern int switch_rtp_del_dtls(HandleRef jarg1, int jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_has_dtls")] public static extern int switch_rtp_has_dtls(); @@ -17632,6 +17942,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_cJSON { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_cJSON(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_cJSON() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_cJSON obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_FILE { private HandleRef swigCPtr; @@ -17752,6 +18092,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_f_p_q_const__char_p_cJSON_p_q_const__char_unsigned_long__void { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_f_p_q_const__char_p_cJSON_p_q_const__char_unsigned_long__void(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_f_p_q_const__char_p_cJSON_p_q_const__char_unsigned_long__void() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_f_p_q_const__char_p_cJSON_p_q_const__char_unsigned_long__void obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_p_switch_console_callback_match__switch_status_t { private HandleRef swigCPtr; @@ -17962,6 +18332,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_f_p_q_const__cJSON_p_switch_core_session_p_p_cJSON__switch_status_t { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_f_p_q_const__cJSON_p_switch_core_session_p_p_cJSON__switch_status_t(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_f_p_q_const__cJSON_p_switch_core_session_p_p_cJSON__switch_status_t() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_f_p_q_const__cJSON_p_switch_core_session_p_p_cJSON__switch_status_t obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_f_p_q_const__switch_log_node_t_enum_switch_log_level_t__switch_status_t { private HandleRef swigCPtr; @@ -19612,6 +20012,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_f_p_switch_live_array_s_p_q_const__char_p_q_const__char_p_cJSON_p_void__void { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_f_p_switch_live_array_s_p_q_const__char_p_q_const__char_p_cJSON_p_void__void(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_f_p_switch_live_array_s_p_q_const__char_p_q_const__char_p_cJSON_p_void__void() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_f_p_switch_live_array_s_p_q_const__char_p_q_const__char_p_cJSON_p_void__void obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_f_p_switch_media_bug_p_void_enum_switch_abc_type_t__switch_bool_t { private HandleRef swigCPtr; @@ -21322,6 +21752,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_p_switch_live_array_s { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_p_switch_live_array_s(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_p_switch_live_array_s() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_p_switch_live_array_s obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_p_switch_log_node_t { private HandleRef swigCPtr; @@ -22402,6 +22862,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_switch_live_array_s { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_switch_live_array_s(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_switch_live_array_s() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_switch_live_array_s obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_switch_media_bug { private HandleRef swigCPtr; @@ -29838,7 +30328,8 @@ namespace FreeSWITCH.Native { SWITCH_FILE_BUFFER_DONE = (1 << 14), SWITCH_FILE_WRITE_APPEND = (1 << 15), SWITCH_FILE_WRITE_OVER = (1 << 16), - SWITCH_FILE_NOMUX = (1 << 17) + SWITCH_FILE_NOMUX = (1 << 17), + SWITCH_FILE_BREAK_ON_CHANGE = (1 << 18) } } @@ -29945,12 +30436,12 @@ public class switch_file_handle : IDisposable { } } - public byte channels { + public uint channels { set { freeswitchPINVOKE.switch_file_handle_channels_set(swigCPtr, value); } get { - byte ret = freeswitchPINVOKE.switch_file_handle_channels_get(swigCPtr); + uint ret = freeswitchPINVOKE.switch_file_handle_channels_get(swigCPtr); return ret; } } @@ -30315,6 +30806,26 @@ public class switch_file_handle : IDisposable { } } + public uint cur_channels { + set { + freeswitchPINVOKE.switch_file_handle_cur_channels_set(swigCPtr, value); + } + get { + uint ret = freeswitchPINVOKE.switch_file_handle_cur_channels_get(swigCPtr); + return ret; + } + } + + public uint cur_samplerate { + set { + freeswitchPINVOKE.switch_file_handle_cur_samplerate_set(swigCPtr, value); + } + get { + uint ret = freeswitchPINVOKE.switch_file_handle_cur_samplerate_get(swigCPtr); + return ret; + } + } + public switch_file_handle() : this(freeswitchPINVOKE.new_switch_file_handle(), true) { } @@ -32511,6 +33022,148 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class switch_json_api_interface : IDisposable { + private HandleRef swigCPtr; + protected bool swigCMemOwn; + + internal switch_json_api_interface(IntPtr cPtr, bool cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(switch_json_api_interface obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~switch_json_api_interface() { + Dispose(); + } + + public virtual void Dispose() { + lock(this) { + if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { + swigCMemOwn = false; + freeswitchPINVOKE.delete_switch_json_api_interface(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + GC.SuppressFinalize(this); + } + } + + public string interface_name { + set { + freeswitchPINVOKE.switch_json_api_interface_interface_name_set(swigCPtr, value); + } + get { + string ret = freeswitchPINVOKE.switch_json_api_interface_interface_name_get(swigCPtr); + return ret; + } + } + + public string desc { + set { + freeswitchPINVOKE.switch_json_api_interface_desc_set(swigCPtr, value); + } + get { + string ret = freeswitchPINVOKE.switch_json_api_interface_desc_get(swigCPtr); + return ret; + } + } + + public SWIGTYPE_p_f_p_q_const__cJSON_p_switch_core_session_p_p_cJSON__switch_status_t function { + set { + freeswitchPINVOKE.switch_json_api_interface_function_set(swigCPtr, SWIGTYPE_p_f_p_q_const__cJSON_p_switch_core_session_p_p_cJSON__switch_status_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_json_api_interface_function_get(swigCPtr); + SWIGTYPE_p_f_p_q_const__cJSON_p_switch_core_session_p_p_cJSON__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_q_const__cJSON_p_switch_core_session_p_p_cJSON__switch_status_t(cPtr, false); + return ret; + } + } + + public string syntax { + set { + freeswitchPINVOKE.switch_json_api_interface_syntax_set(swigCPtr, value); + } + get { + string ret = freeswitchPINVOKE.switch_json_api_interface_syntax_get(swigCPtr); + return ret; + } + } + + public SWIGTYPE_p_switch_thread_rwlock_t rwlock { + set { + freeswitchPINVOKE.switch_json_api_interface_rwlock_set(swigCPtr, SWIGTYPE_p_switch_thread_rwlock_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_json_api_interface_rwlock_get(swigCPtr); + SWIGTYPE_p_switch_thread_rwlock_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_thread_rwlock_t(cPtr, false); + return ret; + } + } + + public int refs { + set { + freeswitchPINVOKE.switch_json_api_interface_refs_set(swigCPtr, value); + } + get { + int ret = freeswitchPINVOKE.switch_json_api_interface_refs_get(swigCPtr); + return ret; + } + } + + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_json_api_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_json_api_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + + public switch_loadable_module_interface parent { + set { + freeswitchPINVOKE.switch_json_api_interface_parent_set(swigCPtr, switch_loadable_module_interface.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_json_api_interface_parent_get(swigCPtr); + switch_loadable_module_interface ret = (cPtr == IntPtr.Zero) ? null : new switch_loadable_module_interface(cPtr, false); + return ret; + } + } + + public switch_json_api_interface next { + set { + freeswitchPINVOKE.switch_json_api_interface_next_set(swigCPtr, switch_json_api_interface.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_json_api_interface_next_get(swigCPtr); + switch_json_api_interface ret = (cPtr == IntPtr.Zero) ? null : new switch_json_api_interface(cPtr, false); + return ret; + } + } + + public switch_json_api_interface() : this(freeswitchPINVOKE.new_switch_json_api_interface(), true) { + } + +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class switch_limit_interface : IDisposable { private HandleRef swigCPtr; protected bool swigCMemOwn; @@ -32903,6 +33556,17 @@ public class switch_loadable_module_interface : IDisposable { } } + public switch_json_api_interface json_api_interface { + set { + freeswitchPINVOKE.switch_loadable_module_interface_json_api_interface_set(swigCPtr, switch_json_api_interface.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_loadable_module_interface_json_api_interface_get(swigCPtr); + switch_json_api_interface ret = (cPtr == IntPtr.Zero) ? null : new switch_json_api_interface(cPtr, false); + return ret; + } + } + public switch_file_interface file_interface { set { freeswitchPINVOKE.switch_loadable_module_interface_file_interface_set(swigCPtr, switch_file_interface.getCPtr(value)); @@ -33464,7 +34128,8 @@ public enum switch_module_interface_name_t { SWITCH_ASR_INTERFACE, SWITCH_MANAGEMENT_INTERFACE, SWITCH_LIMIT_INTERFACE, - SWITCH_CHAT_APPLICATION_INTERFACE + SWITCH_CHAT_APPLICATION_INTERFACE, + SWITCH_JSON_API_INTERFACE } } @@ -33532,6 +34197,22 @@ public enum switch_priority_t { namespace FreeSWITCH.Native { +public enum switch_pvt_class_t { + SWITCH_PVT_PRIMARY = 0, + SWITCH_PVT_SECONDARY +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + public enum switch_ring_ready_t { SWITCH_RING_READY_NONE, SWITCH_RING_READY_RINGING, @@ -33923,6 +34604,7 @@ public enum switch_rtp_flag_t { SWITCH_RTP_FLAG_ENABLE_RTCP, SWITCH_RTP_FLAG_RTCP_MUX, SWITCH_RTP_FLAG_KILL_JB, + SWITCH_RTP_FLAG_VIDEO_BREAK, SWITCH_RTP_FLAG_INVALID } @@ -35919,7 +36601,9 @@ public enum switch_status_t { SWITCH_STATUS_FOUND, SWITCH_STATUS_CONTINUE, SWITCH_STATUS_TERM, - SWITCH_STATUS_NOT_INITALIZED + SWITCH_STATUS_NOT_INITALIZED, + SWITCH_STATUS_XBREAK = 35, + SWITCH_STATUS_WINBREAK = 730035 } } diff --git a/src/mod/languages/mod_perl/mod_perl_wrap.cpp b/src/mod/languages/mod_perl/mod_perl_wrap.cpp index 6f1b81cabe..0757fcd85c 100644 --- a/src/mod/languages/mod_perl/mod_perl_wrap.cpp +++ b/src/mod/languages/mod_perl/mod_perl_wrap.cpp @@ -2510,17 +2510,29 @@ XS(_wrap_IVRMenu_execute) { XS(_wrap_new_API) { { + CoreSession *arg1 = (CoreSession *) NULL ; API *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; int argvi = 0; dXSARGS; - if ((items < 0) || (items > 0)) { - SWIG_croak("Usage: new_API();"); + if ((items < 0) || (items > 1)) { + SWIG_croak("Usage: new_API(s);"); } - result = (API *)new API(); + if (items > 0) { + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_CoreSession, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_API" "', argument " "1"" of type '" "CoreSession *""'"); + } + arg1 = reinterpret_cast< CoreSession * >(argp1); + } + result = (API *)new API(arg1); ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_API, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + XSRETURN(argvi); fail: + SWIG_croak_null(); } } diff --git a/src/mod/languages/mod_python/mod_python_wrap.cpp b/src/mod/languages/mod_python/mod_python_wrap.cpp index caecd70d5b..b7379edb7d 100644 --- a/src/mod/languages/mod_python/mod_python_wrap.cpp +++ b/src/mod/languages/mod_python/mod_python_wrap.cpp @@ -3579,10 +3579,21 @@ SWIGINTERN PyObject *IVRMenu_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObje SWIGINTERN PyObject *_wrap_new_API(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; + CoreSession *arg1 = (CoreSession *) NULL ; API *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; - if (!PyArg_ParseTuple(args,(char *)":new_API")) SWIG_fail; - result = (API *)new API(); + if (!PyArg_ParseTuple(args,(char *)"|O:new_API",&obj0)) SWIG_fail; + if (obj0) { + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CoreSession, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_API" "', argument " "1"" of type '" "CoreSession *""'"); + } + arg1 = reinterpret_cast< CoreSession * >(argp1); + } + result = (API *)new API(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_API, SWIG_POINTER_NEW | 0 ); return resultobj; fail: From 00c46450ffe202ed090f6cfa1a1b4e98a55d0929 Mon Sep 17 00:00:00 2001 From: William King Date: Tue, 15 Oct 2013 19:09:39 -0700 Subject: [PATCH 35/80] In a case where calls to phones with presence enabled as well as presence disabled, there were cases where the presence enabled calls weren't turning off lights due to the fact that there were calls still up on the phone(though those calls had presence disabled). --- src/mod/endpoints/mod_sofia/sofia_presence.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 11228355bf..ef998c9c88 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -644,15 +644,31 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event) static int sofia_presence_dialog_callback(void *pArg, int argc, char **argv, char **columnNames) { struct dialog_helper *helper = (struct dialog_helper *) pArg; + switch_core_session_t *session = NULL; + switch_channel_t *channel = NULL; + int done = 0; if (argc >= 4) { if (argc == 5 && !zstr(argv[4])) { - if (!switch_ivr_uuid_exists(argv[4])) { + if ((session = switch_core_session_locate(argv[4]))) { + channel = switch_core_session_get_channel(session); + + if (!switch_channel_test_flag(channel, CF_ANSWERED) && + switch_true(switch_channel_get_variable_dup(channel, "presence_disable_early", SWITCH_FALSE, -1))) { + done++; + } + + switch_core_session_rwunlock(session); + } else { return 0; } } + if (done) { + return 0; + } + if (mod_sofia_globals.debug_presence > 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "CHECK DIALOG state[%s] status[%s] rpid[%s] pres[%s] uuid[%s]\n", argv[0], argv[1], argv[2], argv[3], argv[4]); From 25e7be1c60abdfa30a573559fecf3b6b1af29177 Mon Sep 17 00:00:00 2001 From: Raymond Chandler Date: Wed, 16 Oct 2013 10:56:01 -0400 Subject: [PATCH 36/80] FS-2731 apply patch --- src/mod/endpoints/mod_sofia/mod_sofia.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index b99c7aae96..7286c5de16 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -4557,6 +4557,9 @@ static int notify_csta_callback(void *pArg, int argc, char **argv, char **column char *ct = argv[i++]; char *id = NULL; char *contact; + sip_cseq_t *cseq = NULL; + uint32_t callsequence; + uint32_t now = (uint32_t) switch_epoch_time_now(NULL); sofia_destination_t *dst = NULL; char *route_uri = NULL; @@ -4581,14 +4584,22 @@ static int notify_csta_callback(void *pArg, int argc, char **argv, char **column route_uri = sofia_glue_strip_uri(dst->route_uri); } + switch_mutex_lock(profile->ireg_mutex); + if (!profile->cseq_base) { + profile->cseq_base = (now - 1312693200) * 10; + } + callsequence = ++profile->cseq_base; + switch_mutex_unlock(profile->ireg_mutex); + //nh = nua_handle(profile->nua, NULL, NUTAG_URL(dst->contact), SIPTAG_FROM_STR(id), SIPTAG_TO_STR(id), SIPTAG_CONTACT_STR(profile->url), TAG_END()); - nh = nua_handle(profile->nua, NULL, NUTAG_URL(dst->contact), SIPTAG_FROM_STR(full_from), SIPTAG_TO_STR(full_to), SIPTAG_CONTACT_STR(profile->url), TAG_END()); + nh = nua_handle(profile->nua, NULL, NUTAG_URL(dst->contact), SIPTAG_FROM_STR(full_to), SIPTAG_TO_STR(full_from), SIPTAG_CONTACT_STR(profile->url), TAG_END()); + cseq = sip_cseq_create(nh->nh_home, callsequence, SIP_METHOD_NOTIFY); nua_handle_bind(nh, &mod_sofia_globals.destroy_private); nua_notify(nh, NUTAG_NEWSUB(1), TAG_IF(dst->route_uri, NUTAG_PROXY(route_uri)), TAG_IF(dst->route, SIPTAG_ROUTE_STR(dst->route)), TAG_IF(call_id, SIPTAG_CALL_ID_STR(call_id)), - SIPTAG_EVENT_STR("as-feature-event"), SIPTAG_CONTENT_TYPE_STR(ct), TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)), TAG_IF(!zstr(body), SIPTAG_PAYLOAD_STR(body)), TAG_END()); + SIPTAG_EVENT_STR("as-feature-event"), SIPTAG_CONTENT_TYPE_STR(ct), TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)), TAG_IF(!zstr(body), SIPTAG_PAYLOAD_STR(body)), SIPTAG_CSEQ(cseq), TAG_END()); @@ -4872,7 +4883,7 @@ static void general_event_handler(switch_event_t *event) SWITCH_STANDARD_STREAM(fwdi_stream); write_csta_xml_chunk(event, fwdi_stream, "ForwardingEvent", "forwardImmediate"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[%s] is %d bytes long\n", (char *)fwdi_stream.data, (int)strlen(fwdi_stream.data)); - stream.write_function(&stream, "--%s\nContent-Type: application/x-as-feature-event+xml\nContent-Length:%d\nContent-ID:<%s@%s>\n\n%s", boundary_string, strlen(fwdi_stream.data), user, host, fwdi_stream.data); + stream.write_function(&stream, "--%s\r\nContent-Type: application/x-as-feature-event+xml\r\nContent-Length: %d\r\nContent-ID: <%si@%s>\r\n\r\n%s", boundary_string, strlen(fwdi_stream.data), user, host, fwdi_stream.data); switch_safe_free(fwdi_stream.data); } if ((header_name = switch_event_get_header(event, "forward_busy"))) { @@ -4880,7 +4891,7 @@ static void general_event_handler(switch_event_t *event) SWITCH_STANDARD_STREAM(fwdb_stream); write_csta_xml_chunk(event, fwdb_stream, "ForwardingEvent", "forwardBusy"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[%s] is %d bytes long\n", (char *)fwdb_stream.data, (int)strlen(fwdb_stream.data)); - stream.write_function(&stream, "--%s\nContent-Type: application/x-as-feature-event+xml\nContent-Length:%d\nContent-ID:<%s@%s>\n\n%s", boundary_string, strlen(fwdb_stream.data), user, host, fwdb_stream.data); + stream.write_function(&stream, "--%s\r\nContent-Type: application/x-as-feature-event+xml\r\nContent-Length: %d\r\nContent-ID: <%sb@%s>\r\n\r\n%s", boundary_string, strlen(fwdb_stream.data), user, host, fwdb_stream.data); switch_safe_free(fwdb_stream.data); } if ((header_name = switch_event_get_header(event, "forward_no_answer"))) { @@ -4888,17 +4899,17 @@ static void general_event_handler(switch_event_t *event) SWITCH_STANDARD_STREAM(fwdna_stream); write_csta_xml_chunk(event, fwdna_stream, "ForwardingEvent", "forwardNoAns"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[%s] is %d bytes long\n", (char *)fwdna_stream.data, (int)strlen(fwdna_stream.data)); - stream.write_function(&stream, "--%s\nContent-Type: application/x-as-feature-event+xml\nContent-Length:%d\nContent-ID:<%s@%s>\n\n%s", boundary_string, strlen(fwdna_stream.data), user, host, fwdna_stream.data); + stream.write_function(&stream, "--%s\r\nContent-Type: application/x-as-feature-event+xml\r\nContent-Length: %d\r\nContent-ID: <%sn@%s>\r\n\r\n%s", boundary_string, strlen(fwdna_stream.data), user, host, fwdna_stream.data); switch_safe_free(fwdna_stream.data); } SWITCH_STANDARD_STREAM(dnd_stream); write_csta_xml_chunk(event, dnd_stream, "DoNotDisturbEvent", NULL); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[%s] is %d bytes long\n", (char *)dnd_stream.data, (int)strlen(dnd_stream.data)); - stream.write_function(&stream, "--%s\nContent-Type:application/x-as-feature-event+xml\nContent-Length:%d\nContent-ID:<%s@%s>\n\n%s", boundary_string, strlen(dnd_stream.data), user, host, dnd_stream.data); + stream.write_function(&stream, "--%s\r\nContent-Type: application/x-as-feature-event+xml\r\nContent-Length: %d\r\nContent-ID: <%sd@%s>\r\n\r\n%s", boundary_string, strlen(dnd_stream.data), user, host, dnd_stream.data); switch_safe_free(dnd_stream.data); - stream.write_function(&stream, "--%s--\n", boundary_string); + stream.write_function(&stream, "--%s--\r\n", boundary_string); ct = switch_mprintf("multipart/mixed; boundary=\"%s\"", boundary_string); } else { From b474c897088188a75e23ffdd73370221098042ee Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 16 Oct 2013 14:33:25 -0400 Subject: [PATCH 37/80] FS-5861 regression typo --- src/mod/applications/mod_dptools/mod_dptools.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 5fe2c57e5b..8d7b5c6f37 100755 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -287,7 +287,7 @@ SWITCH_STANDARD_APP(clear_digit_action_function) char *target_str; switch_digit_action_target_t target = DIGIT_TARGET_SELF; - if (zstr(realm)) { + if (zstr((char *)data)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "clear_digit_action called with no args"); return; } From b694cb09a6345f2f0f646e77cb27e42cfa77c989 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 16 Oct 2013 22:57:15 +0500 Subject: [PATCH 38/80] google changed something in DTLS --- src/include/switch_event.h | 3 +- src/switch_core_cert.c | 1 + src/switch_core_media.c | 18 +++++--- src/switch_event.c | 91 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 101 insertions(+), 12 deletions(-) diff --git a/src/include/switch_event.h b/src/include/switch_event.h index be60c17cd9..d812602a5b 100644 --- a/src/include/switch_event.h +++ b/src/include/switch_event.h @@ -451,7 +451,8 @@ SWITCH_DECLARE(void) switch_live_array_unlock(switch_live_array_t *la); SWITCH_DECLARE(void) switch_live_array_set_user_data(switch_live_array_t *la, void *user_data); SWITCH_DECLARE(void) switch_live_array_set_command_handler(switch_live_array_t *la, switch_live_array_command_handler_t command_handler); SWITCH_DECLARE(void) switch_live_array_parse_json(cJSON *json, switch_event_channel_id_t channel_id); - +SWITCH_DECLARE(switch_bool_t) switch_live_array_add_alias(switch_live_array_t *la, const char *event_channel, const char *name); +SWITCH_DECLARE(switch_bool_t) switch_live_array_clear_alias(switch_live_array_t *la, const char *event_channel, const char *name); ///\} diff --git a/src/switch_core_cert.c b/src/switch_core_cert.c index 41446c600d..ffba06ade5 100644 --- a/src/switch_core_cert.c +++ b/src/switch_core_cert.c @@ -97,6 +97,7 @@ static const EVP_MD *get_evp_by_name(const char *name) { if (!strcasecmp(name, "md5")) return EVP_md5(); if (!strcasecmp(name, "sha1")) return EVP_sha1(); + if (!strcasecmp(name, "sha-1")) return EVP_sha1(); if (!strcasecmp(name, "sha-256")) return EVP_sha256(); if (!strcasecmp(name, "sha-512")) return EVP_sha512(); diff --git a/src/switch_core_media.c b/src/switch_core_media.c index b412a518f5..38f61fd826 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -2038,7 +2038,11 @@ static void generate_local_fingerprint(switch_media_handle_t *smh, switch_media_ switch_rtp_engine_t *engine = &smh->engines[type]; if (!engine->local_dtls_fingerprint.len) { - engine->local_dtls_fingerprint.type = "sha-256"; + if (engine->remote_dtls_fingerprint.type) { + engine->local_dtls_fingerprint.type = engine->remote_dtls_fingerprint.type; + } else { + engine->local_dtls_fingerprint.type = "sha-256"; + } switch_core_cert_gen_fingerprint(DTLS_SRTP_FNAME, &engine->local_dtls_fingerprint); } } @@ -2118,16 +2122,16 @@ static void check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_ switch_set_string(engine->local_dtls_fingerprint.str, p); } - if (strcasecmp(engine->remote_dtls_fingerprint.type, "sha-256")) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Unsupported fingerprint type.\n"); - engine->local_dtls_fingerprint.type = NULL; - engine->remote_dtls_fingerprint.type = NULL; - } + //if (strcasecmp(engine->remote_dtls_fingerprint.type, "sha-256")) { + // switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Unsupported fingerprint type.\n"); + //engine->local_dtls_fingerprint.type = NULL; + //engine->remote_dtls_fingerprint.type = NULL; + //} generate_local_fingerprint(smh, type); switch_channel_set_flag(smh->session->channel, CF_DTLS); - + } else if (!engine->remote_ssrc && !strcasecmp(attr->a_name, "ssrc") && attr->a_value) { engine->remote_ssrc = (uint32_t) atol(attr->a_value); diff --git a/src/switch_event.c b/src/switch_event.c index 926b3d85f6..873e3d98dd 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -2963,6 +2963,12 @@ SWITCH_DECLARE(switch_status_t) switch_event_channel_bind(const char *event_chan return status; } +typedef struct alias_node_s { + char *event_channel; + char *name; + struct alias_node_s *next; +} alias_node_t; + typedef struct la_node_s { char *name; cJSON *obj; @@ -2986,8 +2992,31 @@ struct switch_live_array_s { switch_event_channel_id_t channel_id; switch_live_array_command_handler_t command_handler; void *user_data; + alias_node_t *aliases; }; +static switch_status_t la_broadcast(switch_live_array_t *la, cJSON **json) +{ + alias_node_t *np; + + if (la->aliases) { + switch_mutex_lock(la->mutex); + for (np = la->aliases; np; np = np->next) { + cJSON *dup = cJSON_Duplicate(*json, 1); + cJSON *data = cJSON_GetObjectItem(dup, "data"); + + cJSON_ReplaceItemInObject(dup, "eventChannel", cJSON_CreateString(np->event_channel)); + cJSON_ReplaceItemInObject(data, "name", cJSON_CreateString(np->name)); + + switch_event_channel_broadcast(np->event_channel, &dup, __FILE__, la->channel_id); + } + switch_mutex_unlock(la->mutex); + } + + return switch_event_channel_broadcast(la->event_channel, json, __FILE__, la->channel_id); + +} + SWITCH_DECLARE(switch_status_t) switch_live_array_visible(switch_live_array_t *la, switch_bool_t visible, switch_bool_t force) { @@ -3004,7 +3033,7 @@ SWITCH_DECLARE(switch_status_t) switch_live_array_visible(switch_live_array_t *l cJSON_AddItemToObject(data, "action", cJSON_CreateString(visible ? "hide" : "show")); cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(la->serno++)); - switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, la->channel_id); + la_broadcast(la, &msg); la->visible = visible; } @@ -3030,7 +3059,7 @@ SWITCH_DECLARE(switch_status_t) switch_live_array_clear(switch_live_array_t *la) cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(-1)); cJSON_AddItemToObject(data, "data", cJSON_CreateObject()); - switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, la->channel_id); + la_broadcast(la, &msg); while(np) { cur = np; @@ -3146,6 +3175,60 @@ SWITCH_DECLARE(switch_bool_t) switch_live_array_isnew(switch_live_array_t *la) return la->new; } +SWITCH_DECLARE(switch_bool_t) switch_live_array_clear_alias(switch_live_array_t *la, const char *event_channel, const char *name) +{ + alias_node_t *np, *last = NULL; + switch_bool_t r = SWITCH_FALSE; + + switch_mutex_lock(la->mutex); + for (np = la->aliases; np; np = np->next) { + if (!strcmp(np->event_channel, event_channel) && !strcmp(np->name, name)) { + r = SWITCH_TRUE; + + if (last) { + last->next = np->next; + } else { + la->aliases = np->next; + } + } else { + last = np; + } + } + switch_mutex_unlock(la->mutex); + + return r; +} + +SWITCH_DECLARE(switch_bool_t) switch_live_array_add_alias(switch_live_array_t *la, const char *event_channel, const char *name) +{ + alias_node_t *node, *np; + switch_bool_t exist = SWITCH_FALSE; + + switch_mutex_lock(la->mutex); + for (np = la->aliases; np && np->next; np = np->next) { + if (!strcmp(np->event_channel, event_channel) && !strcmp(np->name, name)) { + exist = SWITCH_TRUE; + break; + } + } + + if (!exist) { + node = switch_core_alloc(la->pool, sizeof(*node)); + node->event_channel = switch_core_strdup(la->pool, event_channel); + node->name = switch_core_strdup(la->pool, name); + if (np) { + np->next = node; + } else { + la->aliases = node; + } + } + + switch_mutex_unlock(la->mutex); + + return !exist; +} + + SWITCH_DECLARE(switch_status_t) switch_live_array_create(const char *event_channel, const char *name, switch_event_channel_id_t channel_id, switch_live_array_t **live_arrayP) { @@ -3259,7 +3342,7 @@ SWITCH_DECLARE(switch_status_t) switch_live_array_del(switch_live_array_t *la, c cJSON_AddItemToObject(data, "data", cur->obj); cur->obj = NULL; - switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, la->channel_id); + la_broadcast(la, &msg); free(cur->name); free(cur); } else { @@ -3360,7 +3443,7 @@ SWITCH_DECLARE(switch_status_t) switch_live_array_add(switch_live_array_t *la, c cJSON_AddItemToObject(data, "wireSerno", cJSON_CreateNumber(la->serno++)); cJSON_AddItemToObject(data, "data", cJSON_Duplicate(node->obj, 1)); - switch_event_channel_broadcast(la->event_channel, &msg, __FILE__, la->channel_id); + la_broadcast(la, &msg); switch_mutex_unlock(la->mutex); From af4c91764dbb9e7bedb8e43460589c25122d7c59 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 Oct 2013 03:57:23 +0500 Subject: [PATCH 39/80] only test for reneg after 20 sec with no activity --- src/switch_rtp.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index c3027b8ba3..9078f82486 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -911,9 +911,6 @@ static void handle_ice(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice, void *d switch_port_t port = 0; char *host = NULL; - ice->missed_count++; - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_WARNING, "missed %d\n", ice->missed_count); - if (elapsed > 20000 && pri) { int i, j; uint32_t old; @@ -924,6 +921,11 @@ static void handle_ice(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice, void *d char adj_port[6]; switch_channel_t *channel = NULL; + + ice->missed_count++; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_WARNING, "missed %d\n", ice->missed_count); + + if (rtp_session->session) { channel = switch_core_session_get_channel(rtp_session->session); } From 2ffe8312068d71789c8932c1e101b8ee480c68e3 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 Oct 2013 03:58:03 +0500 Subject: [PATCH 40/80] refactor and add more plumbing --- src/include/switch_event.h | 3 ++ src/include/switch_types.h | 1 + src/switch_event.c | 95 +++++++++++++++++++++++++++++++++++--- 3 files changed, 93 insertions(+), 6 deletions(-) diff --git a/src/include/switch_event.h b/src/include/switch_event.h index d812602a5b..28e805658f 100644 --- a/src/include/switch_event.h +++ b/src/include/switch_event.h @@ -453,6 +453,9 @@ SWITCH_DECLARE(void) switch_live_array_set_command_handler(switch_live_array_t * SWITCH_DECLARE(void) switch_live_array_parse_json(cJSON *json, switch_event_channel_id_t channel_id); SWITCH_DECLARE(switch_bool_t) switch_live_array_add_alias(switch_live_array_t *la, const char *event_channel, const char *name); SWITCH_DECLARE(switch_bool_t) switch_live_array_clear_alias(switch_live_array_t *la, const char *event_channel, const char *name); +SWITCH_DECLARE(switch_bool_t) switch_event_channel_permission_verify(const char *cookie, const char *event_channel); +SWITCH_DECLARE(void) switch_event_channel_permission_modify(const char *cookie, const char *event_channel, switch_bool_t set); +SWITCH_DECLARE(void) switch_event_channel_permission_clear(const char *cookie); ///\} diff --git a/src/include/switch_types.h b/src/include/switch_types.h index ee42de2eee..055539e767 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1320,6 +1320,7 @@ typedef enum { CF_CONFIRM_BLIND_TRANSFER, CF_NO_PRESENCE, CF_CONFERENCE, + CF_CONFERENCE_ADV, CF_RECOVERING, CF_RECOVERING_BRIDGE, CF_TRACKED, diff --git a/src/switch_event.c b/src/switch_event.c index 873e3d98dd..60ab038cce 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -72,6 +72,7 @@ static struct { switch_event_channel_id_t ID; switch_thread_rwlock_t *rwlock; switch_hash_t *hash; + switch_hash_t *perm_hash; switch_hash_t *lahash; switch_mutex_t *lamutex; } event_channel_manager; @@ -586,6 +587,8 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void) } switch_core_hash_destroy(&event_channel_manager.lahash); + switch_core_hash_destroy(&event_channel_manager.hash); + switch_core_hash_destroy(&event_channel_manager.perm_hash); switch_core_hash_destroy(&CUSTOM_HASH); switch_core_memory_reclaim_events(); @@ -675,6 +678,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_init(switch_memory_pool_t *pool) switch_thread_rwlock_create(&event_channel_manager.rwlock, RUNTIME_POOL); switch_core_hash_init(&event_channel_manager.hash, RUNTIME_POOL); + switch_core_hash_init(&event_channel_manager.perm_hash, RUNTIME_POOL); event_channel_manager.ID = 1; switch_mutex_lock(EVENT_QUEUE_MUTEX); @@ -2676,21 +2680,27 @@ static uint32_t switch_event_channel_unsub_head(switch_event_channel_func_t func static void unsub_all_switch_event_channel(void) { switch_hash_index_t *hi; + const void *var; void *val; switch_event_channel_sub_node_head_t *head; switch_thread_rwlock_wrlock(event_channel_manager.rwlock); - top: - head = NULL; - for (hi = switch_hash_first(NULL, event_channel_manager.hash); hi; hi = switch_hash_next(hi)) { + while ((hi = switch_hash_first(NULL, event_channel_manager.perm_hash))) { + switch_event_t *vals = NULL; + switch_hash_this(hi, &var, NULL, &val); + vals = (switch_event_t *) val; + switch_core_hash_delete(event_channel_manager.perm_hash, var); + switch_event_destroy(&vals); + } + + while ((hi = switch_hash_first(NULL, event_channel_manager.hash))) { switch_hash_this(hi, NULL, NULL, &val); head = (switch_event_channel_sub_node_head_t *) val; switch_event_channel_unsub_head(NULL, head); switch_core_hash_delete(event_channel_manager.hash, head->event_channel); free(head->event_channel); free(head); - goto top; } switch_thread_rwlock_unlock(event_channel_manager.rwlock); @@ -2963,9 +2973,61 @@ SWITCH_DECLARE(switch_status_t) switch_event_channel_bind(const char *event_chan return status; } +SWITCH_DECLARE(switch_bool_t) switch_event_channel_permission_verify(const char *cookie, const char *event_channel) +{ + switch_event_t *vals; + switch_bool_t r = SWITCH_FALSE; + + switch_thread_rwlock_rdlock(event_channel_manager.rwlock); + if ((vals = switch_core_hash_find(event_channel_manager.perm_hash, cookie))) { + r = switch_true(switch_event_get_header(vals, event_channel)); + } + switch_thread_rwlock_unlock(event_channel_manager.rwlock); + + return r; +} + +SWITCH_DECLARE(void) switch_event_channel_permission_modify(const char *cookie, const char *event_channel, switch_bool_t set) +{ + switch_event_t *vals; + + switch_thread_rwlock_wrlock(event_channel_manager.rwlock); + if (!(vals = switch_core_hash_find(event_channel_manager.perm_hash, cookie))) { + if (!set) goto end; + + switch_event_create_plain(&vals, SWITCH_EVENT_CHANNEL_DATA); + switch_core_hash_insert(event_channel_manager.perm_hash, cookie, vals); + } + + if (set) { + switch_event_add_header_string(vals, SWITCH_STACK_BOTTOM, event_channel, "true"); + } else { + switch_event_del_header(vals, event_channel); + } + + + end: + + switch_thread_rwlock_unlock(event_channel_manager.rwlock); +} + +SWITCH_DECLARE(void) switch_event_channel_permission_clear(const char *cookie) +{ + switch_event_t *vals; + + switch_thread_rwlock_wrlock(event_channel_manager.rwlock); + if ((vals = switch_core_hash_find(event_channel_manager.perm_hash, cookie))) { + switch_core_hash_delete(event_channel_manager.perm_hash, cookie); + switch_event_destroy(&vals); + } + switch_thread_rwlock_unlock(event_channel_manager.rwlock); +} + + typedef struct alias_node_s { char *event_channel; char *name; + char *key; struct alias_node_s *next; } alias_node_t; @@ -3152,6 +3214,7 @@ SWITCH_DECLARE(switch_status_t) switch_live_array_destroy(switch_live_array_t ** { switch_live_array_t *la = *live_arrayP; switch_memory_pool_t *pool; + alias_node_t *np; *live_arrayP = NULL; @@ -3163,6 +3226,9 @@ SWITCH_DECLARE(switch_status_t) switch_live_array_destroy(switch_live_array_t ** switch_mutex_lock(event_channel_manager.lamutex); switch_core_hash_delete(event_channel_manager.lahash, la->key); + for (np = la->aliases; np; np = np->next) { + switch_core_hash_delete(event_channel_manager.lahash, np->key); + } switch_mutex_unlock(event_channel_manager.lamutex); switch_core_destroy_memory_pool(&pool); @@ -3177,13 +3243,14 @@ SWITCH_DECLARE(switch_bool_t) switch_live_array_isnew(switch_live_array_t *la) SWITCH_DECLARE(switch_bool_t) switch_live_array_clear_alias(switch_live_array_t *la, const char *event_channel, const char *name) { - alias_node_t *np, *last = NULL; + alias_node_t *np, *last = NULL, *del = NULL; switch_bool_t r = SWITCH_FALSE; switch_mutex_lock(la->mutex); for (np = la->aliases; np; np = np->next) { if (!strcmp(np->event_channel, event_channel) && !strcmp(np->name, name)) { r = SWITCH_TRUE; + del = np; if (last) { last->next = np->next; @@ -3196,6 +3263,13 @@ SWITCH_DECLARE(switch_bool_t) switch_live_array_clear_alias(switch_live_array_t } switch_mutex_unlock(la->mutex); + if (r) { + switch_mutex_lock(event_channel_manager.lamutex); + switch_core_hash_delete(event_channel_manager.lahash, del->key); + switch_mutex_unlock(event_channel_manager.lamutex); + } + + return r; } @@ -3216,6 +3290,8 @@ SWITCH_DECLARE(switch_bool_t) switch_live_array_add_alias(switch_live_array_t *l node = switch_core_alloc(la->pool, sizeof(*node)); node->event_channel = switch_core_strdup(la->pool, event_channel); node->name = switch_core_strdup(la->pool, name); + node->key = switch_core_sprintf(la->pool, "%s.%s", event_channel, name); + if (np) { np->next = node; } else { @@ -3225,6 +3301,13 @@ SWITCH_DECLARE(switch_bool_t) switch_live_array_add_alias(switch_live_array_t *l switch_mutex_unlock(la->mutex); + if (!exist) { + switch_mutex_lock(event_channel_manager.lamutex); + switch_core_hash_insert(event_channel_manager.lahash, node->key, la); + switch_mutex_unlock(event_channel_manager.lamutex); + } + + return !exist; } @@ -3474,7 +3557,7 @@ SWITCH_DECLARE(void) switch_live_array_parse_json(cJSON *json, switch_event_chan if ((context = cJSON_GetObjectCstr(jla, "context")) && (name = cJSON_GetObjectCstr(jla, "name"))) { const char *command = cJSON_GetObjectCstr(jla, "command"); const char *sessid = cJSON_GetObjectCstr(json, "sessid"); - + if (command) { switch_live_array_create(context, name, channel_id, &la); From 4819ee18abfa4bbb02db0a63b30aa23fa1ba0579 Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Wed, 16 Oct 2013 21:47:09 -0500 Subject: [PATCH 41/80] windows compiler warning --- src/switch_event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_event.c b/src/switch_event.c index 60ab038cce..36014ab921 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -3275,7 +3275,7 @@ SWITCH_DECLARE(switch_bool_t) switch_live_array_clear_alias(switch_live_array_t SWITCH_DECLARE(switch_bool_t) switch_live_array_add_alias(switch_live_array_t *la, const char *event_channel, const char *name) { - alias_node_t *node, *np; + alias_node_t *node = 0, *np; switch_bool_t exist = SWITCH_FALSE; switch_mutex_lock(la->mutex); From 1c3704e78fbea3b3c82915a9784e462b1d5ed349 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Thu, 17 Oct 2013 09:42:52 -0400 Subject: [PATCH 42/80] FS-5884 --resolve mod_rayo: detect unjoin mismatch --- src/mod/event_handlers/mod_rayo/mod_rayo.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mod/event_handlers/mod_rayo/mod_rayo.c b/src/mod/event_handlers/mod_rayo/mod_rayo.c index df1ce007c9..de89a32bb1 100644 --- a/src/mod/event_handlers/mod_rayo/mod_rayo.c +++ b/src/mod/event_handlers/mod_rayo/mod_rayo.c @@ -1793,7 +1793,7 @@ static iks *exec_conference_api(switch_core_session_t *session, const char *conf SWITCH_STANDARD_STREAM(stream); switch_api_execute("conference", switch_core_session_sprintf(session, "%s %s %s", conf_name, command, conf_member_id), NULL, &stream); if (!zstr(stream.data) && strncmp("OK", stream.data, 2)) { - response = iks_new_error_detailed_printf(node, STANZA_ERROR_INTERNAL_SERVER_ERROR, "%s", stream.data); + response = iks_new_error_detailed_printf(node, STANZA_ERROR_SERVICE_UNAVAILABLE, "%s", stream.data); } switch_safe_free(stream.data); return response; @@ -2047,7 +2047,13 @@ static iks *on_rayo_unjoin(struct rayo_actor *call, struct rayo_message *msg, vo response = iks_new_error_detailed(msg->payload, STANZA_ERROR_UNEXPECTED_REQUEST, "(un)join request is pending"); } else if (!RAYO_CALL(call)->joined) { /* not joined to anything */ - response = iks_new_error(msg->payload, STANZA_ERROR_SERVICE_UNAVAILABLE); + response = iks_new_error_detailed(msg->payload, STANZA_ERROR_SERVICE_UNAVAILABLE, "not joined to anything"); + } else if (RAYO_CALL(call)->joined == JOINED_MIXER && !zstr(call_uri)) { + /* joined to mixer, not call */ + response = iks_new_error_detailed(msg->payload, STANZA_ERROR_SERVICE_UNAVAILABLE, "not joined to call"); + } else if (RAYO_CALL(call)->joined == JOINED_CALL && !zstr(mixer_name)) { + /* joined to call, not mixer */ + response = iks_new_error_detailed(msg->payload, STANZA_ERROR_SERVICE_UNAVAILABLE, "not joined to mixer"); } else if (!zstr(call_uri)) { response = unjoin_call(RAYO_CALL(call), session, msg, call_uri); } else if (!zstr(mixer_name)) { From 9921007a4bbef8d6de0e5ee3c82dcfb0b2123dc1 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 17 Oct 2013 13:18:26 +0000 Subject: [PATCH 43/80] Ensure that flite gets configured before building Without this change, we would only configure flite if its Makefile did not exist. However in the tarball for flite (v1.5.4), there is a Makefile even before you run configure. So the only reason this worked at all was because make was calculating the rules to run before downloading and extracting flite. If you build flite without configuring it first, you get a flite with ALSA symbols that doesn't load in FS. In discussion with the flite guys, they indicated that the presence of the Makefile in the tarball is indeed intended. This change has the side-effect of fixing mod_flite in the Debian packages. FS-5873 --resolve --- src/mod/asr_tts/mod_flite/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mod/asr_tts/mod_flite/Makefile b/src/mod/asr_tts/mod_flite/Makefile index c93b48c1ca..360eb611e1 100644 --- a/src/mod/asr_tts/mod_flite/Makefile +++ b/src/mod/asr_tts/mod_flite/Makefile @@ -21,12 +21,12 @@ $(MODNAME).lo: $(FLITE_A) $(FLITE_DIR): $(GETLIB) $(FLITE)-current.tar.bz2 -$(FLITE_BUILDDIR)/Makefile: $(FLITE_DIR) +$(FLITE_BUILDDIR)/.stamp-configure: $(FLITE_DIR) mkdir -p $(FLITE_BUILDDIR) cd $(FLITE_BUILDDIR) && $(DEFAULT_VARS) $(FLITE_DIR)/configure $(DEFAULT_ARGS) --srcdir=$(FLITE_DIR) --with-audio=none --with-pic --disable-shared - $(TOUCH_TARGET) + test -f Makefile && touch $@ -$(FLITE_A): $(FLITE_DIR) $(FLITE_BUILDDIR)/Makefile +$(FLITE_A): $(FLITE_DIR) $(FLITE_BUILDDIR)/.stamp-configure cd $(FLITE_BUILDDIR) && $(MAKE) -j1 test -d $(FLITE_LIBDIR) || mkdir $(FLITE_LIBDIR) TARGET_OS=`grep TARGET_OS $(FLITE_BUILDDIR)/config/config | sed "s/^.*= //"` ;\ From 9246309a21c3186780d5b63eec0a03843cf7b1fb Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 Oct 2013 12:07:37 -0400 Subject: [PATCH 44/80] comment out --- src/switch_core_media.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 38f61fd826..322d4a63da 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -5646,9 +5646,9 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess rate = a_engine->codec_params.rm_rate; - if (!strcasecmp(a_engine->codec_params.rm_encoding, "opus")) { - a_engine->codec_params.adv_channels = 2; - } + //if (!strcasecmp(a_engine->codec_params.rm_encoding, "opus")) { + // a_engine->codec_params.adv_channels = 2; + //} if (a_engine->codec_params.adv_channels > 1) { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d/%d\n", From b1a3a106ecf98db4953d8ce54ea93bd8f28273d8 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 Oct 2013 12:18:01 -0400 Subject: [PATCH 45/80] FS-5852 --resolve --- src/include/switch_types.h | 8 +++--- src/switch_caller.c | 5 ++++ src/switch_core_session.c | 17 ++++++++++++- src/switch_ivr_originate.c | 52 +++++++++++++++++++++++++++++++++----- 4 files changed, 71 insertions(+), 11 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 055539e767..7c90161d3a 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -299,9 +299,11 @@ typedef enum { SOF_NONE = 0, SOF_NOBLOCK = (1 << 0), SOF_FORKED_DIAL = (1 << 1), - SOF_NO_EFFECTIVE_CID_NUM = (1 << 2), - SOF_NO_EFFECTIVE_CID_NAME = (1 << 3), - SOF_NO_LIMITS = (1 << 4) + SOF_NO_EFFECTIVE_ANI = (1 << 2), + SOF_NO_EFFECTIVE_ANIII = (1 << 3), + SOF_NO_EFFECTIVE_CID_NUM = (1 << 4), + SOF_NO_EFFECTIVE_CID_NAME = (1 << 5), + SOF_NO_LIMITS = (1 << 6) } switch_originate_flag_enum_t; typedef uint32_t switch_originate_flag_t; diff --git a/src/switch_caller.c b/src/switch_caller.c index 02de5575aa..fdd41a4dd7 100644 --- a/src/switch_caller.c +++ b/src/switch_caller.c @@ -66,6 +66,11 @@ SWITCH_DECLARE(switch_caller_profile_t *) switch_caller_profile_new(switch_memor caller_id_number = SWITCH_DEFAULT_CLID_NUMBER; } + /* ANI defaults to Caller ID Number when not specified */ + if (zstr(ani)) { + ani = caller_id_number; + } + profile_dup_clean(username, profile->username, pool); profile_dup_clean(dialplan, profile->dialplan, pool); profile_dup_clean(caller_id_name, profile->caller_id_name, pool); diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 52cb871aa9..a08b548fee 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -525,8 +525,17 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_ } if (caller_profile) { + const char *eani = NULL, *eaniii = NULL; const char *ecaller_id_name = NULL, *ecaller_id_number = NULL; + if (!(flags & SOF_NO_EFFECTIVE_ANI)) { + eani = switch_channel_get_variable(channel, "effective_ani"); + } + + if (!(flags & SOF_NO_EFFECTIVE_ANIII)) { + eaniii = switch_channel_get_variable(channel, "effective_aniii"); + } + if (!(flags & SOF_NO_EFFECTIVE_CID_NAME)) { ecaller_id_name = switch_channel_get_variable(channel, "effective_caller_id_name"); } @@ -535,9 +544,15 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_ ecaller_id_number = switch_channel_get_variable(channel, "effective_caller_id_number"); } - if (ecaller_id_name || ecaller_id_number) { + if (eani || eaniii || ecaller_id_name || ecaller_id_number) { outgoing_profile = switch_caller_profile_clone(session, caller_profile); + if (eani) { + outgoing_profile->ani = eani; + } + if (eaniii) { + outgoing_profile->aniii = eaniii; + } if (ecaller_id_name) { outgoing_profile->caller_id_name = ecaller_id_name; } diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 52ef822cad..b30df42a98 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -1487,16 +1487,24 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_enterprise_originate(switch_core_sess } if (channel) { - const char *cid; + const char *tmp_var = NULL; switch_channel_process_export(channel, NULL, var_event, SWITCH_EXPORT_VARS_VARIABLE); - if ((cid = switch_channel_get_variable(channel, "effective_caller_id_name"))) { - switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "origination_caller_id_name", cid); + if ((tmp_var = switch_channel_get_variable(channel, "effective_ani"))) { + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "origination_ani", tmp_var); } - if ((cid = switch_channel_get_variable(channel, "effective_caller_id_number"))) { - switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "origination_caller_id_number", cid); + if ((tmp_var = switch_channel_get_variable(channel, "effective_aniii"))) { + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "origination_aniii", tmp_var); + } + + if ((tmp_var = switch_channel_get_variable(channel, "effective_caller_id_name"))) { + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "origination_caller_id_name", tmp_var); + } + + if ((tmp_var = switch_channel_get_variable(channel, "effective_caller_id_number"))) { + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "origination_caller_id_number", tmp_var); } } @@ -1891,6 +1899,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess int read_packet = 0; int check_reject = 1; switch_codec_implementation_t read_impl = { 0 }; + const char *ani_override = NULL; + const char *aniii_override = NULL; if (session) { switch_channel_set_variable(switch_core_session_get_channel(session), "originated_legs", NULL); @@ -2342,6 +2352,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess } } + /* variable to force ANI / ANIII */ + ani_override = switch_event_get_header(var_event, "origination_ani"); + aniii_override = switch_event_get_header(var_event, "origination_aniii"); + if ((cid_tmp = switch_event_get_header(var_event, "origination_caller_id_name"))) { cid_name_override = cid_tmp; } @@ -2370,6 +2384,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess dftflags |= SOF_NO_LIMITS; } + if (ani_override) { + dftflags |= SOF_NO_EFFECTIVE_ANI; + } + + if (aniii_override) { + dftflags |= SOF_NO_EFFECTIVE_ANIII; + } + if (cid_num_override) { dftflags |= SOF_NO_EFFECTIVE_CID_NUM; } @@ -2542,13 +2564,19 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess new_profile = switch_caller_profile_new(oglobals.pool, NULL, NULL, - cid_name_override, cid_num_override, NULL, NULL, NULL, NULL, __FILE__, NULL, chan_data); + cid_name_override, cid_num_override, NULL, ani_override, aniii_override, NULL, __FILE__, NULL, chan_data); } new_profile->uuid = SWITCH_BLANK_STRING; new_profile->chan_name = SWITCH_BLANK_STRING; new_profile->destination_number = switch_core_strdup(new_profile->pool, chan_data); + if (ani_override) { + new_profile->ani = switch_core_strdup(new_profile->pool, ani_override); + } + if (aniii_override) { + new_profile->aniii = switch_core_strdup(new_profile->pool, aniii_override); + } if (cid_name_override) { new_profile->caller_id_name = switch_core_strdup(new_profile->pool, cid_name_override); } @@ -2572,7 +2600,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess new_profile = switch_caller_profile_new(oglobals.pool, NULL, NULL, - cid_name_override, cid_num_override, NULL, NULL, NULL, NULL, __FILE__, NULL, chan_data); + cid_name_override, cid_num_override, NULL, ani_override, aniii_override, NULL, __FILE__, NULL, chan_data); } } @@ -2615,6 +2643,16 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_event_merge(originate_var_event, local_var_event); } + if ((current_variable = switch_event_get_header(originate_var_event, "origination_ani"))) { + new_profile->ani = switch_core_strdup(new_profile->pool, current_variable); + myflags |= SOF_NO_EFFECTIVE_ANI; + } + + if ((current_variable = switch_event_get_header(originate_var_event, "origination_aniii"))) { + new_profile->aniii = switch_core_strdup(new_profile->pool, current_variable); + myflags |= SOF_NO_EFFECTIVE_ANIII; + } + if ((current_variable = switch_event_get_header(originate_var_event, "origination_caller_id_number"))) { new_profile->caller_id_number = switch_core_strdup(new_profile->pool, current_variable); myflags |= SOF_NO_EFFECTIVE_CID_NUM; From 6a7793f72ad105f4beb13174e8558d2b9090b4b8 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 Oct 2013 12:33:55 -0400 Subject: [PATCH 46/80] change dtmf vol to 13 --- src/switch_rtp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 9078f82486..ff621e1826 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -3881,7 +3881,7 @@ static void do_2833(switch_rtp_t *rtp_session) rtp_session->dtmf_data.out_digit_dur = rdigit->duration; rtp_session->dtmf_data.out_digit = rdigit->digit; rtp_session->dtmf_data.out_digit_packet[0] = (unsigned char) switch_char_to_rfc2833(rdigit->digit); - rtp_session->dtmf_data.out_digit_packet[1] = 7; + rtp_session->dtmf_data.out_digit_packet[1] = 13; rtp_session->dtmf_data.out_digit_packet[2] = (unsigned char) (rtp_session->dtmf_data.out_digit_sub_sofar >> 8); rtp_session->dtmf_data.out_digit_packet[3] = (unsigned char) rtp_session->dtmf_data.out_digit_sub_sofar; From 37774268c0b0e99335effa35e63ba96d2b2f32a7 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 Oct 2013 22:39:55 +0500 Subject: [PATCH 47/80] FS-5882 --resolve --- src/mod/endpoints/mod_sofia/mod_sofia.h | 2 ++ src/mod/endpoints/mod_sofia/sofia.c | 29 +++++++++++++++++++++++++ src/mod/endpoints/mod_sofia/sofia_reg.c | 3 +++ 3 files changed, 34 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index c27fcb55a3..952fce2f9f 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -171,6 +171,8 @@ struct sofia_private { char *network_ip; char *network_port; char *key; + char *user; + char *realm; int destroy_nh; int destroy_me; int is_call; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index fcd9c5870f..9000ec96b3 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1454,6 +1454,7 @@ static void our_sofia_event_callback(nua_event_t event, if (sofia_private && sofia_private->call_id && sofia_private->network_ip && sofia_private->network_port) { char *sql; + switch_event_t *event = NULL; sql = switch_mprintf("delete from sip_registrations where call_id='%q' and network_ip='%q' and network_port='%q'", sofia_private->call_id, sofia_private->network_ip, sofia_private->network_port); @@ -1461,6 +1462,34 @@ static void our_sofia_event_callback(nua_event_t event, sofia_private->call_id, sofia_private->network_ip, sofia_private->network_port); sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); + switch_core_del_registration(sofia_private->user, sofia_private->realm, sofia_private->call_id); + + + + if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", "unknown"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "user-agent", + (sip && sip->sip_user_agent) ? sip->sip_user_agent->g_string : "unknown"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", sofia_private->user, sofia_private->realm); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", "Unregistered"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "presence-source", "register"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); + switch_event_fire(&event); + } + + + if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_UNREGISTER) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "profile-name", profile->name); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from-user", sofia_private->user); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from-host", sofia_private->realm); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-id", sofia_private->call_id); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", "unknown"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "reason", "socket-disconnection"); + switch_event_fire(&event); + } + sofia_reg_check_socket(profile, sofia_private->call_id, sofia_private->network_ip, sofia_private->network_port); } diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 1514d4be4f..821a086880 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -1758,6 +1758,9 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand sofia_private->network_ip = su_strdup(nh->nh_home, network_ip); sofia_private->network_port = su_strdup(nh->nh_home, network_port_c); sofia_private->key = su_strdup(nh->nh_home, key); + sofia_private->user = su_strdup(nh->nh_home, to_user); + sofia_private->realm = su_strdup(nh->nh_home, reg_host); + sofia_private->is_static++; *sofia_private_p = sofia_private; nua_handle_bind(nh, sofia_private); From 70ea252505c5eff2cd3aba93c7145d29089cd466 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 18 Oct 2013 01:32:31 +0500 Subject: [PATCH 48/80] tweak --- src/switch_channel.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/switch_channel.c b/src/switch_channel.c index 76d3d49f97..4bc93573a6 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -1904,6 +1904,7 @@ SWITCH_DECLARE(void) switch_channel_clear_state_flag(switch_channel_t *channel, SWITCH_DECLARE(void) switch_channel_clear_flag(switch_channel_t *channel, switch_channel_flag_t flag) { int ACTIVE = 0; + int CLEAR = 0; switch_assert(channel != NULL); switch_assert(channel->flag_mutex); @@ -1912,6 +1913,11 @@ SWITCH_DECLARE(void) switch_channel_clear_flag(switch_channel_t *channel, switch if (flag == CF_LEG_HOLDING && channel->flags[flag] && channel->flags[CF_ANSWERED]) { ACTIVE = 1; } + + if (flag == CF_VIDEO_PASSIVE && channel->flags[flag]) { + CLEAR = 1; + } + channel->flags[flag] = 0; switch_mutex_unlock(channel->flag_mutex); @@ -1937,7 +1943,7 @@ SWITCH_DECLARE(void) switch_channel_clear_flag(switch_channel_t *channel, switch switch_channel_set_variable(channel, "recovered", NULL); } - if (flag == CF_VIDEO_PASSIVE) { + if (flag == CF_VIDEO_PASSIVE && CLEAR) { switch_core_session_wake_video_thread(channel->session); } From 3fce1aae039d0440cb9c794808c4a7e68a0060c5 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 17 Oct 2013 03:05:12 +0000 Subject: [PATCH 49/80] Fix build of apr-util expat with libtool2 Applied patch from: http://people.apache.org/~rjung/patches/expat-libtool2.patch The failure that results from this seems to occur non-deterministically. FS-3185 --resolve --- libs/apr-util/xml/expat/buildconf.sh | 34 +++++++++++++++++----------- libs/apr-util/xml/expat/configure.in | 1 + 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/libs/apr-util/xml/expat/buildconf.sh b/libs/apr-util/xml/expat/buildconf.sh index 1f5789dc07..9050a0282a 100755 --- a/libs/apr-util/xml/expat/buildconf.sh +++ b/libs/apr-util/xml/expat/buildconf.sh @@ -28,26 +28,34 @@ rm -rf aclocal.m4 libtool.m4 ltsugar.m4 autom4te*.cache $libtoolize --copy --automake # -# Build aclocal.m4 from libtool's libtool.m4 +# find libtool.m4 # -if [ -f libtool.m4 ]; then - ltfile=libtool.m4 -else +if [ ! -f libtool.m4 ]; then ltpath=`dirname $libtoolize` ltfile=${LIBTOOL_M4-`cd $ltpath/../share/aclocal ; pwd`/libtool.m4} + if [ -f $ltfile ]; then + echo "libtool.m4 found at $ltfile" + cp $ltfile libtool.m4 + else + echo "libtool.m4 not found - aborting!" + exit 1 + fi fi -echo "Incorporating $ltfile into aclocal.m4 ..." + +# +# Build aclocal.m4 from libtool's m4 files +# echo "dnl THIS FILE IS AUTOMATICALLY GENERATED BY buildconf.sh" > aclocal.m4 echo "dnl edits here will be lost" >> aclocal.m4 -cat $ltfile >> aclocal.m4 -if [ -f ltsugar.m4 ]; then - echo "Incorporating ltsugar.m4 into aclocal.m4 ..." - cat ltsugar.m4 >> aclocal.m4 -fi - -# Clean up again -rm -f libtool.m4 ltsugar.m4 +for m4file in libtool.m4 ltsugar.m4 ltoptions.m4 ltversion.m4 lt~obsolete.m4 +do + if [ -f $m4file ]; then + echo "Incorporating $m4file into aclocal.m4 ..." + cat $m4file >> aclocal.m4 + rm -f $m4file + fi +done cross_compile_warning="warning: AC_TRY_RUN called without default to allow cross compiling" diff --git a/libs/apr-util/xml/expat/configure.in b/libs/apr-util/xml/expat/configure.in index 478d8d5313..f808df4cce 100644 --- a/libs/apr-util/xml/expat/configure.in +++ b/libs/apr-util/xml/expat/configure.in @@ -12,6 +12,7 @@ dnl AC_INIT(Makefile.in) AC_CONFIG_AUX_DIR(conftools) +AC_CONFIG_MACRO_DIR(.) dnl dnl Follow the GNU/Linux convention of odd number minor version for From e0054af96f13b86bf04cea1315295e27a00ea451 Mon Sep 17 00:00:00 2001 From: William King Date: Thu, 17 Oct 2013 22:27:34 -0700 Subject: [PATCH 50/80] Fixing a use after free --- src/switch_event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_event.c b/src/switch_event.c index 36014ab921..0a0a532628 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -3125,10 +3125,10 @@ SWITCH_DECLARE(switch_status_t) switch_live_array_clear(switch_live_array_t *la) while(np) { cur = np; + np = np->next; cJSON_Delete(cur->obj); free(cur->name); free(cur); - np = np->next; } la->head = la->tail = NULL; From da5fd53417e05290a64fa163dea544923bf16cb7 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Fri, 18 Oct 2013 09:47:30 -0400 Subject: [PATCH 51/80] mod_rayo: fix hangup after unjoining bridged calls --- src/mod/event_handlers/mod_rayo/mod_rayo.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mod/event_handlers/mod_rayo/mod_rayo.c b/src/mod/event_handlers/mod_rayo/mod_rayo.c index de89a32bb1..f653e9fc68 100644 --- a/src/mod/event_handlers/mod_rayo/mod_rayo.c +++ b/src/mod/event_handlers/mod_rayo/mod_rayo.c @@ -3152,8 +3152,10 @@ done: if (ok) { switch_channel_set_variable(channel, "hangup_after_bridge", "false"); - switch_channel_set_variable(channel, "transfer_after_bridge", "false"); - switch_channel_set_variable(channel, "park_after_bridge", "true"); + switch_channel_set_variable(channel, "transfer_after_bridge", ""); + switch_channel_set_variable(channel, "park_after_bridge", "false"); + switch_channel_set_variable(channel, "exec_after_bridge_app", "park"); + switch_channel_set_variable(channel, "exec_after_bridge_arg", ""); switch_channel_set_variable(channel, SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE, "-1"); /* required so that output mixing works */ switch_core_event_hook_add_read_frame(session, rayo_call_on_read_frame); if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { From bf78270540056229065c481b1742083502c7f933 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 18 Oct 2013 19:14:24 +0500 Subject: [PATCH 52/80] send video break on floor change --- src/mod/applications/mod_conference/mod_conference.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 06677e33cd..a847fb4ea2 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -1657,6 +1657,9 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf } else { switch_channel_clear_flag(imember->channel, CF_VIDEO_PASSIVE); } + + switch_channel_set_flag(imember->channel, CF_VIDEO_BREAK); + switch_core_session_kill_channel(imember->session, SWITCH_SIG_BREAK); switch_core_session_refresh_video(imember->session); } From 0d19abfbdbf333ea5eed85cb09f7bb1dde4ec79f Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sat, 19 Oct 2013 00:00:28 +0500 Subject: [PATCH 53/80] FS-5887 --resolve --- libs/sofia-sip/.update | 2 +- libs/sofia-sip/libsofia-sip-ua/tport/ws.c | 29 ++++++++++++++++++++--- libs/sofia-sip/libsofia-sip-ua/tport/ws.h | 2 ++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 36fa387d65..a528d9c447 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Tue Oct 8 12:10:32 CDT 2013 +Fri Oct 18 23:59:59 CDT 2013 diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c index a8d056c895..a6b73406e4 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c @@ -334,8 +334,7 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes) #else if (x++) Sleep(10); #endif - } while (r == -1 && (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK || - errno == 35 || errno == 730035 || errno == 2 || errno == 60) && x < 100); + } while (r == -1 && xp_is_blocking(xp_errno()) && x < 100); if (x >= 100) { r = -1; @@ -364,7 +363,7 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes) do { r = send(wsh->sock, data, bytes, 0); - } while (r == -1 && (errno == EAGAIN || errno == EINTR)); + } while (r == -1 && xp_is_blocking(xp_errno())); //if (r<0) { //printf("wRITE FAIL: %s\n", strerror(errno)); @@ -789,4 +788,28 @@ ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes) return bytes; } +#ifdef _MSC_VER +int xp_errno(void) +{ + return WSAGetLastError(); +} + +int xp_is_blocking(int errcode) +{ + return errcode == WSAEWOULDBLOCK || errcode == WSAEINPROGRESS; +} + +#else + +int xp_errno(void) +{ + return errno; +} + +int xp_is_blocking(int errcode) +{ + return errcode == EAGAIN || errcode == EWOULDBLOCK || errcode == EINPROGRESS || errcode == EINTR; +} + +#endif \ No newline at end of file diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h index 11e6b93068..8c0a50733e 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h @@ -91,6 +91,8 @@ void ws_destroy(wsh_t *wsh); void init_ssl(void); void deinit_ssl(void); +int xp_errno(void); +int xp_is_blocking(int errcode); #ifndef _MSC_VER static inline uint64_t get_unaligned_uint64(const void *p) From 6354b055f2d421734f46b796881684aea9d247a3 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Fri, 18 Oct 2013 15:14:50 -0400 Subject: [PATCH 54/80] mod_rayo: allow unjoin of call without specifying call-uri, fix unjoin of call on hold so that b-leg is not hung up, allow unjoin command to b-leg --- src/mod/event_handlers/mod_rayo/mod_rayo.c | 82 +++++++++++++--------- 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/src/mod/event_handlers/mod_rayo/mod_rayo.c b/src/mod/event_handlers/mod_rayo/mod_rayo.c index f653e9fc68..6dd58d29c6 100644 --- a/src/mod/event_handlers/mod_rayo/mod_rayo.c +++ b/src/mod/event_handlers/mod_rayo/mod_rayo.c @@ -1972,11 +1972,8 @@ static iks *unjoin_call(struct rayo_call *call, switch_core_session_t *session, { iks *node = msg->payload; iks *response = NULL; - const char *bleg_uuid = switch_channel_get_variable(switch_core_session_get_channel(session), SWITCH_BRIDGE_UUID_VARIABLE); - const char *bleg_uri = switch_core_session_sprintf(session, "xmpp:%s@%s", bleg_uuid ? bleg_uuid : "", RAYO_JID(globals.server)); - /* bleg must match call_uri */ - if (!zstr(bleg_uri) && !strcmp(bleg_uri, call_uri)) { + if (!strcmp(call_uri, call->joined_id)) { /* unbridge call */ call->pending_join_request = iks_copy(node); switch_ivr_park_session(session); @@ -2781,7 +2778,7 @@ static void on_call_bridge_event(struct rayo_client *rclient, switch_event_t *ev iks *joined; call->joined = JOINED_CALL; - call->joined_id = switch_core_strdup(RAYO_POOL(call), b_uuid); + call->joined_id = switch_core_sprintf(RAYO_POOL(call), "xmpp:%s@%s", b_uuid, RAYO_JID(globals.server)); /* send IQ result to client now. */ if (call->pending_join_request) { @@ -2792,6 +2789,29 @@ static void on_call_bridge_event(struct rayo_client *rclient, switch_event_t *ev iks_delete(request); } + b_call = RAYO_CALL_LOCATE_BY_ID(b_uuid); + if (b_call) { + b_call->joined = JOINED_CALL; + b_call->joined_id = switch_core_sprintf(RAYO_POOL(b_call), "xmpp:%s@s", a_uuid, RAYO_JID(globals.server)); + + /* send IQ result to client now. */ + if (b_call->pending_join_request) { + iks *request = b_call->pending_join_request; + iks *result = iks_new_iq_result(request); + b_call->pending_join_request = NULL; + RAYO_SEND_REPLY(call, iks_find_attrib_soft(request, "from"), result); + iks_delete(request); + } + + /* send B-leg event */ + revent = iks_new_presence("joined", RAYO_NS, RAYO_JID(b_call), rayo_call_get_dcp_jid(b_call)); + joined = iks_find(revent, "joined"); + iks_insert_attrib_printf(joined, "call-uri", "xmpp:%s@%s", a_uuid, RAYO_JID(globals.server)); + + RAYO_SEND_MESSAGE(b_call, rayo_call_get_dcp_jid(b_call), revent); + RAYO_UNLOCK(b_call); + } + /* send A-leg event */ revent = iks_new_presence("joined", RAYO_NS, switch_event_get_header(event, "variable_rayo_call_jid"), @@ -2801,19 +2821,6 @@ static void on_call_bridge_event(struct rayo_client *rclient, switch_event_t *ev RAYO_SEND_MESSAGE(call, RAYO_JID(rclient), revent); - /* send B-leg event */ - b_call = RAYO_CALL_LOCATE_BY_ID(b_uuid); - if (b_call) { - revent = iks_new_presence("joined", RAYO_NS, RAYO_JID(b_call), rayo_call_get_dcp_jid(b_call)); - joined = iks_find(revent, "joined"); - iks_insert_attrib_printf(joined, "call-uri", "xmpp:%s@%s", a_uuid, RAYO_JID(globals.server)); - - b_call->joined = JOINED_CALL; - b_call->joined_id = switch_core_strdup(RAYO_POOL(b_call), a_uuid); - - RAYO_SEND_MESSAGE(b_call, rayo_call_get_dcp_jid(b_call), revent); - RAYO_UNLOCK(b_call); - } RAYO_UNLOCK(call); } } @@ -2846,6 +2853,28 @@ static void on_call_unbridge_event(struct rayo_client *rclient, switch_event_t * iks_delete(request); } + b_call = RAYO_CALL_LOCATE_BY_ID(b_uuid); + if (b_call) { + b_call->joined = 0; + b_call->joined_id = NULL; + + /* send IQ result to client now. */ + if (b_call->pending_join_request) { + iks *request = b_call->pending_join_request; + iks *result = iks_new_iq_result(request); + b_call->pending_join_request = NULL; + RAYO_SEND_REPLY(b_call, iks_find_attrib_soft(request, "from"), result); + iks_delete(request); + } + + /* send B-leg event */ + revent = iks_new_presence("unjoined", RAYO_NS, RAYO_JID(b_call), rayo_call_get_dcp_jid(b_call)); + joined = iks_find(revent, "unjoined"); + iks_insert_attrib_printf(joined, "call-uri", "xmpp:%s@%s", a_uuid, RAYO_JID(globals.server)); + RAYO_SEND_MESSAGE(b_call, rayo_call_get_dcp_jid(b_call), revent); + RAYO_UNLOCK(b_call); + } + /* send A-leg event */ revent = iks_new_presence("unjoined", RAYO_NS, switch_event_get_header(event, "variable_rayo_call_jid"), @@ -2854,18 +2883,6 @@ static void on_call_unbridge_event(struct rayo_client *rclient, switch_event_t * iks_insert_attrib_printf(joined, "call-uri", "xmpp:%s@%s", b_uuid, RAYO_JID(globals.server)); RAYO_SEND_MESSAGE(call, RAYO_JID(rclient), revent); - /* send B-leg event */ - b_call = RAYO_CALL_LOCATE_BY_ID(b_uuid); - if (b_call) { - revent = iks_new_presence("unjoined", RAYO_NS, RAYO_JID(b_call), rayo_call_get_dcp_jid(b_call)); - joined = iks_find(revent, "unjoined"); - iks_insert_attrib_printf(joined, "call-uri", "xmpp:%s@%s", a_uuid, RAYO_JID(globals.server)); - RAYO_SEND_MESSAGE(b_call, rayo_call_get_dcp_jid(b_call), revent); - - b_call->joined = 0; - b_call->joined_id = NULL; - RAYO_UNLOCK(b_call); - } RAYO_UNLOCK(call); } } @@ -3153,9 +3170,8 @@ done: if (ok) { switch_channel_set_variable(channel, "hangup_after_bridge", "false"); switch_channel_set_variable(channel, "transfer_after_bridge", ""); - switch_channel_set_variable(channel, "park_after_bridge", "false"); - switch_channel_set_variable(channel, "exec_after_bridge_app", "park"); - switch_channel_set_variable(channel, "exec_after_bridge_arg", ""); + switch_channel_set_variable(channel, "park_after_bridge", "true"); + switch_channel_set_variable(channel, "hold_hangup_xfer_exten", "foo"); /* Icky hack to prevent unjoin of call on hold from hanging up b-leg. park_after_bridge will take precedence over the transfer_after_bridge variable that gets set by this var */ switch_channel_set_variable(channel, SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE, "-1"); /* required so that output mixing works */ switch_core_event_hook_add_read_frame(session, rayo_call_on_read_frame); if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { From 37648ced3e9db25673175dc2fbbe4ae28743227f Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 18 Oct 2013 08:17:50 +0000 Subject: [PATCH 55/80] Add freeswitch-all debian package This package bundles all modules and extras into a single DEB. This can have some advantages in terms of convenience and speed of apt operations. --- debian/.gitignore | 1 + debian/bootstrap.sh | 100 +++++++++++++++++++++++++++++++++++++++----- debian/rules | 1 + 3 files changed, 91 insertions(+), 11 deletions(-) diff --git a/debian/.gitignore b/debian/.gitignore index 81fc750bf9..896d998162 100644 --- a/debian/.gitignore +++ b/debian/.gitignore @@ -5,6 +5,7 @@ /files /modules.conf /modules_.conf +/freeswitch-all.* /freeswitch-autotools.install /freeswitch-mod-*.install /freeswitch-conf-*.install diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 5843872904..2f9665a5c8 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -6,7 +6,7 @@ mod_dir="../src/mod" conf_dir="../conf" lang_dir="../conf/vanilla/lang" fs_description="FreeSWITCH is a scalable open source cross-platform telephony platform designed to route and interconnect popular communication protocols using audio, video, text or any other form of media." -mod_build_depends="." +mod_build_depends="." mod_depends="." mod_recommends="." mod_suggests="." supported_distros="squeeze wheezy jessie sid" avoid_mods=( applications/mod_limit @@ -204,6 +204,26 @@ EOF print_core_control () { cat <= 1.0.8), + freeswitch-sounds-en-us-callie (>= 1.0.25) | freeswitch-sounds, + $(debian_wrap "${mod_depends}") +Recommends: + $(debian_wrap "${mod_recommends}") +Suggests: freeswitch-all-dbg, + $(debian_wrap "${mod_suggests}") +Description: Cross-Platform Scalable Multi-Protocol Soft Switch + $(debian_wrap "${fs_description}") + . + This package contains FreeSWITCH and all modules and extras. + Package: freeswitch Architecture: any Depends: \${shlibs:Depends}, \${perl:Depends}, \${misc:Depends}, @@ -616,6 +636,16 @@ Description: Cross-Platform Scalable Multi-Protocol Soft Switch This is a metapackage which depends on all mod_say languages for FreeSWITCH. +Package: freeswitch-all-dbg +Section: debug +Priority: extra +Architecture: any +Depends: \${misc:Depends}, freeswitch (= \${binary:Version}) +Description: debugging symbols for FreeSWITCH + $(debian_wrap "${fs_description}") + . + This package contains debugging symbols for FreeSWITCH. + Package: freeswitch-dbg Section: debug Priority: extra @@ -890,6 +920,7 @@ gencontrol_per_cat () { geninstall_per_mod () { local f=freeswitch-${module_name//_/-}.install (print_edit_warning; print_mod_install "$module_name") > $f + print_mod_install "$module_name" >> freeswitch-all.install test -f $f.tmpl && cat $f.tmpl >> $f } @@ -912,6 +943,7 @@ genconf () { local p=freeswitch-conf-${conf//_/-} local f=$p.install (print_edit_warning; print_conf_install) > $f + print_conf_install >> freeswitch-all.install test -f $f.tmpl && cat $f.tmpl >> $f local f=$p.lintian-overrides (print_edit_warning; print_conf_overrides "$p") > $f @@ -923,26 +955,50 @@ genlang () { local p=freeswitch-lang-${lang//_/-} local f=$p.install (print_edit_warning; print_lang_install) > $f + print_lang_install >> freeswitch-all.install test -f $f.tmpl && cat $f.tmpl >> $f local f=$p.lintian-overrides (print_edit_warning; print_lang_overrides "$p") > $f test -f $f.tmpl && cat $f.tmpl >> $f } -accumulate_build_depends () { +accumulate_mod_deps () { local x="" + # build-depends if [ -n "$(eval echo \$build_depends_$codename)" ]; then x="$(eval echo \$build_depends_$codename)" - else - x="${build_depends}" - fi + else x="${build_depends}"; fi if [ -n "$x" ]; then if [ ! "$mod_build_depends" = "." ]; then mod_build_depends="${mod_build_depends}, ${x}" - else - mod_build_depends="${x}" - fi - fi + else mod_build_depends="${x}"; fi; fi + # depends + if [ -n "$(eval echo \$depends_$codename)" ]; then + x="$(eval echo \$depends_$codename)" + else x="${depends}"; fi + x="$(echo "$x" | sed 's/, \?/\n/g' | grep -v '^freeswitch' | tr '\n' ',' | sed -e 's/,$//' -e 's/,/, /g')" + if [ -n "$x" ]; then + if [ ! "$mod_depends" = "." ]; then + mod_depends="${mod_depends}, ${x}" + else mod_depends="${x}"; fi; fi + # recommends + if [ -n "$(eval echo \$recommends_$codename)" ]; then + x="$(eval echo \$recommends_$codename)" + else x="${recommends}"; fi + x="$(echo "$x" | sed 's/, \?/\n/g' | grep -v '^freeswitch' | tr '\n' ',' | sed -e 's/,$//' -e 's/,/, /g')" + if [ -n "$x" ]; then + if [ ! "$mod_recommends" = "." ]; then + mod_recommends="${mod_recommends}, ${x}" + else mod_recommends="${x}"; fi; fi + # suggests + if [ -n "$(eval echo \$suggests_$codename)" ]; then + x="$(eval echo \$suggests_$codename)" + else x="${suggests}"; fi + x="$(echo "$x" | sed 's/, \?/\n/g' | grep -v '^freeswitch' | tr '\n' ',' | sed -e 's/,$//' -e 's/,/, /g')" + if [ -n "$x" ]; then + if [ ! "$mod_suggests" = "." ]; then + mod_suggests="${mod_suggests}, ${x}" + else mod_suggests="${x}"; fi; fi } genmodctl_new_mod () { @@ -1108,10 +1164,13 @@ echo "Generating control-modules.gen as sanity check..." >&2 map_modules ':' 'genmodctl_cat' 'genmodctl_mod' \ ) > control-modules.gen -echo "Accumulating build dependencies from modules..." >&2 -map_modules 'mod_filter' '' 'accumulate_build_depends' +echo "Accumulating dependencies from modules..." >&2 +map_modules 'mod_filter' '' 'accumulate_mod_deps' echo "Generating debian/..." >&2 > control +> freeswitch-all.install +(print_edit_warning; print_mod_overrides "freeswitch-all") \ + > freeswitch-all.lintian-overrides (print_edit_warning; print_source_control; print_core_control) >> control echo "Generating debian/ (conf)..." >&2 (echo "### conf"; echo) >> control @@ -1125,6 +1184,25 @@ print_edit_warning > modules_.conf map_modules "mod_filter" \ "gencontrol_per_cat genmodules_per_cat" \ "gencontrol_per_mod geninstall_per_mod genoverrides_per_mod genmodules_per_mod" +echo "Generating debian/ (-all package)..." >&2 +grep -e '^Package:' control | grep -v '^freeswitch-all$' | while xread l; do + m="${l#*: }" + f=$m.install + if [ -s $f ]; then + grep -v '^##\|^$' $f | while xread x; do + if ! grep -e "$x" freeswitch-all.install >/dev/null; then + printf '%s\n' "$x" >> freeswitch-all.install + fi + done + fi +done +for x in postinst postrm preinst prerm; do + cp -a freeswitch.$x freeswitch-all.$x +done +cp -a freeswitch-doc.docs freeswitch-all.docs +#cp -a freeswitch-systemd.freeswitch.service freeswitch-all.freeswitch.service +cp -a freeswitch-sysvinit.freeswitch.default freeswitch-all.freeswitch.default +cp -a freeswitch-sysvinit.freeswitch.init freeswitch-all.freeswitch.init echo "Generating additional lintian overrides..." >&2 grep -e '^Package:' control | while xread l; do diff --git a/debian/rules b/debian/rules index 7da66a8eaa..7d7d50fd71 100755 --- a/debian/rules +++ b/debian/rules @@ -104,6 +104,7 @@ override_dh_auto_install: override_dh_installinit: dh_installinit -pfreeswitch-sysvinit --name=freeswitch + dh_installinit -pfreeswitch-all --name=freeswitch debian-bootstrap: debian/.stamp-bootstrap debian/.stamp-bootstrap: From 8ea0bc73a9e162504b8e0564f585cbfb5b39acfc Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 18 Oct 2013 20:14:42 +0000 Subject: [PATCH 56/80] Limit version of packages we replace --- debian/bootstrap.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 2f9665a5c8..b9776f14ac 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -207,10 +207,16 @@ cat <= 1.0.8), freeswitch-sounds-en-us-callie (>= 1.0.25) | freeswitch-sounds, From eee96c60c99a343332399e45027b4ad03c99b33d Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Sat, 19 Oct 2013 18:51:50 +0800 Subject: [PATCH 57/80] Tweaks --- libs/spandsp/src/libspandsp.2012.vcxproj.filters | 8 ++++++-- src/mod/applications/mod_spandsp/udptl.c | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/libs/spandsp/src/libspandsp.2012.vcxproj.filters b/libs/spandsp/src/libspandsp.2012.vcxproj.filters index dea495c328..bc694efb84 100644 --- a/libs/spandsp/src/libspandsp.2012.vcxproj.filters +++ b/libs/spandsp/src/libspandsp.2012.vcxproj.filters @@ -696,8 +696,12 @@ Header Files - - + + Header Files + + + Header Files + Header Files diff --git a/src/mod/applications/mod_spandsp/udptl.c b/src/mod/applications/mod_spandsp/udptl.c index 9de1a915cc..45fa6b6ffc 100644 --- a/src/mod/applications/mod_spandsp/udptl.c +++ b/src/mod/applications/mod_spandsp/udptl.c @@ -205,7 +205,8 @@ int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len) /* Save the new packet. Pure redundancy mode won't use this, but some systems will switch into FEC mode after sending some redundant packets. */ x = seq_no & UDPTL_BUF_MASK; - memcpy(s->rx[x].buf, msg, msg_len); + if (msg_len > 0) + memcpy(s->rx[x].buf, msg, msg_len); s->rx[x].buf_len = msg_len; s->rx[x].fec_len[0] = 0; s->rx[x].fec_span = 0; @@ -288,7 +289,8 @@ int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len) return -1; /* Save the new FEC data */ - memcpy(s->rx[x].fec[i], data, s->rx[x].fec_len[i]); + if (s->rx[x].fec_len[i]) + memcpy(s->rx[x].fec[i], data, s->rx[x].fec_len[i]); #if 0 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FEC: "); for (j = 0; j < s->rx[x].fec_len[i]; j++) From aa2380a04ca9fb308dfc9f60037d1ae8f11c9432 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 19 Oct 2013 18:42:21 +0000 Subject: [PATCH 58/80] Install perl module files needed by mod_perl FS-5892 --resolve --- debian/freeswitch-mod-perl.install.tmpl | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 debian/freeswitch-mod-perl.install.tmpl diff --git a/debian/freeswitch-mod-perl.install.tmpl b/debian/freeswitch-mod-perl.install.tmpl new file mode 100644 index 0000000000..5b2fe712f3 --- /dev/null +++ b/debian/freeswitch-mod-perl.install.tmpl @@ -0,0 +1,2 @@ +debian/tmp/usr/perl/freeswitch.pm /usr/lib/perl5 +debian/tmp/usr/perl/freeswitch.so /usr/lib/perl5/auto/freeswitch From 2cdfb045d2a0d00d01c2000017cb0ff50da40ff7 Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Sun, 20 Oct 2013 20:55:23 +0800 Subject: [PATCH 59/80] Update some of the MSVC files for spandsp --- libs/spandsp/src/libspandsp.2012.sln | 318 ++++++++++++++++++ libs/spandsp/tests/msvc/adsi_tests.vcproj | 208 ------------ .../tests/msvc/complex_tests.2012.vcxproj | 109 ++++++ .../msvc/complex_tests.2012.vcxproj.filters | 33 ++ libs/spandsp/tests/msvc/complex_tests.vcproj | 208 ------------ .../complex_vector_float_tests.2012.vcxproj | 109 ++++++ ...ex_vector_float_tests.2012.vcxproj.filters | 33 ++ .../msvc/complex_vector_float_tests.vcproj | 208 ------------ .../complex_vector_int_tests.2012.vcxproj | 109 ++++++ ...plex_vector_int_tests.2012.vcxproj.filters | 33 ++ .../msvc/complex_vector_int_tests.vcproj | 208 ------------ .../tests/msvc/dtmf_rx_tests.2012.vcxproj | 103 ++++++ .../msvc/dtmf_rx_tests.2012.vcxproj.filters | 33 ++ libs/spandsp/tests/msvc/dtmf_rx_tests.vcproj | 208 ------------ .../tests/msvc/dtmf_tx_tests.2012.vcxproj | 103 ++++++ .../msvc/dtmf_tx_tests.2012.vcxproj.filters | 33 ++ libs/spandsp/tests/msvc/dtmf_tx_tests.vcproj | 208 ------------ .../tests/msvc/queue_tests.2012.vcxproj | 103 ++++++ .../msvc/queue_tests.2012.vcxproj.filters | 33 ++ libs/spandsp/tests/msvc/queue_tests.vcproj | 208 ------------ .../tests/msvc/t38_core_tests.2012.vcxproj | 109 ++++++ .../msvc/t38_core_tests.2012.vcxproj.filters | 33 ++ libs/spandsp/tests/msvc/t38_core_tests.vcproj | 208 ------------ .../t38_non_ecm_buffer_tests.2012.vcxproj | 109 ++++++ ..._non_ecm_buffer_tests.2012.vcxproj.filters | 33 ++ .../msvc/t38_non_ecm_buffer_tests.vcproj | 208 ------------ .../tests/msvc/v22bis_tests.2012.vcxproj | 103 ++++++ .../msvc/v22bis_tests.2012.vcxproj.filters | 33 ++ libs/spandsp/tests/msvc/v22bis_tests.vcproj | 208 ------------ .../spandsp/tests/msvc/v29_tests.2012.vcxproj | 103 ++++++ .../tests/msvc/v29_tests.2012.vcxproj.filters | 33 ++ libs/spandsp/tests/msvc/v29_tests.vcproj | 208 ------------ .../spandsp/tests/msvc/v80_tests.2012.vcxproj | 103 ++++++ .../tests/msvc/v80_tests.2012.vcxproj.filters | 33 ++ libs/spandsp/tests/msvc/v80_tests.vcproj | 208 ------------ libs/spandsp/tests/msvc/v8_tests.2012.vcxproj | 103 ++++++ .../tests/msvc/v8_tests.2012.vcxproj.filters | 33 ++ libs/spandsp/tests/msvc/v8_tests.vcproj | 208 ------------ .../msvc/vector_float_tests.2012.vcxproj | 109 ++++++ .../vector_float_tests.2012.vcxproj.filters | 33 ++ .../tests/msvc/vector_float_tests.vcproj | 208 ------------ .../tests/msvc/vector_int_tests.2012.vcxproj | 109 ++++++ .../vector_int_tests.2012.vcxproj.filters | 33 ++ .../tests/msvc/vector_int_tests.vcproj | 208 ------------ 44 files changed, 2264 insertions(+), 3120 deletions(-) create mode 100644 libs/spandsp/src/libspandsp.2012.sln delete mode 100644 libs/spandsp/tests/msvc/adsi_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/complex_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/complex_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/complex_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/complex_vector_float_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/complex_vector_float_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/complex_vector_float_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/complex_vector_int_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/complex_vector_int_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/complex_vector_int_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/dtmf_rx_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/dtmf_rx_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/dtmf_rx_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/dtmf_tx_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/dtmf_tx_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/dtmf_tx_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/queue_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/queue_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/queue_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/t38_core_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/t38_core_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/t38_core_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/v22bis_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/v22bis_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/v22bis_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/v29_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/v29_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/v29_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/v80_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/v80_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/v80_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/v8_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/v8_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/v8_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/vector_float_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/vector_float_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/vector_float_tests.vcproj create mode 100644 libs/spandsp/tests/msvc/vector_int_tests.2012.vcxproj create mode 100644 libs/spandsp/tests/msvc/vector_int_tests.2012.vcxproj.filters delete mode 100644 libs/spandsp/tests/msvc/vector_int_tests.vcproj diff --git a/libs/spandsp/src/libspandsp.2012.sln b/libs/spandsp/src/libspandsp.2012.sln new file mode 100644 index 0000000000..c0cc75f4e3 --- /dev/null +++ b/libs/spandsp/src/libspandsp.2012.sln @@ -0,0 +1,318 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Desktop +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_at_dictionary", "msvc\make_at_dictionary.2012.vcxproj", "{DEE932AB-5911-4700-9EEB-8C7090A0A330}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_modem_filter", "msvc\make_modem_filter.2012.vcxproj", "{329A6FA0-0FCC-4435-A950-E670AEFA9838}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_t43_gray_code_tables", "msvc\make_t43_gray_code_tables.2012.vcxproj", "{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_cielab_luts", "msvc\make_cielab_luts.2012.vcxproj", "{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_math_fixed_tables", "msvc\make_math_fixed_tables.2012.vcxproj", "{2386B892-35F5-46CF-A0F0-10394D2FBF9B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspandsp", "libspandsp.2012.vcxproj", "{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}" + ProjectSection(ProjectDependencies) = postProject + {329A6FA0-0FCC-4435-A950-E670AEFA9838} = {329A6FA0-0FCC-4435-A950-E670AEFA9838} + {DEE932AB-5911-4700-9EEB-8C7090A0A330} = {DEE932AB-5911-4700-9EEB-8C7090A0A330} + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014} = {401A40CD-5DB4-4E34-AC68-FA99E9FAC014} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_line_models", "..\spandsp-sim\msvc\make_line_models.2012.vcxproj", "{F290BADE-82DE-4037-B49D-D563E43169DA}" + ProjectSection(ProjectDependencies) = postProject + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} = {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspandsp_sim", "..\spandsp-sim\libspandsp_sim.2012.vcxproj", "{502F1E51-F0A0-4607-AB7F-05BAB530AAE1}" + ProjectSection(ProjectDependencies) = postProject + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} = {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "download libjpeg", "msvc\download_libjpeg.2012.vcxproj", "{652AD5F7-8488-489F-AAD0-7FBE064703B6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "download libtiff", "msvc\download_libtiff.2012.vcxproj", "{2B8A45C9-FEB4-4734-AB37-8DB9DB899917}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libjpeg", "msvc\libjpeg.2012.vcxproj", "{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}" + ProjectSection(ProjectDependencies) = postProject + {652AD5F7-8488-489F-AAD0-7FBE064703B6} = {652AD5F7-8488-489F-AAD0-7FBE064703B6} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtiff", "msvc\libtiff.2012.vcxproj", "{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}" + ProjectSection(ProjectDependencies) = postProject + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1} = {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1} + {652AD5F7-8488-489F-AAD0-7FBE064703B6} = {652AD5F7-8488-489F-AAD0-7FBE064703B6} + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917} = {2B8A45C9-FEB4-4734-AB37-8DB9DB899917} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t38_core_tests", "..\tests\msvc\t38_core_tests.2012.vcxproj", "{A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t38_non_ecm_buffer_tests", "..\tests\msvc\t38_non_ecm_buffer_tests.2012.vcxproj", "{80A3D9D9-3846-4DA5-8676-F940D725EA62}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vector_int_tests", "..\tests\msvc\vector_int_tests.2012.vcxproj", "{80A60464-29E8-4EE8-BAFA-8708B7C08CC3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vector_float_tests", "..\tests\msvc\vector_float_tests.2012.vcxproj", "{EA745FF7-9E4B-4C13-BA19-2EE8165A6245}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "complex_tests", "..\tests\msvc\complex_tests.2012.vcxproj", "{A349379F-0FEA-49C8-9535-05F39663337B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "complex_vector_float_tests", "..\tests\msvc\complex_vector_float_tests.2012.vcxproj", "{2B0D705C-1CF2-401C-BFBC-A43FB806908C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "complex_vector_int_tests", "..\tests\msvc\complex_vector_int_tests.2012.vcxproj", "{C2E8B4D1-A398-4D57-94F8-B61F20C7D514}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "queue_tests", "..\tests\msvc\queue_tests.2012.vcxproj", "{D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dtmf_tx_tests", "..\tests\msvc\dtmf_tx_tests.2012.vcxproj", "{1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dtmf_rx_tests", "..\tests\msvc\dtmf_rx_tests.2012.vcxproj", "{24E7EF80-7854-4A21-80FB-31C4E71109DE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "v29_tests", "..\tests\msvc\v29_tests.2012.vcxproj", "{323BD962-4581-4561-8105-8C166A9FA933}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "v80_tests", "..\tests\msvc\v80_tests.2012.vcxproj", "{10263F04-37DD-4E4A-AE4F-0641B018B714}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "v22bis_tests", "..\tests\msvc\v22bis_tests.2012.vcxproj", "{DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "v8_tests", "..\tests\msvc\v8_tests.2012.vcxproj", "{0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C84E437E-9D4C-46C8-9724-DF301C849E61}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + All|Win32 = All|Win32 + All|x64 = All|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.Build.0 = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|x64.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.Build.0 = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.Build.0 = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|x64.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.Build.0 = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.ActiveCfg = All|Win32 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|Win32.ActiveCfg = Release|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.ActiveCfg = Release|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.Build.0 = Release|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.Build.0 = Debug|Win32 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.ActiveCfg = Debug|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.Build.0 = Debug|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.ActiveCfg = Release|Win32 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.Build.0 = Release|Win32 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.ActiveCfg = Release|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.Build.0 = Release|x64 + {F290BADE-82DE-4037-B49D-D563E43169DA}.All|Win32.ActiveCfg = All|Win32 + {F290BADE-82DE-4037-B49D-D563E43169DA}.All|Win32.Build.0 = All|Win32 + {F290BADE-82DE-4037-B49D-D563E43169DA}.All|x64.ActiveCfg = All|Win32 + {F290BADE-82DE-4037-B49D-D563E43169DA}.Debug|Win32.ActiveCfg = All|Win32 + {F290BADE-82DE-4037-B49D-D563E43169DA}.Debug|Win32.Build.0 = All|Win32 + {F290BADE-82DE-4037-B49D-D563E43169DA}.Debug|x64.ActiveCfg = All|Win32 + {F290BADE-82DE-4037-B49D-D563E43169DA}.Release|Win32.ActiveCfg = All|Win32 + {F290BADE-82DE-4037-B49D-D563E43169DA}.Release|Win32.Build.0 = All|Win32 + {F290BADE-82DE-4037-B49D-D563E43169DA}.Release|x64.ActiveCfg = All|Win32 + {502F1E51-F0A0-4607-AB7F-05BAB530AAE1}.All|Win32.ActiveCfg = Release|Win32 + {502F1E51-F0A0-4607-AB7F-05BAB530AAE1}.All|Win32.Build.0 = Release|Win32 + {502F1E51-F0A0-4607-AB7F-05BAB530AAE1}.All|x64.ActiveCfg = Release|Win32 + {502F1E51-F0A0-4607-AB7F-05BAB530AAE1}.Debug|Win32.ActiveCfg = Debug|Win32 + {502F1E51-F0A0-4607-AB7F-05BAB530AAE1}.Debug|Win32.Build.0 = Debug|Win32 + {502F1E51-F0A0-4607-AB7F-05BAB530AAE1}.Debug|x64.ActiveCfg = Debug|Win32 + {502F1E51-F0A0-4607-AB7F-05BAB530AAE1}.Release|Win32.ActiveCfg = Release|Win32 + {502F1E51-F0A0-4607-AB7F-05BAB530AAE1}.Release|Win32.Build.0 = Release|Win32 + {502F1E51-F0A0-4607-AB7F-05BAB530AAE1}.Release|x64.ActiveCfg = Release|Win32 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|Win32.ActiveCfg = Release|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.ActiveCfg = Release|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.Build.0 = Release|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.ActiveCfg = Debug|Win32 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.Build.0 = Debug|Win32 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.ActiveCfg = Debug|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.Build.0 = Debug|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.ActiveCfg = Release|Win32 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.Build.0 = Release|Win32 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.ActiveCfg = Release|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.Build.0 = Release|x64 + {652AD5F7-8488-489F-AAD0-7FBE064703B6}.All|Win32.ActiveCfg = All|Win32 + {652AD5F7-8488-489F-AAD0-7FBE064703B6}.All|Win32.Build.0 = All|Win32 + {652AD5F7-8488-489F-AAD0-7FBE064703B6}.All|x64.ActiveCfg = All|Win32 + {652AD5F7-8488-489F-AAD0-7FBE064703B6}.Debug|Win32.ActiveCfg = All|Win32 + {652AD5F7-8488-489F-AAD0-7FBE064703B6}.Debug|Win32.Build.0 = All|Win32 + {652AD5F7-8488-489F-AAD0-7FBE064703B6}.Debug|x64.ActiveCfg = All|Win32 + {652AD5F7-8488-489F-AAD0-7FBE064703B6}.Release|Win32.ActiveCfg = All|Win32 + {652AD5F7-8488-489F-AAD0-7FBE064703B6}.Release|Win32.Build.0 = All|Win32 + {652AD5F7-8488-489F-AAD0-7FBE064703B6}.Release|x64.ActiveCfg = All|Win32 + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917}.All|Win32.ActiveCfg = All|Win32 + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917}.All|Win32.Build.0 = All|Win32 + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917}.All|x64.ActiveCfg = All|Win32 + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917}.Debug|Win32.ActiveCfg = All|Win32 + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917}.Debug|Win32.Build.0 = All|Win32 + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917}.Debug|x64.ActiveCfg = All|Win32 + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917}.Release|Win32.ActiveCfg = All|Win32 + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917}.Release|Win32.Build.0 = All|Win32 + {2B8A45C9-FEB4-4734-AB37-8DB9DB899917}.Release|x64.ActiveCfg = All|Win32 + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}.All|Win32.ActiveCfg = Release|Win32 + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}.All|Win32.Build.0 = Release|Win32 + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}.All|x64.ActiveCfg = Release|Win32 + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}.Debug|Win32.ActiveCfg = Debug|Win32 + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}.Debug|Win32.Build.0 = Debug|Win32 + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}.Debug|x64.ActiveCfg = Debug|Win32 + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}.Release|Win32.ActiveCfg = Release|Win32 + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}.Release|Win32.Build.0 = Release|Win32 + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3}.Release|x64.ActiveCfg = Release|Win32 + {80A3D9D9-3846-4DA5-8676-F940D725EA62}.All|Win32.ActiveCfg = Release|Win32 + {80A3D9D9-3846-4DA5-8676-F940D725EA62}.All|Win32.Build.0 = Release|Win32 + {80A3D9D9-3846-4DA5-8676-F940D725EA62}.All|x64.ActiveCfg = Release|Win32 + {80A3D9D9-3846-4DA5-8676-F940D725EA62}.Debug|Win32.ActiveCfg = Debug|Win32 + {80A3D9D9-3846-4DA5-8676-F940D725EA62}.Debug|Win32.Build.0 = Debug|Win32 + {80A3D9D9-3846-4DA5-8676-F940D725EA62}.Debug|x64.ActiveCfg = Debug|Win32 + {80A3D9D9-3846-4DA5-8676-F940D725EA62}.Release|Win32.ActiveCfg = Release|Win32 + {80A3D9D9-3846-4DA5-8676-F940D725EA62}.Release|Win32.Build.0 = Release|Win32 + {80A3D9D9-3846-4DA5-8676-F940D725EA62}.Release|x64.ActiveCfg = Release|Win32 + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3}.All|Win32.ActiveCfg = Release|Win32 + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3}.All|Win32.Build.0 = Release|Win32 + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3}.All|x64.ActiveCfg = Release|Win32 + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3}.Debug|Win32.ActiveCfg = Debug|Win32 + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3}.Debug|Win32.Build.0 = Debug|Win32 + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3}.Debug|x64.ActiveCfg = Debug|Win32 + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3}.Release|Win32.ActiveCfg = Release|Win32 + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3}.Release|Win32.Build.0 = Release|Win32 + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3}.Release|x64.ActiveCfg = Release|Win32 + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245}.All|Win32.ActiveCfg = Release|Win32 + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245}.All|Win32.Build.0 = Release|Win32 + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245}.All|x64.ActiveCfg = Release|Win32 + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245}.Debug|Win32.ActiveCfg = Debug|Win32 + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245}.Debug|Win32.Build.0 = Debug|Win32 + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245}.Debug|x64.ActiveCfg = Debug|Win32 + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245}.Release|Win32.ActiveCfg = Release|Win32 + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245}.Release|Win32.Build.0 = Release|Win32 + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245}.Release|x64.ActiveCfg = Release|Win32 + {A349379F-0FEA-49C8-9535-05F39663337B}.All|Win32.ActiveCfg = Release|Win32 + {A349379F-0FEA-49C8-9535-05F39663337B}.All|Win32.Build.0 = Release|Win32 + {A349379F-0FEA-49C8-9535-05F39663337B}.All|x64.ActiveCfg = Release|Win32 + {A349379F-0FEA-49C8-9535-05F39663337B}.Debug|Win32.ActiveCfg = Debug|Win32 + {A349379F-0FEA-49C8-9535-05F39663337B}.Debug|Win32.Build.0 = Debug|Win32 + {A349379F-0FEA-49C8-9535-05F39663337B}.Debug|x64.ActiveCfg = Debug|Win32 + {A349379F-0FEA-49C8-9535-05F39663337B}.Release|Win32.ActiveCfg = Release|Win32 + {A349379F-0FEA-49C8-9535-05F39663337B}.Release|Win32.Build.0 = Release|Win32 + {A349379F-0FEA-49C8-9535-05F39663337B}.Release|x64.ActiveCfg = Release|Win32 + {2B0D705C-1CF2-401C-BFBC-A43FB806908C}.All|Win32.ActiveCfg = Release|Win32 + {2B0D705C-1CF2-401C-BFBC-A43FB806908C}.All|Win32.Build.0 = Release|Win32 + {2B0D705C-1CF2-401C-BFBC-A43FB806908C}.All|x64.ActiveCfg = Release|Win32 + {2B0D705C-1CF2-401C-BFBC-A43FB806908C}.Debug|Win32.ActiveCfg = Debug|Win32 + {2B0D705C-1CF2-401C-BFBC-A43FB806908C}.Debug|Win32.Build.0 = Debug|Win32 + {2B0D705C-1CF2-401C-BFBC-A43FB806908C}.Debug|x64.ActiveCfg = Debug|Win32 + {2B0D705C-1CF2-401C-BFBC-A43FB806908C}.Release|Win32.ActiveCfg = Release|Win32 + {2B0D705C-1CF2-401C-BFBC-A43FB806908C}.Release|Win32.Build.0 = Release|Win32 + {2B0D705C-1CF2-401C-BFBC-A43FB806908C}.Release|x64.ActiveCfg = Release|Win32 + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514}.All|Win32.ActiveCfg = Release|Win32 + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514}.All|Win32.Build.0 = Release|Win32 + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514}.All|x64.ActiveCfg = Release|Win32 + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514}.Debug|Win32.ActiveCfg = Debug|Win32 + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514}.Debug|Win32.Build.0 = Debug|Win32 + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514}.Debug|x64.ActiveCfg = Debug|Win32 + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514}.Release|Win32.ActiveCfg = Release|Win32 + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514}.Release|Win32.Build.0 = Release|Win32 + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514}.Release|x64.ActiveCfg = Release|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.Build.0 = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x64.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.Build.0 = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.Build.0 = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.Build.0 = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|x64.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.Build.0 = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|x64.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.Build.0 = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.Build.0 = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|x64.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.Build.0 = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|x64.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.Build.0 = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|x64.ActiveCfg = All|Win32 + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}.All|Win32.ActiveCfg = Release|Win32 + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}.All|Win32.Build.0 = Release|Win32 + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}.All|x64.ActiveCfg = Release|Win32 + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}.Debug|Win32.ActiveCfg = Debug|Win32 + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}.Debug|Win32.Build.0 = Debug|Win32 + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}.Debug|x64.ActiveCfg = Debug|Win32 + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}.Release|Win32.ActiveCfg = Release|Win32 + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}.Release|Win32.Build.0 = Release|Win32 + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF}.Release|x64.ActiveCfg = Release|Win32 + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}.All|Win32.ActiveCfg = Release|Win32 + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}.All|Win32.Build.0 = Release|Win32 + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}.All|x64.ActiveCfg = Release|Win32 + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}.Debug|Win32.ActiveCfg = Debug|Win32 + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}.Debug|Win32.Build.0 = Debug|Win32 + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}.Debug|x64.ActiveCfg = Debug|Win32 + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}.Release|Win32.ActiveCfg = Release|Win32 + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}.Release|Win32.Build.0 = Release|Win32 + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5}.Release|x64.ActiveCfg = Release|Win32 + {24E7EF80-7854-4A21-80FB-31C4E71109DE}.All|Win32.ActiveCfg = Release|Win32 + {24E7EF80-7854-4A21-80FB-31C4E71109DE}.All|Win32.Build.0 = Release|Win32 + {24E7EF80-7854-4A21-80FB-31C4E71109DE}.All|x64.ActiveCfg = Release|Win32 + {24E7EF80-7854-4A21-80FB-31C4E71109DE}.Debug|Win32.ActiveCfg = Debug|Win32 + {24E7EF80-7854-4A21-80FB-31C4E71109DE}.Debug|Win32.Build.0 = Debug|Win32 + {24E7EF80-7854-4A21-80FB-31C4E71109DE}.Debug|x64.ActiveCfg = Debug|Win32 + {24E7EF80-7854-4A21-80FB-31C4E71109DE}.Release|Win32.ActiveCfg = Release|Win32 + {24E7EF80-7854-4A21-80FB-31C4E71109DE}.Release|Win32.Build.0 = Release|Win32 + {24E7EF80-7854-4A21-80FB-31C4E71109DE}.Release|x64.ActiveCfg = Release|Win32 + {323BD962-4581-4561-8105-8C166A9FA933}.All|Win32.ActiveCfg = Release|Win32 + {323BD962-4581-4561-8105-8C166A9FA933}.All|Win32.Build.0 = Release|Win32 + {323BD962-4581-4561-8105-8C166A9FA933}.All|x64.ActiveCfg = Release|Win32 + {323BD962-4581-4561-8105-8C166A9FA933}.Debug|Win32.ActiveCfg = Debug|Win32 + {323BD962-4581-4561-8105-8C166A9FA933}.Debug|Win32.Build.0 = Debug|Win32 + {323BD962-4581-4561-8105-8C166A9FA933}.Debug|x64.ActiveCfg = Debug|Win32 + {323BD962-4581-4561-8105-8C166A9FA933}.Release|Win32.ActiveCfg = Release|Win32 + {323BD962-4581-4561-8105-8C166A9FA933}.Release|Win32.Build.0 = Release|Win32 + {323BD962-4581-4561-8105-8C166A9FA933}.Release|x64.ActiveCfg = Release|Win32 + {10263F04-37DD-4E4A-AE4F-0641B018B714}.All|Win32.ActiveCfg = Release|Win32 + {10263F04-37DD-4E4A-AE4F-0641B018B714}.All|Win32.Build.0 = Release|Win32 + {10263F04-37DD-4E4A-AE4F-0641B018B714}.All|x64.ActiveCfg = Release|Win32 + {10263F04-37DD-4E4A-AE4F-0641B018B714}.Debug|Win32.ActiveCfg = Debug|Win32 + {10263F04-37DD-4E4A-AE4F-0641B018B714}.Debug|Win32.Build.0 = Debug|Win32 + {10263F04-37DD-4E4A-AE4F-0641B018B714}.Debug|x64.ActiveCfg = Debug|Win32 + {10263F04-37DD-4E4A-AE4F-0641B018B714}.Release|Win32.ActiveCfg = Release|Win32 + {10263F04-37DD-4E4A-AE4F-0641B018B714}.Release|Win32.Build.0 = Release|Win32 + {10263F04-37DD-4E4A-AE4F-0641B018B714}.Release|x64.ActiveCfg = Release|Win32 + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}.All|Win32.ActiveCfg = Release|Win32 + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}.All|Win32.Build.0 = Release|Win32 + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}.All|x64.ActiveCfg = Release|Win32 + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}.Debug|Win32.Build.0 = Debug|Win32 + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}.Debug|x64.ActiveCfg = Debug|Win32 + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}.Release|Win32.ActiveCfg = Release|Win32 + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}.Release|Win32.Build.0 = Release|Win32 + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE}.Release|x64.ActiveCfg = Release|Win32 + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}.All|Win32.ActiveCfg = Release|Win32 + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}.All|Win32.Build.0 = Release|Win32 + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}.All|x64.ActiveCfg = Release|Win32 + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}.Debug|Win32.ActiveCfg = Debug|Win32 + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}.Debug|Win32.Build.0 = Debug|Win32 + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}.Debug|x64.ActiveCfg = Debug|Win32 + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}.Release|Win32.ActiveCfg = Release|Win32 + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}.Release|Win32.Build.0 = Release|Win32 + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34}.Release|x64.ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/libs/spandsp/tests/msvc/adsi_tests.vcproj b/libs/spandsp/tests/msvc/adsi_tests.vcproj deleted file mode 100644 index b76e06ecbf..0000000000 --- a/libs/spandsp/tests/msvc/adsi_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/complex_tests.2012.vcxproj b/libs/spandsp/tests/msvc/complex_tests.2012.vcxproj new file mode 100644 index 0000000000..edbd29ebae --- /dev/null +++ b/libs/spandsp/tests/msvc/complex_tests.2012.vcxproj @@ -0,0 +1,109 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {A349379F-0FEA-49C8-9535-05F39663337B} + complex_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + {1cbb0077-18c5-455f-801c-0a0ce7b0bbf5} + false + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/complex_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/complex_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..c985311d03 --- /dev/null +++ b/libs/spandsp/tests/msvc/complex_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/complex_tests.vcproj b/libs/spandsp/tests/msvc/complex_tests.vcproj deleted file mode 100644 index c7145da4f9..0000000000 --- a/libs/spandsp/tests/msvc/complex_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/complex_vector_float_tests.2012.vcxproj b/libs/spandsp/tests/msvc/complex_vector_float_tests.2012.vcxproj new file mode 100644 index 0000000000..1a2d8178fa --- /dev/null +++ b/libs/spandsp/tests/msvc/complex_vector_float_tests.2012.vcxproj @@ -0,0 +1,109 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {2B0D705C-1CF2-401C-BFBC-A43FB806908C} + complex_vector_float_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + {1cbb0077-18c5-455f-801c-0a0ce7b0bbf5} + false + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/complex_vector_float_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/complex_vector_float_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..97213f0053 --- /dev/null +++ b/libs/spandsp/tests/msvc/complex_vector_float_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/complex_vector_float_tests.vcproj b/libs/spandsp/tests/msvc/complex_vector_float_tests.vcproj deleted file mode 100644 index caa57adb96..0000000000 --- a/libs/spandsp/tests/msvc/complex_vector_float_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/complex_vector_int_tests.2012.vcxproj b/libs/spandsp/tests/msvc/complex_vector_int_tests.2012.vcxproj new file mode 100644 index 0000000000..6b3e33ca93 --- /dev/null +++ b/libs/spandsp/tests/msvc/complex_vector_int_tests.2012.vcxproj @@ -0,0 +1,109 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {C2E8B4D1-A398-4D57-94F8-B61F20C7D514} + complex_vector_int_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + {1cbb0077-18c5-455f-801c-0a0ce7b0bbf5} + false + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/complex_vector_int_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/complex_vector_int_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..c7fd99f9aa --- /dev/null +++ b/libs/spandsp/tests/msvc/complex_vector_int_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/complex_vector_int_tests.vcproj b/libs/spandsp/tests/msvc/complex_vector_int_tests.vcproj deleted file mode 100644 index 5b16b33ce7..0000000000 --- a/libs/spandsp/tests/msvc/complex_vector_int_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/dtmf_rx_tests.2012.vcxproj b/libs/spandsp/tests/msvc/dtmf_rx_tests.2012.vcxproj new file mode 100644 index 0000000000..4f17b6be84 --- /dev/null +++ b/libs/spandsp/tests/msvc/dtmf_rx_tests.2012.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {24E7EF80-7854-4A21-80FB-31C4E71109DE} + dtmf_rx_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/dtmf_rx_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/dtmf_rx_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..dd8f8cc2d1 --- /dev/null +++ b/libs/spandsp/tests/msvc/dtmf_rx_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/dtmf_rx_tests.vcproj b/libs/spandsp/tests/msvc/dtmf_rx_tests.vcproj deleted file mode 100644 index 3b1df8cd86..0000000000 --- a/libs/spandsp/tests/msvc/dtmf_rx_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/dtmf_tx_tests.2012.vcxproj b/libs/spandsp/tests/msvc/dtmf_tx_tests.2012.vcxproj new file mode 100644 index 0000000000..4419ec5829 --- /dev/null +++ b/libs/spandsp/tests/msvc/dtmf_tx_tests.2012.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {1577F41D-9A06-45DD-87D4-9ADCC9CCDAD5} + dtmf_tx_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/dtmf_tx_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/dtmf_tx_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..e2ac03f95e --- /dev/null +++ b/libs/spandsp/tests/msvc/dtmf_tx_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/dtmf_tx_tests.vcproj b/libs/spandsp/tests/msvc/dtmf_tx_tests.vcproj deleted file mode 100644 index 64e420dd58..0000000000 --- a/libs/spandsp/tests/msvc/dtmf_tx_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/queue_tests.2012.vcxproj b/libs/spandsp/tests/msvc/queue_tests.2012.vcxproj new file mode 100644 index 0000000000..468f0b7d98 --- /dev/null +++ b/libs/spandsp/tests/msvc/queue_tests.2012.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D9C0F575-83E7-4C15-BF71-D7A0D44A26BF} + queue_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/queue_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/queue_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..49ddb6a0e6 --- /dev/null +++ b/libs/spandsp/tests/msvc/queue_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/queue_tests.vcproj b/libs/spandsp/tests/msvc/queue_tests.vcproj deleted file mode 100644 index d9f6d26169..0000000000 --- a/libs/spandsp/tests/msvc/queue_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ -tiff-4.0.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/t38_core_tests.2012.vcxproj b/libs/spandsp/tests/msvc/t38_core_tests.2012.vcxproj new file mode 100644 index 0000000000..d21b895f02 --- /dev/null +++ b/libs/spandsp/tests/msvc/t38_core_tests.2012.vcxproj @@ -0,0 +1,109 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {A34A9D0E-A7E2-4A04-B044-7BB2FE709EF3} + t38_core_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + {1cbb0077-18c5-455f-801c-0a0ce7b0bbf5} + false + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/t38_core_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/t38_core_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..8a9d19c5b7 --- /dev/null +++ b/libs/spandsp/tests/msvc/t38_core_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/t38_core_tests.vcproj b/libs/spandsp/tests/msvc/t38_core_tests.vcproj deleted file mode 100644 index bb4c9a16ee..0000000000 --- a/libs/spandsp/tests/msvc/t38_core_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.2012.vcxproj b/libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.2012.vcxproj new file mode 100644 index 0000000000..40d4ff728b --- /dev/null +++ b/libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.2012.vcxproj @@ -0,0 +1,109 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {80A3D9D9-3846-4DA5-8676-F940D725EA62} + t38_non_ecm_buffer_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + {1cbb0077-18c5-455f-801c-0a0ce7b0bbf5} + false + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..fde53cb0c3 --- /dev/null +++ b/libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.vcproj b/libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.vcproj deleted file mode 100644 index 45f264ec1c..0000000000 --- a/libs/spandsp/tests/msvc/t38_non_ecm_buffer_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/v22bis_tests.2012.vcxproj b/libs/spandsp/tests/msvc/v22bis_tests.2012.vcxproj new file mode 100644 index 0000000000..88bf6b1fdc --- /dev/null +++ b/libs/spandsp/tests/msvc/v22bis_tests.2012.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {DA4DB99F-E5BA-48BD-BB6B-3595CE24CBAE} + v22bis_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/v22bis_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/v22bis_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..f588cc67d4 --- /dev/null +++ b/libs/spandsp/tests/msvc/v22bis_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/v22bis_tests.vcproj b/libs/spandsp/tests/msvc/v22bis_tests.vcproj deleted file mode 100644 index fc69b38d46..0000000000 --- a/libs/spandsp/tests/msvc/v22bis_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/v29_tests.2012.vcxproj b/libs/spandsp/tests/msvc/v29_tests.2012.vcxproj new file mode 100644 index 0000000000..672a62c1fb --- /dev/null +++ b/libs/spandsp/tests/msvc/v29_tests.2012.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {323BD962-4581-4561-8105-8C166A9FA933} + v29_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/v29_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/v29_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..8e030a1801 --- /dev/null +++ b/libs/spandsp/tests/msvc/v29_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/v29_tests.vcproj b/libs/spandsp/tests/msvc/v29_tests.vcproj deleted file mode 100644 index 6cfe9d9bc2..0000000000 --- a/libs/spandsp/tests/msvc/v29_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/v80_tests.2012.vcxproj b/libs/spandsp/tests/msvc/v80_tests.2012.vcxproj new file mode 100644 index 0000000000..3b59f30708 --- /dev/null +++ b/libs/spandsp/tests/msvc/v80_tests.2012.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {10263F04-37DD-4E4A-AE4F-0641B018B714} + v80_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/v80_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/v80_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..454b800c13 --- /dev/null +++ b/libs/spandsp/tests/msvc/v80_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/v80_tests.vcproj b/libs/spandsp/tests/msvc/v80_tests.vcproj deleted file mode 100644 index ae05e597c1..0000000000 --- a/libs/spandsp/tests/msvc/v80_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/v8_tests.2012.vcxproj b/libs/spandsp/tests/msvc/v8_tests.2012.vcxproj new file mode 100644 index 0000000000..03fe38e66c --- /dev/null +++ b/libs/spandsp/tests/msvc/v8_tests.2012.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {0C69B8C2-0CE1-4CD4-870C-1C13FB3F9B34} + v8_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/v8_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/v8_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..a5737ede86 --- /dev/null +++ b/libs/spandsp/tests/msvc/v8_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/v8_tests.vcproj b/libs/spandsp/tests/msvc/v8_tests.vcproj deleted file mode 100644 index 11d3e57d02..0000000000 --- a/libs/spandsp/tests/msvc/v8_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/vector_float_tests.2012.vcxproj b/libs/spandsp/tests/msvc/vector_float_tests.2012.vcxproj new file mode 100644 index 0000000000..ec6a2c3c7b --- /dev/null +++ b/libs/spandsp/tests/msvc/vector_float_tests.2012.vcxproj @@ -0,0 +1,109 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {EA745FF7-9E4B-4C13-BA19-2EE8165A6245} + vector_float_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + {1cbb0077-18c5-455f-801c-0a0ce7b0bbf5} + false + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/vector_float_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/vector_float_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..58d1fe1968 --- /dev/null +++ b/libs/spandsp/tests/msvc/vector_float_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/vector_float_tests.vcproj b/libs/spandsp/tests/msvc/vector_float_tests.vcproj deleted file mode 100644 index f97b0e7d6e..0000000000 --- a/libs/spandsp/tests/msvc/vector_float_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/spandsp/tests/msvc/vector_int_tests.2012.vcxproj b/libs/spandsp/tests/msvc/vector_int_tests.2012.vcxproj new file mode 100644 index 0000000000..41ca9c3fe0 --- /dev/null +++ b/libs/spandsp/tests/msvc/vector_int_tests.2012.vcxproj @@ -0,0 +1,109 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {80A60464-29E8-4EE8-BAFA-8708B7C08CC3} + vector_int_tests + Win32Proj + + + + Application + v110 + Unicode + true + + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.60610.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + Disabled + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + + + + MaxSpeed + .;..\..\src\spandsp;..\..\src;..\..\src\msvc;..;..\..\tiff-4.0.3\tiff-4.0.3\libtiff;%(AdditionalIncludeDirectories) + true + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + ..\..\src\Win32\Debug\libspandsp.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + + + + + + + + + {1cbb0077-18c5-455f-801c-0a0ce7b0bbf5} + false + + + + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/vector_int_tests.2012.vcxproj.filters b/libs/spandsp/tests/msvc/vector_int_tests.2012.vcxproj.filters new file mode 100644 index 0000000000..e933bb2770 --- /dev/null +++ b/libs/spandsp/tests/msvc/vector_int_tests.2012.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/libs/spandsp/tests/msvc/vector_int_tests.vcproj b/libs/spandsp/tests/msvc/vector_int_tests.vcproj deleted file mode 100644 index 78fc5a10b0..0000000000 --- a/libs/spandsp/tests/msvc/vector_int_tests.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From bfcd1e07caafe42662cbb6215b6e60c90dcc0764 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Mon, 21 Oct 2013 10:54:23 -0400 Subject: [PATCH 60/80] compile failure due to no newline at end of file --- libs/sofia-sip/libsofia-sip-ua/tport/ws.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c index a6b73406e4..41df93fdcf 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c @@ -812,4 +812,4 @@ int xp_is_blocking(int errcode) return errcode == EAGAIN || errcode == EWOULDBLOCK || errcode == EINPROGRESS || errcode == EINTR; } -#endif \ No newline at end of file +#endif From 3c2a5db225354e6873b1b5277d6638e425c1a51b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 21 Oct 2013 20:11:30 +0500 Subject: [PATCH 61/80] add missing protos --- libs/sofia-sip/.update | 2 +- libs/sofia-sip/libsofia-sip-ua/tport/ws.h | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index a528d9c447..241cdefa22 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Fri Oct 18 23:59:59 CDT 2013 +Mon Oct 21 20:11:13 CDT 2013 diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h index 8c0a50733e..992998be48 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h @@ -13,7 +13,6 @@ #include #else #pragma warning(disable:4996) -#include #endif #include #include @@ -27,7 +26,14 @@ #include #ifdef _MSC_VER -typedef intptr_t ssize_t; +#ifdef _WIN64 +#define WS_SSIZE_T __int64 +#elif _MSC_VER >= 1400 +#define WS_SSIZE_T __int32 __w64 +#else +#define WS_SSIZE_T __int32 +#endif +typedef WS_SSIZE_T ssize_t #endif @@ -90,10 +96,11 @@ ssize_t ws_close(wsh_t *wsh, int16_t reason); void ws_destroy(wsh_t *wsh); void init_ssl(void); void deinit_ssl(void); - int xp_errno(void); int xp_is_blocking(int errcode); + + #ifndef _MSC_VER static inline uint64_t get_unaligned_uint64(const void *p) { From e2bdd78d55ba1eab49a33a2788358b155b2c58c0 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 22 Oct 2013 20:33:13 +0500 Subject: [PATCH 62/80] FS-5896 --resolve --- libs/sofia-sip/.update | 2 +- libs/sofia-sip/libsofia-sip-ua/tport/tport.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 241cdefa22..07dc0cbaba 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Mon Oct 21 20:11:13 CDT 2013 +Tue Oct 22 20:32:55 CDT 2013 diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/tport.c b/libs/sofia-sip/libsofia-sip-ua/tport/tport.c index ccffb5e007..6105fadf71 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/tport.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/tport.c @@ -2620,6 +2620,8 @@ int tport_accept(tport_primary_t *pri, int events) SU_DEBUG_3(("%s(%p): incoming secondary on "TPN_FORMAT " failed. reason = %s\n", __func__, (void *)pri, TPN_ARGS(pri->pri_primary->tp_name), reason)); + shutdown(s, 2); + su_close(s); return 0; } else { From 73bbd83dc45048e57804d9a5e86d77212d5f3147 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 22 Oct 2013 20:49:44 +0500 Subject: [PATCH 63/80] FS-5900 --resolve wow, that's a good find --- src/switch_core_sqldb.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c index 7dd02df818..0b4d8b9ede 100644 --- a/src/switch_core_sqldb.c +++ b/src/switch_core_sqldb.c @@ -510,8 +510,6 @@ SWITCH_DECLARE(switch_status_t) _switch_cache_db_get_db_handle(switch_cache_db_h switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_DEBUG10, "Create Cached DB handle %s [%s] %s:%d\n", new_dbh->name, switch_cache_db_type_name(type), file, line); - new_dbh = create_handle(type); - if (db) { new_dbh->native_handle.core_db_dbh = db; } else if (odbc_dbh) { From e809b41dde54f00e40f080378eab32bae1e5a35f Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 22 Oct 2013 14:47:00 -0500 Subject: [PATCH 64/80] add in-memory use_count for fifo-events --- src/mod/applications/mod_fifo/mod_fifo.c | 130 ++++++++++++++++++++--- 1 file changed, 115 insertions(+), 15 deletions(-) diff --git a/src/mod/applications/mod_fifo/mod_fifo.c b/src/mod/applications/mod_fifo/mod_fifo.c index 886930f096..3c6bc7a169 100644 --- a/src/mod/applications/mod_fifo/mod_fifo.c +++ b/src/mod/applications/mod_fifo/mod_fifo.c @@ -576,6 +576,8 @@ static struct { switch_hash_t *caller_orig_hash; switch_hash_t *consumer_orig_hash; switch_hash_t *bridge_hash; + switch_hash_t *use_hash; + switch_mutex_t *use_mutex; switch_mutex_t *caller_orig_mutex; switch_mutex_t *consumer_orig_mutex; switch_mutex_t *bridge_mutex; @@ -604,6 +606,66 @@ static struct { +static int fifo_dec_use_count(const char *outbound_id) +{ + int r = 0, *count; + + + switch_mutex_lock(globals.use_mutex); + if ((count = (int *) switch_core_hash_find(globals.use_hash, outbound_id))) { + if (*count > 0) { + r = --(*count); + } + } + switch_mutex_unlock(globals.use_mutex); + + return r; +} + +static int fifo_get_use_count(const char *outbound_id) +{ + int r = 0, *count; + + switch_mutex_lock(globals.use_mutex); + if ((count = (int *) switch_core_hash_find(globals.use_hash, outbound_id))) { + r = *count; + } + switch_mutex_unlock(globals.use_mutex); + + return r; +} + + +static int fifo_inc_use_count(const char *outbound_id) +{ + int r = 0, *count; + + switch_mutex_lock(globals.use_mutex); + if (!(count = (int *) switch_core_hash_find(globals.use_hash, outbound_id))) { + count = switch_core_alloc(globals.pool, sizeof(int)); + switch_core_hash_insert(globals.use_hash, outbound_id, count); + } + + r = ++(*count); + + switch_mutex_unlock(globals.use_mutex); + + return r; +} + +static void fifo_init_use_count(void) +{ + switch_mutex_lock(globals.use_mutex); + if (globals.use_hash) { + switch_core_hash_destroy(&globals.use_hash); + } + switch_core_hash_init(&globals.use_hash, globals.pool); + switch_mutex_unlock(globals.use_mutex); +} + + + + static int check_caller_outbound_call(const char *key) { int x = 0; @@ -961,10 +1023,16 @@ static void do_unbridge(switch_core_session_t *consumer_session, switch_core_ses const char *epoch_start_a = NULL; char *sql; switch_event_t *event; + const char *outbound_id = NULL; + int use_count = 0; switch_channel_clear_app_flag_key(FIFO_APP_KEY, consumer_channel, FIFO_APP_BRIDGE_TAG); switch_channel_set_variable(consumer_channel, "fifo_bridged", NULL); + if ((outbound_id = switch_channel_get_variable(consumer_channel, "fifo_outbound_uuid"))) { + use_count = fifo_get_use_count(outbound_id); + } + ts = switch_micro_time_now(); switch_time_exp_lt(&tm, ts); switch_strftime_nocheck(date, &retsize, sizeof(date), "%Y-%m-%d %T", &tm); @@ -999,6 +1067,10 @@ static void do_unbridge(switch_core_session_t *consumer_session, switch_core_ses switch_channel_event_set_data(consumer_channel, event); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Name", MANUAL_QUEUE_NAME); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Action", "bridge-consumer-stop"); + if (use_count) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Outbound-ID", outbound_id); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Use-Count", "%d", use_count); + } switch_event_fire(&event); } @@ -1072,7 +1144,7 @@ static switch_status_t messagehook (switch_core_session_t *session, switch_core_ switch_time_t ts; switch_time_exp_t tm; switch_size_t retsize; - const char *ced_name, *ced_number, *cid_name, *cid_number; + const char *ced_name, *ced_number, *cid_name, *cid_number, *outbound_id; if (switch_channel_test_app_flag_key(FIFO_APP_KEY, consumer_channel, FIFO_APP_BRIDGE_TAG)) { goto end; @@ -1083,6 +1155,7 @@ static switch_status_t messagehook (switch_core_session_t *session, switch_core_ switch_channel_set_variable(consumer_channel, "fifo_bridged", "true"); switch_channel_set_variable(consumer_channel, "fifo_manual_bridge", "true"); switch_channel_set_variable(consumer_channel, "fifo_role", "consumer"); + outbound_id = switch_channel_get_variable(consumer_channel, "fifo_outbound_uuid"); if (caller_channel) { switch_channel_set_variable(caller_channel, "fifo_role", "caller"); @@ -1118,6 +1191,10 @@ static switch_status_t messagehook (switch_core_session_t *session, switch_core_ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Action", "bridge-consumer-start"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Caller-CID-Name", ced_name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Caller-CID-Number", ced_number); + if (outbound_id) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Outbound-ID", outbound_id); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Use-Count", "%d", fifo_get_use_count(outbound_id)); + } switch_event_fire(&event); } @@ -2144,7 +2221,7 @@ SWITCH_STANDARD_API(fifo_add_outbound_function) static void dec_use_count(switch_core_session_t *session, switch_bool_t send_event) { char *sql; - const char *outbound_id; + const char *outbound_id = NULL; switch_event_t *event; long now = (long) switch_epoch_time_now(NULL); switch_channel_t *channel = switch_core_session_get_channel(session); @@ -2162,6 +2239,7 @@ static void dec_use_count(switch_core_session_t *session, switch_bool_t send_eve sql = switch_mprintf("update fifo_outbound set use_count=use_count-1, stop_time=%ld, next_avail=%ld + lag + 1 where use_count > 0 and uuid='%q'", now, now, outbound_id); fifo_execute_sql_queued(&sql, SWITCH_TRUE, SWITCH_TRUE); + fifo_dec_use_count(outbound_id); } if (send_event) { @@ -2169,6 +2247,10 @@ static void dec_use_count(switch_core_session_t *session, switch_bool_t send_eve switch_channel_event_set_data(channel, event); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Name", MANUAL_QUEUE_NAME); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Action", "channel-consumer-stop"); + if (outbound_id) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Outbound-ID", outbound_id); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Use-Count", "%d", fifo_get_use_count(outbound_id)); + } switch_event_fire(&event); } } @@ -2229,7 +2311,7 @@ SWITCH_STANDARD_APP(fifo_track_call_function) sql = switch_mprintf("update fifo_outbound set stop_time=0,start_time=%ld,outbound_fail_count=0,use_count=use_count+1,%s=%s+1,%s=%s+1 where uuid='%q'", (long) switch_epoch_time_now(NULL), col1, col1, col2, col2, data); fifo_execute_sql_queued(&sql, SWITCH_TRUE, SWITCH_TRUE); - + fifo_inc_use_count(data); if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND) { cid_name = switch_channel_get_variable(channel, "destination_number"); @@ -2647,6 +2729,7 @@ SWITCH_STANDARD_APP(fifo_function) const char *url = NULL; const char *caller_uuid = NULL; const char *outbound_id = switch_channel_get_variable(channel, "fifo_outbound_uuid"); + //const char *track_use_count = switch_channel_get_variable(channel, "fifo_track_use_count"); //int do_track = switch_true(track_use_count); @@ -3051,18 +3134,6 @@ SWITCH_STANDARD_APP(fifo_function) switch_process_import(session, other_channel, "fifo_caller_consumer_import", switch_channel_get_variable(channel, "fifo_import_prefix")); switch_process_import(other_session, channel, "fifo_consumer_caller_import", switch_channel_get_variable(other_channel, "fifo_import_prefix")); - if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, FIFO_EVENT) == SWITCH_STATUS_SUCCESS) { - switch_channel_event_set_data(channel, event); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Name", argv[0]); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Action", "bridge-consumer-start"); - switch_event_fire(&event); - } - if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, FIFO_EVENT) == SWITCH_STATUS_SUCCESS) { - switch_channel_event_set_data(other_channel, event); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Name", argv[0]); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Action", "bridge-caller-start"); - switch_event_fire(&event); - } if (outbound_id) { cancel_consumer_outbound_call(outbound_id, SWITCH_CAUSE_ORIGINATOR_CANCEL); @@ -3073,8 +3144,29 @@ SWITCH_STANDARD_APP(fifo_function) fifo_execute_sql_queued(&sql, SWITCH_TRUE, SWITCH_TRUE); + fifo_inc_use_count(outbound_id); + } + if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, FIFO_EVENT) == SWITCH_STATUS_SUCCESS) { + switch_channel_event_set_data(channel, event); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Name", argv[0]); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Action", "bridge-consumer-start"); + if (outbound_id) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Outbound-ID", outbound_id); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Use-Count", "%d", fifo_get_use_count(outbound_id)); + } + + switch_event_fire(&event); + } + if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, FIFO_EVENT) == SWITCH_STATUS_SUCCESS) { + switch_channel_event_set_data(other_channel, event); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Name", argv[0]); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Action", "bridge-caller-start"); + switch_event_fire(&event); + } + + add_bridge_call(switch_core_session_get_uuid(other_session)); add_bridge_call(switch_core_session_get_uuid(session)); @@ -3125,6 +3217,7 @@ SWITCH_STANDARD_APP(fifo_function) fifo_execute_sql_queued(&sql, SWITCH_TRUE, SWITCH_TRUE); del_bridge_call(outbound_id); + fifo_dec_use_count(outbound_id); } @@ -3136,6 +3229,10 @@ SWITCH_STANDARD_APP(fifo_function) switch_channel_event_set_data(channel, event); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Name", argv[0]); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Action", "bridge-consumer-stop"); + if (outbound_id) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Outbound-ID", outbound_id); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "FIFO-Consumer-Use-Count", "%d", fifo_get_use_count(outbound_id)); + } switch_event_fire(&event); } if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, FIFO_EVENT) == SWITCH_STATUS_SUCCESS) { @@ -4129,6 +4226,7 @@ static switch_status_t load_config(int reload, int del_all) if (!reload) { char *sql= "update fifo_outbound set start_time=0,stop_time=0,ring_count=0,use_count=0,outbound_call_count=0,outbound_fail_count=0 where static=0"; fifo_execute_sql_queued(&sql, SWITCH_FALSE, SWITCH_TRUE); + fifo_init_use_count(); } if (reload) { @@ -4547,11 +4645,13 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_fifo_load) switch_core_hash_init(&globals.caller_orig_hash, globals.pool); switch_core_hash_init(&globals.consumer_orig_hash, globals.pool); switch_core_hash_init(&globals.bridge_hash, globals.pool); + switch_core_hash_init(&globals.use_hash, globals.pool); switch_mutex_init(&globals.caller_orig_mutex, SWITCH_MUTEX_NESTED, globals.pool); switch_mutex_init(&globals.consumer_orig_mutex, SWITCH_MUTEX_NESTED, globals.pool); switch_mutex_init(&globals.bridge_mutex, SWITCH_MUTEX_NESTED, globals.pool); switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, globals.pool); + switch_mutex_init(&globals.use_mutex, SWITCH_MUTEX_NESTED, globals.pool); switch_mutex_init(&globals.sql_mutex, SWITCH_MUTEX_NESTED, globals.pool); globals.running = 1; From 045b76406277132386ed37b7c4037b7ea2059a9e Mon Sep 17 00:00:00 2001 From: Brian West Date: Tue, 22 Oct 2013 15:44:50 -0500 Subject: [PATCH 65/80] Remove duplicated code --- src/mod/endpoints/mod_loopback/mod_loopback.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index ee354ad90b..aea8032433 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -488,7 +488,6 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session) { switch_channel_t *channel = NULL; loopback_private_t *tech_pvt = NULL; - void *pop; switch_event_t *vars; channel = switch_core_session_get_channel(session); @@ -516,10 +515,7 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session) switch_frame_free(&tech_pvt->write_frame); } - while (switch_queue_trypop(tech_pvt->frame_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) { - switch_frame_t *frame = (switch_frame_t *) pop; - switch_frame_free(&frame); - } + clear_queue(tech_pvt); } From 337000291315f47499d2b156ac2c41ad3397d6e4 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 Oct 2013 03:03:21 +0500 Subject: [PATCH 66/80] delete resources on csv mod shutdown --- .../event_handlers/mod_cdr_csv/mod_cdr_csv.c | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c b/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c index a268e8d158..4e6083086a 100644 --- a/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c +++ b/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c @@ -290,6 +290,26 @@ static void do_rotate_all() } +static void do_teardown() +{ + switch_hash_index_t *hi; + void *val; + cdr_fd_t *fd; + switch_mutex_lock(globals.mutex); + for (hi = switch_hash_first(NULL, globals.fd_hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, NULL, NULL, &val); + fd = (cdr_fd_t *) val; + switch_mutex_lock(fd->mutex); + if (fd->fd > -1) { + close(fd->fd); + fd->fd = -1; + } + switch_mutex_unlock(fd->mutex); + } + switch_mutex_unlock(globals.mutex); +} + + static void event_handler(switch_event_t *event) { const char *sig = switch_event_get_header(event, "Trapped-Signal"); @@ -445,6 +465,9 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_csv_shutdown) switch_event_unbind_callback(event_handler); switch_core_remove_state_handler(&state_handlers); + do_teardown(); + switch_core_hash_destroy(&globals.fd_hash); + switch_core_hash_destroy(&globals.template_hash); return SWITCH_STATUS_SUCCESS; } From 20a55d3cc63f509f2f0fa5c95a8d240aa7acecf6 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 22 Oct 2013 16:27:15 -0500 Subject: [PATCH 67/80] update --- libs/sofia-sip/.update | 2 +- libs/sofia-sip/libsofia-sip-ua/tport/tport.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 07dc0cbaba..5dc89e0a24 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Tue Oct 22 20:32:55 CDT 2013 +Tue Oct 22 16:25:25 CDT 2013 diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/tport.c b/libs/sofia-sip/libsofia-sip-ua/tport/tport.c index 6105fadf71..aa257f79f8 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/tport.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/tport.c @@ -903,7 +903,6 @@ tport_t *tport_alloc_secondary(tport_primary_t *pri, pri->pri_params->tpp_tos); } else { - su_close(socket); *return_reason = "malloc"; } From 88b2e96516db3203bd28e8d4a467347de4000e9e Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Tue, 22 Oct 2013 23:23:48 -0500 Subject: [PATCH 68/80] windows fix compiler errors --- libs/sofia-sip/libsofia-sip-ua/tport/ws.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h index 992998be48..7b02b47966 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h @@ -26,6 +26,8 @@ #include #ifdef _MSC_VER +#define strncasecmp _strnicmp +#define snprintf _snprintf #ifdef _WIN64 #define WS_SSIZE_T __int64 #elif _MSC_VER >= 1400 @@ -33,7 +35,7 @@ #else #define WS_SSIZE_T __int32 #endif -typedef WS_SSIZE_T ssize_t +typedef WS_SSIZE_T ssize_t; #endif From ba052c224c4f1757cda591f6a269264266283911 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 17 Oct 2013 00:40:18 +0000 Subject: [PATCH 69/80] Add option to use pkg-config rather than pg_config We shouldn't be using pg_config to get build options for FS from libpq. pg_config just tells us what was used to build postgresql, not what we should use. See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725007 Make this optional for now until we're comfortable it works everywhere. FS-5821 --resolve --- configure.in | 61 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/configure.in b/configure.in index 3fcea77267..88c56d1a41 100644 --- a/configure.in +++ b/configure.in @@ -418,32 +418,45 @@ SWITCH_AM_CFLAGS="$LIBUUID_CFLAGS $SWITCH_AM_CFLAGS" AC_ARG_ENABLE(core-pgsql-support, [AS_HELP_STRING([--enable-core-pgsql-support], [Compile with PGSQL Support])],,[enable_core_pgsql_support="no"]) +AC_ARG_ENABLE(core-pgsql-pkgconfig, + [AS_HELP_STRING([--enable-core-pgsql-pkgconfig], [Use pkg-config to get PGQSL build options])],,[enable_core_pgsql_pkgconfig="no"]) if test x"$enable_core_pgsql_support" = x"yes" ; then - -AC_PATH_PROG([PG_CONFIG], [pg_config], [no]) -if test "$PG_CONFIG" != "no"; then - AC_MSG_CHECKING([for PostgreSQL libraries]) - POSTGRESQL_CXXFLAGS="`$PG_CONFIG --cppflags` -I`$PG_CONFIG --includedir`" - POSTGRESQL_LDFLAGS="`$PG_CONFIG --ldflags|sed 's/ -Wl,--as-needed//g'` -L`$PG_CONFIG --libdir` -lpq" - POSTGRESQL_VERSION=`$PG_CONFIG --version | sed -e 's#PostgreSQL ##'` - POSTGRESQL_MAJOR_VERSION=`$PG_CONFIG --version | sed -e 's/devel//' | sed -re 's#PostgreSQL ([0-9]+).[0-9]+.?[0-9]+?#\1#'` - POSTGRESQL_MINOR_VERSION=`$PG_CONFIG --version | sed -e 's/devel//' | sed -re 's#PostgreSQL [0-9]+.([0-9]+).?[0-9]+?#\1#'` - POSTGRESQL_PATCH_VERSION=`$PG_CONFIG --version | sed -e 's/devel//' | sed -re 's#PostgreSQL [0-9]+.[0-9]+.?([0-9]+)?#\1#'` - AC_DEFINE([SWITCH_HAVE_PGSQL], [1], [Define to 1 if PostgreSQL libraries are available]) - AC_DEFINE_UNQUOTED([POSTGRESQL_VERSION], "${POSTGRESQL_VERSION}", [Specifies the version of PostgreSQL we are linking against]) - AC_DEFINE_UNQUOTED([POSTGRESQL_MAJOR_VERSION], ${POSTGRESQL_MAJOR_VERSION}, [Specifies the version of PostgreSQL we are linking against]) - AC_DEFINE_UNQUOTED([POSTGRESQL_MINOR_VERSION], ${POSTGRESQL_MINOR_VERSION}, [Specifies the version of PostgreSQL we are linking against]) - AC_DEFINE_UNQUOTED([POSTGRESQL_PATCH_VERSION], ${POSTGRESQL_PATCH_VERSION}, [Specifies the version of PostgreSQL we are linking against]) - AC_CHECK_LIB([pq], [PQgetvalue],, AC_MSG_ERROR([no usable libpq; please install PostgreSQL devel package or equivalent])) - AC_MSG_RESULT([yes]) - SWITCH_AM_CXXFLAGS="$POSTGRESQL_CXXFLAGS $SWITCH_AM_CXXFLAGS" - SWITCH_AM_LDFLAGS="$POSTGRESQL_LDFLAGS $SWITCH_AM_LDFLAGS" -else - AC_MSG_RESULT([no]) - AC_MSG_FAILURE([Unabled to find pg_config in PATH. Is PostgreSQL installed?]) -fi - + AC_PATH_PROG([PG_CONFIG], [pg_config], [no]) + AC_PATH_PROG([PKG_CONFIG], [pkg-config], [no]) + if test "$PG_CONFIG" = "no"; then + AC_MSG_RESULT([no]) + AC_MSG_FAILURE([Unabled to find pg_config in PATH. Is PostgreSQL installed?]) + else + if test "$PKG_CONFIG" = "no" \ + || test x"$enable_core_pgsql_pkgconfig" = x"no" \ + || ! pkg-config libpq; then + AC_MSG_CHECKING([for PostgreSQL libraries]) + POSTGRESQL_CXXFLAGS="`$PG_CONFIG --cppflags` -I`$PG_CONFIG --includedir`" + POSTGRESQL_LDFLAGS="`$PG_CONFIG --ldflags|sed 's/ -Wl,--as-needed//g'` -L`$PG_CONFIG --libdir` -lpq" + POSTGRESQL_VERSION=`$PG_CONFIG --version | sed -e 's#PostgreSQL ##'` + POSTGRESQL_MAJOR_VERSION=`$PG_CONFIG --version | sed -e 's/devel//' | sed -re 's#PostgreSQL ([0-9]+).[0-9]+.?[0-9]+?#\1#'` + POSTGRESQL_MINOR_VERSION=`$PG_CONFIG --version | sed -e 's/devel//' | sed -re 's#PostgreSQL [0-9]+.([0-9]+).?[0-9]+?#\1#'` + POSTGRESQL_PATCH_VERSION=`$PG_CONFIG --version | sed -e 's/devel//' | sed -re 's#PostgreSQL [0-9]+.[0-9]+.?([0-9]+)?#\1#'` + else + AC_MSG_CHECKING([for PostgreSQL libraries]) + POSTGRESQL_CXXFLAGS="`$PKG_CONFIG --cflags libpq`" + POSTGRESQL_LDFLAGS="`$PKG_CONFIG --libs libpq`" + POSTGRESQL_VERSION="`$PKG_CONFIG --modversion libpq`" + POSTGRESQL_MAJOR_VERSION="`echo $POSTGRESQL_VERSION | cut -d. -f1`" + POSTGRESQL_MINOR_VERSION="`echo $POSTGRESQL_VERSION | cut -d. -f2`" + POSTGRESQL_PATCH_VERSION="`echo $POSTGRESQL_VERSION | cut -d. -f3`" + fi + AC_DEFINE([SWITCH_HAVE_PGSQL], [1], [Define to 1 if PostgreSQL libraries are available]) + AC_DEFINE_UNQUOTED([POSTGRESQL_VERSION], "${POSTGRESQL_VERSION}", [Specifies the version of PostgreSQL we are linking against]) + AC_DEFINE_UNQUOTED([POSTGRESQL_MAJOR_VERSION], ${POSTGRESQL_MAJOR_VERSION}, [Specifies the version of PostgreSQL we are linking against]) + AC_DEFINE_UNQUOTED([POSTGRESQL_MINOR_VERSION], ${POSTGRESQL_MINOR_VERSION}, [Specifies the version of PostgreSQL we are linking against]) + AC_DEFINE_UNQUOTED([POSTGRESQL_PATCH_VERSION], ${POSTGRESQL_PATCH_VERSION}, [Specifies the version of PostgreSQL we are linking against]) + AC_CHECK_LIB([pq], [PQgetvalue],, AC_MSG_ERROR([no usable libpq; please install PostgreSQL devel package or equivalent])) + AC_MSG_RESULT([yes]) + SWITCH_AM_CXXFLAGS="$POSTGRESQL_CXXFLAGS $SWITCH_AM_CXXFLAGS" + SWITCH_AM_LDFLAGS="$POSTGRESQL_LDFLAGS $SWITCH_AM_LDFLAGS" + fi fi AC_ARG_ENABLE(deprecated-core-db-events, From 299081edf7b624c70f545d4c8e1d51c73895c4d8 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 17 Oct 2013 00:54:18 +0000 Subject: [PATCH 70/80] Use pkg-config for libpq by default FS-5821 --resolve --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 88c56d1a41..27f3645ff7 100644 --- a/configure.in +++ b/configure.in @@ -419,7 +419,7 @@ SWITCH_AM_CFLAGS="$LIBUUID_CFLAGS $SWITCH_AM_CFLAGS" AC_ARG_ENABLE(core-pgsql-support, [AS_HELP_STRING([--enable-core-pgsql-support], [Compile with PGSQL Support])],,[enable_core_pgsql_support="no"]) AC_ARG_ENABLE(core-pgsql-pkgconfig, - [AS_HELP_STRING([--enable-core-pgsql-pkgconfig], [Use pkg-config to get PGQSL build options])],,[enable_core_pgsql_pkgconfig="no"]) + [AS_HELP_STRING([--disable-core-pgsql-pkgconfig], [Use pg_config to get PGQSL build options])],[enable_core_pgsql_pkgconfig="$enableval"],[enable_core_pgsql_pkgconfig="yes"]) if test x"$enable_core_pgsql_support" = x"yes" ; then AC_PATH_PROG([PG_CONFIG], [pg_config], [no]) From 55c86bff80b265d320d687a3749c1075b3d40fcb Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 Oct 2013 16:39:20 -0500 Subject: [PATCH 71/80] use the actual_sps not the effective on codec load strings --- src/switch_loadable_module.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index c9fdda1da7..b4d26c2942 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -188,10 +188,18 @@ static switch_status_t switch_loadable_module_process(char *key, switch_loadable } if (load_interface) { for (impl = ptr->implementations; impl; impl = impl->next) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, - "Adding Codec %s %d %s %dhz %dms %dbps\n", - impl->iananame, impl->ianacode, - ptr->interface_name, impl->actual_samples_per_second, impl->microseconds_per_packet / 1000, impl->bits_per_second); + if (impl->bits_per_second) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, + "Adding Codec %s %d %s %dhz %dms %dbps\n", + impl->iananame, impl->ianacode, + ptr->interface_name, impl->actual_samples_per_second, + impl->microseconds_per_packet / 1000, impl->bits_per_second); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, + "Adding Codec %s %d %s %dhz %dms (VBR)\n", + impl->iananame, impl->ianacode, + ptr->interface_name, impl->actual_samples_per_second, impl->microseconds_per_packet / 1000); + } if (!switch_core_hash_find(loadable_modules.codec_hash, impl->iananame)) { switch_core_hash_insert(loadable_modules.codec_hash, impl->iananame, (const void *) ptr); } @@ -2308,7 +2316,7 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_ continue; } - if (((!rate && (uint32_t) imp->samples_per_second != default_rate) || (rate && (uint32_t) imp->samples_per_second != rate))) { + if (((!rate && (uint32_t) imp->actual_samples_per_second != default_rate) || (rate && (uint32_t) imp->actual_samples_per_second != rate))) { continue; } @@ -2332,7 +2340,7 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_ continue; } - if (rate && (uint32_t) imp->samples_per_second != rate) { + if (rate && (uint32_t) imp->actual_samples_per_second != rate) { continue; } From 8ab31493d7f680c5ca241559faecc327c2067508 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 Oct 2013 05:04:23 +0500 Subject: [PATCH 72/80] make exception for g722 --- src/switch_core_codec.c | 6 ++++-- src/switch_loadable_module.c | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/switch_core_codec.c b/src/switch_core_codec.c index bd3b521a98..db0db33cd5 100644 --- a/src/switch_core_codec.c +++ b/src/switch_core_codec.c @@ -655,7 +655,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_init_with_bitrate(switch_codec /* If no specific codec interval is requested opt for 20ms above all else because lots of stuff assumes it */ if (!ms) { for (iptr = codec_interface->implementations; iptr; iptr = iptr->next) { - if ((!rate || rate == iptr->samples_per_second) && (!bitrate || bitrate == (uint32_t)iptr->bits_per_second) && + uint32_t crate = !strcasecmp(codec_name, "g722") ? iptr->samples_per_second : iptr->actual_samples_per_second; + if ((!rate || rate == crate) && (!bitrate || bitrate == (uint32_t)iptr->bits_per_second) && (20 == (iptr->microseconds_per_packet / 1000)) && (!channels || channels == iptr->number_of_channels)) { implementation = iptr; goto found; @@ -665,7 +666,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_init_with_bitrate(switch_codec /* Either looking for a specific interval or there was no interval specified and there wasn't one @20ms available */ for (iptr = codec_interface->implementations; iptr; iptr = iptr->next) { - if ((!rate || rate == iptr->samples_per_second) && (!bitrate || bitrate == (uint32_t)iptr->bits_per_second) && + uint32_t crate = !strcasecmp(codec_name, "g722") ? iptr->samples_per_second : iptr->actual_samples_per_second; + if ((!rate || rate == crate) && (!bitrate || bitrate == (uint32_t)iptr->bits_per_second) && (!ms || ms == (iptr->microseconds_per_packet / 1000)) && (!channels || channels == iptr->number_of_channels)) { implementation = iptr; break; diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index b4d26c2942..df1e351bba 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -2310,13 +2310,14 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_ uint32_t default_rate = switch_default_rate(imp->iananame, imp->ianacode); if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO) { - + uint32_t crate = !strcasecmp(imp->iananame, "g722") ? imp->samples_per_second : imp->actual_samples_per_second; + if ((!interval && (uint32_t) (imp->microseconds_per_packet / 1000) != default_ptime) || (interval && (uint32_t) (imp->microseconds_per_packet / 1000) != interval)) { continue; } - if (((!rate && (uint32_t) imp->actual_samples_per_second != default_rate) || (rate && (uint32_t) imp->actual_samples_per_second != rate))) { + if (((!rate && crate != default_rate) || (rate && (uint32_t) imp->actual_samples_per_second != rate))) { continue; } @@ -2335,12 +2336,13 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_ /* Either looking for a specific interval or there was no interval specified and there wasn't one at the default ptime available */ for (imp = codec_interface->implementations; imp; imp = imp->next) { if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO) { + uint32_t crate = !strcasecmp(imp->iananame, "g722") ? imp->samples_per_second : imp->actual_samples_per_second; if (interval && (uint32_t) (imp->microseconds_per_packet / 1000) != interval) { continue; } - if (rate && (uint32_t) imp->actual_samples_per_second != rate) { + if (rate && (uint32_t) crate != rate) { continue; } From 916a75e9cf14642e9db42904398bbdd9477126fa Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 Oct 2013 20:45:29 -0500 Subject: [PATCH 73/80] device state tweaks --- src/include/switch_core.h | 22 ++++++++++ src/switch_channel.c | 89 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 106 insertions(+), 5 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 11340c211c..c203f84dbc 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -82,18 +82,33 @@ typedef struct device_uuid_node_s { switch_channel_callstate_t callstate; switch_hold_record_t *hold_record; switch_caller_profile_t *hup_profile; + switch_call_direction_t direction; struct switch_device_record_s *parent; struct device_uuid_node_s *next; } switch_device_node_t; typedef struct switch_device_stats_s { uint32_t total; + uint32_t total_in; + uint32_t total_out; uint32_t offhook; + uint32_t offhook_in; + uint32_t offhook_out; uint32_t active; + uint32_t active_in; + uint32_t active_out; uint32_t held; + uint32_t held_in; + uint32_t held_out; uint32_t hup; + uint32_t hup_in; + uint32_t hup_out; uint32_t ringing; + uint32_t ringing_in; + uint32_t ringing_out; uint32_t early; + uint32_t early_in; + uint32_t early_out; } switch_device_stats_t; @@ -102,15 +117,22 @@ typedef struct switch_device_record_s { char *uuid; int refs; switch_device_stats_t stats; + switch_device_stats_t last_stats; switch_device_state_t state; switch_device_state_t last_state; switch_time_t active_start; switch_time_t active_stop; switch_time_t last_call_time; + switch_time_t ring_start; + switch_time_t ring_stop; + switch_time_t hold_start; + switch_time_t hold_stop; + switch_time_t call_start; struct device_uuid_node_s *uuid_list; struct device_uuid_node_s *uuid_tail; switch_mutex_t *mutex; switch_memory_pool_t *pool; + void *user_data; } switch_device_record_t; typedef void(*switch_device_state_function_t)(switch_core_session_t *session, switch_channel_callstate_t callstate, switch_device_record_t *drec); diff --git a/src/switch_channel.c b/src/switch_channel.c index 4bc93573a6..24c8e03489 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -277,7 +277,11 @@ SWITCH_DECLARE(void) switch_channel_perform_set_callstate(switch_channel_t *chan switch_channel_callstate2str(o_callstate), switch_channel_callstate2str(callstate)); switch_channel_check_device_state(channel, channel->callstate); - + + if (callstate == CCS_HANGUP) { + process_device_hup(channel); + } + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_CALLSTATE) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Original-Channel-Call-State", switch_channel_callstate2str(o_callstate)); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Channel-Call-State-Number", "%d", callstate); @@ -3137,8 +3141,6 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_hangup(switch_chan channel->state = CS_HANGUP; switch_mutex_unlock(channel->state_mutex); - process_device_hup(channel); - channel->hangup_cause = hangup_cause; switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, switch_channel_get_uuid(channel), SWITCH_LOG_NOTICE, "Hangup %s [%s] [%s]\n", channel->name, state_names[last_state], switch_channel_cause2str(channel->hangup_cause)); @@ -4664,28 +4666,64 @@ static void fetch_device_stats(switch_device_record_t *drec) { switch_device_node_t *np; + memset(&drec->stats, 0, sizeof(switch_device_stats_t)); switch_mutex_lock(drec->mutex); for(np = drec->uuid_list; np; np = np->next) { drec->stats.total++; + if (np->direction == SWITCH_CALL_DIRECTION_INBOUND) { + drec->stats.total_in++; + } else { + drec->stats.total_out++; + } if (!np->hup_profile) { drec->stats.offhook++; + if (np->direction == SWITCH_CALL_DIRECTION_INBOUND) { + drec->stats.offhook_in++; + } else { + drec->stats.offhook_out++; + } if (np->callstate == CCS_HELD) { drec->stats.held++; + if (np->direction == SWITCH_CALL_DIRECTION_INBOUND) { + drec->stats.held_in++; + } else { + drec->stats.held_out++; + } } else { if (np->callstate == CCS_EARLY) { drec->stats.early++; + if (np->direction == SWITCH_CALL_DIRECTION_INBOUND) { + drec->stats.early_in++; + } else { + drec->stats.early_out++; + } } else if (np->callstate == CCS_RINGING) { drec->stats.ringing++; + if (np->direction == SWITCH_CALL_DIRECTION_INBOUND) { + drec->stats.ringing_in++; + } else { + drec->stats.ringing_out++; + } } else if (np->callstate != CCS_DOWN) { drec->stats.active++; + if (np->direction == SWITCH_CALL_DIRECTION_INBOUND) { + drec->stats.active_in++; + } else { + drec->stats.active_out++; + } } } } else { drec->stats.hup++; + if (np->direction == SWITCH_CALL_DIRECTION_INBOUND) { + drec->stats.hup_in++; + } else { + drec->stats.hup_out++; + } } } switch_mutex_unlock(drec->mutex); @@ -4826,7 +4864,7 @@ static void switch_channel_check_device_state(switch_channel_t *channel, switch_ drec->state = SDS_HANGUP; } else { if (drec->stats.active == 0) { - if ((drec->stats.ringing + drec->stats.early) > 0) { + if ((drec->stats.ringing_out + drec->stats.early_out) > 0) { drec->state = SDS_RINGING; } else { if (drec->stats.held > 0) { @@ -4848,7 +4886,15 @@ static void switch_channel_check_device_state(switch_channel_t *channel, switch_ return; } + if (!drec->call_start) { + drec->call_start = switch_micro_time_now(); + } + switch(drec->state) { + case SDS_RINGING: + drec->ring_start = switch_micro_time_now(); + drec->ring_stop = 0; + break; case SDS_ACTIVE: case SDS_ACTIVE_MULTI: if (drec->last_state != SDS_HELD && drec->active_start) { @@ -4857,6 +4903,9 @@ static void switch_channel_check_device_state(switch_channel_t *channel, switch_ drec->active_start = switch_micro_time_now(); } break; + case SDS_HELD: + drec->hold_start = switch_micro_time_now(); + drec->hold_stop = 0; default: if (drec->last_state != SDS_HELD) { drec->active_stop = switch_micro_time_now(); @@ -4864,6 +4913,15 @@ static void switch_channel_check_device_state(switch_channel_t *channel, switch_ break; } + if (drec->ring_start && !drec->ring_stop && drec->state != SDS_RINGING) { + drec->ring_stop = switch_micro_time_now(); + } + + if (drec->hold_start && !drec->hold_stop && drec->state != SDS_HELD) { + drec->hold_stop = switch_micro_time_now(); + } + + if (switch_event_create(&event, SWITCH_EVENT_DEVICE_STATE) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Device-ID", drec->device_id); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Last-Device-State", switch_channel_device_state2str(drec->last_state)); @@ -4884,7 +4942,8 @@ static void switch_channel_check_device_state(switch_channel_t *channel, switch_ } switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG1, - "%s device: %s\nState: %s Dev State: %s/%s Total:%u Offhook:%u Ringing:%u Early:%u Active:%u Held:%u Hungup:%u Dur: %u %s\n", + "%s device: %s\nState: %s Dev State: %s/%s Total:%u Offhook:%u " + "Ringing:%u Early:%u Active:%u Held:%u Hungup:%u Dur: %u Ringtime: %u Holdtime: %u %s\n", switch_channel_get_name(channel), drec->device_id, switch_channel_callstate2str(callstate), @@ -4898,12 +4957,16 @@ static void switch_channel_check_device_state(switch_channel_t *channel, switch_ drec->stats.held, drec->stats.hup, drec->active_stop ? (uint32_t)(drec->active_stop - drec->active_start) / 1000 : 0, + drec->ring_stop ? (uint32_t)(drec->ring_stop - drec->ring_start) / 1000 : 0, + drec->hold_stop ? (uint32_t)(drec->hold_stop - drec->hold_start) / 1000 : 0, switch_channel_test_flag(channel, CF_FINAL_DEVICE_LEG) ? "FINAL LEG" : ""); for (ptr = globals.device_bindings; ptr; ptr = ptr->next) { ptr->function(channel->session, callstate, drec); } + drec->last_stats = drec->stats; + if (drec->active_stop) { drec->active_start = drec->active_stop = 0; if (drec->state == SDS_ACTIVE || drec->state == SDS_ACTIVE_MULTI) { @@ -4911,6 +4974,20 @@ static void switch_channel_check_device_state(switch_channel_t *channel, switch_ } } + if (drec->hold_stop) { + drec->hold_start = drec->hold_stop = 0; + if (drec->state == SDS_HELD) { + drec->hold_start = switch_micro_time_now(); + } + } + + if (drec->ring_stop) { + drec->ring_start = drec->ring_stop = 0; + if (drec->state == SDS_RINGING) { + drec->ring_start = switch_micro_time_now(); + } + } + drec->last_call_time = switch_micro_time_now(); drec->last_state = drec->state; @@ -4938,6 +5015,8 @@ static void add_uuid(switch_device_record_t *drec, switch_channel_t *channel) node->uuid = switch_core_strdup(drec->pool, switch_core_session_get_uuid(channel->session)); node->parent = drec; node->callstate = channel->callstate; + node->direction = channel->direction == SWITCH_CALL_DIRECTION_INBOUND ? SWITCH_CALL_DIRECTION_OUTBOUND : SWITCH_CALL_DIRECTION_INBOUND; + channel->device_node = node; if (!drec->uuid_list) { From a4a89487749060b43b484ce47dfffbf23dcd2c4f Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 Oct 2013 23:09:14 -0500 Subject: [PATCH 74/80] tweak to devstate --- src/switch_channel.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/switch_channel.c b/src/switch_channel.c index 24c8e03489..a2c87414dd 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -4708,6 +4708,13 @@ static void fetch_device_stats(switch_device_record_t *drec) } else { drec->stats.ringing_out++; } + } else if (np->callstate == CCS_HANGUP) { + drec->stats.hup++; + if (np->direction == SWITCH_CALL_DIRECTION_INBOUND) { + drec->stats.hup_in++; + } else { + drec->stats.hup_out++; + } } else if (np->callstate != CCS_DOWN) { drec->stats.active++; if (np->direction == SWITCH_CALL_DIRECTION_INBOUND) { From e659814a8423ba188f403207636e949497aa5230 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 Oct 2013 23:21:31 -0500 Subject: [PATCH 75/80] missed a spot --- src/switch_channel.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/switch_channel.c b/src/switch_channel.c index a2c87414dd..e96bbc78d7 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -4904,7 +4904,7 @@ static void switch_channel_check_device_state(switch_channel_t *channel, switch_ break; case SDS_ACTIVE: case SDS_ACTIVE_MULTI: - if (drec->last_state != SDS_HELD && drec->active_start) { + if (drec->active_start && drec->last_state != SDS_HELD) { drec->active_stop = switch_micro_time_now(); } else if (!drec->active_start) { drec->active_start = switch_micro_time_now(); @@ -4914,7 +4914,7 @@ static void switch_channel_check_device_state(switch_channel_t *channel, switch_ drec->hold_start = switch_micro_time_now(); drec->hold_stop = 0; default: - if (drec->last_state != SDS_HELD) { + if (drec->active_start && drec->last_state != SDS_HELD) { drec->active_stop = switch_micro_time_now(); } break; From 6b2c9e4478c973f9c2e558e079117b6a10f39c7a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 Oct 2013 01:23:18 -0500 Subject: [PATCH 76/80] change codec negotiation for edge opus cases --- src/switch_core_media.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 322d4a63da..8643a1d693 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -73,6 +73,7 @@ typedef struct codec_params_s { char *iananame; switch_payload_t pt; unsigned long rm_rate; + unsigned long adv_rm_rate; uint32_t codec_ms; uint32_t bitrate; @@ -1436,6 +1437,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_read_frame(switch_core_session engine->codec_params.rm_encoding = switch_core_session_strdup(smh->session, imp->iananame); engine->codec_params.rm_fmtp = NULL; engine->codec_params.rm_rate = imp->samples_per_second; + engine->codec_params.adv_rm_rate = imp->samples_per_second; + if (strcasecmp(imp->iananame, "g722")) { + engine->codec_params.rm_rate = imp->actual_samples_per_second; + } engine->codec_params.codec_ms = imp->microseconds_per_packet / 1000; engine->codec_params.bitrate = imp->bits_per_second; engine->codec_params.channels = 1; @@ -2983,6 +2988,8 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s const switch_codec_implementation_t *imp = codec_array[i]; uint32_t bit_rate = imp->bits_per_second; uint32_t codec_rate = imp->samples_per_second; + char *samp = NULL; + if (imp->codec_type != SWITCH_CODEC_TYPE_AUDIO) { continue; } @@ -3009,6 +3016,21 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s match = 0; } + if (!zstr(map->rm_fmtp)) { + samp = strstr(map->rm_fmtp, "samplerate="); + } + if (!strcasecmp(map->rm_encoding, "opus") && !strcasecmp(rm_encoding, imp->iananame) && samp) { + char *rate_str = samp + 11; + + if (rate_str && *rate_str) { + near_rate = atoi(rate_str); + near_match = imp; + near_map = mmap = map; + match = 0; + goto near_match; + } + } + if (match) { if (scrooge) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, @@ -3087,6 +3109,10 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s a_engine->codec_params.iananame = switch_core_session_strdup(session, (char *) mimp->iananame); a_engine->codec_params.pt = (switch_payload_t) mmap->rm_pt; a_engine->codec_params.rm_rate = mimp->samples_per_second; + a_engine->codec_params.adv_rm_rate = mimp->samples_per_second; + if (strcasecmp(mimp->iananame, "g722")) { + a_engine->codec_params.rm_rate = mimp->actual_samples_per_second; + } a_engine->codec_params.codec_ms = mimp->microseconds_per_packet / 1000; a_engine->codec_params.bitrate = mimp->bits_per_second; a_engine->codec_params.channels = mmap->rm_params ? atoi(mmap->rm_params) : 1; @@ -5644,7 +5670,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "\n"); - rate = a_engine->codec_params.rm_rate; + rate = a_engine->codec_params.adv_rm_rate; //if (!strcasecmp(a_engine->codec_params.rm_encoding, "opus")) { // a_engine->codec_params.adv_channels = 2; @@ -6439,6 +6465,7 @@ SWITCH_DECLARE(void) switch_core_media_patch_sdp(switch_core_session_t *session) } a_engine->codec_params.iananame = switch_core_session_strdup(session, "PROXY"); a_engine->codec_params.rm_rate = 8000; + a_engine->codec_params.adv_rm_rate = 8000; a_engine->codec_params.codec_ms = 20; } @@ -6584,6 +6611,7 @@ SWITCH_DECLARE(void) switch_core_media_patch_sdp(switch_core_session_t *session) switch_core_media_choose_port(session, SWITCH_MEDIA_TYPE_VIDEO, 1); v_engine->codec_params.rm_encoding = "PROXY-VID"; v_engine->codec_params.rm_rate = 90000; + v_engine->codec_params.adv_rm_rate = 90000; v_engine->codec_params.codec_ms = 0; switch_snprintf(vport_buf, sizeof(vport_buf), "%u", v_engine->codec_params.adv_sdp_port); if (switch_channel_media_ready(session->channel) && !switch_rtp_ready(v_engine->rtp_session)) { @@ -7686,6 +7714,7 @@ SWITCH_DECLARE(void) switch_core_media_check_outgoing_proxy(switch_core_session_ a_engine->codec_params.iananame = switch_core_session_strdup(session, "PROXY"); a_engine->codec_params.rm_rate = 8000; + a_engine->codec_params.adv_rm_rate = 8000; a_engine->codec_params.codec_ms = 20; @@ -7693,6 +7722,7 @@ SWITCH_DECLARE(void) switch_core_media_check_outgoing_proxy(switch_core_session_ switch_core_media_choose_port(session, SWITCH_MEDIA_TYPE_VIDEO, 1); v_engine->codec_params.rm_encoding = "PROXY-VID"; v_engine->codec_params.rm_rate = 90000; + v_engine->codec_params.adv_rm_rate = 90000; v_engine->codec_params.codec_ms = 0; switch_channel_set_flag(session->channel, CF_VIDEO); switch_channel_set_flag(session->channel, CF_VIDEO_POSSIBLE); @@ -7764,6 +7794,7 @@ SWITCH_DECLARE(void) switch_core_media_proxy_codec(switch_core_session_t *sessio for (map = m->m_rtpmaps; map; map = map->rm_next) { a_engine->codec_params.iananame = switch_core_session_strdup(session, map->rm_encoding); a_engine->codec_params.rm_rate = map->rm_rate; + a_engine->codec_params.adv_rm_rate = map->rm_rate; a_engine->codec_params.codec_ms = ptime; switch_core_media_set_codec(session, 0, smh->mparams->codec_flags); break; @@ -7841,6 +7872,7 @@ SWITCH_DECLARE (void) switch_core_media_recover_session(switch_core_session_t *s if ((tmp = switch_channel_get_variable(session->channel, "rtp_use_codec_rate"))) { a_engine->codec_params.rm_rate = atoi(tmp); + a_engine->codec_params.adv_rm_rate = a_engine->codec_params.rm_rate; } if ((tmp = switch_channel_get_variable(session->channel, "rtp_use_codec_ptime"))) { @@ -7895,6 +7927,7 @@ SWITCH_DECLARE (void) switch_core_media_recover_session(switch_core_session_t *s if ((tmp = switch_channel_get_variable(session->channel, "rtp_use_video_codec_rate"))) { v_engine->codec_params.rm_rate = atoi(tmp); + v_engine->codec_params.adv_rm_rate = v_engine->codec_params.rm_rate; } if ((tmp = switch_channel_get_variable(session->channel, "rtp_use_video_codec_ptime"))) { From daee478115dd952a0aeff00bfab8804091e22fd2 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 Oct 2013 23:55:07 +0500 Subject: [PATCH 77/80] tweak api --- src/switch_core_session.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/switch_core_session.c b/src/switch_core_session.c index a08b548fee..63aab9d583 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -264,12 +264,14 @@ SWITCH_DECLARE(switch_console_callback_match_t *) switch_core_session_findall_ma switch_memory_pool_t *pool; struct str_node *head = NULL, *np; switch_console_callback_match_t *my_matches = NULL; + const char *like = NULL; + + if (var_val && *var_val == '~') { + like = var_val + 1; + } switch_core_new_memory_pool(&pool); - if (!var_val) - return NULL; - switch_mutex_lock(runtime.session_hash_mutex); for (hi = switch_hash_first(NULL, session_manager.session_table); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, NULL, NULL, &val); @@ -290,7 +292,8 @@ SWITCH_DECLARE(switch_console_callback_match_t *) switch_core_session_findall_ma if ((session = switch_core_session_locate(np->str))) { const char *this_val; if (switch_channel_up_nosig(session->channel) && - (this_val = switch_channel_get_variable_dup(session->channel, var_name, SWITCH_FALSE, -1)) && (!strcmp(this_val, var_val))) { + (this_val = switch_channel_get_variable_dup(session->channel, var_name, SWITCH_FALSE, -1)) && + (!var_val || (like && switch_stristr(like, var_val)) || !strcmp(this_val, var_val))) { switch_console_push_match(&my_matches, (const char *) np->str); } switch_core_session_rwunlock(session); From 328997fb77c5b4a294313a45d697df7032e3eb87 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 Oct 2013 23:56:02 +0500 Subject: [PATCH 78/80] examples of new json api interface --- .../applications/mod_commands/mod_commands.c | 257 ++++++++++++++++++ 1 file changed, 257 insertions(+) diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 3f561ba386..2e4259817a 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -6085,9 +6085,257 @@ end: return SWITCH_STATUS_SUCCESS; } +SWITCH_STANDARD_JSON_API(json_channel_data_function) +{ + cJSON *reply, *data = cJSON_GetObjectItem(json, "data"); + switch_status_t status = SWITCH_STATUS_FALSE; + const char *uuid = cJSON_GetObjectCstr(data, "uuid"); + switch_core_session_t *tsession; + + + reply = cJSON_CreateObject(); + *json_reply = reply; + + if (zstr(uuid)) { + cJSON_AddItemToObject(reply, "response", cJSON_CreateString("INVALID INPUT")); + goto end; + } + + + if ((tsession = switch_core_session_locate(uuid))) { + cJSON *jevent; + + if (switch_ivr_generate_json_cdr(tsession, &jevent, SWITCH_FALSE) == SWITCH_STATUS_SUCCESS) { + cJSON_AddItemToObject(reply, "channelData", jevent); + } + + switch_core_session_rwunlock(tsession); + + status = SWITCH_STATUS_SUCCESS; + } else { + cJSON_AddItemToObject(reply, "response", cJSON_CreateString("Session does not exist")); + goto end; + } + + end: + + return status; +} + +SWITCH_STANDARD_JSON_API(json_execute_function) +{ + cJSON *reply, *data = cJSON_GetObjectItem(json, "data"); + switch_status_t status = SWITCH_STATUS_FALSE; + const char *uuid = cJSON_GetObjectCstr(data, "uuid"); + const char *app = cJSON_GetObjectCstr(data, "app"); + const char *arg = cJSON_GetObjectCstr(data, "arg"); + const char *einline = cJSON_GetObjectCstr(data, "inline"); + const char *edata = cJSON_GetObjectCstr(data, "extendedData"); + switch_core_session_t *tsession; + + + reply = cJSON_CreateObject(); + *json_reply = reply; + + if (!(uuid && app)) { + cJSON_AddItemToObject(reply, "response", cJSON_CreateString("INVALID INPUT")); + goto end; + } + + + if ((tsession = switch_core_session_locate(uuid))) { + if (switch_true(edata)) { + cJSON *jevent = NULL; + + if (switch_ivr_generate_json_cdr(tsession, &jevent, SWITCH_FALSE) == SWITCH_STATUS_SUCCESS) { + cJSON_AddItemToObject(reply, "channelData", jevent); + } + } else { + cJSON_AddItemToObject(reply, "channelName", cJSON_CreateString(switch_core_session_get_name(tsession))); + } + + if (switch_true(einline)) { + switch_core_session_execute_application(tsession, app, arg); + } else { + switch_core_session_execute_application_async(tsession, app, arg); + } + status = SWITCH_STATUS_SUCCESS; + + switch_core_session_rwunlock(tsession); + + } else { + cJSON_AddItemToObject(reply, "response", cJSON_CreateString("Session does not exist")); + goto end; + } + + + end: + + return status; +} + +SWITCH_STANDARD_JSON_API(json_api_function) +{ + cJSON *data, *cmd, *arg, *reply; + switch_stream_handle_t stream = { 0 }; + switch_status_t status = SWITCH_STATUS_SUCCESS; + + data = cJSON_GetObjectItem(json, "data"); + + cmd = cJSON_GetObjectItem(data, "cmd"); + arg = cJSON_GetObjectItem(data, "arg"); + + if (cmd && !cmd->valuestring) { + cmd = NULL; + } + + if (arg && !arg->valuestring) { + arg = NULL; + } + + reply = cJSON_CreateObject(); + + SWITCH_STANDARD_STREAM(stream); + + if (cmd && (status = switch_api_execute(cmd->valuestring, arg ? arg->valuestring : NULL, session, &stream)) == SWITCH_STATUS_SUCCESS) { + cJSON_AddItemToObject(reply, "message", cJSON_CreateString((char *) stream.data)); + } else { + cJSON_AddItemToObject(reply, "message", cJSON_CreateString("INVALID CALL")); + } + + switch_safe_free(stream.data); + + *json_reply = reply; + + return status; + +} + +#include +SWITCH_STANDARD_JSON_API(json_status_function) +{ + cJSON *o, *oo, *reply = cJSON_CreateObject(); + switch_core_time_duration_t duration = { 0 }; + int sps = 0, last_sps = 0, max_sps = 0, max_sps_fivemin = 0; + int sessions_peak = 0, sessions_peak_fivemin = 0; /* Max Concurrent Sessions buffers */ + switch_size_t cur = 0, max = 0; + + switch_core_measure_time(switch_core_uptime(), &duration); + + switch_core_session_ctl(SCSC_SESSIONS_PEAK, &sessions_peak); + switch_core_session_ctl(SCSC_SESSIONS_PEAK_FIVEMIN, &sessions_peak_fivemin); + switch_core_session_ctl(SCSC_LAST_SPS, &last_sps); + switch_core_session_ctl(SCSC_SPS, &sps); + switch_core_session_ctl(SCSC_SPS_PEAK, &max_sps); + switch_core_session_ctl(SCSC_SPS_PEAK_FIVEMIN, &max_sps_fivemin); + + cJSON_AddItemToObject(reply, "systemStatus", cJSON_CreateString(switch_core_ready() ? "ready" : "not ready")); + + o = cJSON_CreateObject(); + cJSON_AddItemToObject(o, "years", cJSON_CreateNumber(duration.yr)); + cJSON_AddItemToObject(o, "days", cJSON_CreateNumber(duration.day)); + cJSON_AddItemToObject(o, "hours", cJSON_CreateNumber(duration.hr)); + cJSON_AddItemToObject(o, "minutes", cJSON_CreateNumber(duration.min)); + cJSON_AddItemToObject(o, "seconds", cJSON_CreateNumber(duration.sec)); + cJSON_AddItemToObject(o, "milliseconds", cJSON_CreateNumber(duration.ms)); + cJSON_AddItemToObject(o, "microseconds", cJSON_CreateNumber(duration.mms)); + + cJSON_AddItemToObject(reply, "uptime", o); + cJSON_AddItemToObject(reply, "version", cJSON_CreateString(SWITCH_VERSION_FULL_HUMAN)); + + o = cJSON_CreateObject(); + cJSON_AddItemToObject(reply, "sessions", o); + + oo = cJSON_CreateObject(); + cJSON_AddItemToObject(o, "count", oo); + + cJSON_AddItemToObject(oo, "total", cJSON_CreateNumber(switch_core_session_id() - 1)); + cJSON_AddItemToObject(oo, "active", cJSON_CreateNumber(switch_core_session_count())); + cJSON_AddItemToObject(oo, "peak", cJSON_CreateNumber(sessions_peak)); + cJSON_AddItemToObject(oo, "peak5Min", cJSON_CreateNumber(sessions_peak_fivemin)); + cJSON_AddItemToObject(oo, "limit", cJSON_CreateNumber(switch_core_session_limit(0))); + + + + oo = cJSON_CreateObject(); + cJSON_AddItemToObject(o, "rate", oo); + cJSON_AddItemToObject(oo, "current", cJSON_CreateNumber(last_sps)); + cJSON_AddItemToObject(oo, "max", cJSON_CreateNumber(sps)); + cJSON_AddItemToObject(oo, "peak", cJSON_CreateNumber(max_sps)); + cJSON_AddItemToObject(oo, "peak5Min", cJSON_CreateNumber(max_sps_fivemin)); + + + o = cJSON_CreateObject(); + cJSON_AddItemToObject(reply, "idleCPU", o); + + cJSON_AddItemToObject(o, "used", cJSON_CreateNumber(switch_core_min_idle_cpu(-1.0))); + cJSON_AddItemToObject(o, "allowed", cJSON_CreateNumber(switch_core_idle_cpu())); + + + if (switch_core_get_stacksizes(&cur, &max) == SWITCH_STATUS_SUCCESS) { + o = cJSON_CreateObject(); + cJSON_AddItemToObject(reply, "stackSizeKB", o); + + cJSON_AddItemToObject(o, "current", cJSON_CreateNumber(cur / 1024)); + cJSON_AddItemToObject(o, "max", cJSON_CreateNumber(max / 1024)); + } + + + *json_reply = reply; + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_STANDARD_API(json_function) +{ + cJSON *jcmd = NULL, *format = NULL; + const char *message = ""; + char *response = NULL; + + if (zstr(cmd)) { + message = "No JSON supplied."; + goto err; + } + + jcmd = cJSON_Parse(cmd); + + if (!jcmd) { + message = "Parse error."; + goto err; + } + + format = cJSON_GetObjectItem(jcmd, "format"); + + switch_json_api_execute(jcmd, session, NULL); + + + if (format && format->valuestring && !strcasecmp(format->valuestring, "pretty")) { + response = cJSON_Print(jcmd); + } else { + response = cJSON_PrintUnformatted(jcmd); + } + + stream->write_function(stream, "%s\n", switch_str_nil(response)); + + switch_safe_free(response); + + cJSON_Delete(jcmd); + + return SWITCH_STATUS_SUCCESS; + + err: + + stream->write_function(stream, "-ERR %s\n", message); + + + return SWITCH_STATUS_SUCCESS; +} + SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load) { switch_api_interface_t *commands_api_interface; + switch_json_api_interface_t *json_api_interface; + *module_interface = switch_loadable_module_create_module_interface(pool, modname); switch_thread_rwlock_create(&bgapi_rwlock, pool); @@ -6219,6 +6467,15 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load) SWITCH_ADD_API(commands_api_interface, "xml_locate", "Find some xml", xml_locate_function, "[root |
]"); SWITCH_ADD_API(commands_api_interface, "xml_wrap", "Wrap another api command in xml", xml_wrap_api_function, " "); SWITCH_ADD_API(commands_api_interface, "file_exists", "Check if a file exists on server", file_exists_function, ""); + SWITCH_ADD_API(commands_api_interface, "json", "JSON API", json_function, "JSON"); + + + SWITCH_ADD_JSON_API(json_api_interface, "status", "JSON status API", json_status_function, ""); + SWITCH_ADD_JSON_API(json_api_interface, "fsapi", "JSON FSAPI Gateway", json_api_function, ""); + SWITCH_ADD_JSON_API(json_api_interface, "execute", "JSON session execute application", json_execute_function, ""); + SWITCH_ADD_JSON_API(json_api_interface, "channelData", "JSON channel data application", json_channel_data_function, ""); + + switch_console_set_complete("add alias add"); switch_console_set_complete("add alias del"); From 3089eee77ccda7b5fa9ab6cc699caf2d1575445f Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 Oct 2013 23:59:41 +0500 Subject: [PATCH 79/80] minor refactor --- .../mod_conference/mod_conference.c | 436 +++++++++++++++++- 1 file changed, 431 insertions(+), 5 deletions(-) diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index a847fb4ea2..863e4c727b 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -100,6 +100,7 @@ static struct { uint32_t id_pool; int32_t running; uint32_t threads; + switch_event_channel_id_t event_channel_id; } globals; /* forward declaration for conference_obj and caller_control */ @@ -115,6 +116,7 @@ typedef struct conference_cdr_node_s { uint32_t flags; uint32_t id; conference_member_t *member; + switch_event_t *var_event; struct conference_cdr_node_s *next; } conference_cdr_node_t; @@ -204,7 +206,9 @@ typedef enum { CFLAG_ENDCONF_FORCED = (1 << 16), CFLAG_RFC4579 = (1 << 17), CFLAG_FLOOR_CHANGE = (1 << 18), - CFLAG_VID_FLOOR_LOCK = (1 << 19) + CFLAG_VID_FLOOR_LOCK = (1 << 19), + CFLAG_JSON_EVENTS = (1 << 20), + CFLAG_LIVEARRAY_SYNC = (1 << 21) } conf_flag_t; typedef enum { @@ -300,6 +304,8 @@ typedef struct conference_record { /* Conference Object */ typedef struct conference_obj { char *name; + char *la_name; + char *la_event_channel; char *desc; char *timer_name; char *tts_engine; @@ -338,6 +344,7 @@ typedef struct conference_obj { char *domain; char *caller_controls; char *moderator_controls; + switch_live_array_t *la; uint32_t flags; member_flag_t mflags; switch_call_cause_t bridge_hangup_cause; @@ -466,6 +473,8 @@ struct conference_member { char *kicked_sound; switch_queue_t *dtmf_queue; switch_thread_t *input_thread; + cJSON *json; + cJSON *status_field; }; typedef enum { @@ -564,6 +573,9 @@ static switch_status_t conf_api_sub_clear_vid_floor(conference_obj_t *conference static void conference_cdr_del(conference_member_t *member) { + if (member->channel) { + switch_channel_get_variables(member->channel, &member->cdr_node->var_event); + } member->cdr_node->leave_time = switch_epoch_time_now(NULL); member->cdr_node->flags = member->flags; member->cdr_node->member = NULL; @@ -1086,6 +1098,218 @@ static void conference_cdr_render(conference_obj_t *conference) switch_xml_free(cdr); } +static cJSON *conference_json_render(conference_obj_t *conference, cJSON *req) +{ + char tmp[30]; + const char *domain; const char *name; + char *dup_domain = NULL; + char *uri; + conference_cdr_node_t *np; + char *tmpp = tmp; + cJSON *json = cJSON_CreateObject(), *jusers = NULL, *jold_users = NULL, *juser = NULL, *jvars = NULL; + + switch_assert(json); + + switch_mutex_lock(conference->mutex); + switch_snprintf(tmp, sizeof(tmp), "%u", conference->doc_version); + conference->doc_version++; + switch_mutex_unlock(conference->mutex); + + if (!(name = conference->name)) { + name = "conference"; + } + + if (!(domain = conference->domain)) { + dup_domain = switch_core_get_domain(SWITCH_TRUE); + if (!(domain = dup_domain)) { + domain = "cluecon.com"; + } + } + + + uri = switch_mprintf("%s@%s", name, domain); + json_add_child_string(json, "entity", uri); + json_add_child_string(json, "conferenceDescription", conference->desc ? conference->desc : "FreeSWITCH Conference"); + json_add_child_string(json, "conferenceState", "active"); + switch_snprintf(tmp, sizeof(tmp), "%u", conference->count); + json_add_child_string(json, "userCount", tmp); + + jusers = json_add_child_array(json, "users"); + jold_users = json_add_child_array(json, "oldUsers"); + + switch_mutex_lock(conference->member_mutex); + + for (np = conference->cdr_nodes; np; np = np->next) { + char *user_uri = NULL; + switch_channel_t *channel = NULL; + switch_time_exp_t tm; + switch_size_t retsize; + const char *fmt = "%Y-%m-%dT%H:%M:%S%z"; + char *p; + + if (np->record_path || !np->cp) { + continue; + } + + //if (!np->cp || (np->member && !np->member->session) || np->leave_time) { /* for now we'll remove participants when they leave */ + //continue; + //} + + if (np->member && np->member->session) { + channel = switch_core_session_get_channel(np->member->session); + } + + juser = cJSON_CreateObject(); + + if (channel) { + const char *uri = switch_channel_get_variable_dup(channel, "conference_invite_uri", SWITCH_FALSE, -1); + + if (uri) { + user_uri = strdup(uri); + } + } + + if (np->cp) { + + if (!user_uri) { + user_uri = switch_mprintf("%s@%s", np->cp->caller_id_number, domain); + } + + json_add_child_string(juser, "entity", user_uri); + json_add_child_string(juser, "displayText", np->cp->caller_id_name); + } + + //if (np->record_path) { + //json_add_child_string(juser, "recordingPATH", np->record_path); + //} + + json_add_child_string(juser, "status", np->leave_time ? "disconnected" : "connected"); + + switch_time_exp_lt(&tm, (switch_time_t) conference->start_time * 1000000); + switch_strftime_nocheck(tmp, &retsize, sizeof(tmp), fmt, &tm); + p = end_of_p(tmpp) -1; + snprintf(p, 4, ":00"); + + json_add_child_string(juser, "joinTime", tmpp); + + snprintf(tmp, sizeof(tmp), "%u", np->id); + json_add_child_string(juser, "memberId", tmp); + + jvars = cJSON_CreateObject(); + + if (!np->member && np->var_event) { + switch_json_add_presence_data_cols(np->var_event, jvars, "PD-"); + } else if (np->member) { + const char *var; + const char *prefix = NULL; + switch_event_t *var_event = NULL; + switch_event_header_t *hp; + int all = 0; + + switch_channel_get_variables(channel, &var_event); + + if ((prefix = switch_event_get_header(var_event, "json_conf_var_prefix"))) { + all = strcasecmp(prefix, "__all__"); + } else { + prefix = "json_"; + } + + for(hp = var_event->headers; hp; hp = hp->next) { + if (all || !strncasecmp(hp->name, prefix, strlen(prefix))) { + json_add_child_string(jvars, hp->name, hp->value); + } + } + + switch_json_add_presence_data_cols(var_event, jvars, "PD-"); + + switch_event_destroy(&var_event); + + if ((var = switch_channel_get_variable(channel, "rtp_use_ssrc"))) { + json_add_child_string(juser, "rtpAudioSSRC", var); + } + + json_add_child_string(juser, "rtpAudioDirection", switch_channel_test_flag(channel, CF_HOLD) ? "sendonly" : "sendrecv"); + + + if (switch_channel_test_flag(channel, CF_VIDEO)) { + if ((var = switch_channel_get_variable(channel, "rtp_use_video_ssrc"))) { + json_add_child_string(juser, "rtpVideoSSRC", var); + } + + json_add_child_string(juser, "rtpVideoDirection", switch_channel_test_flag(channel, CF_HOLD) ? "sendonly" : "sendrecv"); + } + } + + if (jvars) { + json_add_child_obj(juser, "variables", jvars); + } + + cJSON_AddItemToArray(np->leave_time ? jold_users : jusers, juser); + + switch_safe_free(user_uri); + } + + switch_mutex_unlock(conference->member_mutex); + + switch_safe_free(dup_domain); + switch_safe_free(uri); + + return json; +} + +static void conference_la_event_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id) +{ + switch_live_array_parse_json(json, globals.event_channel_id); +} + +static void conference_event_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id) +{ + char *domain = NULL, *name = NULL; + conference_obj_t *conference = NULL; + cJSON *data, *reply = NULL, *conf_desc = NULL; + const char *action = NULL; + + if ((data = cJSON_GetObjectItem(json, "data"))) { + action = cJSON_GetObjectCstr(data, "action"); + } + + if (!action) action = ""; + + reply = cJSON_Duplicate(json, 1); + cJSON_DeleteItemFromObject(reply, "data"); + + if ((name = strchr(event_channel, '.'))) { + char *tmp = strdup(name + 1); + switch_assert(tmp); + name = tmp; + + if ((domain = strchr(name, '@'))) { + *domain++ = '\0'; + } + } + + if (!strcasecmp(action, "bootstrap")) { + if (!zstr(name) && (conference = conference_find(name, domain))) { + conf_desc = conference_json_render(conference, json); + } else { + conf_desc = cJSON_CreateObject(); + json_add_child_string(conf_desc, "conferenceDescription", "FreeSWITCH Conference"); + json_add_child_string(conf_desc, "conferenceState", "inactive"); + json_add_child_array(conf_desc, "users"); + json_add_child_array(conf_desc, "oldUsers"); + } + } else { + conf_desc = cJSON_CreateObject(); + json_add_child_string(conf_desc, "error", "Invalid action"); + } + + json_add_child_string(conf_desc, "action", "conferenceDescription"); + + cJSON_AddItemToObject(reply, "data", conf_desc); + + switch_event_channel_broadcast(event_channel, &reply, modname, globals.event_channel_id); + +} static switch_status_t conference_add_event_data(conference_obj_t *conference, switch_event_t *event) @@ -1340,6 +1564,42 @@ static switch_status_t member_del_relationship(conference_member_t *member, uint return status; } +static void send_json_event(conference_obj_t *conference) +{ + cJSON *event, *conf_desc = NULL; + char *name = NULL, *domain = NULL, *dup_domain = NULL; + char *event_channel = NULL; + + if (!switch_test_flag(conference, CFLAG_JSON_EVENTS)) { + return; + } + + conf_desc = conference_json_render(conference, NULL); + + if (!(name = conference->name)) { + name = "conference"; + } + + if (!(domain = conference->domain)) { + dup_domain = switch_core_get_domain(SWITCH_TRUE); + if (!(domain = dup_domain)) { + domain = "cluecon.com"; + } + } + + event_channel = switch_mprintf("conference.%q@%q", name, domain); + + event = cJSON_CreateObject(); + + json_add_child_string(event, "eventChannel", event_channel); + cJSON_AddItemToObject(event, "data", conf_desc); + + switch_event_channel_broadcast(event_channel, &event, modname, globals.event_channel_id); + + switch_safe_free(dup_domain); + switch_safe_free(event_channel); +} + static void send_rfc_event(conference_obj_t *conference) { switch_event_t *event; @@ -1422,6 +1682,73 @@ static void send_conference_notify(conference_obj_t *conference, const char *sta } +static void member_update_status_field(conference_member_t *member) +{ + char *str, *vstr = "", display[128] = ""; + + if (!member->conference->la) { + return; + } + + switch_live_array_lock(member->conference->la); + + if (!switch_test_flag(member, MFLAG_CAN_SPEAK)) { + str = "MUTE"; + } else if (switch_channel_test_flag(member->channel, CF_HOLD)) { + str = "HOLD"; + } else if (member == member->conference->floor_holder) { + if (switch_test_flag(member, MFLAG_TALKING)) { + str = "TALKING (FLOOR)"; + } else { + str = "FLOOR"; + } + } else if (switch_test_flag(member, MFLAG_TALKING)) { + str = "TALKING"; + } else { + str = "ACTIVE"; + } + + if (switch_channel_test_flag(member->channel, CF_VIDEO)) { + vstr = " VIDEO"; + if (member == member->conference->video_floor_holder) { + vstr = " VIDEO (FLOOR)"; + } + } + + switch_snprintf(display, sizeof(display), "%s%s", str, vstr); + + + free(member->status_field->valuestring); + member->status_field->valuestring = strdup(display); + + switch_live_array_add(member->conference->la, switch_core_session_get_uuid(member->session), -1, &member->json, SWITCH_FALSE); + switch_live_array_unlock(member->conference->la); +} + +static void adv_la(conference_obj_t *conference, conference_member_t *member, switch_bool_t join) +{ + if (conference && conference->la && member->session) { + cJSON *msg, *data; + const char *uuid = switch_core_session_get_uuid(member->session); + const char *cookie = switch_channel_get_variable(member->channel, "event_channel_cookie"); + + msg = cJSON_CreateObject(); + data = json_add_child_obj(msg, "pvtData", NULL); + + cJSON_AddItemToObject(msg, "eventChannel", cJSON_CreateString(uuid)); + cJSON_AddItemToObject(msg, "eventType", cJSON_CreateString("channelPvtData")); + + cJSON_AddItemToObject(data, "action", cJSON_CreateString(join ? "conference-liveArray-join" : "conference-liveArray-part")); + cJSON_AddItemToObject(data, "laChannel", cJSON_CreateString(conference->la_event_channel)); + cJSON_AddItemToObject(data, "laName", cJSON_CreateString(conference->la_name)); + + if (cookie) { + switch_event_channel_permission_modify(cookie, conference->la_event_channel, join); + } + + switch_event_channel_broadcast(uuid, &msg, modname, globals.event_channel_id); + } +} /* Gain exclusive access and add the member to the list */ static switch_status_t conference_add_member(conference_obj_t *conference, conference_member_t *member) @@ -1585,7 +1912,29 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe switch_mutex_unlock(member->audio_out_mutex); switch_mutex_unlock(member->audio_in_mutex); + if (conference->la && member->channel) { + member->json = cJSON_CreateArray(); + cJSON_AddItemToArray(member->json, cJSON_CreateStringPrintf("%0.8d", member->id)); + cJSON_AddItemToArray(member->json, cJSON_CreateString(switch_channel_get_variable(member->channel, "caller_id_number"))); + cJSON_AddItemToArray(member->json, cJSON_CreateString(switch_channel_get_variable(member->channel, "caller_id_name"))); + + cJSON_AddItemToArray(member->json, cJSON_CreateStringPrintf("%s@%s", + switch_channel_get_variable(member->channel, "original_read_codec"), + switch_channel_get_variable(member->channel, "original_read_rate") + )); + + member->status_field = cJSON_CreateString(""); + cJSON_AddItemToArray(member->json, member->status_field); + member_update_status_field(member); + //switch_live_array_add_alias(conference->la, switch_core_session_get_uuid(member->session), "conference"); + adv_la(conference, member, SWITCH_TRUE); + switch_live_array_add(conference->la, switch_core_session_get_uuid(member->session), -1, &member->json, SWITCH_FALSE); + + } + + send_rfc_event(conference); + send_json_event(conference); switch_mutex_unlock(conference->mutex); status = SWITCH_STATUS_SUCCESS; @@ -1637,12 +1986,14 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf //switch_channel_set_flag(member->channel, CF_VIDEO_PASSIVE); switch_core_session_refresh_video(member->session); conference->video_floor_holder = member; + member_update_status_field(member); } else { conference->video_floor_holder = NULL; } if (old_member) { old_id = old_member->id; + member_update_status_field(old_member); //switch_channel_clear_flag(old_member->channel, CF_VIDEO_PASSIVE); } @@ -1714,6 +2065,7 @@ static void conference_set_floor_holder(conference_obj_t *conference, conference switch_channel_get_name(member->channel)); conference->floor_holder = member; + member_update_status_field(member); } else { conference->floor_holder = NULL; } @@ -1721,6 +2073,7 @@ static void conference_set_floor_holder(conference_obj_t *conference, conference if (old_member) { old_id = old_member->id; + member_update_status_field(old_member); } switch_set_flag(conference, CFLAG_FLOOR_CHANGE); @@ -1881,8 +2234,14 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe switch_mutex_unlock(member->audio_in_mutex); + if (conference->la && member->session) { + switch_live_array_del(conference->la, switch_core_session_get_uuid(member->session)); + //switch_live_array_clear_alias(conference->la, switch_core_session_get_uuid(member->session), "conference"); + adv_la(conference, member, SWITCH_FALSE); + } + send_rfc_event(conference); - + send_json_event(conference); switch_mutex_unlock(conference->mutex); status = SWITCH_STATUS_SUCCESS; @@ -2062,6 +2421,11 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr return NULL; } +static void conference_command_handler(switch_live_array_t *la, const char *cmd, const char *sessid, cJSON *jla, void *user_data) +{ + +} + /* Main monitor thread (1 per distinct conference room) */ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *obj) { @@ -2079,6 +2443,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v int32_t z = 0; int member_score_sum = 0; int divisor = 0; + conference_cdr_node_t *np; if (!(divisor = conference->rate / 8000)) { divisor = 1; @@ -2108,6 +2473,26 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "conference-create"); switch_event_fire(&event); + if (switch_test_flag(conference, CFLAG_LIVEARRAY_SYNC)) { + char *p; + + if (strchr(conference->name, '@')) { + conference->la_event_channel = switch_core_sprintf(conference->pool, "conference-liveArray.%s", conference->name); + } else { + conference->la_event_channel = switch_core_sprintf(conference->pool, "conference-liveArray.%s@%s", conference->name, conference->domain); + } + + conference->la_name = switch_core_strdup(conference->pool, conference->name); + if ((p = strchr(conference->la_name, '@'))) { + *p = '\0'; + } + + switch_live_array_create(conference->la_event_channel, conference->la_name, globals.event_channel_id, &conference->la); + switch_live_array_set_user_data(conference->la, conference); + switch_live_array_set_command_handler(conference->la, conference_command_handler); + } + + while (globals.running && !switch_test_flag(conference, CFLAG_DESTRUCT)) { switch_size_t file_sample_len = samples; switch_size_t file_data_len = samples * 2; @@ -2505,6 +2890,14 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v switch_mutex_lock(conference->mutex); conference_stop_file(conference, FILE_STOP_ASYNC); conference_stop_file(conference, FILE_STOP_ALL); + + for (np = conference->cdr_nodes; np; np = np->next) { + if (np->var_event) { + switch_event_destroy(&np->var_event); + } + } + + /* Close Unused Handles */ if (conference->fnode) { conference_file_node_t *fnode, *cur; @@ -2596,6 +2989,10 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v switch_thread_rwlock_unlock(conference->rwlock); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write Lock OFF\n"); + if (conference->la) { + switch_live_array_destroy(&conference->la); + } + if (conference->sh) { switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; switch_core_speech_close(&conference->lsh, &flags); @@ -3241,7 +3638,6 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v break; } - /* if we have caller digits, feed them to the parser to find an action */ if (switch_channel_has_dtmf(channel)) { char dtmf[128] = ""; @@ -3251,7 +3647,12 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v if (switch_test_flag(member, MFLAG_DIST_DTMF)) { conference_send_all_dtmf(member, member->conference, dtmf); } else if (member->dmachine) { - switch_ivr_dmachine_feed(member->dmachine, dtmf, NULL); + char *p; + char str[2] = ""; + for (p = dtmf; p && *p; p++) { + str[0] = *p; + switch_ivr_dmachine_feed(member->dmachine, str, NULL); + } } } else if (member->dmachine) { switch_ivr_dmachine_ping(member->dmachine, NULL); @@ -3280,6 +3681,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v if (++hangover_hits >= hangover) { hangover_hits = hangunder_hits = 0; switch_clear_flag_locked(member, MFLAG_TALKING); + member_update_status_field(member); check_agc_levels(member); clear_avg(member); member->score_iir = 0; @@ -3398,7 +3800,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v if (!switch_test_flag(member, MFLAG_TALKING)) { switch_set_flag_locked(member, MFLAG_TALKING); - + member_update_status_field(member); if (test_eflag(member->conference, EFLAG_START_TALKING) && switch_test_flag(member, MFLAG_CAN_SPEAK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); @@ -3435,6 +3837,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v if (++hangover_hits >= hangover) { hangover_hits = hangunder_hits = 0; switch_clear_flag_locked(member, MFLAG_TALKING); + member_update_status_field(member); check_agc_levels(member); clear_avg(member); @@ -3763,6 +4166,15 @@ static void conference_loop_output(conference_member_t *member) switch_mutex_lock(member->write_mutex); + + if (switch_channel_test_flag(member->channel, CF_CONFERENCE_ADV)) { + if (member->conference->la) { + adv_la(member->conference, member, SWITCH_TRUE); + } + switch_channel_clear_flag(member->channel, CF_CONFERENCE_ADV); + } + + if (switch_core_session_dequeue_event(member->session, &event, SWITCH_FALSE) == SWITCH_STATUS_SUCCESS) { if (event->event_id == SWITCH_EVENT_MESSAGE) { char *from = switch_event_get_header(event, "from"); @@ -4864,6 +5276,8 @@ static switch_status_t conf_api_sub_mute(conference_member_t *member, switch_str switch_event_fire(&event); } + member_update_status_field(member); + return SWITCH_STATUS_SUCCESS; } @@ -4948,6 +5362,8 @@ static switch_status_t conf_api_sub_unmute(conference_member_t *member, switch_s switch_event_fire(&event); } + member_update_status_field(member); + return SWITCH_STATUS_SUCCESS; } @@ -7260,6 +7676,10 @@ static void set_cflags(const char *flags, uint32_t *f) *f |= CFLAG_VIDEO_BRIDGE; } else if (!strcasecmp(argv[i], "audio-always")) { *f |= CFLAG_AUDIO_ALWAYS; + } else if (!strcasecmp(argv[i], "json-events")) { + *f |= CFLAG_JSON_EVENTS; + } else if (!strcasecmp(argv[i], "livearray-sync")) { + *f |= CFLAG_LIVEARRAY_SYNC; } else if (!strcasecmp(argv[i], "rfc-4579")) { *f |= CFLAG_RFC4579; } @@ -9308,6 +9728,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_conference_load) switch_console_add_complete_func("::conference::list_conferences", list_conferences); + switch_event_channel_bind("conference", conference_event_channel_handler, &globals.event_channel_id); + switch_event_channel_bind("conference-liveArray", conference_la_event_channel_handler, &globals.event_channel_id); + /* build api interface help ".syntax" field string */ p = strdup(""); for (i = 0; i < CONFFUNCAPISIZE; i++) { @@ -9389,6 +9812,9 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_conference_shutdown) /* signal all threads to shutdown */ globals.running = 0; + switch_event_channel_unbind(NULL, conference_event_channel_handler); + switch_event_channel_unbind(NULL, conference_la_event_channel_handler); + switch_console_del_complete_func("::conference::list_conferences"); /* wait for all threads */ From 556e243361ddb445241f48fbf4ca46501569736e Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 Oct 2013 14:29:29 -0500 Subject: [PATCH 80/80] FS-5910 --resolve --- src/include/switch_types.h | 2 ++ src/mod/endpoints/mod_sofia/sofia.c | 1 + 2 files changed, 3 insertions(+) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 7c90161d3a..49dbfd0064 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -27,6 +27,7 @@ * Bret McDanel * Joseph Sullivan * Raymond Chandler + * Emmanuel Schmidbauer * * switch_types.h -- Data Types * @@ -968,6 +969,7 @@ typedef enum { SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE, SWITCH_MESSAGE_INDICATE_STUN_ERROR, SWITCH_MESSAGE_INDICATE_MEDIA_RENEG, + SWITCH_MESSAGE_REFER_EVENT, SWITCH_MESSAGE_ANSWER_EVENT, SWITCH_MESSAGE_PROGRESS_EVENT, SWITCH_MESSAGE_RING_EVENT, diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 9000ec96b3..e2207d2c6d 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -6893,6 +6893,7 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t exten = (char *) refer_to->r_url->url_user; } + switch_core_session_queue_indication(session, SWITCH_MESSAGE_REFER_EVENT); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Process REFER to [%s@%s]\n", exten, (char *) refer_to->r_url->url_host); switch_channel_set_variable(tech_pvt->channel, "transfer_disposition", "recv_replace");