aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Romain <christophe.romain@process-one.net>2008-08-27 09:25:24 +0000
committerChristophe Romain <christophe.romain@process-one.net>2008-08-27 09:25:24 +0000
commit55b586e51c203e6a61adf308937cda3059639c9e (patch)
tree10779d7b8cdac51b164450edf35a29dcd4efe8da
parent* doc/release_notes_2.0.2.txt: Update for final release (diff)
send last published events now supports PEP events from unavailable users nodes (EJAB-698)
SVN Revision: 1549
-rw-r--r--ChangeLog6
-rw-r--r--src/ejabberd_c2s.erl18
-rw-r--r--src/mod_pubsub/mod_pubsub.erl2
3 files changed, 25 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 3ef90f616..57a18cec5 100644
--- 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
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(