diff --git a/src/mod/event_handlers/mod_erlang_event/ei_helpers.c b/src/mod/event_handlers/mod_erlang_event/ei_helpers.c
index 4f314c9733..67dd41bcc4 100644
--- a/src/mod/event_handlers/mod_erlang_event/ei_helpers.c
+++ b/src/mod/event_handlers/mod_erlang_event/ei_helpers.c
@@ -41,18 +41,19 @@
* */
#define put8(s,n) do { \
- (s)[0] = (char)((n) & 0xff); \
- (s) += 1; \
+ (s)[0] = (char)((n) & 0xff); \
+ (s) += 1; \
} while (0)
#define put32be(s,n) do { \
- (s)[0] = ((n) >> 24) & 0xff; \
- (s)[1] = ((n) >> 16) & 0xff; \
- (s)[2] = ((n) >> 8) & 0xff; \
- (s)[3] = (n) & 0xff; \
- (s) += 4; \
+ (s)[0] = ((n) >> 24) & 0xff; \
+ (s)[1] = ((n) >> 16) & 0xff; \
+ (s)[2] = ((n) >> 8) & 0xff; \
+ (s)[3] = (n) & 0xff; \
+ (s) += 4; \
} while (0)
+
void ei_link(listener_t *listener, erlang_pid *from, erlang_pid *to) {
char msgbuf[2048];
char *s;
@@ -92,21 +93,21 @@ void ei_encode_switch_event_headers(ei_x_buff *ebuf, switch_event_t *event)
ei_x_encode_list_header(ebuf, i+1);
if (uuid) {
- ei_x_encode_string(ebuf, switch_event_get_header(event, "unique-id"));
+ _ei_x_encode_string(ebuf, switch_event_get_header(event, "unique-id"));
} else {
ei_x_encode_atom(ebuf, "undefined");
}
for (hp = event->headers; hp; hp = hp->next) {
ei_x_encode_tuple_header(ebuf, 2);
- ei_x_encode_string(ebuf, hp->name);
- ei_x_encode_string(ebuf, hp->value);
+ _ei_x_encode_string(ebuf, hp->name);
+ _ei_x_encode_string(ebuf, hp->value);
}
if (event->body) {
ei_x_encode_tuple_header(ebuf, 2);
- ei_x_encode_string(ebuf, "body");
- ei_x_encode_string(ebuf, event->body);
+ _ei_x_encode_string(ebuf, "body");
+ _ei_x_encode_string(ebuf, event->body);
}
ei_x_encode_empty_list(ebuf);
diff --git a/src/mod/event_handlers/mod_erlang_event/erlang_event.conf.xml b/src/mod/event_handlers/mod_erlang_event/erlang_event.conf.xml
index 66d30f2853..d71084ed3f 100644
--- a/src/mod/event_handlers/mod_erlang_event/erlang_event.conf.xml
+++ b/src/mod/event_handlers/mod_erlang_event/erlang_event.conf.xml
@@ -3,7 +3,10 @@
-
-
+
+
+
+
+
diff --git a/src/mod/event_handlers/mod_erlang_event/handle_msg.c b/src/mod/event_handlers/mod_erlang_event/handle_msg.c
index 41034b1a59..f5c1cf3b07 100644
--- a/src/mod/event_handlers/mod_erlang_event/handle_msg.c
+++ b/src/mod/event_handlers/mod_erlang_event/handle_msg.c
@@ -101,8 +101,8 @@ static void *SWITCH_THREAD_FUNC api_exec(switch_thread_t *thread, void *obj)
else
ei_x_encode_atom(&ebuf, "bgerror");
- ei_x_encode_string(&ebuf, acs->uuid_str);
- ei_x_encode_string(&ebuf, reply);
+ _ei_x_encode_string(&ebuf, acs->uuid_str);
+ _ei_x_encode_string(&ebuf, reply);
switch_mutex_lock(acs->listener->sock_mutex);
ei_send(acs->listener->sockfd, &acs->pid, ebuf.buff, ebuf.index);
@@ -129,7 +129,7 @@ static void *SWITCH_THREAD_FUNC api_exec(switch_thread_t *thread, void *obj)
ei_x_encode_atom(&rbuf, "error");
}
- ei_x_encode_string(&rbuf, reply);
+ _ei_x_encode_string(&rbuf, reply);
switch_mutex_lock(acs->listener->sock_mutex);
@@ -360,7 +360,7 @@ static switch_status_t handle_msg_bgapi(listener_t *listener, erlang_msg *msg, i
ei_x_encode_tuple_header(rbuf, 2);
ei_x_encode_atom(rbuf, "ok");
- ei_x_encode_string(rbuf, acs->uuid_str);
+ _ei_x_encode_string(rbuf, acs->uuid_str);
}
return SWITCH_STATUS_SUCCESS;
}
diff --git a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c
index db1852fcbf..1bd5b4ee6b 100644
--- a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c
+++ b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c
@@ -380,10 +380,10 @@ static switch_xml_t erlang_fetch(const char *sectionstr, const char *tag_name, c
ei_x_encode_tuple_header(&buf, 7);
ei_x_encode_atom(&buf, "fetch");
ei_x_encode_atom(&buf, sectionstr);
- ei_x_encode_string(&buf, tag_name ? tag_name : "undefined");
- ei_x_encode_string(&buf, key_name ? key_name : "undefined");
- ei_x_encode_string(&buf, key_value ? key_value : "undefined");
- ei_x_encode_string(&buf, uuid_str);
+ _ei_x_encode_string(&buf, tag_name ? tag_name : "undefined");
+ _ei_x_encode_string(&buf, key_name ? key_name : "undefined");
+ _ei_x_encode_string(&buf, key_value ? key_value : "undefined");
+ _ei_x_encode_string(&buf, uuid_str);
ei_encode_switch_event_headers(&buf, params);
/*switch_core_hash_insert(ptr->reply_hash, uuid_str, );*/
@@ -840,6 +840,7 @@ static int config(void)
memset(&prefs, 0, sizeof(prefs));
prefs.shortname = SWITCH_TRUE;
+ prefs.encoding = ERLANG_STRING;
if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of %s failed\n", cf);
@@ -859,6 +860,14 @@ static int config(void)
set_pref_nodename(val);
} else if (!strcmp(var, "shortname")) {
prefs.shortname = switch_true(val);
+ } else if (!strcmp(var, "encoding")) {
+ if (!strcasecmp(val, "string")) {
+ prefs.encoding = ERLANG_STRING;
+ } else if (!strcasecmp(val, "binary")) {
+ prefs.encoding = ERLANG_BINARY;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid encoding strategy '%s' specified\n", val);
+ }
} else if (!strcasecmp(var, "apply-inbound-acl")) {
if (prefs.acl_count < MAX_ACL) {
prefs.acl[prefs.acl_count++] = strdup(val);
diff --git a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.h b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.h
index 4dbaf1ecf1..4cf99f943a 100644
--- a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.h
+++ b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.h
@@ -44,6 +44,11 @@ typedef enum {
ERLANG_REG_PROCESS
} process_type;
+typedef enum {
+ ERLANG_STRING = 0,
+ ERLANG_BINARY
+} erlang_encoding_t;
+
struct erlang_process {
process_type type;
char *reg_name;
@@ -163,6 +168,7 @@ struct prefs_struct {
char *acl[MAX_ACL];
uint32_t acl_count;
uint32_t id;
+ erlang_encoding_t encoding;
};
typedef struct prefs_struct prefs_t;
@@ -197,6 +203,16 @@ int ei_compare_pids(erlang_pid *pid1, erlang_pid *pid2);
switch_status_t initialise_ei(struct ei_cnode_s *ec);
#define ei_encode_switch_event(_b, _e) ei_encode_switch_event_tag(_b, _e, "event")
+/* crazy macro for toggling encoding type */
+#define _ei_x_encode_string(buf, string) switch (prefs.encoding) { \
+ case ERLANG_BINARY: \
+ ei_x_encode_binary(buf, string, strlen(string)); \
+ break; \
+ default: \
+ ei_x_encode_string(buf, string); \
+ break; \
+}
+
/* mod_erlang_event.c */
session_elem_t* attach_call_to_registered_process(listener_t* listener, char* reg_name, switch_core_session_t *session);
session_elem_t* attach_call_to_spawned_process(listener_t* listener, char *module, char *function, switch_core_session_t *session);