]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
XMLification (wave 4)
authorAnthony Minessale <anthony.minessale@gmail.com>
Wed, 10 May 2006 15:47:54 +0000 (15:47 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Wed, 10 May 2006 15:47:54 +0000 (15:47 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@1412 d0543943-73ff-0310-b7d9-9358b9ac24b2

26 files changed:
src/include/switch_console.h
src/include/switch_loadable_module.h
src/include/switch_module_interfaces.h
src/include/switch_types.h
src/include/switch_utils.h
src/include/switch_xml.h
src/mod/applications/mod_commands/mod_commands.c
src/mod/dialplans/mod_dialplan_directory/mod_dialplan_directory.c
src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c
src/mod/endpoints/mod_dingaling/mod_dingaling.c
src/mod/endpoints/mod_exosip/mod_exosip.c
src/mod/endpoints/mod_iax/mod_iax.c
src/mod/endpoints/mod_opal/mod_opal.c
src/mod/endpoints/mod_portaudio/mod_portaudio.c
src/mod/endpoints/mod_wanpipe/mod_wanpipe.c
src/mod/endpoints/mod_woomera/mod_woomera.c
src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c
src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c
src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c
src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
src/mod/loggers/mod_console/mod_console.c
src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c
src/switch_console.c
src/switch_loadable_module.c
src/switch_utils.c
src/switch_xml.c

index 3b7701cc89b4e72fc405fb21fdc55734be63bfbc..7789a4fcd0465b636d561c379f308133c56092e1 100644 (file)
@@ -53,6 +53,10 @@ SWITCH_DECLARE(void) switch_console_loop(void);
 */
 SWITCH_DECLARE(void) switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt, ...);
 
+/*!
+  \brief A method akin to printf for dealing with api streams
+*/
+SWITCH_DECLARE(switch_status_t) switch_console_stream_write(switch_stream_handle_t *handle, char *fmt, ...);
 END_EXTERN_C
 
 #endif
index 185fb74d50c4a6c88acce36f941f6e1f7c26cc45..31f7a273d030c0b6f62d6b3f0470ce4792385dc4 100644 (file)
@@ -193,11 +193,11 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(switch_codec_interf
   \brief Execute a registered API command
   \param cmd the name of the API command to execute
   \param arg the optional arguement to the command
-  \param retbuf a buffer to write output to
-  \param len the length in bytes of retbuf
+  \param stream stream for output
   \return the status returned by the API call
 */
-SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, char *retbuf, switch_size_t len);
+SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, switch_stream_handle_t *stream);
+
 
 
 /*!
index 2198293901471ce21ca363e39a40e2db9684a176..85af4379e476902f4832a95623442970de31d88d 100644 (file)
@@ -62,6 +62,14 @@ struct switch_state_handler_table {
        switch_state_handler_t on_hold;
 };
 
+struct switch_stream_handle {
+       switch_stream_handle_write_function_t write_function;
+       void *data;
+       void *end;
+       switch_size_t data_size;
+       switch_size_t data_len;
+};
+
 /*! \brief Node in which to store custom outgoing channel callback hooks */
 struct switch_io_event_hook_outgoing_channel {
        /*! the outgoing channel callback hook*/
index 1bc5aad546c91b994d5561d785e630b5737726a3..bb0c72149135b0888195ea1bc3fe1f89aba8a1fa 100644 (file)
@@ -671,7 +671,9 @@ typedef switch_status_t (*switch_kill_channel_hook_t)(switch_core_session_t *, i
 typedef switch_status_t (*switch_waitfor_read_hook_t)(switch_core_session_t *, int, int);
 typedef switch_status_t (*switch_waitfor_write_hook_t)(switch_core_session_t *, int, int);
 typedef switch_status_t (*switch_send_dtmf_hook_t)(switch_core_session_t *, char *);
-typedef switch_status_t (*switch_api_function_t)(char *in, char *out, switch_size_t outlen);
+typedef struct switch_stream_handle switch_stream_handle_t;
+typedef switch_status_t (*switch_stream_handle_write_function_t)(switch_stream_handle_t *handle, char *fmt, ...);
+typedef switch_status_t (*switch_api_function_t)(char *in, switch_stream_handle_t *stream);
 typedef switch_status_t (*switch_dtmf_callback_function_t)(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen);
 typedef int (*switch_core_db_callback_func_t)(void *pArg, int argc, char **argv, char **columnNames);
 typedef switch_status_t (*switch_module_load_t) (switch_loadable_module_interface_t **, char *);
@@ -686,10 +688,11 @@ typedef struct switch_core_time_duration switch_core_time_duration_t;
 typedef switch_xml_t (*switch_xml_search_function_t)(char *section,
                                                                                                         char *tag_name,
                                                                                                         char *key_name,
-                                                                                                        char *key_value);
+                                                                                                        char *key_value,
+                                                                                                        char *params);
 
-/* things we don't deserve to know about */
 
+/* things we don't deserve to know about */
 /*! \brief A channel */
 struct switch_channel;
 /*! \brief A core session representing a call and all of it's resources */
index 06aedbff0ab090359300ab1065665458308d3c57..f5395faf56d55b875a4c3cd2ed76487a3754e2b4 100644 (file)
@@ -184,7 +184,8 @@ SWITCH_DECLARE(char *) switch_string_replace(const char *string, const char *sea
 SWITCH_DECLARE(switch_status_t) switch_string_match(const char *string, size_t string_len, const char *search, size_t search_len);
 
 #define SWITCH_READ_ACCEPTABLE(status) status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK
-
+SWITCH_DECLARE(int) switch_url_encode(char *url, char *buf, size_t len);
+SWITCH_DECLARE(char *) switch_url_decode(char *s);
 END_EXTERN_C
 
 #endif
index 654f785572386befb800d25b96920ec131a571d4..c909f9b665da337beef7353f7c48d2f193d754b3 100644 (file)
@@ -196,9 +196,10 @@ SWITCH_DECLARE(switch_status_t) switch_xml_locate(char *section,
                                                                                                  char *key_name,
                                                                                                  char *key_value,
                                                                                                  switch_xml_t *root,
-                                                                                                 switch_xml_t *node);
+                                                                                                 switch_xml_t *node,
+                                                                                                 char *params);
                                                                                                 
-SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t *node);
+SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t *node, char *params);
 SWITCH_DECLARE(switch_status_t) switch_xml_bind_search_function(switch_xml_search_function_t function);
 
 END_EXTERN_C
