diff options
Diffstat (limited to 'src/com/isode/stroke/client/NickResolver.java')
-rw-r--r-- | src/com/isode/stroke/client/NickResolver.java | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/com/isode/stroke/client/NickResolver.java b/src/com/isode/stroke/client/NickResolver.java new file mode 100644 index 0000000..fe2b129 --- /dev/null +++ b/src/com/isode/stroke/client/NickResolver.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2010-2015, Isode Limited, London, England. + * All rights reserved. + */ +package com.isode.stroke.client; + +import java.util.Collection; + +import com.isode.stroke.elements.VCard; +import com.isode.stroke.jid.JID; +import com.isode.stroke.muc.MUCRegistry; +import com.isode.stroke.roster.XMPPRoster; +import com.isode.stroke.signals.Signal2; +import com.isode.stroke.signals.Slot1; +import com.isode.stroke.signals.Slot2; +import com.isode.stroke.signals.Slot3; +import com.isode.stroke.vcards.VCardManager; + +public class NickResolver { + private JID ownJID_; + private String ownNick_; + private XMPPRoster xmppRoster_; + private MUCRegistry mucRegistry_; + private VCardManager vcardManager_; + + public final Signal2<JID, String> onNickChanged = new Signal2<JID, String>(); + + public NickResolver(final JID ownJID, XMPPRoster xmppRoster, VCardManager vcardManager, MUCRegistry mucRegistry) { + ownJID_ = ownJID; + xmppRoster_ = xmppRoster; + vcardManager_ = vcardManager; + if (vcardManager_ != null) { + vcardManager_.onVCardChanged.connect(new Slot2<JID, VCard>() { + @Override + public void call(JID p1, VCard p2) { + handleVCardReceived(p1, p2); + } + }); + } + mucRegistry_ = mucRegistry; + xmppRoster_.onJIDUpdated.connect(new Slot3<JID, String, Collection<String>>() { + @Override + public void call(JID p1, String p2, Collection<String> p3) { + handleJIDUpdated(p1, p2, p3); + } + }); + xmppRoster_.onJIDAdded.connect(new Slot1<JID>() { + @Override + public void call(JID p1) { + handleJIDAdded(p1); + } + }); + } + + void handleJIDUpdated(final JID jid, final String previousNick, final Collection<String> groups) { + onNickChanged.emit(jid, previousNick); + } + + void handleJIDAdded(final JID jid) { + String oldNick= jidToNick(jid); + onNickChanged.emit(jid, oldNick); + } + + public String jidToNick(final JID jid) { + if (jid.toBare().equals(ownJID_)) { + if (ownNick_ != null && !ownNick_.isEmpty()) { + return ownNick_; + } + } + + if (mucRegistry_ != null && mucRegistry_.isMUC(jid.toBare()) ) { + return jid.getResource().isEmpty() ? jid.toBare().toString() : jid.getResource(); + } + + if (xmppRoster_.containsJID(jid) && !xmppRoster_.getNameForJID(jid).isEmpty()) { + return xmppRoster_.getNameForJID(jid); + } + + return jid.toBare().toString(); + } + + void handleVCardReceived(final JID jid, VCard ownVCard) { + if (jid.compare(ownJID_, JID.CompareType.WithoutResource) != 0) { + return; + } + ownNick_ = ownJID_.toString(); + if (ownVCard != null) { + if (!ownVCard.getNickname().isEmpty()) { + ownNick_ = ownVCard.getNickname(); + } else if (!ownVCard.getGivenName().isEmpty()) { + ownNick_ = ownVCard.getGivenName(); + } else if (!ownVCard.getFullName().isEmpty()) { + ownNick_ = ownVCard.getFullName(); + } + } + } + +} |