diff options
author | tmallard <tmallard@null> | 2005-04-17 22:08:34 +0400 |
---|---|---|
committer | tmallard <tmallard@null> | 2005-04-17 22:08:34 +0400 |
commit | 374446f8471747c878cdaf760c4bb37d17493ab7 (patch) | |
tree | e91bac5669555dcf33627e4745b04236f743126d /src/jd2ejd.erl | |
parent | 13de45118d951e955074a2a9775298b36f92f718 (diff) |
Merged the Process One contributions ( Virtual Hosting )
SVN Revision: 307
Diffstat (limited to 'src/jd2ejd.erl')
-rw-r--r-- | src/jd2ejd.erl | 313 |
1 files changed, 91 insertions, 222 deletions
diff --git a/src/jd2ejd.erl b/src/jd2ejd.erl index 1fff78149..974b80540 100644 --- a/src/jd2ejd.erl +++ b/src/jd2ejd.erl @@ -10,222 +10,127 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --behaviour(gen_fsm). - %% External exports --export([start/1, - start/2, - import_file/1, +-export([import_file/1, import_dir/1]). -%% gen_fsm callbacks --export([init/1, - wait_for_xdb/2, - xdb_data/2, - handle_event/3, - handle_sync_event/4, - code_change/4, - handle_info/3, - terminate/3]). - -include("ejabberd.hrl"). -include("jlib.hrl"). --record(state, {socket, pid, xml_stream_pid, - user = "", server = ?MYNAME, resource = "" - }). - -%-define(DBGFSM, true). - --ifdef(DBGFSM). --define(FSMOPTS, [{debug, [trace]}]). --else. --define(FSMOPTS, []). --endif. %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- -start(File) -> + +import_file(File) -> User = filename:rootname(filename:basename(File)), - start(File, User). + Server = filename:basename(filename:dirname(File)), + case (jlib:nodeprep(User) /= error) andalso + (jlib:nameprep(Server) /= error) of + true -> + case file:read_file(File) of + {ok, Text} -> + case xml_stream:parse_element(Text) of + El when element(1, El) == xmlelement -> + case catch process_xdb(User, Server, El) of + {'EXIT', Reason} -> + ?ERROR_MSG( + "Error while processing file \"~s\": ~p~n", + [File, Reason]); + _ -> + ok + end; + {error, Reason} -> + ?ERROR_MSG("Can't parse file \"~s\": ~p~n", + [File, Reason]) + end; + {error, Reason} -> + ?ERROR_MSG("Can't read file \"~s\": ~p~n", [File, Reason]) + end; + false -> + ?ERROR_MSG("Incorrect user/server name in file \"~s\"~n", [File]) + end. -start(File, User) -> - gen_fsm:start(?MODULE, [File, User, self()], ?FSMOPTS). + +import_dir(Dir) -> + {ok, Files} = file:list_dir(Dir), + MsgFiles = lists:filter( + fun(FN) -> + case string:len(FN) > 4 of + true -> + string:substr(FN, + string:len(FN) - 3) == ".xml"; + _ -> + false + end + end, Files), + lists:foreach( + fun(FN) -> + import_file(filename:join([Dir, FN])) + end, MsgFiles), + ok. %%%---------------------------------------------------------------------- -%%% Callback functions from gen_fsm +%%% Internal functions %%%---------------------------------------------------------------------- -%%---------------------------------------------------------------------- -%% Func: init/1 -%% Returns: {ok, StateName, StateData} | -%% {ok, StateName, StateData, Timeout} | -%% ignore | -%% {stop, StopReason} -%%---------------------------------------------------------------------- -init([File, User, Pid]) -> - % Profiling - %eprof:start(), - %eprof:profile([self()]), - XMLStreamPid = xml_stream:start(self()), - {ok, Text} = file:read_file(File), - xml_stream:send_text(XMLStreamPid, Text), - {ok, wait_for_xdb, #state{user = User, pid = Pid, - xml_stream_pid = XMLStreamPid}}. - -%%---------------------------------------------------------------------- -%% Func: StateName/2 -%% Returns: {next_state, NextStateName, NextStateData} | -%% {next_state, NextStateName, NextStateData, Timeout} | -%% {stop, Reason, NewStateData} -%%---------------------------------------------------------------------- - -wait_for_xdb({xmlstreamstart, Name, _Attrs}, StateData) -> +process_xdb(User, Server, {xmlelement, Name, _Attrs, Els}) -> case Name of "xdb" -> - {next_state, xdb_data, StateData}; + lists:foreach( + fun(El) -> + xdb_data(User, Server, El) + end, Els); _ -> - {stop, normal, StateData} - end; - -wait_for_xdb(closed, StateData) -> - {stop, normal, StateData}. + ok + end. -xdb_data({xmlstreamelement, El}, StateData) -> +xdb_data(User, Server, El) -> {xmlelement, _Name, Attrs, _Els} = El, - Server = StateData#state.server, - From = jlib:make_jid(StateData#state.user, Server, ""), - NewState = - case xml:get_attr_s("xmlns", Attrs) of - ?NS_AUTH -> - Password = xml:get_tag_cdata(El), - ejabberd_auth:set_password(StateData#state.user, Password), - StateData; - ?NS_ROSTER -> - %catch mod_roster:process_iq( - % From, - % {"", ?MYNAME, ""}, - % #iq{type = set, xmlns = ?NS_ROSTER, sub_el = El}), - catch mod_roster:set_items(StateData#state.user, El), - StateData; - ?NS_VCARD -> - catch mod_vcard:process_sm_iq( - From, - jlib:make_jid("", ?MYNAME, ""), - #iq{type = set, xmlns = ?NS_VCARD, sub_el = El}), - StateData; - "jabber:x:offline" -> - process_offline(From, El), - StateData; - %?NS_REGISTER -> - % catch mod_register:process_iq( - % {"", "", ""}, {"", ?MYNAME, ""}, - % #iq{type =set, xmlns = ?NS_REGISTER, xub_el = El}), - % User = xml:get_path_s(El, [{elem, "username"}, cdata]), - % io:format("user ~s~n", [User]), - % StateData; - XMLNS -> - case xml:get_attr_s("j_private_flag", Attrs) of - "1" -> - catch mod_private:process_local_iq( - From, - jlib:make_jid("", ?MYNAME, ""), - #iq{type = set, xmlns = ?NS_PRIVATE, - sub_el = {xmlelement, "query", [], - [jlib:remove_attr( - "j_private_flag", - jlib:remove_attr("xdbns", El))]}}), - StateData; - _ -> - io:format("jd2ejd: Unknown namespace \"~s\"~n", - [XMLNS]), - StateData - end - end, - {next_state, xdb_data, NewState}; - -xdb_data({xmlstreamend, _Name}, StateData) -> - {stop, normal, StateData}; - -xdb_data(closed, StateData) -> - {stop, normal, StateData}. - - - -%%---------------------------------------------------------------------- -%% Func: StateName/3 -%% Returns: {next_state, NextStateName, NextStateData} | -%% {next_state, NextStateName, NextStateData, Timeout} | -%% {reply, Reply, NextStateName, NextStateData} | -%% {reply, Reply, NextStateName, NextStateData, Timeout} | -%% {stop, Reason, NewStateData} | -%% {stop, Reason, Reply, NewStateData} -%%---------------------------------------------------------------------- -%state_name(Event, From, StateData) -> -% Reply = ok, -% {reply, Reply, state_name, StateData}. - -%%---------------------------------------------------------------------- -%% Func: handle_event/3 -%% Returns: {next_state, NextStateName, NextStateData} | -%% {next_state, NextStateName, NextStateData, Timeout} | -%% {stop, Reason, NewStateData} -%%---------------------------------------------------------------------- -handle_event(_Event, StateName, StateData) -> - {next_state, StateName, StateData}. - -%%---------------------------------------------------------------------- -%% Func: handle_sync_event/4 -%% Returns: {next_state, NextStateName, NextStateData} | -%% {next_state, NextStateName, NextStateData, Timeout} | -%% {reply, Reply, NextStateName, NextStateData} | -%% {reply, Reply, NextStateName, NextStateData, Timeout} | -%% {stop, Reason, NewStateData} | -%% {stop, Reason, Reply, NewStateData} -%%---------------------------------------------------------------------- -handle_sync_event(_Event, _From, StateName, StateData) -> - Reply = ok, - {reply, Reply, StateName, StateData}. - -code_change(_OldVsn, StateName, StateData, _Extra) -> - {ok, StateName, StateData}. - -%%---------------------------------------------------------------------- -%% Func: handle_info/3 -%% Returns: {next_state, NextStateName, NextStateData} | -%% {next_state, NextStateName, NextStateData, Timeout} | -%% {stop, Reason, NewStateData} -%%---------------------------------------------------------------------- -handle_info(_, StateName, StateData) -> - {next_state, StateName, StateData}. - -%%---------------------------------------------------------------------- -%% Func: terminate/3 -%% Purpose: Shutdown the fsm -%% Returns: any -%%---------------------------------------------------------------------- -terminate(Reason, _StateName, StateData) -> - exit(StateData#state.xml_stream_pid, closed), - StateData#state.pid ! {jd2ejd, Reason}, - % Profiling - %eprof:log("/tmp/eprof"), - %eprof:analyse(), - %eprof:stop(), - ok. + From = jlib:make_jid(User, Server, ""), + case xml:get_attr_s("xmlns", Attrs) of + ?NS_AUTH -> + Password = xml:get_tag_cdata(El), + ejabberd_auth:set_password(User, Server, Password), + ok; + ?NS_ROSTER -> + catch mod_roster:set_items(User, Server, El), + ok; + ?NS_VCARD -> + catch mod_vcard:process_sm_iq( + From, + jlib:make_jid("", ?MYNAME, ""), + #iq{type = set, xmlns = ?NS_VCARD, sub_el = El}), + ok; + "jabber:x:offline" -> + process_offline(From, El), + ok; + XMLNS -> + case xml:get_attr_s("j_private_flag", Attrs) of + "1" -> + catch mod_private:process_local_iq( + From, + jlib:make_jid("", ?MYNAME, ""), + #iq{type = set, xmlns = ?NS_PRIVATE, + sub_el = {xmlelement, "query", [], + [jlib:remove_attr( + "j_private_flag", + jlib:remove_attr("xdbns", El))]}}); + _ -> + ?DEBUG("jd2ejd: Unknown namespace \"~s\"~n", [XMLNS]) + end, + ok + end. -%%%---------------------------------------------------------------------- -%%% Internal functions -%%%---------------------------------------------------------------------- process_offline(To, {xmlelement, _, _, Els}) -> lists:foreach(fun({xmlelement, _, Attrs, _} = El) -> FromS = xml:get_attr_s("from", Attrs), From = case FromS of "" -> - {"", ?MYNAME, ""}; + jlib:make_jid("", ?MYNAME, ""); _ -> jlib:string_to_jid(FromS) end, @@ -237,39 +142,3 @@ process_offline(To, {xmlelement, _, _, Els}) -> end end, Els). - -import_file(File) -> - clear_queue(), - start(File), - receive - {jd2ejd, Result} -> Result - %after 4000 -> timeout - end. - -clear_queue() -> - receive - {jd2ejd, _Result} -> clear_queue - after 0 -> ok - end. - - -import_dir(Dir) -> - {ok, Files} = file:list_dir(Dir), - MsgFiles = lists:filter( - fun(FN) -> - case string:len(FN) > 4 of - true -> - string:substr(FN, - string:len(FN) - 3) == ".xml"; - _ -> - false - end - end, Files), - lists:foreach( - fun(FN) -> - import_file(filename:join([Dir, FN])) - end, MsgFiles), - ok. - - - |