index 83e9525de554e1f54cf186042905f04d1c6f0657..82f32a214e8739f7823178f3170517bfc422b347 100644 (file)
 
 static const char modname[] = "mod_commands";
 
+static switch_status_t status_function(char *cmd, switch_stream_handle_t *stream)
+{
+       switch_core_time_duration_t duration;
+       switch_core_measure_time(switch_core_uptime(), &duration);
 
-static switch_status_t load_function(char *mod, char *out, size_t outlen)
+       stream->write_function(stream, "<b>UP %u year(s), %u day(s), %u hour(s), %u minute(s), %u second(s), %u millisecond(s), %u microsecond(s)</b>\n",
+                                                  duration.yr,
+                                                  duration.day,
+                                                  duration.hr,
+                                                  duration.min,
+                                                  duration.sec,
+                                                  duration.ms,
+                                                  duration.mms
+                                                  );
+       return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t load_function(char *mod, switch_stream_handle_t *stream)
 {
        switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) mod);
-       snprintf(out, outlen, "OK\n");
+        stream->write_function(stream, "OK\n");
        return SWITCH_STATUS_SUCCESS;
 }
 
-static switch_status_t kill_function(char *dest, char *out, size_t outlen)
+static switch_status_t kill_function(char *dest, switch_stream_handle_t *stream)
 {
        switch_core_session_t *session = NULL;
 
@@ -50,16 +66,16 @@ static switch_status_t kill_function(char *dest, char *out, size_t outlen)
                switch_core_session_kill_channel(session, SWITCH_SIG_KILL);
                switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
                switch_core_session_rwunlock(session);
-               snprintf(out, outlen, "OK\n");
+               stream->write_function(stream, "OK\n");
        } else {
-               snprintf(out, outlen, "No Such Channel!\n");
+               stream->write_function(stream, "No Such Channel!\n");
        }
 
        return SWITCH_STATUS_SUCCESS;
 }
 
 
