diff --git a/ChangeLog b/ChangeLog index 3ef90f616..57a18cec5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-08-27 Christophe Romain + + * 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 * doc/release_notes_2.0.2.txt: Update for final release diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index e55ff19e0..0d6b7747d 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -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, diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index 4d18eb95a..dffd8af75 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -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(