diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | src/ejabberd_c2s.erl | 40 |
2 files changed, 31 insertions, 14 deletions
@@ -1,3 +1,8 @@ +2006-04-23 Alexey Shchepin <alexey@sevcom.net> + + * src/ejabberd_c2s.erl: Resend messages when leaving negative + presence state (thanks to Magnus Henoch) + 2006-04-23 Mickael Remond <mickael.remond@process-one.net> * src/msgs/fr.msg: Updated diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 1b2639b86..826c52b53 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1346,7 +1346,14 @@ presence_update(From, Packet, StateData) -> "unsubscribed" -> StateData; _ -> - update_priority(xml:get_subtag(Packet, "priority"), StateData), + OldPriority = case StateData#state.pres_last of + undefined -> + 0; + OldPresence -> + get_priority_from_presence(OldPresence) + end, + NewPriority = get_priority_from_presence(Packet), + update_priority(NewPriority, StateData), FromUnavail = (StateData#state.pres_last == undefined) or StateData#state.pres_invis, ?DEBUG("from unavail = ~p~n", [FromUnavail]), @@ -1367,6 +1374,11 @@ presence_update(From, Packet, StateData) -> StateData#state.pres_f, StateData#state.pres_a, Packet), + if OldPriority < 0, NewPriority >= 0 -> + resend_offline_messages(StateData); + true -> + ok + end, StateData#state{pres_last = Packet, pres_invis = false } @@ -1619,25 +1631,25 @@ roster_change(IJID, ISubscription, StateData) -> end. -update_priority(El, StateData) -> - Pri = case El of - false -> - 0; - _ -> - case catch list_to_integer(xml:get_tag_cdata(El)) of - P when is_integer(P) -> - P; - _ -> - 0 - end - end, +update_priority(Pri, StateData) -> ejabberd_sm:set_presence(StateData#state.sid, StateData#state.user, StateData#state.server, StateData#state.resource, Pri). - +get_priority_from_presence(PresencePacket) -> + case xml:get_subtag(PresencePacket, "priority") of + false -> + 0; + SubEl -> + case catch list_to_integer(xml:get_tag_cdata(SubEl)) of + P when is_integer(P) -> + P; + _ -> + 0 + end + end. process_privacy_iq(From, To, #iq{type = Type, sub_el = SubEl} = IQ, |