diff options
Diffstat (limited to '')
-rw-r--r-- | src/eu/siacs/conversations/parser/PresenceParser.java | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/src/eu/siacs/conversations/parser/PresenceParser.java b/src/eu/siacs/conversations/parser/PresenceParser.java index 8cc57bad..bd2aa636 100644 --- a/src/eu/siacs/conversations/parser/PresenceParser.java +++ b/src/eu/siacs/conversations/parser/PresenceParser.java @@ -5,12 +5,15 @@ import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Presences; +import eu.siacs.conversations.generator.PresenceGenerator; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.xml.Element; +import eu.siacs.conversations.xmpp.OnPresencePacketReceived; import eu.siacs.conversations.xmpp.stanzas.PresencePacket; -public class PresenceParser extends AbstractParser { - +public class PresenceParser extends AbstractParser implements + OnPresencePacketReceived { + public PresenceParser(XmppConnectionService service) { super(service); } @@ -30,14 +33,15 @@ public class PresenceParser extends AbstractParser { int error = muc.getMucOptions().getError(); muc.getMucOptions().processPacket(packet, mPgpEngine); if (muc.getMucOptions().getError() != error) { - mXmppConnectionService.updateUi(muc, false); + mXmppConnectionService.updateConversationUi(); } } } } public void parseContactPresence(PresencePacket packet, Account account) { - if (packet.getFrom()==null) { + PresenceGenerator mPresenceGenerator = mXmppConnectionService.getPresenceGenerator(); + if (packet.getFrom() == null) { return; } String[] fromParts = packet.getFrom().split("/"); @@ -75,9 +79,9 @@ public class PresenceParser extends AbstractParser { } } boolean online = sizeBefore < contact.getPresences().size(); - updateLastseen(packet, account,true); + updateLastseen(packet, account, true); mXmppConnectionService.onContactStatusChanged - .onContactStatusChanged(contact,online); + .onContactStatusChanged(contact, online); } } else if (type.equals("unavailable")) { if (fromParts.length != 2) { @@ -86,17 +90,10 @@ public class PresenceParser extends AbstractParser { contact.removePresence(fromParts[1]); } mXmppConnectionService.onContactStatusChanged - .onContactStatusChanged(contact,false); + .onContactStatusChanged(contact, false); } else if (type.equals("subscribe")) { if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) { - mXmppConnectionService.sendPresenceUpdatesTo(contact); - contact.setOption(Contact.Options.FROM); - contact.resetOption(Contact.Options.PREEMPTIVE_GRANT); - if ((contact.getOption(Contact.Options.ASKING)) - && (!contact.getOption(Contact.Options.TO))) { - mXmppConnectionService - .requestPresenceUpdatesFrom(contact); - } + mXmppConnectionService.sendPresencePacket(account, mPresenceGenerator.sendPresenceUpdatesTo(contact)); } else { contact.setOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST); } @@ -104,4 +101,15 @@ public class PresenceParser extends AbstractParser { } } + @Override + public void onPresencePacketReceived(Account account, PresencePacket packet) { + if (packet.hasChild("x", "http://jabber.org/protocol/muc#user")) { + this.parseConferencePresence(packet, account); + } else if (packet.hasChild("x", "http://jabber.org/protocol/muc")) { + this.parseConferencePresence(packet, account); + } else { + this.parseContactPresence(packet, account); + } + } + } |