[Freeswitch-svn] [commit] r3250 - freeswitch/branches/knhor/wip/mod_conference

Freeswitch SVN knhor at freeswitch.org
Wed Nov 1 17:27:20 EST 2006


Author: knhor
Date: Wed Nov  1 17:27:18 2006
New Revision: 3250

Modified:
   freeswitch/branches/knhor/wip/mod_conference/mod_conference.c

Log:
progress update - all functions fleshed out

Modified: freeswitch/branches/knhor/wip/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/branches/knhor/wip/mod_conference/mod_conference.c	(original)
+++ freeswitch/branches/knhor/wip/mod_conference/mod_conference.c	Wed Nov  1 17:27:18 2006
@@ -242,7 +242,10 @@
 static switch_status_t chat_send(char *proto, char *from, char *to, char *subject, char *body, char *hint);
 static void launch_conference_record_thread(conference_obj_t *conference, char *path);
 
+typedef int (*conf_api_args_cmd_t)(conference_obj_t*, switch_stream_handle_t*, int, char**);
 typedef int (*conf_api_member_cmd_t)(conference_obj_t*, conference_member_t*, int, switch_stream_handle_t*, void*);
+typedef int (*conf_api_text_cmd_t)(conference_obj_t*, switch_stream_handle_t*, char*);
+
 static void conference_member_itterator(conference_obj_t *conference,
 										switch_stream_handle_t *stream,
 										conf_api_member_cmd_t pfncallback,
@@ -1822,12 +1825,44 @@
 
 	return err;
 }
-static void conference_function_api_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+
+static int conference_function_api_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
-//	switch_event_t *event;
+//static void conference_list(conference_obj_t *conference, switch_stream_handle_t *stream, char *delim)
+	switch_hash_index_t *hi;
+	void *val;
+	char *d = ";";
 
+	if (argv[1]) {
+		if (argv[2] && !strcasecmp(argv[1], "delim")) {
+			d = argv[2];
+
+			if (*d == '"') {
+				if (++d) {
+					char *p;
+					if ((p = strchr(d, '"'))) {
+						*p = '\0';
+					}
+				} else {
+					d = ";";
+				}
+			}
+		}
+	}
+
+	for (hi = switch_hash_first(globals.conference_pool, globals.conference_hash); hi; hi = switch_hash_next(hi)) {
+		switch_hash_this(hi, NULL, NULL, &val);
+		conference = (conference_obj_t *) val;
+
+		stream->write_function(stream, "Conference %s (%u members)\n", conference->name, conference->count);
+		conference_list(conference, stream, d);
+		stream->write_function(stream, "\n");
+	}
+
+	return 0;
 }
-static void conference_function_api_play(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+
+static int conference_function_api_play(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
 	switch_event_t *event;
 
@@ -1864,97 +1899,84 @@
 			stream->write_function(stream, "Member: %u not found.\n", id);
 		}
 	}
+
+	return 0;
 }
 
