diff options
Diffstat (limited to 'src/mod_offline.erl')
-rw-r--r-- | src/mod_offline.erl | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/mod_offline.erl b/src/mod_offline.erl index 503317485..10ee7b409 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -42,6 +42,9 @@ remove_expired_messages/1, remove_old_messages/2, remove_user/2, + import/1, + import/3, + export/1, get_queue_length/2, get_offline_els/2, webadmin_page/3, @@ -873,3 +876,60 @@ count_offline_messages(LUser, LServer) -> _ -> 0 end. + +export(_Server) -> + [{offline_msg, + fun(Host, #offline_msg{us = {LUser, LServer}, + timestamp = TimeStamp, from = From, to = To, + packet = Packet}) + when LServer == Host -> + Username = ejabberd_odbc:escape(LUser), + #xmlel{name = Name, attrs = Attrs, children = Els} = + Packet, + Attrs2 = + jlib:replace_from_to_attrs(jlib:jid_to_string(From), + jlib:jid_to_string(To), + Attrs), + NewPacket = #xmlel{name = Name, attrs = Attrs2, + children = + Els ++ + [jlib:timestamp_to_xml( + calendar:now_to_universal_time(TimeStamp), + utc, + jlib:make_jid(<<"">>, + LServer, + <<"">>), + <<"Offline Storage">>), + jlib:timestamp_to_xml( + calendar:now_to_universal_time(TimeStamp))]}, + XML = + ejabberd_odbc:escape(xml:element_to_binary(NewPacket)), + [[<<"delete from spool where username='">>, Username, <<"';">>], + [<<"insert into spool(username, xml) values ('">>, + Username, <<"', '">>, XML, <<"');">>]]; + (_Host, _R) -> + [] + end}]. + +import(LServer) -> + [{<<"select username, xml from spool;">>, + fun([LUser, XML]) -> + El = #xmlel{} = xml_stream:parse_element(XML), + From = #jid{} = jlib:string_to_jid( + xml:get_attr_s(<<"from">>, El)), + To = #jid{} = jlib:string_to_jid( + xml:get_attr_s(<<"to">>, El)), + Stamp = xml:get_path_s(El, [{elem, <<"delay">>}, + {elem, <<"stamp">>}, + cdata]), + {_, _, _} = TS = jlib:datetime_string_to_timestamp(Stamp), + Expire = find_x_expire(TS, El#xmlel.children), + #offline_msg{us = {LUser, LServer}, + from = From, to = To, + timestamp = TS, expire = Expire} + end}]. + +import(_LServer, mnesia, #offline_msg{} = Msg) -> + mnesia:dirty_write(Msg); +import(_, _, _) -> + pass. |