]> granicus.if.org Git - ejabberd/commitdiff
Fix mod_mam compatibility with RSM for other backends
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 9 Jul 2015 10:01:37 +0000 (13:01 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Fri, 10 Jul 2015 10:59:33 +0000 (13:59 +0300)
src/mod_mam.erl
test/ejabberd_SUITE.erl
tools/xmpp_codec.erl
tools/xmpp_codec.hrl
tools/xmpp_codec.spec

index cd869c9d875a01d930581855710bec926095d4ed..4e58f9ffb12abf2a5796d113a933a5a153d46816 100644 (file)
@@ -663,21 +663,23 @@ filter_by_rsm(_Msgs, #rsm_in{max = Max}) when Max =< 0 ->
     [];
 filter_by_rsm(Msgs, #rsm_in{max = Max, direction = Direction, id = ID}) ->
     NewMsgs = case Direction of
-                  aft ->
-                      lists:filter(
-                        fun(#archive_msg{id = I}) ->
-                                I > ID
-                        end, Msgs);
-                  before ->
-                      lists:foldl(
-                        fun(#archive_msg{id = I} = Msg, Acc) when I < ID ->
-                                [Msg|Acc];
-                           (_, Acc) ->
-                                Acc
-                        end, [], Msgs);
-                  _ ->
-                      Msgs
-              end,
+                 aft when ID /= <<"">> ->
+                     lists:filter(
+                       fun(#archive_msg{id = I}) ->
+                               I > ID
+                       end, Msgs);
+                 before when ID /= <<"">> ->
+                     lists:foldl(
+                       fun(#archive_msg{id = I} = Msg, Acc) when I < ID ->
+                               [Msg|Acc];
+                          (_, Acc) ->
+                               Acc
+                       end, [], Msgs);
+                 before when ID == <<"">> ->
+                     lists:reverse(Msgs);
+                 _ ->
+                     Msgs
+             end,
     filter_by_max(NewMsgs, Max).
 
 filter_by_max(Msgs, undefined) ->
index 470055654d37f03781b103f2550b7c4bac38222c..8cd21d5e9d2f39c614e9cb58fffd69317a9f766a 100644 (file)
@@ -1854,6 +1854,35 @@ mam_query_rsm(Config, NS) ->
                                    rsm = #rsm_set{count = 10,
                                                   first = undefined,
                                                   last = undefined}}]})
+    end,
+    %% Should receive 2 last messages
+    I5 = send(Config,
+             #iq{type = Type,
+                 sub_els = [#mam_query{xmlns = NS,
+                                       rsm = #rsm_set{max = 2,
+                                                      before = none}}]}),
+    maybe_recv_iq_result(NS, I5),
+    lists:foreach(
+      fun(N) ->
+             Text = #text{data = jlib:integer_to_binary(N)},
+             ?recv1(#message{to = MyJID,
+                             sub_els =
+                                 [#mam_result{
+                                     xmlns = NS,
+                                     sub_els =
+                                         [#forwarded{
+                                             delay = #delay{},
+                                             sub_els =
+                                                 [#message{
+                                                     from = MyJID, to = Peer,
+                                                     body = [Text]}]}]}]})
+      end, lists:seq(4, 5)),
+    if NS == ?NS_MAM_TMP ->
+           ?recv1(#iq{type = result, id = I5,
+                      sub_els = [#mam_query{xmlns = NS, rsm = #rsm_set{count = 5}}]});
+       true ->
+           ?recv1(#message{
+                     sub_els = [#mam_fin{rsm = #rsm_set{count = 10}}]})
     end.
 
 client_state_master(Config) ->
index 0dbc6280850c3959ca5937c074c5ab7d175ee7d2..08a2e84cae71bf61d6e9cbb66faa41271afa9bf2 100644 (file)
@@ -4746,10 +4746,10 @@ encode_rsm_before(Cdata, _xmlns_attrs) ->
     _attrs = _xmlns_attrs,
     {xmlel, <<"before">>, _attrs, _els}.
 
-decode_rsm_before_cdata(__TopXMLNS, <<>>) -> undefined;
+decode_rsm_before_cdata(__TopXMLNS, <<>>) -> none;
 decode_rsm_before_cdata(__TopXMLNS, _val) -> _val.
 
-encode_rsm_before_cdata(undefined, _acc) -> _acc;
+encode_rsm_before_cdata(none, _acc) -> _acc;
 encode_rsm_before_cdata(_val, _acc) ->
     [{xmlcdata, _val} | _acc].
 
index 567946fe2e691e0a03d61234c028596c12f8b04a..fa8e5e74d1f72586da90291a8928ba22c4b3bb90 100644 (file)
                     units = [] :: [binary()]}).
 
 -record(rsm_set, {'after' :: binary(),
-                  before :: binary(),
+                  before :: 'none' | binary(),
                   count :: non_neg_integer(),
                   first :: #rsm_first{},
                   index :: non_neg_integer(),
index dfa516ef5dfa045385b551591fc249fc050373df..326d1de3604dce9fdd5bc662b84f23b50204c5e3 100644 (file)
 -xml(rsm_before,
      #elem{name = <<"before">>,
            xmlns = <<"http://jabber.org/protocol/rsm">>,
+          cdata = #cdata{default = none},
            result = '$cdata'}).
 
 -xml(rsm_last,