Merge remote-tracking branch 'remotes/origin/trz/rename' into trz/rebase

Cast problem fixed
This commit is contained in:
steckbrief 2016-01-15 22:15:00 +01:00
commit 69145c02f2
10 changed files with 287 additions and 87 deletions

View file

@ -0,0 +1,125 @@
package de.thedevstack.conversationsplus.xmpp.avatar;
import de.thedevstack.conversationsplus.xmpp.pubsub.PubSubPacketGenerator;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.jid.Jid;
import eu.siacs.conversations.xmpp.pep.Avatar;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
/**
* Generates the IQ Packets for handling Avatars
* as defined in XEP-0084.
* @see {@link http://xmpp.org/extensions/xep-0084.html}
*/
public final class AvatarPacketGenerator {
public static final String NAMESPACE_AVATAR_DATA = "urn:xmpp:avatar:data";
public static final String NAMESPACE_AVATAR_METADATA = "urn:xmpp:avatar:metadata";
/**
* Generates an IqPacket for publishing avatar data.
* The attributes from and id are not set in here - this is added while sending the packet.
* <pre>
* <iq type='set'>
* <pubsub xmlns='http://jabber.org/protocol/pubsub'>
* <publish node='urn:xmpp:avatar:data'>
* <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
* <data xmlns='urn:xmpp:avatar:data'>
* qANQR1DBwU4DX7jmYZnncm...
* </data>
* </item>
* </publish>
* </pubsub>
* </iq>
* </pre>
* @param avatar the avatar to publish
* @return the IqPacket
*/
public static IqPacket generatePublishAvatarPacket(Avatar avatar) {
final Element item = new Element("item");
item.setAttribute("id", avatar.sha1sum);
final Element data = item.addChild("data", NAMESPACE_AVATAR_DATA);
data.setContent(avatar.image);
return PubSubPacketGenerator.generatePubSubPublishPacket(NAMESPACE_AVATAR_DATA, item);
}
/**
* Generates an IqPacket to retrieve avatar data.
* The attributes from and id are not set in here - this is added while sending the packet.
* <pre>
* <iq type='get'>
* <pubsub xmlns='http://jabber.org/protocol/pubsub'>
* <items node='urn:xmpp:avatar:data'>
* <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'/>
* </items>
* </pubsub>
* </iq>
* </pre>
* @param avatar the avatar to retrieve
* @return the IqPacket
*/
public static IqPacket generateRetrieveAvatarPacket(Avatar avatar) {
final Element item = new Element("item");
item.setAttribute("id", avatar.sha1sum);
final IqPacket packet = PubSubPacketGenerator.generatePubSubRetrievePacket(NAMESPACE_AVATAR_DATA, item);
packet.setTo(avatar.owner);
return packet;
}
/**
* Generates an IqPacket to publish metadata for an avatar.
* The attributes from and id are not set in here - this is added while sending the packet.
* <pre>
* <iq type='set'>
* <pubsub xmlns='http://jabber.org/protocol/pubsub'>
* <publish node='urn:xmpp:avatar:metadata'>
* <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
* <metadata xmlns='urn:xmpp:avatar:metadata'>
* <info bytes='12345'
* id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'
* height='64'
* type='image/png'
* width='64'/>
* </metadata>
* </item>
* </publish>
* </pubsub>
* </iq>
* </pre>
* @param avatar the avatar to publish the metadata
* @return the IqPacket
*/
public static IqPacket generatePublishAvatarMetadataPacket(Avatar avatar) {
final Element item = new Element("item");
item.setAttribute("id", avatar.sha1sum);
final Element metadata = item.addChild("metadata", NAMESPACE_AVATAR_METADATA);
final Element info = metadata.addChild("info");
info.setAttribute("bytes", avatar.size);
info.setAttribute("id", avatar.sha1sum);
info.setAttribute("height", avatar.height);
info.setAttribute("width", avatar.height);
info.setAttribute("type", avatar.type);
return PubSubPacketGenerator.generatePubSubPublishPacket(NAMESPACE_AVATAR_METADATA, item);
}
/**
* Generates an IqPacket to retrieve metadata of an avatar.
* The attributes from and id are not set in here - this is added while sending the packet.
* @param to the Jid to deliver the metadata to
* @return the IqPacket
*/
public static IqPacket generateRetrieveAvatarMetadataPacket(Jid to) {
final IqPacket packet = PubSubPacketGenerator.generatePubSubRetrievePacket(NAMESPACE_AVATAR_METADATA, null);
if (to != null) {
packet.setTo(to);
}
return packet;
}
/**
* Helper class - private constructor to avoid instantiation
*/
private AvatarPacketGenerator() {
// avoid instantiation
}
}

View file

