[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