-static void conference_function_api_say(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_say(conference_obj_t *conference, switch_stream_handle_t *stream, char *text)
 {
-	/*
-	switch_event_t *event;
-	char *tbuf = NULL;
-	char *text;
+	int err = 0;
 
-	if (argc > 2 && (tbuf = strdup(buf))) {
-		if ((text = strstr(tbuf, "say"))) {
-			text += 4;
-			while(*text == ' ') {
-				text++;
+	if (text != NULL && !switch_strlen_zero(text)) {
+		if (conference_say(conference, text, 0) == SWITCH_STATUS_SUCCESS) {
+			switch_event_t *event;
+
+			stream->write_function(stream, "(say) OK\n");
+			if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
+				switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Conference-Name", conference->name);
+				switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "speak-text");
+				switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Text", text);
+				switch_event_fire(&event);
 			}
-			if (!switch_strlen_zero(text) && conference_say(conference, text, 0) == SWITCH_STATUS_SUCCESS) {
-				stream->write_function(stream, "(say) OK\n");
-				if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
-					switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Conference-Name", conference->name);
-					switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "speak-text");
-					switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Text", text);
-					switch_event_fire(&event);
-				}
-			} else {
-				stream->write_function(stream, "(say) Error!");
-			}
+		} else {
+			stream->write_function(stream, "(say) Error!");
 		}
-		free(tbuf);
 	} else {
 		stream->write_function(stream, "(say) Error! No text.");
+		err = 1;
 	}
-	*/
+
+	return err;
 }
 
-static void conference_function_api_saymember(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_saymember(conference_obj_t *conference, switch_stream_handle_t *stream, char *text)
 {
-	/*
-	switch_event_t *event;
-	char *tbuf = NULL, *text, *name;
-	uint32_t id;
-	conference_member_t *member;
+	int err = 0;
 
-	if (argc > 3) {
-		id = atoi(argv[3]);
-	} else {
-		stream->write_function(stream, "(saymember) Syntax Error!");
-		goto done;
-	}
+	if (text != NULL && !switch_strlen_zero(text)) {
+		char *name = strdup(text);
+		uint32_t id = 0;
+		conference_member_t *member;
 
-	if ((tbuf = strdup(buf))) {
-		if ((name = strstr(tbuf, "saymember "))) {
-			name += 10;
+		if (name != NULL && *name) {
+			text = strchr(name, ' ');
+			*name = '\0';
+			id = atoi(name);
+			free(name);
+		} else {
+			err = 1;
+		}
 
-			if (*name) {
-				text = strchr(name, ' ');
-				id = atoi(name);
-			} else {
-				stream->write_function(stream, "(saymember) Syntax Error!");
-				goto done;
-			}
+		if (id != 0 && (member = conference_member_get(conference, id))) {
+			if (text && conference_member_say(conference, member, text, 0) == SWITCH_STATUS_SUCCESS) {
+				switch_event_t *event;
 
-			if ((member = conference_member_get(conference, id))) {
-				if (text && conference_member_say(conference, member, text, 0) == SWITCH_STATUS_SUCCESS) {
-					stream->write_function(stream, "(saymember) OK\n");
-					if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
-						switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Conference-Name", conference->name);
-						switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "speak-text-member");
-						switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-ID", "%u", id);
-						switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Text", text);
-						switch_event_fire(&event);
-					}
-				} else {
-					stream->write_function(stream, "(saymember) Error!");
+				stream->write_function(stream, "(saymember) OK\n");
+				if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
+					switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Conference-Name", conference->name);
+					switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "speak-text-member");
+					switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-ID", "%u", id);
+					switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Text", text);
+					switch_event_fire(&event);
 				}
 			} else {
-				stream->write_function(stream, "(saymember) Unknown Member %u!", id);
+				stream->write_function(stream, "(saymember) Error!");
 			}
 		} else {
-			stream->write_function(stream, "(saymember) Syntax Error!");
+			stream->write_function(stream, "(saymember) Unknown Member %u!", id);
+			err = 1;
 		}
-
-		free(tbuf);
+	} else {
+		err = 1;
 	}
-	*/
+
+	return err;
 }
 
-static void conference_function_api_stop(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_stop(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
-	/*
-	switch_event_t *event;
 	uint8_t current = 0, all = 0;
+	int err = 0;
 
 	if (argc > 2) {
 		current = strcasecmp(argv[2], "current") ? 0 : 1;
@@ -1965,6 +1987,7 @@
 		if (argc == 4) {
 			uint32_t id = atoi(argv[3]);
 			conference_member_t *member;
+
 			if ((member = conference_member_get(conference, id))) {
 				uint32_t stopped = conference_member_stop_file(member, current ? FILE_STOP_CURRENT : FILE_STOP_ALL);
 				stream->write_function(stream, "Stopped %u files.\n", stopped);
@@ -1976,15 +1999,15 @@
 			stream->write_function(stream, "Stopped %u files.\n", stopped);
 		}
 	} else {
-		stream->write_function(stream, "Usage stop [current/all]\n");
+		err = 1;
 	}
-	*/
+
+	return err;
 }
 
-static void conference_function_api_relate(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_relate(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
-	/*
-	switch_event_t *event;
+	int err = 0;
 
 	char *relate_usage = "Usage relate <id> <id> [nospeak|nohear|clear]\n";
 	if (argc > 4) {
@@ -2055,10 +2078,12 @@
 	} else {
 		stream->write_function(stream, relate_usage);
 	}
-	*/
+
+done:
+	return err;
 }
 
-static void conference_function_api_lock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_lock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
 	switch_event_t *event;
 
@@ -2069,9 +2094,11 @@
 		switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "lock");
 		switch_event_fire(&event);
 	}
+
+	return 0;
 }
 
-static void conference_function_api_unlock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_unlock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
 	switch_event_t *event;
 
@@ -2082,21 +2109,27 @@
 		switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "unlock");
 		switch_event_fire(&event);
 	}