@ -0,0 +1,30 @@
package de.thedevstack.conversationsplus.xmpp.avatar;
import de.thedevstack.conversationsplus.xmpp.pubsub.PubSubPacketParser;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
/**
* Parses the IQ Packets for handling Avatars
* as defined in XEP-0084.
* @see {@link http://xmpp.org/extensions/xep-0084.html}
*/
public class AvatarPacketParser {
/**
* Extracts the base64 encoded avatar data from an IqPacket.
* @param packet the IqPacket to be parsed.
* @return base64 encoded avatar data
*/
public static String parseAvatarData(IqPacket packet) {
Element items = PubSubPacketParser.findItems(packet);
String base64Avatar = null;
if (null != items) {
Element item = items.findChild("item");
if (null != item) {
base64Avatar = item.findChildContent("data", AvatarPacketGenerator.NAMESPACE_AVATAR_DATA);
}
}
return base64Avatar;
}
}

View file

@ -0,0 +1,33 @@
package de.thedevstack.conversationsplus.xmpp.pubsub;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
/**
* Created by tzur on 15.01.2016.
*/
public class PubSubPacket extends IqPacket {
public static final String NAMESPACE = "http://jabber.org/protocol/pubsub";
public static final String ELEMENT_NAME = "pubsub";
private Element pubSubElement;
public PubSubPacket(IqPacket.TYPE type) {
super(type);
this.pubSubElement = super.addChild(PubSubPacket.ELEMENT_NAME, PubSubPacket.NAMESPACE);
}
@Override
public Element addChild(Element child) {
return this.pubSubElement.addChild(child);
}
@Override
public Element addChild(String name) {
return this.pubSubElement.addChild(name);
}
@Override
public Element addChild(String name, String xmlns) {
return this.pubSubElement.addChild(name, xmlns);
}
}

View file

@ -0,0 +1,32 @@
package de.thedevstack.conversationsplus.xmpp.pubsub;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
/**
* Created by tzur on 15.01.2016.
*/
public final class PubSubPacketGenerator {
public static PubSubPacket generatePubSubPublishPacket(String nodeName, Element item) {
final PubSubPacket pubsub = new PubSubPacket(IqPacket.TYPE.SET);
final Element publish = pubsub.addChild("publish");
publish.setAttribute("node", nodeName);
publish.addChild(item);
return pubsub;
}
public static PubSubPacket generatePubSubRetrievePacket(String nodeName, Element item) {
final PubSubPacket pubsub = new PubSubPacket(IqPacket.TYPE.GET);
final Element items = pubsub.addChild("items");
items.setAttribute("node", nodeName);
if (item != null) {
items.addChild(item);
}
return pubsub;
}
private PubSubPacketGenerator() {
// Avoid instantiation
}
}

View file

@ -0,0 +1,27 @@
package de.thedevstack.conversationsplus.xmpp.pubsub;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
/**
* Created by tzur on 15.01.2016.
*/
public class PubSubPacketParser {
public static Element findPubSubPacket(IqPacket packet){
if (null == packet) {
return null;
}
return packet.findChild("pubsub", "http://jabber.org/protocol/pubsub");
}
public static Element findItemsFromPubSubElement(Element pubSubPacket) {
if (null == pubSubPacket) {
return null;
}
return pubSubPacket.findChild("items");
}
public static Element findItems(IqPacket packet) {
return PubSubPacketParser.findItemsFromPubSubElement(PubSubPacketParser.findPubSubPacket(packet));
}
}

View file

@ -0,0 +1,33 @@
package de.thedevstack.conversationsplus.xmpp.stanzas;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
/**
* Created by tzur on 15.01.2016.
*/
public final class IqPacketGenerator {
private static IqPacket generateIqPacket(IqPacket.TYPE type) {
return new IqPacket(type);
}
public static IqPacket generateIqSetPacket() {
return generateIqPacket(IqPacket.TYPE.SET);
}
public static IqPacket generateIqGetPacket() {
return generateIqPacket(IqPacket.TYPE.GET);
}
public static IqPacket generateIqResultPacket() {
return generateIqPacket(IqPacket.TYPE.RESULT);
}
public static IqPacket generateIqErrorPacket() {
return generateIqPacket(IqPacket.TYPE.ERROR);
}
private IqPacketGenerator() {
// avoid Instantiation
}
}

View file

