From da2e0d710fb6f50b29a619ec2a7eb57003873f4b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 Jul 2008 18:19:56 +0000 Subject: [PATCH] add mod_snom git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9145 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- build/modules.conf.in | 1 + conf/autoload_configs/modules.conf.xml | 3 + conf/dialplan/default.xml | 23 +++ src/include/switch_types.h | 2 + .../applications/mod_dptools/mod_dptools.c | 73 +++++++++ src/mod/applications/mod_snom/Makefile | 2 + src/mod/applications/mod_snom/mod_snom.c | 143 ++++++++++++++++++ src/mod/endpoints/mod_sofia/mod_sofia.c | 8 +- src/mod/endpoints/mod_sofia/sofia.c | 1 + src/mod/endpoints/mod_sofia/sofia_presence.c | 7 +- src/switch_event.c | 1 + 11 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 src/mod/applications/mod_snom/Makefile create mode 100644 src/mod/applications/mod_snom/mod_snom.c diff --git a/build/modules.conf.in b/build/modules.conf.in index b194f71add..a8ed0a3fbf 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -13,6 +13,7 @@ applications/mod_esf applications/mod_fsv #applications/mod_soundtouch #applications/mod_rss +#applications/mod_snom #asr_tts/mod_flite #asr_tts/mod_pocketsphinx #asr_tts/mod_cepstral diff --git a/conf/autoload_configs/modules.conf.xml b/conf/autoload_configs/modules.conf.xml index b81d36f385..bcc340574d 100644 --- a/conf/autoload_configs/modules.conf.xml +++ b/conf/autoload_configs/modules.conf.xml @@ -47,6 +47,9 @@ + + + diff --git a/conf/dialplan/default.xml b/conf/dialplan/default.xml index 01aa18442a..05fcecec5b 100644 --- a/conf/dialplan/default.xml +++ b/conf/dialplan/default.xml @@ -64,6 +64,29 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 2eb117e468..07d3f79ef4 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1057,6 +1057,7 @@ typedef uint32_t switch_io_flag_t; SWITCH_EVENT_RELOADXML - XML registry has been reloaded SWITCH_EVENT_NOTIFY - Notification SWITCH_EVENT_SEND_MESSAGE - Message + SWITCH_EVENT_RECV_MESSAGE - Message SWITCH_EVENT_ALL - All events at once @@ -1113,6 +1114,7 @@ typedef enum { SWITCH_EVENT_RELOADXML, SWITCH_EVENT_NOTIFY, SWITCH_EVENT_SEND_MESSAGE, + SWITCH_EVENT_RECV_MESSAGE, SWITCH_EVENT_ALL } switch_event_types_t; diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 095c9c9c59..684b214b59 100644 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -2088,6 +2088,74 @@ SWITCH_STANDARD_APP(wait_for_silence_function) } +static switch_status_t event_chat_send(char *proto, char *from, char *to, char *subject, char *body, char *hint) +{ + switch_event_t *event; + + if (switch_event_create(&event, SWITCH_EVENT_RECV_MESSAGE) == SWITCH_STATUS_SUCCESS) { + if (proto) switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Proto", "%s", proto); + if (from) switch_event_add_header(event, SWITCH_STACK_BOTTOM, "From", "%s", from); + if (subject) switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Subject", "%s", subject); + if (hint) switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Hint", "%s", hint); + if (body) switch_event_add_body(event, "%s", body); + if (to) { + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "To", "%s", to); + const char *v; + if ((v = switch_core_get_variable(to))) { + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Command", "%s", v); + } + } + + if (switch_event_fire(&event) == SWITCH_STATUS_SUCCESS) { + return SWITCH_STATUS_SUCCESS; + } + + switch_event_destroy(&event); + } + + return SWITCH_STATUS_MEMERR; +} + + +static switch_status_t api_chat_send(char *proto, char *from, char *to, char *subject, char *body, char *hint) +{ + + if (to) { + const char *v; + switch_stream_handle_t stream = { 0 }; + char *cmd, *arg; + switch_chat_interface_t *ci; + + if (!(v = switch_core_get_variable(to))) { + v = to; + } + + cmd = strdup(v); + switch_assert(cmd); + + switch_url_decode(cmd); + + if ((arg = strchr(cmd, ' '))) { + *arg++ = '\0'; + } + + SWITCH_STANDARD_STREAM(stream); + switch_api_execute(cmd, arg, NULL, &stream); + + if (proto && (ci = switch_loadable_module_get_chat_interface(proto))) { + ci->chat_send("api", to, hint && strchr(hint, '/') ? hint : from, "text/plain", (char *) stream.data, NULL); + } + + switch_safe_free(stream.data); + + free(cmd); + + } + + return SWITCH_STATUS_SUCCESS; +} + + #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" @@ -2108,6 +2176,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load) switch_api_interface_t *api_interface; switch_application_interface_t *app_interface; switch_dialplan_interface_t *dp_interface; + switch_chat_interface_t *chat_interface; /* connect my internal structure to the blank pointer passed to me */ *module_interface = switch_loadable_module_create_module_interface(pool, modname); @@ -2116,6 +2185,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load) user_endpoint_interface->interface_name = "USER"; user_endpoint_interface->io_routines = &user_io_routines; + + SWITCH_ADD_CHAT(chat_interface, "event", event_chat_send); + SWITCH_ADD_CHAT(chat_interface, "api", api_chat_send); + SWITCH_ADD_API(api_interface, "strepoch", "Convert a date string into epoch time", strepoch_api_function, ""); SWITCH_ADD_API(api_interface, "chat", "chat", chat_api_function, "|||"); SWITCH_ADD_API(api_interface, "strftime", "strftime", strftime_api_function, ""); diff --git a/src/mod/applications/mod_snom/Makefile b/src/mod/applications/mod_snom/Makefile new file mode 100644 index 0000000000..2c35e6e98f --- /dev/null +++ b/src/mod/applications/mod_snom/Makefile @@ -0,0 +1,2 @@ +BASE=../../../.. +include $(BASE)/build/modmake.rules diff --git a/src/mod/applications/mod_snom/mod_snom.c b/src/mod/applications/mod_snom/mod_snom.c new file mode 100644 index 0000000000..5254bd1e17 --- /dev/null +++ b/src/mod/applications/mod_snom/mod_snom.c @@ -0,0 +1,143 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005/2006, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Anthony Minessale II + * + * mod_snom.c -- SNOM Specific Features + * + */ +#include + +SWITCH_MODULE_LOAD_FUNCTION(mod_snom_load); +SWITCH_MODULE_DEFINITION(mod_snom, mod_snom_load, NULL, NULL); + +static switch_bool_t snom_bind_key(const char *key, + const char *light, + const char *label, + const char *user, + const char *host, + const char *profile, + const char *action_name, + const char *action) +{ + switch_event_t *event; + + + if (user && host && profile) { + if (switch_event_create(&event, SWITCH_EVENT_SEND_MESSAGE) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "user", "%s", user); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "host", "%s", host); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "profile", "%s", profile); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "content-type", "application/x-buttons"); + if (action && action_name) { + switch_event_add_body(event, "k=%s\nc=%s\nl=%s\nn=%s\na=%s\n", key, light, label, action, action_name); + } else { + switch_event_add_body(event, "k=%s\nc=%s\nl=%s\n\n", key, light, label); + } + + switch_event_fire(&event); + } + return SWITCH_TRUE; + } + + return SWITCH_FALSE; +} + + +#define URL_SYNTAX "" +SWITCH_STANDARD_API(snom_url_api_function) +{ +#if 0 + char *tmp; + switch_event_serialize(stream->param_event, &tmp, SWITCH_TRUE); + printf("W00t\n%s\n", tmp); + free(tmp); +#endif + + return SWITCH_STATUS_SUCCESS; + +} + +#define KEY_BIND_SYNTAX "