parse nick and avatar only from available presences to avoid potential error reflection

This commit is contained in:
Daniel Gultsch 2015-05-27 11:44:44 +02:00
parent 0f6f6adca0
commit 165965bb83

View File

@ -45,38 +45,37 @@ public class PresenceParser extends AbstractParser implements
} }
public void parseContactPresence(PresencePacket packet, Account account) { public void parseContactPresence(PresencePacket packet, Account account) {
PresenceGenerator mPresenceGenerator = mXmppConnectionService PresenceGenerator mPresenceGenerator = mXmppConnectionService.getPresenceGenerator();
.getPresenceGenerator(); final Jid from = packet.getFrom();
if (packet.getFrom() == null) { if (from == null) {
return; return;
} }
final Jid from = packet.getFrom(); final String type = packet.getAttribute("type");
String type = packet.getAttribute("type"); final Contact contact = account.getRoster().getContact(from);
Contact contact = account.getRoster().getContact(packet.getFrom());
if (type == null) { if (type == null) {
String presence; String presence = from.isBareJid() ? "" : from.getResourcepart();
if (!from.isBareJid()) { contact.setPresenceName(packet.findChildContent("nick", "http://jabber.org/protocol/nick"));
presence = from.getResourcepart(); Avatar avatar = Avatar.parsePresence(packet.findChild("x", "vcard-temp:x:update"));
if (avatar != null && !contact.isSelf()) {
avatar.owner = from.toBareJid();
if (mXmppConnectionService.getFileBackend().isAvatarCached(avatar)) {
if (contact.setAvatar(avatar)) {
mXmppConnectionService.getAvatarService().clear(contact);
mXmppConnectionService.updateConversationUi();
mXmppConnectionService.updateRosterUi();
}
} else { } else {
presence = ""; mXmppConnectionService.fetchAvatar(account, avatar);
}
} }
int sizeBefore = contact.getPresences().size(); int sizeBefore = contact.getPresences().size();
contact.updatePresence(presence, contact.updatePresence(presence, Presences.parseShow(packet.findChild("show")));
Presences.parseShow(packet.findChild("show")));
PgpEngine pgp = mXmppConnectionService.getPgpEngine(); PgpEngine pgp = mXmppConnectionService.getPgpEngine();
if (pgp != null) {
Element x = packet.findChild("x", "jabber:x:signed"); Element x = packet.findChild("x", "jabber:x:signed");
if (x != null) { if (pgp != null && x != null) {
Element status = packet.findChild("status"); Element status = packet.findChild("status");
String msg; String msg = status != null ? status.getContent() : "";
if (status != null) { contact.setPgpKeyId(pgp.fetchKeyId(account, msg, x.getContent()));
msg = status.getContent();
} else {
msg = "";
}
contact.setPgpKeyId(pgp.fetchKeyId(account, msg,
x.getContent()));
}
} }
boolean online = sizeBefore < contact.getPresences().size(); boolean online = sizeBefore < contact.getPresences().size();
updateLastseen(packet, account, false); updateLastseen(packet, account, false);
@ -87,8 +86,7 @@ public class PresenceParser extends AbstractParser implements
} else { } else {
contact.removePresence(from.getResourcepart()); contact.removePresence(from.getResourcepart());
} }
mXmppConnectionService.onContactStatusChanged mXmppConnectionService.onContactStatusChanged.onContactStatusChanged(contact, false);
.onContactStatusChanged(contact, false);
} else if (type.equals("subscribe")) { } else if (type.equals("subscribe")) {
if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) { if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) {
mXmppConnectionService.sendPresencePacket(account, mXmppConnectionService.sendPresencePacket(account,
@ -97,25 +95,6 @@ public class PresenceParser extends AbstractParser implements
contact.setOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST); contact.setOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST);
} }
} }
Element nick = packet.findChild("nick",
"http://jabber.org/protocol/nick");
if (nick != null) {
contact.setPresenceName(nick.getContent());
}
Element x = packet.findChild("x","vcard-temp:x:update");
Avatar avatar = Avatar.parsePresence(x);
if (avatar != null && !contact.isSelf()) {
avatar.owner = from.toBareJid();
if (mXmppConnectionService.getFileBackend().isAvatarCached(avatar)) {
if (contact.setAvatar(avatar)) {
mXmppConnectionService.getAvatarService().clear(contact);
mXmppConnectionService.updateConversationUi();
mXmppConnectionService.updateRosterUi();
}
} else {
mXmppConnectionService.fetchAvatar(account,avatar);
}
}
mXmppConnectionService.updateRosterUi(); mXmppConnectionService.updateRosterUi();
} }