-static switch_status_t transfer_function(char *cmd, char *out, size_t outlen)
+static switch_status_t transfer_function(char *cmd, switch_stream_handle_t *stream)
 {
        switch_core_session_t *session = NULL;
        char *argv[4] = {0};
@@ -68,7 +84,7 @@ static switch_status_t transfer_function(char *cmd, char *out, size_t outlen)
        argc = switch_separate_string(cmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
 
        if (argc < 2 || argc > 4) {
-               snprintf(out, outlen, "Invalid Parameters\n");
+               stream->write_function(stream, "Invalid Parameters\n");
        } else {
                char *uuid = argv[0];
                char *dest = argv[1];
@@ -78,15 +94,15 @@ static switch_status_t transfer_function(char *cmd, char *out, size_t outlen)
                if ((session = switch_core_session_locate(uuid))) {
 
                        if (switch_ivr_session_transfer(session, dest, dp, context) == SWITCH_STATUS_SUCCESS) {
-                               snprintf(out, outlen, "OK\n");
+                                stream->write_function(stream, "OK\n");
                        } else {
-                               snprintf(out, outlen, "ERROR\n");
+                               stream->write_function(stream, "ERROR\n");
                        }
 
                        switch_core_session_rwunlock(session);
 
                } else {
-                       snprintf(out, outlen, "No Such Channel!\n");
+                       stream->write_function(stream, "No Such Channel!\n");
                }
        }
 
@@ -96,7 +112,7 @@ static switch_status_t transfer_function(char *cmd, char *out, size_t outlen)
 
 
 
-static switch_status_t pause_function(char *cmd, char *out, size_t outlen)
+static switch_status_t pause_function(char *cmd, switch_stream_handle_t *stream)
 {
        switch_core_session_t *session = NULL;
        char *argv[4] = {0};
@@ -105,7 +121,7 @@ static switch_status_t pause_function(char *cmd, char *out, size_t outlen)
        argc = switch_separate_string(cmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
 
        if (argc < 2) {
-               snprintf(out, outlen, "Invalid Parameters\n");
+               stream->write_function(stream, "Invalid Parameters\n");
        } else {
                char *uuid = argv[0];
                char *dest = argv[1];
@@ -122,66 +138,32 @@ static switch_status_t pause_function(char *cmd, char *out, size_t outlen)
                        switch_core_session_rwunlock(session);
 
                } else {
-                       snprintf(out, outlen, "No Such Channel!\n");
+                       stream->write_function(stream, "No Such Channel!\n");
                }
        }
 
        return SWITCH_STATUS_SUCCESS;
 }
 
-struct show_return {
-       char *out;
-       size_t remaining;
-};
-
 static int show_callback(void *pArg, int argc, char **argv, char **columnNames){
-       struct show_return *returnval = (struct show_return *) pArg;
-       char temp[1024];
-       size_t len;
-
-       sprintf(temp, "%s\n", argv[1]);
-       len = strlen(temp);
+       switch_stream_handle_t *stream = (switch_stream_handle_t *) pArg;
 
-       if (len < returnval->remaining) {
-               strcpy(returnval->out, temp);
-               returnval->remaining -= len;
-               returnval->out += len;
-       }
+       stream->write_function(stream, "%s\n", argv[1]);
        return 0;
 }
 
-static switch_status_t status_function(char *cmd, char *out, size_t outlen)
-{
-       switch_core_time_duration_t duration;
-       switch_core_measure_time(switch_core_uptime(), &duration);
 
-       snprintf(out, outlen, "<b>UP %u year(s), %u day(s), %u hour(s), %u minute(s), %u second(s), %u millisecond(s), %u microsecond(s)</b>\n",
-                        duration.yr,
-                        duration.day,
-                        duration.hr,
-                        duration.min,
-                        duration.sec,
-                        duration.ms,
-                        duration.mms
-                        );
-       return SWITCH_STATUS_SUCCESS;
-}
-
-static switch_status_t show_function(char *cmd, char *out, size_t outlen)
+static switch_status_t show_function(char *cmd, switch_stream_handle_t *stream)
 {
        char sql[1024];
        char *errmsg;
-       struct show_return returnval;
        switch_core_db_t *db = switch_core_db_handle();
 
        sprintf (sql, "select * from interfaces");
-       returnval.out = out;
-       returnval.remaining = outlen;
-
-       switch_core_db_exec(db, sql, show_callback, &returnval, &errmsg);
+       switch_core_db_exec(db, sql, show_callback, stream, &errmsg);
 
        if (errmsg) {
-               snprintf(out, outlen, "SQL ERR [%s]\n",errmsg);
+               stream->write_function(stream, "SQL ERR [%s]\n",errmsg);
                switch_core_db_free(errmsg);
                errmsg = NULL;
        }
@@ -234,7 +216,6 @@ static switch_api_interface_t commands_api_interface = {
        /*.next */ &load_api_interface
 };
 
-
 static const switch_loadable_module_interface_t mod_commands_module_interface = {
        /*.module_name */ modname,
        /*.endpoint_interface */ NULL,
index abcafa2998243b155546e4bb8b647cb860666b0b..4e9a40c6947f8849b026607c4d70844787f2365d 100644 (file)
@@ -57,7 +57,7 @@ static void load_config(void)
        switch_xml_t cfg, xml, settings, param;
 
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return;
        }
index 2d401a421f3c57b01e5d512ad078c24c5aa56e68..a64e3b4157fbfc155047d3f10a0c64c448d89636 100644 (file)
@@ -131,7 +131,7 @@ static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session)
        char *exten_name = NULL;
        switch_xml_t cfg, xml, xcontext, xexten, xaction, xcond;
        char *context = NULL;
-
+       char params[1024];
 
        channel = switch_core_session_get_channel(session);
        if ((caller_profile = switch_channel_get_caller_profile(channel))) {
@@ -142,10 +142,10 @@ static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session)
        }
 
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Processing %s->%s!\n", caller_profile->caller_id_name,
-                                                 caller_profile->destination_number);
-
+                                         caller_profile->destination_number);
        
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       snprintf(params, sizeof(params), "dest=%s", caller_profile->destination_number);
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, params))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
                return NULL;            
index fcaa880f99bbcc696a642d23d20437ebeb5f623a..10d04c4596f555b8d912b0cc1a8ae2a1037773b5 100644 (file)
@@ -148,8 +148,8 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, globals.dialplan);
 SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_string, globals.codec_string);
 SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_rates_string, globals.codec_rates_string);
 
-static switch_status_t dl_login(char *arg, char *out, size_t outlen);
-static switch_status_t dl_logout(char *profile_name, char *out, size_t outlen);
+static switch_status_t dl_login(char *arg, switch_stream_handle_t *stream);
+static switch_status_t dl_logout(char *profile_name, switch_stream_handle_t *stream);
 static switch_status_t channel_on_init(switch_core_session_t *session);
 static switch_status_t channel_on_hangup(switch_core_session_t *session);
 static switch_status_t channel_on_ring(switch_core_session_t *session);
@@ -1222,20 +1222,20 @@ static void set_profile_val(struct mdl_profile *profile, char *var, char *val)
        }
 }
 
-static switch_status_t dl_logout(char *profile_name, char *out, size_t outlen)
+static switch_status_t dl_logout(char *profile_name, switch_stream_handle_t *stream)
 {
        struct mdl_profile *profile;
        if ((profile = switch_core_hash_find(globals.profile_hash, profile_name))) {
                ldl_handle_stop(profile->handle);
-               snprintf(out, outlen, "OK\n");
+               stream->write_function(stream, "OK\n");
        } else {
-               snprintf(out, outlen, "NO SUCH PROFILE %s\n", profile_name);
+               stream->write_function(stream, "NO SUCH PROFILE %s\n", profile_name);
        }
 
        return SWITCH_STATUS_SUCCESS;
 }
 
