Introducing some specialized IqPacketGenerators

- IqPacketGenerator
- PubSubPacketGenerator
- AvatarPacketGenerator
This commit is contained in:
steckbrief 2016-01-15 21:57:36 +01:00
parent 1f40166b31
commit d44debab67
10 changed files with 283 additions and 87 deletions

View file

@ -42,58 +42,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);
@ -101,14 +49,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

@ -87,12 +87,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

@ -58,19 +58,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

@ -23,7 +23,6 @@ import de.thedevstack.conversationsplus.entities.Conversation;
import de.thedevstack.conversationsplus.entities.ListItem;
import de.thedevstack.conversationsplus.entities.MucOptions;
import de.thedevstack.conversationsplus.generator.IqGenerator;
import de.thedevstack.conversationsplus.parser.IqParser;
import de.thedevstack.conversationsplus.persistance.DatabaseBackend;
import de.thedevstack.conversationsplus.ui.UiCallback;
import de.thedevstack.conversationsplus.utils.AvatarUtil;
@ -33,6 +32,8 @@ import de.thedevstack.conversationsplus.utils.UiUpdateHelper;
import de.thedevstack.conversationsplus.utils.XmppSendUtil;
import de.thedevstack.conversationsplus.xml.Element;
import de.thedevstack.conversationsplus.xmpp.OnIqPacketReceived;
import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacketGenerator;
import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacketParser;
import de.thedevstack.conversationsplus.xmpp.pep.Avatar;
import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
@ -323,13 +324,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
@ -385,7 +386,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
@ -396,7 +397,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)) {
@ -472,7 +473,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

View file

@ -0,0 +1,124 @@
package de.thedevstack.conversationsplus.xmpp.avatar;
import de.thedevstack.conversationsplus.xml.Element;
import de.thedevstack.conversationsplus.xmpp.jid.Jid;
import de.thedevstack.conversationsplus.xmpp.pep.Avatar;
import de.thedevstack.conversationsplus.xmpp.pubsub.PubSubPacketGenerator;
import de.thedevstack.conversationsplus.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,29 @@
package de.thedevstack.conversationsplus.xmpp.avatar;
import de.thedevstack.conversationsplus.xml.Element;
import de.thedevstack.conversationsplus.xmpp.pubsub.PubSubPacketParser;
import de.thedevstack.conversationsplus.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 de.thedevstack.conversationsplus.xml.Element;
import de.thedevstack.conversationsplus.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 de.thedevstack.conversationsplus.xml.Element;
import de.thedevstack.conversationsplus.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 de.thedevstack.conversationsplus.xml.Element;
import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
/**
* Created by tzur on 15.01.2016.
*/
public class PubSubPacketParser {
public static PubSubPacket findPubSubPacket(IqPacket packet){
if (null == packet) {
return null;
}
return (PubSubPacket) packet.findChild("pubsub", "http://jabber.org/protocol/pubsub");
}
public static Element findItems(PubSubPacket pubSubPacket) {
if (null == pubSubPacket) {
return null;
}
return pubSubPacket.findChild("items");
}
public static Element findItems(IqPacket packet) {
return PubSubPacketParser.findItems(PubSubPacketParser.findPubSubPacket(packet));
}
}

View file

@ -0,0 +1,31 @@
package de.thedevstack.conversationsplus.xmpp.stanzas;
/**
* 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
}
}