From 9d44ed04094c87cf4111190ca905f85df2535b60 Mon Sep 17 00:00:00 2001 From: Andrew Thompson Date: Sat, 17 Jul 2010 14:02:57 -0400 Subject: [PATCH] Make XML fetch reply ACKs distinguishable, update freeswitch.erl --- .../mod_erlang_event/freeswitch.erl | 17 ++++++++++++++--- .../mod_erlang_event/handle_msg.c | 8 ++++++-- .../mod_erlang_event/mod_erlang_event.c | 5 +++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/mod/event_handlers/mod_erlang_event/freeswitch.erl b/src/mod/event_handlers/mod_erlang_event/freeswitch.erl index 97bea8da6d..b508a70f44 100644 --- a/src/mod/event_handlers/mod_erlang_event/freeswitch.erl +++ b/src/mod/event_handlers/mod_erlang_event/freeswitch.erl @@ -19,7 +19,7 @@ get_event_header/2, get_event_body/1, get_event_name/1, getpid/1, sendmsg/3, sendevent/3, sendevent_custom/3, handlecall/2, handlecall/3, start_fetch_handler/5, - start_log_handler/4, start_event_handler/4]). + start_log_handler/4, start_event_handler/4, fetch_reply/3]). -define(TIMEOUT, 5000). %% @doc Return the value for a specific header in an event or `{error,notfound}'. @@ -55,9 +55,21 @@ send(Node, Term) -> Response -> Response after ?TIMEOUT -> - timeout + timeout end. +fetch_reply(Node, FetchID, Reply) -> + {send, Node} ! {fetch_reply, FetchID, Reply}, + receive + {ok, FetchID} -> + ok; + {error, FetchID, Reason} -> + {error, Reason} + after ?TIMEOUT -> + timeout + end. + + %% @doc Make a blocking API call to FreeSWITCH. The result of the API call is %% returned or `timeout' if FreeSWITCH fails to respond. api(Node, Cmd, Args) -> @@ -268,7 +280,6 @@ start_handler(Node, Type, Module, Function, State) -> {foo, Node} ! Type, receive ok -> - io:format("OK!!!!!!!~n"), Self ! {Type, {ok, self()}}, apply(Module, Function, [Node, State]); {error,Reason} -> 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 c2026ed67a..18d4aa791d 100644 --- a/src/mod/event_handlers/mod_erlang_event/handle_msg.c +++ b/src/mod/event_handlers/mod_erlang_event/handle_msg.c @@ -205,18 +205,22 @@ static switch_status_t handle_msg_fetch_reply(listener_t *listener, ei_x_buff * /* Relay the status back to the fetch responder. */ if (status == is_waiting) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found waiting slot for %s\n", uuid_str); + ei_x_encode_tuple_header(rbuf, 2); ei_x_encode_atom(rbuf, "ok"); + _ei_x_encode_string(rbuf, uuid_str); /* Return here to avoid freeing the reply. */ return SWITCH_STATUS_SUCCESS; } else if (status == is_timeout) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Handler for %s timed out\n", uuid_str); - ei_x_encode_tuple_header(rbuf, 2); + ei_x_encode_tuple_header(rbuf, 3); ei_x_encode_atom(rbuf, "error"); + _ei_x_encode_string(rbuf, uuid_str); ei_x_encode_atom(rbuf, "timeout"); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found filled slot for %s\n", uuid_str); - ei_x_encode_tuple_header(rbuf, 2); + ei_x_encode_tuple_header(rbuf, 3); ei_x_encode_atom(rbuf, "error"); + _ei_x_encode_string(rbuf, uuid_str); ei_x_encode_atom(rbuf, "duplicate_response"); } } else { 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 adcd23eafe..4e0126f853 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 @@ -460,6 +460,11 @@ static switch_xml_t erlang_fetch(const char *sectionstr, const char *tag_name, c ei_get_type(rep->buff, &rep->index, &type, &size); + if (type == ERL_NIL_EXT) { + // empty string returned + goto cleanup; + } + if (type != ERL_STRING_EXT && type != ERL_BINARY_EXT) { /* XXX no unicode or character codes > 255 */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "XML fetch response contained non ASCII characters? (was type %d of size %d)\n", type, size);