1 erlang comment %%%----------------------------------------------------------------------
2 erlang comment %%% File : erl1.erl
3 erlang comment %%% Author : Jason Allen <jason@ohloh.net> - kinda - just repurposing random code
4 erlang comment %%% Purpose : Test out the erlang parsing
5 erlang comment %%% Created : 1/17/2007 by Jason Allen <jason@ohloh.net>
6 erlang comment %%% Id : $Id: erl1.erl 1 2007-17-01 jason $
7 erlang comment %%%----------------------------------------------------------------------
9 erlang code -module(erl1).
10 erlang code -author('jason@ohloh.net').
11 erlang code -vsn('$Revision: 1 $ ').
13 erlang comment %% External exports
14 erlang code -export([import_file/1,
15 erlang code import_dir/1]).
17 erlang code -include("random.hrl").
18 erlang code -include("more_random.hrl").
20 erlang comment %%%----------------------------------------------------------------------
21 erlang comment %%% API
22 erlang comment %%%----------------------------------------------------------------------
24 erlang code import_file(File) ->
25 erlang code User = filename:rootname(filename:basename(File)),
26 erlang code Server = filename:basename(filename:dirname(File)),
27 erlang code case (jlib:nodeprep(User) /= error) andalso
28 erlang code (jlib:nameprep(Server) /= error) of
30 erlang code case file:read_file(File) of
31 erlang code {ok, Text} ->
32 erlang code case xml_stream:parse_element(Text) of
33 erlang code El when element(1, El) == xmlelement ->
34 erlang code case catch process_xdb(User, Server, El) of
35 erlang code {'EXIT', Reason} ->
36 erlang code ?ERROR_MSG(
37 erlang code "Error while processing file \"~s\": ~p~n",
38 erlang code [File, Reason]),
39 erlang code {error, Reason};
43 erlang code {error, Reason} ->
44 erlang code ?ERROR_MSG("Can't parse file \"~s\": ~p~n",
45 erlang code [File, Reason]),
46 erlang code {error, Reason}
48 erlang code {error, Reason} ->
49 erlang code ?ERROR_MSG("Can't read file \"~s\": ~p~n", [File, Reason]),
50 erlang code {error, Reason}
53 erlang code ?ERROR_MSG("Illegal user/server name in file \"~s\"~n", [File]),
54 erlang code {error, "illegal user/server"}
58 erlang code import_dir(Dir) ->
59 erlang code {ok, Files} = file:list_dir(Dir),
60 erlang code MsgFiles = lists:filter(
61 erlang code fun(FN) ->
62 erlang code case string:len(FN) > 4 of
64 erlang code string:substr(FN,
65 erlang code string:len(FN) - 3) == ".xml";
69 erlang code end, Files),
70 erlang code lists:foldl(
71 erlang code fun(FN, A) ->
72 erlang code Res = import_file(filename:join([Dir, FN])),
73 erlang code case {A, Res} of
74 erlang code {ok, ok} -> ok;
75 erlang code {ok, _} -> {error, "see aoabberd log for details"};
78 erlang code end, ok, MsgFiles).
80 erlang comment %%%----------------------------------------------------------------------
81 erlang comment %%% Internal functions
82 erlang comment %%%----------------------------------------------------------------------
84 erlang code process_xdb(User, Server, {xmlelement, Name, _Attrs, Els}) ->
85 erlang code case Name of
87 erlang code lists:foreach(
88 erlang code fun(El) ->
89 erlang code xdb_data(User, Server, El)
90 erlang code end, Els);
96 erlang code xdb_data(User, Server, {xmlcdata, _CData}) ->
98 erlang code xdb_data(User, Server, {xmlelement, _Name, Attrs, _Els} = El) ->
99 erlang code From = jlib:make_jid(User, Server, ""),
100 erlang code LServer = jlib:nameprep(Server),
101 erlang code case xml:get_attr_s("xmlns", Attrs) of
102 erlang code ?NS_AUTH ->
103 erlang code Password = xml:get_tag_cdata(El),
104 erlang code ejabberd_auth:set_password(User, Server, Password),
106 erlang code ?NS_ROSTER ->
107 erlang code case lists:member(mod_roster_odbc,
108 erlang code gen_mod:loaded_modules(LServer)) of
110 erlang code catch mod_roster_odbc:set_items(User, Server, El);
112 erlang code catch mod_roster:set_items(User, Server, El)
115 erlang code ?NS_LAST ->
116 erlang code TimeStamp = xml:get_attr_s("last", Attrs),
117 erlang code Status = xml:get_tag_cdata(El),
118 erlang code case lists:member(mod_last_odbc,
119 erlang code gen_mod:loaded_modules(LServer)) of
121 erlang code catch mod_last_odbc:store_last_info(
124 erlang code list_to_integer(TimeStamp),
127 erlang code catch mod_last:store_last_info(
130 erlang code list_to_integer(TimeStamp),
134 erlang code ?NS_VCARD ->
135 erlang code case lists:member(mod_vcard_odbc,
136 erlang code gen_mod:loaded_modules(LServer)) of
138 erlang code catch mod_vcard_odbc:process_sm_iq(
140 erlang code jlib:make_jid("", Server, ""),
141 erlang code #iq{type = set, xmlns = ?NS_VCARD, sub_el = El});
143 erlang code catch mod_vcard:process_sm_iq(
145 erlang code jlib:make_jid("", Server, ""),
146 erlang code #iq{type = set, xmlns = ?NS_VCARD, sub_el = El})
149 erlang code "jabber:x:offline" ->
150 erlang code process_offline(Server, From, El),
153 erlang code case xml:get_attr_s("j_private_flag", Attrs) of
155 erlang code catch mod_private:process_sm_iq(
157 erlang code jlib:make_jid("", Server, ""),
158 erlang code #iq{type = set, xmlns = ?NS_PRIVATE,
159 erlang code sub_el = {xmlelement, "query", [],
160 erlang code [jlib:remove_attr(
161 erlang code "j_private_flag",
162 erlang code jlib:remove_attr("xdbns", El))]}});
164 erlang code ?DEBUG("jd2ejd: Unknown namespace \"~s\"~n", [XMLNS])
170 erlang code process_offline(Server, To, {xmlelement, _, _, Els}) ->
171 erlang code LServer = jlib:nameprep(Server),
172 erlang code lists:foreach(fun({xmlelement, _, Attrs, _} = El) ->
173 erlang code FromS = xml:get_attr_s("from", Attrs),
174 erlang code From = case FromS of
176 erlang code jlib:make_jid("", Server, "");
178 erlang code jlib:string_to_jid(FromS)
180 erlang code case From of
184 erlang code ejabberd_hooks:run(offline_message_hook,
186 erlang code [From, To, El])
188 erlang code end, Els).