]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add some user stuff
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 4 Dec 2007 19:39:14 +0000 (19:39 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 4 Dec 2007 19:39:14 +0000 (19:39 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6501 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/applications/mod_commands/mod_commands.c
src/mod/applications/mod_dptools/mod_dptools.c

index 2b44abc05bafd2760797fabb522a3f7db7636aca..2ee751e87653cc7b1352cb02b988174b2f628d1c 100644 (file)
@@ -41,6 +41,84 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load);
 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_MODULE_LOAD_FUNCTION(mod_commands_load)
        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;
index 8630972a2b47099cc31132674f0824deff787acf..92c8228182060977014823e548acf87c5e2c20eb 100644 (file)
@@ -1420,6 +1420,78 @@ SWITCH_STANDARD_APP(audio_bridge_function)
 }
 
 
+
+/* 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 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load)
        /* 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>");