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 "