aboutsummaryrefslogtreecommitdiff
path: root/src/mod_offline.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_offline.erl')
-rw-r--r--src/mod_offline.erl60
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.