-static switch_status_t dl_login(char *arg, char *out, size_t outlen)
+static switch_status_t dl_login(char *arg, switch_stream_handle_t *stream)
 {
        char *argv[10] = {0};
        int argc = 0;
@@ -1244,7 +1244,7 @@ static switch_status_t dl_login(char *arg, char *out, size_t outlen)
        int x;
 
        if (switch_strlen_zero(arg)) {
-               snprintf(out, outlen, "FAIL\n");
+               stream->write_function(stream, "FAIL\n");
                return SWITCH_STATUS_SUCCESS;
        }
 
@@ -1259,7 +1259,7 @@ static switch_status_t dl_login(char *arg, char *out, size_t outlen)
                if (profile) {
                        if (switch_test_flag(profile, TFLAG_IO)) {
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Profile already exists.");
-                               snprintf(out, outlen, "Profile already exists\n");
+                               stream->write_function(stream, "Profile already exists\n");
                                return SWITCH_STATUS_SUCCESS;
                        }
 
@@ -1277,9 +1277,9 @@ static switch_status_t dl_login(char *arg, char *out, size_t outlen)
        }
        
        if (profile && init_profile(profile, 1) == SWITCH_STATUS_SUCCESS) {
-               snprintf(out, outlen, "OK\n");
+               stream->write_function(stream, "OK\n");
        } else {
-               snprintf(out, outlen, "FAIL\n");
+               stream->write_function(stream, "FAIL\n");
        }
 
        return SWITCH_STATUS_SUCCESS;
@@ -1298,7 +1298,7 @@ static switch_status_t load_config(void)
 
        switch_core_hash_init(&globals.profile_hash, module_pool);      
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index 29d4b19282ee573ff4c5d1df605537c41062b96e..1c7feb958d7e7ce0f4feb75d42fd5bcdfd0a2ad5 100644 (file)
@@ -1609,7 +1609,7 @@ static int config_exosip(int reload)
 
        globals.bytes_per_frame = DEFAULT_BYTES_PER_FRAME;
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index 6182ea5a42a46b15b2b3676ad4b882b60ba9c644..8bb79bfb6033c9da52d2d11fd29cdd750c108b4c 100644 (file)
@@ -822,7 +822,7 @@ static switch_status_t load_config(void)
 
        memset(&globals, 0, sizeof(globals));
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index 3a5b126892cb92b1a4d4a2f92c0515d940f31c66..d093ddeed2188d75c18d8e8ee5f5d9aaad8914b1 100644 (file)
@@ -352,7 +352,7 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
 
        memset(&globals, 0, sizeof(globals));
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index 5d424234db9be1718f1917d0c4c20345187d3223..824511c6beda238de68830f9338415caddc234d8 100644 (file)
@@ -115,11 +115,11 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, globals.dialplan)
         static int dump_info(void);
         static switch_status_t load_config(void);
         static int get_dev_by_name(char *name, int in);
