]> granicus.if.org Git - ejabberd/commitdiff
send last published events now supports PEP events from unavailable users nodes ...
authorChristophe Romain <christophe.romain@process-one.net>
Wed, 27 Aug 2008 09:25:24 +0000 (09:25 +0000)
committerChristophe Romain <christophe.romain@process-one.net>
Wed, 27 Aug 2008 09:25:24 +0000 (09:25 +0000)
SVN Revision: 1549

ChangeLog
src/ejabberd_c2s.erl
src/mod_pubsub/mod_pubsub.erl

index 3ef90f616d18c5fc3cd8464ae3d345f0209e62f4..57a18cec5dbc7fd4c2b0ab6ad8523c6fe7b55f6e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-08-27  Christophe Romain  <christophe.romain@process-one.net>
+
+       * src/mod_pubsub/mod_pubsub.erl: send last published events now supports
+       PEP events from unavailable users nodes (EJAB-698)
+       * src/ejabberd_c2s.erl: Likewise
+
 2008-08-26  Badlop  <badlop@process-one.net>
 
        * doc/release_notes_2.0.2.txt: Update for final release
index e55ff19e0e6a0abbd075548dc1fb298d47572069..0d6b7747dbf783e8590fe558212eb53e8192a8d8 100644 (file)
@@ -37,6 +37,7 @@
         send_element/2,
         socket_type/0,
         get_presence/1,
+        get_subscribed/1,
         get_subscribed_and_online/1]).
 
 %% gen_fsm callbacks
@@ -207,6 +208,9 @@ init([{SockMod, Socket}, Opts]) ->
 
 %% Return list of all available resources of contacts,
 %% in form [{JID, Caps}].
+get_subscribed(FsmRef) ->
+    gen_fsm:sync_send_all_state_event(
+      FsmRef, get_subscribed, 1000).
 get_subscribed_and_online(FsmRef) ->
     gen_fsm:sync_send_all_state_event(
       FsmRef, get_subscribed_and_online, 1000).
@@ -1005,6 +1009,20 @@ handle_sync_event({get_presence}, _From, StateName, StateData) ->
     Reply = {User, Resource, Show, Status},
     fsm_reply(Reply, StateName, StateData);
 
+handle_sync_event(get_subscribed, _From, StateName, StateData) ->
+    Subscribed = StateData#state.pres_f,
+    Online = StateData#state.pres_available,
+    Pred = fun(User, _Caps) ->
+                  ?SETS:is_element(jlib:jid_remove_resource(User),
+                                   Subscribed) orelse
+                      ?SETS:is_element(User, Subscribed)
+          end,
+    SubscribedAndOnline = ?DICT:filter(Pred, Online),
+    SubscribedWithCaps  = ?SETS:fold(fun(User, Acc) ->
+           [{User, undefined}|Acc]
+       end, ?DICT:to_list(SubscribedAndOnline), Subscribed),
+    {reply, SubscribedWithCaps, StateName, StateData};
+
 handle_sync_event(get_subscribed_and_online, _From, StateName, StateData) ->
     Subscribed = StateData#state.pres_f,
     Online = StateData#state.pres_available,
index 4d18eb95a910afe2cb5cf4f2e23b84ae0b397f6d..dffd8af750e76e0a9f62bd749d8f8a5568e7f458 100644 (file)
@@ -472,7 +472,7 @@ handle_cast({presence, JID, Pid}, State) ->
            end, Subscriptions)
     end, State#state.plugins),
     %% and send to From last PEP events published by its contacts
-    case catch ejabberd_c2s:get_subscribed_and_online(Pid) of
+    case catch ejabberd_c2s:get_subscribed(Pid) of
        ContactsWithCaps when is_list(ContactsWithCaps) ->
            Caps = proplists:get_value(LJID, ContactsWithCaps),
            ContactsUsers = lists:usort(lists:map(