[Freeswitch-svn] [commit] r2385 - freeswitch/trunk/src/mod/applications/mod_conference
Freeswitch SVN
anthm at freeswitch.org
Thu Aug 24 16:24:00 EDT 2006
Author: anthm
Date: Thu Aug 24 16:23:43 2006
New Revision: 2385
Modified:
freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c
Log:
conference update
Modified: freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c Thu Aug 24 16:23:43 2006
@@ -697,8 +697,10 @@
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 @@
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 (!(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;
- 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);
+ /* 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;
- } 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]);
- 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 @@
conference->min = 2;
if (dpin) {
- printf("ASS [%s]\n", dpin);
conference->pin = switch_core_strdup(conference->pool, dpin);
}
More information about the Freeswitch-svn
mailing list