[Freeswitch-trunk] [commit] r6501 - in freeswitch/trunk/src/mod/applications: mod_commands mod_dptools

Freeswitch SVN anthm at freeswitch.org
Tue Dec 4 14:39:14 EST 2007


Author: anthm
Date: Tue Dec  4 14:39:14 2007
New Revision: 6501

Modified:
   freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
   freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c

Log:
add some user stuff

Modified: freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c	Tue Dec  4 14:39:14 2007
@@ -41,6 +41,84 @@
 SWITCH_MODULE_DEFINITION(mod_commands, mod_commands_load, NULL, NULL);
 
 
+SWITCH_STANDARD_API(user_data_function)
+{
+	switch_xml_t x_domain, xml = NULL, x_user, x_param, x_params;	
+	int argc;
+    char *mydata = NULL, *argv[3];
+	char *key = NULL, *type = NULL, *user, *domain;
+	char delim = ' ';
+	const char *err = NULL;
+	const char *container = "params", *elem = "param";
+	char *params = NULL;
+
+    if (!cmd) {
+		err = "bad args";
+        goto end;
+    }
+
+    mydata = strdup(cmd);
+    assert(mydata);
+	
+    argc = switch_separate_string(mydata, delim, argv, (sizeof(argv) / sizeof(argv[0])));
+
+    if (argc < 3) {
+		err = "bad args";
+        goto end;
+    }
+
+	user = argv[0];
+	type = argv[1];
+	key = argv[2];
+
+	if ((domain = strchr(user, '@'))) {
+		*domain++ = '\0';
+	} else {
+		domain = "cluecon.com";
+	}
+	
+	params = switch_mprintf("user=%s&domain=%s&type=%s&key=%s", user, domain, type, key);
+
+	if (switch_xml_locate_user("id", user, domain, NULL, &xml, &x_domain, &x_user, params) != SWITCH_STATUS_SUCCESS) {
+		err = "can't find user";
+		goto end;
+	}
+
+
+ end:
+
+	if (xml) {
+		if (err) {
+			//stream->write_function(stream,  "-Error %s\n", err);
+		} else {
+			if (!strcmp(type, "var")) {
+				container = "variables";
+				elem = "variable";
+			}
+
+			if ((x_params = switch_xml_child(x_user, container))) {
+				for (x_param = switch_xml_child(x_params, elem); x_param; x_param = x_param->next) {
+					const char *var = switch_xml_attr(x_param, "name");
+					const char *val = switch_xml_attr(x_param, "value");
+				
+					if (!strcasecmp(var, key)) {
+						stream->write_function(stream, "%s", val);
+						break;
+					}
+				
+				}
+			}
+		}
+		switch_xml_free(xml);
+	}
+
+	free(mydata);
+	switch_safe_free(params);
+
+	return SWITCH_STATUS_SUCCESS;
+
+}
+
 SWITCH_STANDARD_API(find_user_function)
 {
 	switch_xml_t x_domain = NULL, x_user = NULL, xml = NULL;
@@ -1949,6 +2027,7 @@
 	SWITCH_ADD_API(commands_api_interface, "uuid_chat", "Send a chat message", uuid_chat, UUID_CHAT_SYNTAX);
 	SWITCH_ADD_API(commands_api_interface, "find_user_xml", "find a user", find_user_function, "<key> <user>@<domain>");
 	SWITCH_ADD_API(commands_api_interface, "xml_locate", "find some xml", xml_locate_function, "[root | <section> <tag> <tag_attr_name> <tag_attr_val>]");
+	SWITCH_ADD_API(commands_api_interface, "user_data", "find user data", user_data_function, "<user>@<domain> [var|param] <name>");
 
 	/* indicate that the module should continue to be loaded */
 	return SWITCH_STATUS_NOUNLOAD;

Modified: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c	Tue Dec  4 14:39:14 2007
@@ -1420,6 +1420,78 @@
 }
 
 
+
+/* fake chan_user */
+switch_endpoint_interface_t *user_endpoint_interface;
+static switch_call_cause_t user_outgoing_channel(switch_core_session_t *session,
+												 switch_caller_profile_t *outbound_profile,
+												 switch_core_session_t **new_session, switch_memory_pool_t **pool);
+switch_io_routines_t user_io_routines = {
+	/*.outgoing_channel */ user_outgoing_channel
+};
+
+static switch_call_cause_t user_outgoing_channel(switch_core_session_t *session,
+												 switch_caller_profile_t *outbound_profile,
+												 switch_core_session_t **new_session, switch_memory_pool_t **pool)
+{
+	switch_xml_t x_domain, xml = NULL, x_user, x_param, x_params;	
+	char *user = NULL, *domain = NULL;
+	const char *dest = NULL;
+	static switch_call_cause_t cause;
+	unsigned int timelimit = 60;
+
+	user = switch_core_session_strdup(session, outbound_profile->destination_number);
+
+	if (!(domain = strchr(user, '@'))) {
+		goto done;
+	}
+
+	*domain++ = '\0';
+	
+	if (switch_xml_locate_user("id", user, domain, NULL, &xml, &x_domain, &x_user, "as_channel=true") != SWITCH_STATUS_SUCCESS) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", user, domain);
+		goto done;
+	}
+
+	if ((x_params = switch_xml_child(x_user, "params"))) {
+		for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
+			const char *var = switch_xml_attr(x_param, "name");
+			const char *val = switch_xml_attr(x_param, "value");
+			
+			if (!strcasecmp(var, "dial-string")) {
+				dest = val;
+				break;
+			}
+
+		}
+	}
+
+ done:
+
+	if (dest) {
+		const char *var;
+		switch_channel_t *channel;
+
+		channel = switch_core_session_get_channel(session);
+		if ((var = switch_channel_get_variable(channel, "call_timeout"))) {
+			timelimit = atoi(var);
+		}
+
+		if (switch_ivr_originate(session, new_session, &cause, dest, timelimit, NULL, NULL, NULL, NULL) == SWITCH_STATUS_SUCCESS) {
+			switch_core_session_rwunlock(*new_session);
+		}
+	}
+
+	if (xml) {
+		switch_xml_free(xml);
+	}
+	
+
+	return cause;
+
+}
+
+
 #define SPEAK_DESC "Speak text to a channel via the tts interface"
 #define DISPLACE_DESC "Displace audio from a file to the channels input"
 #define SESS_REC_DESC "Starts a background recording of the entire session"
@@ -1443,6 +1515,11 @@
 	/* connect my internal structure to the blank pointer passed to me */
 	*module_interface = switch_loadable_module_create_module_interface(pool, modname);
 
+	user_endpoint_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_ENDPOINT_INTERFACE);
+    user_endpoint_interface->interface_name = "USER";
+    user_endpoint_interface->io_routines = &user_io_routines;
+
+
  	SWITCH_ADD_API(api_interface, "strepoch", "Convert a date string into epoch time", strepoch_api_function, "<string>");
 	SWITCH_ADD_API(api_interface, "chat", "chat", chat_api_function, "<proto>|<from>|<to>|<message>");
 	SWITCH_ADD_API(api_interface, "strftime", "strftime", strftime_api_function, "<format_string>");



More information about the Freeswitch-trunk mailing list