@ -44,58 +44,6 @@ public class IqGenerator extends AbstractGenerator {
return packet;
}
protected static IqPacket publish(final String node, final Element item) {
final IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
final Element pubsub = packet.addChild("pubsub",
"http://jabber.org/protocol/pubsub");
final Element publish = pubsub.addChild("publish");
publish.setAttribute("node", node);
publish.addChild(item);
return packet;
}
protected static IqPacket retrieve(String node, Element item) {
final IqPacket packet = new IqPacket(IqPacket.TYPE.GET);
final Element pubsub = packet.addChild("pubsub",
"http://jabber.org/protocol/pubsub");
final Element items = pubsub.addChild("items");
items.setAttribute("node", node);
if (item != null) {
items.addChild(item);
}
return packet;
}
public static IqPacket publishAvatar(Avatar avatar) {
final Element item = new Element("item");
item.setAttribute("id", avatar.sha1sum);
final Element data = item.addChild("data", "urn:xmpp:avatar:data");
data.setContent(avatar.image);
return publish("urn:xmpp:avatar:data", item);
}
public static IqPacket publishAvatarMetadata(final Avatar avatar) {
final Element item = new Element("item");
item.setAttribute("id", avatar.sha1sum);
final Element metadata = item
.addChild("metadata", "urn:xmpp:avatar:metadata");
final Element info = metadata.addChild("info");
info.setAttribute("bytes", avatar.size);
info.setAttribute("id", avatar.sha1sum);
info.setAttribute("height", avatar.height);
info.setAttribute("width", avatar.height);
info.setAttribute("type", avatar.type);
return publish("urn:xmpp:avatar:metadata", item);
}
public static IqPacket retrievePepAvatar(final Avatar avatar) {
final Element item = new Element("item");
item.setAttribute("id", avatar.sha1sum);
final IqPacket packet = retrieve("urn:xmpp:avatar:data", item);
packet.setTo(avatar.owner);
return packet;
}
public static IqPacket retrieveVcardAvatar(final Avatar avatar) {
final IqPacket packet = new IqPacket(IqPacket.TYPE.GET);
packet.setTo(avatar.owner);
@ -103,14 +51,6 @@ public class IqGenerator extends AbstractGenerator {
return packet;
}
public static IqPacket retrieveAvatarMetaData(final Jid to) {
final IqPacket packet = retrieve("urn:xmpp:avatar:metadata", null);
if (to != null) {
packet.setTo(to);
}
return packet;
}
public IqPacket queryMessageArchiveManagement(final MessageArchiveService.Query mam) {
final IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
final Element query = packet.query("urn:xmpp:mam:0");

View file

@ -89,12 +89,4 @@ public abstract class AbstractParser {
}
}
}
protected static String avatarData(Element items) {
Element item = items.findChild("item");
if (item == null) {
return null;
}
return item.findChildContent("data", "urn:xmpp:avatar:data");
}
}

View file

@ -59,19 +59,6 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived {
mXmppConnectionService.updateRosterUi();
}
public static String avatarData(final IqPacket packet) {
final Element pubsub = packet.findChild("pubsub",
"http://jabber.org/protocol/pubsub");
if (pubsub == null) {
return null;
}
final Element items = pubsub.findChild("items");
if (items == null) {
return null;
}
return AbstractParser.avatarData(items);
}
@Override
public void onIqPacketReceived(final Account account, final IqPacket packet) {
if (packet.hasChild("query", Xmlns.ROSTER) && packet.fromServer(account)) {

View file

@ -18,6 +18,8 @@ import de.thedevstack.conversationsplus.utils.AvatarUtil;
import de.thedevstack.conversationsplus.utils.ImageUtil;
import de.thedevstack.conversationsplus.utils.UiUpdateHelper;
import de.thedevstack.conversationsplus.utils.XmppSendUtil;
import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacketGenerator;
import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacketParser;
import eu.siacs.conversations.R;
import eu.siacs.conversations.Config;
@ -28,7 +30,6 @@ import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.ListItem;
import eu.siacs.conversations.entities.MucOptions;
import eu.siacs.conversations.generator.IqGenerator;
import eu.siacs.conversations.parser.IqParser;
import eu.siacs.conversations.persistance.DatabaseBackend;
import eu.siacs.conversations.ui.UiCallback;
import eu.siacs.conversations.utils.UIHelper;
@ -324,13 +325,13 @@ public class AvatarService {
callback.error(R.string.error_saving_avatar, avatar);
return;
}
final IqPacket packet = IqGenerator.publishAvatar(avatar);
final IqPacket packet = AvatarPacketGenerator.generatePublishAvatarPacket(avatar);
XmppSendUtil.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket result) {
if (result.getType() == IqPacket.TYPE.RESULT) {
final IqPacket packet = IqGenerator.publishAvatarMetadata(avatar);
final IqPacket packet = AvatarPacketGenerator.generatePublishAvatarMetadataPacket(avatar);
XmppSendUtil.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
@ -386,7 +387,7 @@ public class AvatarService {
}
private void fetchAvatarPep(final Account account, final Avatar avatar, final UiCallback<Avatar> callback) {
IqPacket packet = IqGenerator.retrievePepAvatar(avatar);
IqPacket packet = AvatarPacketGenerator.generateRetrieveAvatarPacket(avatar);
XmppSendUtil.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
@ -397,7 +398,7 @@ public class AvatarService {
final String ERROR = account.getJid().toBareJid()
+ ": fetching avatar for " + avatar.owner + " failed ";
if (result.getType() == IqPacket.TYPE.RESULT) {
avatar.image = IqParser.avatarData(result);
avatar.image = AvatarPacketParser.parseAvatarData(result);
if (avatar.image != null) {
if (AvatarUtil.save(avatar)) {
if (account.getJid().toBareJid().equals(avatar.owner)) {
@ -473,7 +474,7 @@ public class AvatarService {
}
public void checkForAvatar(Account account, final UiCallback<Avatar> callback) {
IqPacket packet = IqGenerator.retrieveAvatarMetaData(null);
IqPacket packet = AvatarPacketGenerator.generateRetrieveAvatarMetadataPacket(null);
XmppSendUtil.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override