-        static switch_status_t place_call(char *dest, char *out, size_t outlen);
-        static switch_status_t hup_call(char *callid, char *out, size_t outlen);
-        static switch_status_t call_info(char *callid, char *out, size_t outlen);
-        static switch_status_t send_dtmf(char *callid, char *out, size_t outlen);
-        static switch_status_t answer_call(char *callid, char *out, size_t outlen);
+        static switch_status_t place_call(char *dest, switch_stream_handle_t *stream);
+        static switch_status_t hup_call(char *callid, switch_stream_handle_t *stream);
+        static switch_status_t call_info(char *callid, switch_stream_handle_t *stream);
+        static switch_status_t send_dtmf(char *callid, switch_stream_handle_t *stream);
+        static switch_status_t answer_call(char *callid, switch_stream_handle_t *stream);
 
 /* 
    State methods they get called when the state changes to the specific state 
@@ -571,7 +571,7 @@ static switch_status_t load_config(void)
 
        memset(&globals, 0, sizeof(globals));
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
@@ -794,7 +794,7 @@ static switch_status_t engage_device(struct private_object *tech_pvt)
        return SWITCH_STATUS_FALSE;
 }
 
-static switch_status_t place_call(char *dest, char *out, size_t outlen)
+static switch_status_t place_call(char *dest, switch_stream_handle_t *stream)
 {
        switch_core_session_t *session;
        switch_status_t status = SWITCH_STATUS_FALSE;
@@ -804,8 +804,8 @@ static switch_status_t place_call(char *dest, char *out, size_t outlen)
                return SWITCH_STATUS_FALSE;
        }
 
-       strncpy(out, "FAIL", outlen - 1);
-
+       stream->write_function(stream, "FAIL");
+       
        if ((session = switch_core_session_request(&channel_endpoint_interface, NULL)) != 0) {
                struct private_object *tech_pvt;
                switch_channel_t *channel;
@@ -838,14 +838,14 @@ static switch_status_t place_call(char *dest, char *out, size_t outlen)
                if ((status = engage_device(tech_pvt)) == SWITCH_STATUS_SUCCESS) {
                        switch_channel_set_state(channel, CS_INIT);
                        switch_core_session_thread_launch(tech_pvt->session);
-                       snprintf(out, outlen, "SUCCESS:%s:%s", tech_pvt->call_id, switch_core_session_get_uuid(tech_pvt->session));
+                       stream->write_function(stream, "SUCCESS:%s:%s", tech_pvt->call_id, switch_core_session_get_uuid(tech_pvt->session));
                }
        }
        return status;
 }
 
 
-static switch_status_t hup_call(char *callid, char *out, size_t outlen)
+static switch_status_t hup_call(char *callid, switch_stream_handle_t *stream)
 {
        struct private_object *tech_pvt;
        switch_channel_t *channel = NULL;
@@ -869,7 +869,7 @@ static switch_status_t hup_call(char *callid, char *out, size_t outlen)
                        i++;
                }
 
-               snprintf(out, outlen, "HUNGUP: %d", i);
+               stream->write_function(stream, "HUNGUP: %d", i);
 
                return SWITCH_STATUS_SUCCESS;
        }
@@ -880,16 +880,16 @@ static switch_status_t hup_call(char *callid, char *out, size_t outlen)
                assert(channel != NULL);
 
                switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
-               strncpy(out, "OK", outlen - 1);
+               stream->write_function(stream, "OK");
        } else {
-               strncpy(out, "NO SUCH CALL", outlen - 1);
+               stream->write_function(stream, "NO SUCH CALL");
        }
 
        return SWITCH_STATUS_SUCCESS;
 }
 
 
-static switch_status_t send_dtmf(char *callid, char *out, size_t outlen)
+static switch_status_t send_dtmf(char *callid, switch_stream_handle_t *stream)
 {
        struct private_object *tech_pvt = NULL;
        switch_channel_t *channel = NULL;
@@ -905,15 +905,15 @@ static switch_status_t send_dtmf(char *callid, char *out, size_t outlen)
                channel = switch_core_session_get_channel(tech_pvt->session);
                assert(channel != NULL);
                switch_channel_queue_dtmf(channel, dtmf);
-               strncpy(out, "OK", outlen - 1);
+               stream->write_function(stream, "OK");
        } else {
-               strncpy(out, "NO SUCH CALL", outlen - 1);
+               stream->write_function(stream, "NO SUCH CALL");
        }
 
        return SWITCH_STATUS_SUCCESS;
 }
 
-static switch_status_t answer_call(char *callid, char *out, size_t outlen)
+static switch_status_t answer_call(char *callid, switch_stream_handle_t *stream)
 {
        struct private_object *tech_pvt = NULL;
        switch_channel_t *channel = NULL;
@@ -924,20 +924,20 @@ static switch_status_t answer_call(char *callid, char *out, size_t outlen)
                switch_set_flag(tech_pvt, TFLAG_ANSWER);
                switch_channel_answer(channel);
        } else {
-               strncpy(out, "NO SUCH CALL", outlen - 1);
+               stream->write_function(stream, "NO SUCH CALL");
        }
        return SWITCH_STATUS_SUCCESS;
 }
 
 
-static void print_info(struct private_object *tech_pvt, char *out, size_t outlen)
+static void print_info(struct private_object *tech_pvt, switch_stream_handle_t *stream)
 {
        switch_channel_t *channel = NULL;
        channel = switch_core_session_get_channel(tech_pvt->session);
        assert(channel != NULL);
 
-       snprintf(out, outlen, "CALL %s\t%s\t%s\t%s\t%s\n",
-                        tech_pvt->call_id,
+       stream->write_function(stream, "CALL %s\t%s\t%s\t%s\t%s\n",
+                                                  tech_pvt->call_id,
                         tech_pvt->caller_profile->caller_id_name ? tech_pvt->caller_profile->caller_id_name : "n/a",
                         tech_pvt->caller_profile->caller_id_number ? tech_pvt->caller_profile->caller_id_number : "n/a",
                         tech_pvt->caller_profile->destination_number ? tech_pvt->caller_profile->destination_number : "n/a",
@@ -945,7 +945,7 @@ static void print_info(struct private_object *tech_pvt, char *out, size_t outlen
 
 }
 
-static switch_status_t call_info(char *callid, char *out, size_t outlen)
+static switch_status_t call_info(char *callid, switch_stream_handle_t *stream)
 {
        struct private_object *tech_pvt;
        switch_hash_index_t *hi;
@@ -954,12 +954,12 @@ static switch_status_t call_info(char *callid, char *out, size_t outlen)
                for (hi = apr_hash_first(module_pool, globals.call_hash); hi; hi = switch_hash_next(hi)) {
                        switch_hash_this(hi, NULL, NULL, &val);
                        tech_pvt = val;
-                       print_info(tech_pvt, out + strlen(out), outlen - strlen(out));
+                       print_info(tech_pvt, stream);
                }
        } else if (callid && (tech_pvt = switch_core_hash_find(globals.call_hash, callid)) != 0) {
                print_info(tech_pvt, out, outlen);
        } else {
-               strncpy(out, "NO SUCH CALL", outlen - 1);
+               stream->write_function(stream, "NO SUCH CALL");
        }
 
        return SWITCH_STATUS_SUCCESS;
index 331548f2311caf7a0e6f3becf6f6b39a6caff48c..47e82392449adef5d5e4c9c772cec97fb3c631f1 100644 (file)
@@ -1293,7 +1293,7 @@ static switch_status_t config_wanpipe(int reload)
        globals.dtmf_off = 50;
 
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index 0d20b3b4cd01dd946a9f5ffdb9e050f0762d43bc..37febb70577f277aea7c5d1fa38682e8e1c263ac 100644 (file)
@@ -1308,7 +1308,7 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
        memset(&globals, 0, sizeof(globals));
        globals.next_woomera_port = WOOMERA_MIN_PORT;
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index dae1addd22c14fe7cf21c072833d3232a5eaf5fe..655c1b5d60c963b038483b64ca4acc6d42123f82 100644 (file)
@@ -54,7 +54,7 @@ static switch_status_t load_config(void)
        char *cf = "event_multicast.conf";
        switch_xml_t cfg, xml, settings, param;
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index 098affa4555afb3f66a29dd7959679697d539660..c4d6cea030a547af4e59201eb7eb7021b2ef1b0a 100644 (file)
@@ -104,7 +104,7 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_jid, globals.jid)
 
        memset(&globals, 0, sizeof(globals));
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index a0b1c88a3a84b9f0533b698599b21e901c0ce7ca..05234cbca96bf7e952a7f1cb07cecc41b9ae2b51 100644 (file)
@@ -199,7 +199,7 @@ static switch_status_t load_config(void)
        sw_discovery_oid *oid;
        switch_xml_t cfg, xml, settings, param;
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index 5f2def4c217ece2bb9e4050213a74682d9c9d195..f57719f3c45ce36622e91e379de8d2fead1e67ae 100644 (file)
@@ -1791,8 +1791,13 @@ static JSBool js_api_execute(JSContext *cx, JSObject *obj, uintN argc, jsval *ar
        if (argc > 1) {
                char *cmd = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
                char *arg = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
+               switch_stream_handle_t stream = {0};
                char retbuf[2048] = "";
-               switch_api_execute(cmd, arg, retbuf, sizeof(retbuf));
+
+               stream.data = retbuf;
+               stream.end = stream.data;
+               stream.data_size = sizeof(retbuf);
+               switch_api_execute(cmd, arg, &stream);
                *rval = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, retbuf));
        } else {
                *rval = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, ""));
@@ -2149,16 +2154,16 @@ static void js_thread_launch(char *text)
 }
 
 
-static switch_status_t launch_async(char *text, char *out, size_t outlen)
+static switch_status_t launch_async(char *text, switch_stream_handle_t *stream)
 {
 
        if (switch_strlen_zero(text)) {
-               switch_copy_string(out, "INVALID", outlen);
+               stream->write_function(stream, "INVALID");
                return SWITCH_STATUS_SUCCESS;
        }
 
        js_thread_launch(text);
-       switch_copy_string(out, "OK", outlen);
+       stream->write_function(stream, "OK");
        return SWITCH_STATUS_SUCCESS;
 }
 
index 0fe866d3a09f04a10139a4552358f4afe2461077..4598265bd0c93f2a75f9308516ad55aa99c37c03 100644 (file)
@@ -83,7 +83,7 @@ static switch_status_t config_logger(void)
        char *cf = "console.conf";
        switch_xml_t cfg, xml, settings, param;
 
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
index f395c39a67cc175e0e84611269ad4668c3884c5f..c83c511e256a0b4dfd2ca077c426b45b2c64036e 100644 (file)
@@ -41,6 +41,7 @@
 static const char modname[] = "mod_xml_rpc";
 
 
+
 static struct {
        int port;
        uint8_t running;
@@ -65,16 +66,18 @@ static size_t file_callback(void *ptr, size_t size, size_t nmemb, void *data)
 
 
 static switch_xml_t xml_url_fetch(char *section,
-                                                  char *tag_name,
-                                                  char *key_name,
-                                                  char *key_value)
+                                                                 char *tag_name,
+                                                                 char *key_name,
+                                                                 char *key_value,
+                                                                 char *params)
 {
        char url[1024] = "", filename[1024] = "";
        CURL *curl_handle = NULL;
        struct config_data config_data;
        switch_xml_t xml;
-
-       snprintf(url, sizeof(url), "%s?section=%s&tag_name=%s&key_name=%s&key_value=%s\n", globals.url, section, tag_name, key_name, key_value);
+       
+       snprintf(url, sizeof(url), "%s?section=%s&tag_name=%s&key_name=%s&key_value=%s%s%s\n", 
+                        globals.url, section, tag_name, key_name, key_value, params ? "&" : "", params ? params : "");
        srand(time(NULL) + strlen(url));
        snprintf(filename, sizeof(filename), "%s%04x.tmp", SWITCH_GLOBAL_dirs.temp_dir, (rand() & 0xffff));
        curl_global_init(CURL_GLOBAL_ALL);
@@ -126,7 +129,7 @@ static switch_status_t do_config(void)
        char *cf = "xml_rpc.conf";
        switch_xml_t cfg, xml, settings, param;
        
-       if (!(xml = switch_xml_open_cfg(cf, &cfg))) {
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
                return SWITCH_STATUS_TERM;
        }
@@ -171,13 +174,37 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
 }
 
 
-#define CMDLEN 10240
+static switch_status_t http_stream_write(switch_stream_handle_t *handle, char *fmt, ...)
+{
+       va_list ap;
+       TSession *r = handle->data;
+       int ret = 0;
+       char *data;
+
+       va_start(ap, fmt);
+#ifdef HAVE_VASPRINTF
+       ret = vasprintf(&data, fmt, ap);
+#else
+       if ((data = (char *) malloc(2048))) {
+               vsnprintf(data, 2048, fmt, ap);
+       }
+#endif
+       va_end(ap);
+       
+       if (data) {
+               ret = 0;
+               HTTPWrite(r, data, strlen(data));
+               free(data);
+       }
+       
+       return ret ? SWITCH_STATUS_FALSE : SWITCH_STATUS_SUCCESS;
+}
+
 abyss_bool HandleHook(TSession *r)
 {
     char *m = "text/html";
-       char *retbuf = malloc(CMDLEN);
        char *command, *arg;
-       char *ret = NULL;
+       switch_stream_handle_t stream = {0};
 
        if(strncmp(r->uri, "/api/", 5)) {
                return FALSE;
@@ -191,33 +218,22 @@ abyss_bool HandleHook(TSession *r)
        }
        ResponseChunked(r);
        ResponseStatus(r,200);
-       memset(retbuf, 0, CMDLEN);
-       switch_api_execute(command, arg, retbuf, CMDLEN);
-       if (!strncasecmp(retbuf, "content-type: ", 14)) {
-
-               m = retbuf + 14;
-               if ((ret = strchr(m, '\n'))) {
-                       *ret++ = '\0';
-               }
-       }
-
-       if (!ret) {
-               ret = retbuf;
-       }
        ResponseContentType(r, m);
     ResponseWrite(r);
-       HTTPWrite(r, ret , strlen(ret));
+       stream.data = r;
+       stream.write_function = http_stream_write;
+       switch_api_execute(command, arg, &stream);
        HTTPWriteEnd(r);
        free(command);
-       free(retbuf);
     return TRUE;
 }
 
-
+#define CMDLEN 1024 * 256
 static xmlrpc_value *freeswitch_api(xmlrpc_env *const envP, xmlrpc_value *const paramArrayP, void *const userData) 
 {
        char *command, *arg;
        char *retbuf = malloc(CMDLEN);
+       switch_stream_handle_t stream = {0};
        xmlrpc_value *val;
 
     /* Parse our argument array. */
