diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 242640c898..55e7530448 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -697,8 +697,10 @@ static void conference_loop(conference_member_t *member) return; } - /* Answer the channel */ - switch_channel_answer(channel); + if (!switch_channel_test_flag(channel, CF_OUTBOUND)) { + /* Answer the channel */ + switch_channel_answer(channel); + } /* Prepare the write frame */ write_frame.data = data; @@ -1806,34 +1808,83 @@ static switch_status_t conf_function(char *buf, switch_core_session_t *session, conference_member_t *member = NULL; uint32_t id = atoi(argv[2]); conference_obj_t *new_conference = NULL; + switch_channel_t *channel; + switch_event_t *event; + char *profile_name; + switch_xml_t cxml = NULL, cfg = NULL, profile = NULL, profiles = NULL; - if ((new_conference = (conference_obj_t *) switch_core_hash_find(globals.conference_hash, argv[3]))) { - if ((member = conference_member_get(conference, id))) { - switch_channel_t *channel = switch_core_session_get_channel(member->session); - switch_event_t *event; - - conference_del_member(member->last_conference, member); - conference_add_member(new_conference, member); - stream->write_function(stream, "OK Member %u sent to conference %s.\n", id, argv[3]); - - if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { - switch_channel_event_set_data(channel, event); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-ID", "%u", member->id); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Old-Conference-Name", conference->name); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Conference-Name", argv[3]); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "transfer"); - switch_event_fire(&event); - } - goto done; - } else { - stream->write_function(stream, "No Member %u in conference %s.\n", id, conference->name); - goto done; - } - } else { - stream->write_function(stream, "No Conference called %s found.\n", argv[3]); + if (!(member = conference_member_get(conference, id))) { + stream->write_function(stream, "No Member %u in conference %s.\n", id, conference->name); goto done; } + + channel = switch_core_session_get_channel(member->session); + + if (!(new_conference = (conference_obj_t *) switch_core_hash_find(globals.conference_hash, argv[3]))) { + switch_memory_pool_t *pool; + char *conf_name; + /* Setup a memory pool to use. */ + if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Pool Failure\n"); + goto done; + } + + conf_name = switch_core_strdup(pool, argv[3]); + + if ((profile_name = strchr(conf_name, '@'))) { + *profile_name++ = '\0'; + + /* Open the config from the xml registry */ + if (!(cxml = switch_xml_open_cfg(global_cf_name, &cfg, NULL))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", global_cf_name); + goto done; + } + + if ((profiles = switch_xml_child(cfg, "profiles"))) { + profile = switch_xml_find_child(profiles, "profile", "name", profile_name); + } + } + + + /* Release the config registry handle */ + if (cxml) { + switch_xml_free(cxml); + cxml = NULL; + } + + /* Create the conference object. */ + new_conference = conference_new(conf_name, profile, pool); + + + if (!new_conference) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n"); + goto done; + } + + /* Set the minimum number of members (once you go above it you cannot go below it) */ + new_conference->min = 1; + + /* Indicate the conference is dynamic */ + switch_set_flag_locked(new_conference, CFLAG_DYNAMIC); + + /* Start the conference thread for this conference */ + launch_conference_thread(new_conference); + } + + conference_del_member(member->last_conference, member); + conference_add_member(new_conference, member); + stream->write_function(stream, "OK Member %u sent to conference %s.\n", id, argv[3]); + + if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { + switch_channel_event_set_data(channel, event); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-ID", "%u", member->id); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Old-Conference-Name", conference->name); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-Conference-Name", argv[3]); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "transfer"); + switch_event_fire(&event); + } + } else { stream->write_function(stream, transfer_usage); goto done; @@ -2160,7 +2211,6 @@ static void conference_function(switch_core_session_t *session, char *data) conference->min = 2; if (dpin) { - printf("ASS [%s]\n", dpin); conference->pin = switch_core_strdup(conference->pool, dpin); }