aboutsummaryrefslogtreecommitdiff
path: root/src/adhoc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/adhoc.erl')
-rw-r--r--src/adhoc.erl111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/adhoc.erl b/src/adhoc.erl
new file mode 100644
index 000000000..b6954d2ec
--- /dev/null
+++ b/src/adhoc.erl
@@ -0,0 +1,111 @@
+%%%----------------------------------------------------------------------
+%%% File : adhoc.erl
+%%% Author : Magnus Henoch <henoch@dtek.chalmers.se>
+%%% Purpose : Provide helper functions for ad-hoc commands (JEP-0050)
+%%% Created : 31 Oct 2005 by Magnus Henoch <henoch@dtek.chalmers.se>
+%%% Id : $Id$
+%%%----------------------------------------------------------------------
+
+-module(adhoc).
+-author('henoch@dtek.chalmers.se').
+-vsn('$Revision$ ').
+
+-export([parse_request/1,
+ produce_response/2,
+ produce_response/1]).
+
+-include("ejabberd.hrl").
+-include("jlib.hrl").
+-include("adhoc.hrl").
+
+%% Parse an ad-hoc request. Return either an adhoc_request record or
+%% an {error, ErrorType} tuple.
+parse_request(#iq{type = set, lang = Lang, sub_el = SubEl, xmlns = ?NS_COMMANDS}) ->
+ ?DEBUG("entering parse_request...", []),
+ Node = xml:get_tag_attr_s("node", SubEl),
+ SessionID = xml:get_tag_attr_s("sessionid", SubEl),
+ Action = xml:get_tag_attr_s("action", SubEl),
+ XData = find_xdata_el(SubEl),
+ {xmlelement, _, _, AllEls} = SubEl,
+ if XData ->
+ Others = lists:delete(XData, AllEls);
+ true ->
+ Others = AllEls
+ end,
+
+ #adhoc_request{lang = Lang,
+ node = Node,
+ sessionid = SessionID,
+ action = Action,
+ xdata = XData,
+ others = Others};
+parse_request(_) ->
+ {error, ?ERR_BAD_REQUEST}.
+
+%% Borrowed from mod_vcard.erl
+find_xdata_el({xmlelement, _Name, _Attrs, SubEls}) ->
+ find_xdata_el1(SubEls).
+
+find_xdata_el1([]) ->
+ false;
+find_xdata_el1([{xmlelement, Name, Attrs, SubEls} | Els]) ->
+ case xml:get_attr_s("xmlns", Attrs) of
+ ?NS_XDATA ->
+ {xmlelement, Name, Attrs, SubEls};
+ _ ->
+ find_xdata_el1(Els)
+ end;
+find_xdata_el1([_ | Els]) ->
+ find_xdata_el1(Els).
+
+%% Produce a <command/> node to use as response from an adhoc_response
+%% record, filling in values for language, node and session id from
+%% the request.
+produce_response(#adhoc_request{lang = Lang,
+ node = Node,
+ sessionid = SessionID},
+ Response) ->
+ produce_response(Response#adhoc_response{lang = Lang,
+ node = Node,
+ sessionid = SessionID}).
+
+%% Produce a <command/> node to use as response from an adhoc_response
+%% record.
+produce_response(#adhoc_response{lang = _Lang,
+ node = Node,
+ sessionid = ProvidedSessionID,
+ status = Status,
+ defaultaction = DefaultAction,
+ actions = Actions,
+ notes = Notes,
+ elements = Elements}) ->
+ SessionID = if is_list(ProvidedSessionID), ProvidedSessionID /= "" ->
+ ProvidedSessionID;
+ true ->
+ jlib:now_to_utc_string(now())
+ end,
+ case Actions of
+ [] ->
+ ActionsEls = [];
+ _ ->
+ case DefaultAction of
+ "" ->
+ ActionsElAttrs = [];
+ _ ->
+ ActionsElAttrs = [{"execute", DefaultAction}]
+ end,
+ ActionsEls = [{xmlelement, "actions",
+ ActionsElAttrs,
+ [{xmlelement, Action, [], []} || Action <- Actions]}]
+ end,
+ NotesEls = lists:map(fun({Type, Text}) ->
+ {xmlelement, "note",
+ [{"type", Type}],
+ [{xmlcdata, Text}]}
+ end, Notes),
+ {xmlelement, "command",
+ [{"xmlns", ?NS_COMMANDS},
+ {"sessionid", SessionID},
+ {"node", Node},
+ {"status", atom_to_list(Status)}],
+ ActionsEls ++ NotesEls ++ Elements}.