@@ -227,7 +243,11 @@ static xmlrpc_value *freeswitch_api(xmlrpc_env *const envP, xmlrpc_value *const
        }
 
        memset(retbuf, 0, CMDLEN);
-       switch_api_execute(command, arg, retbuf, CMDLEN);
+       stream.data = retbuf;
+       stream.end = stream.data;
+       stream.data_size = CMDLEN;
+       stream.write_function = switch_console_stream_write;
+       switch_api_execute(command, arg, &stream);
 
     /* Return our result. */
     val = xmlrpc_build_value(envP, "s", retbuf);
index bec20be0c3700d5723bfe3514f3a3f7673a06806..3a6d95ac5f24f9d88a99ca695350c15858610d05 100644 (file)
 #include <switch_console.h>
 #define CMD_BUFLEN 1024 * 1000
 
+
+SWITCH_DECLARE(switch_status_t) switch_console_stream_write(switch_stream_handle_t *handle, char *fmt, ...)
+{
+       va_list ap;
+       char *buf = handle->data;
+       char *end = handle->end;
+       int ret = 0;
+       char *data;
+
+       if (handle->data_len >= handle->data_size) {
+               return SWITCH_STATUS_FALSE;
+       }
+
+       va_start(ap, fmt);
+#ifdef HAVE_VASPRINTF
+       ret = vasprintf(&data, fmt, ap);
+#else
+       if ((data = (char *) malloc(2048))) {
+               vsnprintf(data, 2048, fmt, ap);
+       }
+#endif
+       va_end(ap);
+       
+       if (data) {
+               uint32_t len = handle->data_size - handle->data_len;
+
+               if (len <= strlen(data)) {
+                       ret = -1;
+               } else {
+                       ret = 0;
+                       snprintf(end, len, data);
+                       handle->data_len = strlen(buf);
+                       handle->end = handle->data + handle->data_len;
+               }
+               free(data);
+       }
+       
+       return ret ? SWITCH_STATUS_FALSE : SWITCH_STATUS_SUCCESS;
+}
+
+
 static int switch_console_process(char *cmd, char *retbuf, int retlen)
 {
        char *arg = NULL;
-
+       switch_stream_handle_t stream = {0};
 
        if (!strcmp(cmd, "shutdown") || !strcmp(cmd, "...")) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Bye!\n");
@@ -62,7 +103,11 @@ static int switch_console_process(char *cmd, char *retbuf, int retlen)
                *arg++ = '\0';
        }
 