+
+	return 0;
 }
 
-static void conference_function_api_dial(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_dial(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
+	int err = 0;
+
 	if (argc > 2) {
 		conference_outcall(conference, NULL, argv[2], 60, argv[3], argv[4], argv[5]);
 		stream->write_function(stream, "OK\n");
 	} else {
-		stream->write_function(stream, "Error!\n");
+		err = 1;
 	}
+
+	return err;
 }
 
-static void conference_function_api_transfer(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_transfer(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
-	char *transfer_usage = "Usage transfer <id> <confname>\n";
+	int err = 0;
 
 	if (argc > 3) {
 		conference_member_t *member = NULL;
@@ -2180,23 +2213,24 @@
 		}
 
 	} else {
-		stream->write_function(stream, transfer_usage);
+		err = 1;
 	}
 done:
-	{
-	}
+	return err;
 }
 
-static void conference_function_api_record(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_record(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
 	if (argc > 2) {
 		launch_conference_record_thread(conference, argv[2]);
 	} else {
 		stream->write_function(stream, "usage record <filename>\n");
 	}
+
+	return 0;
 }
 
-static void conference_function_api_norecord(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
+static int conference_function_api_norecord(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char**argv)
 {
 	if (argc > 2) {
 		int all = (strcasecmp(argv[2], "all") == 0 );
@@ -2207,6 +2241,8 @@
 	} else {
 		stream->write_function(stream, "usage norecord <[filename | all]>\n");
 	}
+
+	return 0;
 }
 
 /* API Interface Function sub-commands */
@@ -2216,18 +2252,18 @@
 	{"volume in",	&conference_function_api_volume_in,	1, "<confname> volume_in <member_id|all> [<newval>]"},
 	{"volume out",	&conference_function_api_volume_out,	1, "<confname> volume_out <member_id|all> [<newval>]"},
 	{"play",	&conference_function_api_play,		0, "<confname> play <file_path> [<member_id>]"},
-	{"say",		&conference_function_api_say,		0, "<confname> say <text>"},
-	{"saymember",	 &conference_function_api_saymember,	0, "<confname> saymember <member_id><text>"},
+	{"say",		&conference_function_api_say,		2, "<confname> say <text>"},
+	{"saymember",	 &conference_function_api_saymember,	2, "<confname> saymember <member_id><text>"},
 	{"stop",	 &conference_function_api_stop,		1, "<confname> stop <[current|all]> [<member_id>]"},
 	{"kick",	 &conference_function_api_kick,		1, "<confname> kick <[member_id|all]>"},
 	{"mute",	 &conference_function_api_mute,		1, "<confname> mute <[member_id|all]>"},
 	{"unmute",	 &conference_function_api_unmute,	1, "<confname> unmute <[member_id|all]>"},
 	{"deaf",	 &conference_function_api_deaf,		1, "<confname> deaf <[member_id|all]>"},
 	{"undeaf",	 &conference_function_api_undeaf,	1, "<confname> undef <[member_id|all]>"},
-	{"relate",	 &conference_function_api_relate,	0, "<confname> relate <member_id> <other_member_id> [nospeak|nohear]"},
+	{"relate",	 &conference_function_api_relate,	0, "<confname> relate <member_id> <other_member_id> [nospeak|nohear|clear]"},
 	{"lock",	 &conference_function_api_lock,		0, "<confname> lock"},
 	{"unlock",	 &conference_function_api_unlock,	0, "<confname> unlock"},
-	{"dial",	 &conference_function_api_transfer,	0, "<confname> dial <endpoint_module_name>/<destination>"},
+	{"dial",	 &conference_function_api_dial,		0, "<confname> dial <endpoint_module_name>/<destination>"},
 	{"transfer",	 &conference_function_api_transfer,	0, "<confname> transfer <member_id> <conference_name>"},
 	{"record",	 &conference_function_api_record,	0, "<confname> record <filename>"},
 	{"norecord",	 &conference_function_api_norecord,	0, "<confname> norecord <[filename|all]>"},
@@ -2257,24 +2293,28 @@
 
 	if (buf != NULL && (lbuf = strdup(buf))) {
 		conference_obj_t *conference = NULL;
-		int argc,i;
+		int argc;
 		char *argv[25];
 
+		memset(argv,0,sizeof(argv));
 		argc = switch_separate_string(lbuf, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
 
 		// find a command to execute
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Conference argc: %u\n",argc);
-		for (i=0; i<argc; i++) {
-			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Conference argv[%u]: '%u'\n",i,argv[i]);
-		}
 		if (argc) {
-			int i,found;
+			int i,found=0;
 
 			for (i=0; i<CONFFUNCAPISIZE && !found; i++) {
 				if (strcasecmp(argv[i],conf_function_api_commands[i].pname) == 0) {
 					found = 1;
 					switch(conf_function_api_commands[i].fntype) {
-						case 0:	// generic command type
+						case 0:	// commands that we've broken the command line into arguments for
+							{	conf_api_args_cmd_t pfn = (conf_api_args_cmd_t)conf_function_api_commands[i].pfnapicmd;
+
+								if (pfn(conference, stream, argc, &argv[0]) != 0) {
+									// command returned error, so show syntax usage
+									stream->write_function(stream,conf_function_api_commands[i].psyntax);
+									}
+							}
 							break;
 						case 1: // member specific command that can be itteratted
 							{
@@ -2286,18 +2326,38 @@
 								} else {
 									conf_api_member_cmd_t pfn = (conf_api_member_cmd_t)conf_function_api_commands[i].pfnapicmd;
 
-									if (pfn(conference, NULL, id, stream, argv[3])) {
+									if (pfn(conference, NULL, id, stream, argv[3]) != 0) {
+										// command returned error, so show syntax usage
 										stream->write_function(stream,conf_function_api_commands[i].psyntax);
 										}
 								}
 
 							}
 							break;
+						case 2:	// commands that deals with all text after command
+							{	conf_api_text_cmd_t pfn = (conf_api_text_cmd_t)conf_function_api_commands[i].pfnapicmd;
+								char *pstr = lbuf+strlen(conf_function_api_commands[i].pname)+1;
+
+								// advance past all leading white space after command
+								while(*pstr == ' ' || *pstr == '\t') {
+									pstr++;
+								}
+
+								if (pfn(conference, stream, pstr) != 0) {
+									// command returned error, so show syntax usage
+									stream->write_function(stream,conf_function_api_commands[i].psyntax);
+									}
+							}
+							break;
 					}
 				}
 			}
+
+			if(!found) {
+				stream->write_function(stream,(char *)conf_api_interface.syntax);
+			}
 		} else {
-			stream->write_function(stream,conf_api_interface.syntax);
+			stream->write_function(stream,(char *)conf_api_interface.syntax);
 		}
 	}
 
@@ -3323,7 +3383,7 @@
 
 		// free api interface help ".syntax" field string
 		if (conf_api_interface.syntax != NULL)
-			free(conf_api_interface.syntax);
+			free((char *)conf_api_interface.syntax);
 	}
 
 	return SWITCH_STATUS_SUCCESS;



More information about the Freeswitch-svn mailing list