-       if (switch_api_execute(cmd, arg, retbuf, retlen) == SWITCH_STATUS_SUCCESS) {
+       stream.data = retbuf;
+       stream.end = stream.data;
+       stream.data_size = retlen;
+       stream.write_function = switch_console_stream_write;
+       if (switch_api_execute(cmd, arg, &stream) == SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_CONSOLE, "API CALL [%s(%s)] output:\n%s\n", cmd, arg ? arg : "", retbuf);
        } else {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Unknown Command: %s\n", cmd);
index 2630babf4cdb6af2144eefd4bc7655b3a06ab4c7..90e616c8e15891bb60d3254f7eff6b36ab242d32 100644 (file)
@@ -471,7 +471,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init()
        switch_core_hash_init(&loadable_modules.directory_hash, loadable_modules.pool);
        switch_core_hash_init(&loadable_modules.dialplan_hash, loadable_modules.pool);
 
-       if ((xml = switch_xml_open_cfg(cf, &cfg))) {
+       if ((xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_xml_t mods, ld;
 
                if ((mods = switch_xml_child(cfg, "modules"))) {
@@ -491,7 +491,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init()
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "open of %s failed\n", cf);
        }
 
-       if ((xml = switch_xml_open_cfg(pcf, &cfg))) {
+       if ((xml = switch_xml_open_cfg(pcf, &cfg, NULL))) {
                switch_xml_t mods, ld;
 
                if ((mods = switch_xml_child(cfg, "modules"))) {
@@ -667,17 +667,22 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(switch_codec_interf
        return i;
 }
 
-SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, char *retbuf, switch_size_t len)
+SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, switch_stream_handle_t *stream)
 {
        switch_api_interface_t *api;
        switch_status_t status;
        switch_event_t *event;
 
+       assert(stream != NULL);
+       assert(stream->data != NULL);
+       assert(stream->write_function != NULL);
+
        if ((api = switch_loadable_module_get_api_interface(cmd)) != 0) {
-               status = api->function(arg, retbuf, len);
+               status = api->function(arg, stream);
        } else {
                status = SWITCH_STATUS_FALSE;
-               snprintf(retbuf, len, "INVALID COMMAND [%s]", cmd);
+               stream->write_function(stream, "INVALID COMMAND [%s]", cmd);
+               //snprintf(retbuf, len, "INVALID COMMAND [%s]", cmd);
        }
 
        if (switch_event_create(&event, SWITCH_EVENT_API) == SWITCH_STATUS_SUCCESS) {
@@ -687,7 +692,7 @@ SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, char *r
                if (arg) {
                        switch_event_add_header(event, SWITCH_STACK_BOTTOM, "API-Command-Arguement", arg);
                }
-               switch_event_add_body(event, retbuf);
+               //switch_event_add_body(event, retbuf);
                switch_event_fire(&event);
        }
 
index b2dfad522577e2cb9065b6101b56728972472f7a..82b3b5910cd31ac713661bd671ad7c0c66f20c87 100644 (file)
@@ -212,6 +212,51 @@ SWITCH_DECLARE(int) switch_socket_waitfor(switch_pollfd_t *poll, int ms)
        return nsds;
 }
 
+
+SWITCH_DECLARE(int) switch_url_encode(char *url, char *buf, size_t len)
+{
+    char *p;
+    int x = 0;
+    const char urlunsafe[] = " \"#%&+:;<=>?@[\\]^`{|}";
+    const char hex[] = "0123456789ABCDEF";
+
+    memset(buf, 0, len);
+    for( p = url ; *p ; p++) {
+        if (*p < ' ' || *p > '~' || strchr(urlunsafe, *p)) {
+            if ((x + 3) > len) {
+                break;
+            }
+            buf[x++] = '%';
+            buf[x++] = hex[*p >> 4];
+            buf[x++] = hex[*p & 0x0f];
+        } else {
+            buf[x++] = *p;
+        }
+        if (x == len) {
+            break;
+        }
+    }
+    return x;
+}
+
+SWITCH_DECLARE(char *) switch_url_decode(char *s)
+{
+       char *o;
+       unsigned int tmp;
+
+       for (o = s; *s; s++, o++) {
+               if (*s == '%' && strlen(s) > 2 && sscanf(s + 1, "%2x", &tmp) == 1) {
+                       *o = tmp;
+                       s += 2;
+               } else {
+                       *o = *s;
+               }
+       }
+       *o = '\0';
+       return s;
+}
+
+
 #ifdef WIN32
 //this forces certain symbols to not be optimized out of the dll
 void include_me(void)
index b13864287d1a1ab7f885f51a0fce30b6cc001a33..ef17e897f481885b222d4e7569abe132632797b6 100644 (file)
@@ -745,7 +745,8 @@ SWITCH_DECLARE(switch_status_t) switch_xml_locate(char *section,
                                                                                                  char *key_name,
                                                                                                  char *key_value,
                                                                                                  switch_xml_t *root,
-                                                                                                 switch_xml_t *node)
+                                                                                                 switch_xml_t *node,
+                                                                                                 char *params)
 {
        switch_xml_t conf = NULL;
        switch_xml_t tag = NULL;
@@ -756,7 +757,7 @@ SWITCH_DECLARE(switch_status_t) switch_xml_locate(char *section,
        switch_mutex_lock(XML_LOCK);
 
        for(binding = BINDINGS; binding; binding = binding->next) {
-               if ((xml = binding->function(section, tag_name, key_name, key_value))) {
+               if ((xml = binding->function(section, tag_name, key_name, key_value, params))) {
                        const char *err = NULL;
                        
                        err = switch_xml_error(xml);
@@ -883,7 +884,7 @@ SWITCH_DECLARE(switch_status_t) switch_xml_destroy(void)
        return SWITCH_STATUS_FALSE;
 }
 
-SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t *node)
+SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t *node, char *params)
 {
        switch_xml_t xml = NULL, cfg = NULL;
 
@@ -891,7 +892,7 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t *
 
        assert(MAIN_XML_ROOT != NULL);
 
-       if (switch_xml_locate("configuration", "configuration", "name", file_path, &xml, &cfg) == SWITCH_STATUS_SUCCESS) {
+       if (switch_xml_locate("configuration", "configuration", "name", file_path, &xml, &cfg, params) == SWITCH_STATUS_SUCCESS) {
                *node = cfg;
        }