# HG changeset patch # User Da Risk # Date 1285016575 -7200 # Node ID 1eefc5da624a5f21312dd7ea221009041b0602ae # Parent b2a796654230d9b211972e8cbca90cf2d4efda26 Port the avatar manager on smackx.pubsub.* instead of PEPManager. diff -r b2a796654230 -r 1eefc5da624a doc/asmack-beem/beem_patches/10-PubSubManager-non-final.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/asmack-beem/beem_patches/10-PubSubManager-non-final.patch Mon Sep 20 23:02:55 2010 +0200 @@ -0,0 +1,13 @@ +Index: org/jivesoftware/smackx/pubsub/PubSubManager.java +=================================================================== +--- org/jivesoftware/smackx/pubsub/PubSubManager.java (revision 11464) ++++ org/jivesoftware/smackx/pubsub/PubSubManager.java (working copy) +@@ -41,7 +41,7 @@ + * + * @author Robin Collier + */ +-final public class PubSubManager ++public class PubSubManager + { + private XMPPConnection con; + private String to; diff -r b2a796654230 -r 1eefc5da624a libs/asmack-android-7-beem.jar Binary file libs/asmack-android-7-beem.jar has changed diff -r b2a796654230 -r 1eefc5da624a src/com/beem/project/beem/BeemService.java --- a/src/com/beem/project/beem/BeemService.java Sun Sep 12 01:07:36 2010 +0200 +++ b/src/com/beem/project/beem/BeemService.java Mon Sep 20 23:02:55 2010 +0200 @@ -60,6 +60,7 @@ import org.jivesoftware.smackx.pubsub.provider.PubSubProvider; import org.jivesoftware.smackx.pubsub.provider.ItemsProvider; import org.jivesoftware.smackx.pubsub.provider.ItemProvider; +import org.jivesoftware.smackx.pubsub.provider.EventProvider; import org.jivesoftware.smackx.provider.PEPProvider; import android.app.Notification; @@ -348,21 +349,25 @@ pm.addExtensionProvider("gone", "http://jabber.org/protocol/chatstates", chatState); // capabilities pm.addExtensionProvider("c", "http://jabber.org/protocol/caps", new CapsProvider()); - //PEP -// pm.addIQProvider("pubsub", "http://jabber.org/protocol/pubsub", new PubSubProvider()); -// pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub", new ItemsProvider()); -// pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub", new ItemsProvider()); -// pm.addExtensionProvider("item", "http://jabber.org/protocol/pubsub", new ItemProvider()); + //Pubsub + pm.addIQProvider("pubsub", "http://jabber.org/protocol/pubsub", new PubSubProvider()); + pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub", new ItemsProvider()); + pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub", new ItemsProvider()); + pm.addExtensionProvider("item", "http://jabber.org/protocol/pubsub", new ItemProvider()); - PEPProvider pep = new PEPProvider(); - AvatarMetadataProvider avaMeta = new AvatarMetadataProvider(); - pep.registerPEPParserExtension("urn:xmpp:avatar:metadata", avaMeta); - pm.addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", pep); -// pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub#event", new ItemsProvider()); -// pm.addExtensionProvider("item", "http://jabber.org/protocol/pubsub#event", new ItemProvider()); + pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub#event", new ItemsProvider()); + pm.addExtensionProvider("item", "http://jabber.org/protocol/pubsub#event", new ItemProvider()); + pm.addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", new EventProvider()); + //TODO rajouter les manquants pour du full pubsub + + //PEP avatar -// pm.addExtensionProvider("metadata", "urn:xmpp:avatar:metadata", new AvatarMetadataProvider()); + pm.addExtensionProvider("metadata", "urn:xmpp:avatar:metadata", new AvatarMetadataProvider()); +// PEPProvider pep = new PEPProvider(); +// AvatarMetadataProvider avaMeta = new AvatarMetadataProvider(); +// pep.registerPEPParserExtension("urn:xmpp:avatar:metadata", avaMeta); +// pm.addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", pep); /* // Private Data Storage diff -r b2a796654230 -r 1eefc5da624a src/com/beem/project/beem/service/XmppConnectionAdapter.java --- a/src/com/beem/project/beem/service/XmppConnectionAdapter.java Sun Sep 12 01:07:36 2010 +0200 +++ b/src/com/beem/project/beem/service/XmppConnectionAdapter.java Mon Sep 20 23:02:55 2010 +0200 @@ -51,7 +51,9 @@ import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.PacketFilter; +import org.jivesoftware.smack.filter.PacketExtensionFilter; import org.jivesoftware.smack.packet.Packet; +import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.*; import org.jivesoftware.smack.filter.*; import org.jivesoftware.smack.packet.*; @@ -60,6 +62,8 @@ import org.jivesoftware.smackx.ServiceDiscoveryManager; import org.jivesoftware.smackx.packet.DiscoverInfo; import org.jivesoftware.smackx.pubsub.PayloadItem; +import org.jivesoftware.smackx.pubsub.ItemsExtension; +import org.jivesoftware.smackx.pubsub.EventElement; import android.app.Notification; import android.app.PendingIntent; @@ -89,6 +93,7 @@ import com.beem.project.beem.smack.avatar.AvatarCache; import com.beem.project.beem.smack.avatar.FileAvatarCache; import com.beem.project.beem.smack.avatar.AvatarManager; +import com.beem.project.beem.smack.pep.PepSubManager; /** * This class implements an adapter for XMPPConnection. @@ -271,7 +276,7 @@ private void testPEP() { Log.d(TAG, "TEST PEP activate"); - AvatarMetadataExtension meta = new AvatarMetadataExtension(null); + AvatarMetadataExtension meta = new AvatarMetadataExtension(); AvatarMetadataExtension.Info info = new AvatarMetadataExtension.Info(); info.id = "test"; info.setUrl("http://elyzion.net/img.png"); @@ -449,7 +454,6 @@ mChatStateManager = ChatStateManager.getInstance(mAdaptee); BeemCapsManager caps = new BeemCapsManager(sdm, mAdaptee, mService); caps.setNode("http://www.beem-project.com"); - } private void discoverServerFeatures() { diff -r b2a796654230 -r 1eefc5da624a src/com/beem/project/beem/smack/AvatarMetadataExtension.java --- a/src/com/beem/project/beem/smack/AvatarMetadataExtension.java Sun Sep 12 01:07:36 2010 +0200 +++ b/src/com/beem/project/beem/smack/AvatarMetadataExtension.java Mon Sep 20 23:02:55 2010 +0200 @@ -3,13 +3,12 @@ import java.util.List; import java.util.LinkedList; -import org.jivesoftware.smackx.packet.PEPItem; +import org.jivesoftware.smack.packet.PacketExtension; -public class AvatarMetadataExtension extends PEPItem { +public class AvatarMetadataExtension implements PacketExtension { List infos = new LinkedList(); - public AvatarMetadataExtension(String id) { - super(id); + public AvatarMetadataExtension() { } public List getInfos() { @@ -21,11 +20,21 @@ } @Override + public String getElementName() { + return "metadata"; + } + + @Override + public String getNamespace() { + return "urn:xmpp:avatar:metadata"; + } + +// @Override protected String getNode() { return "urn:xmpp:avatar:metadata"; } - @Override +// @Override protected String getItemDetailsXML() { StringBuilder builder = new StringBuilder(""); @@ -37,6 +46,11 @@ return builder.toString(); } + @Override + public String toXML() { + return getItemDetailsXML(); + } + public static class Info { public int bytes; public int height; diff -r b2a796654230 -r 1eefc5da624a src/com/beem/project/beem/smack/AvatarMetadataProvider.java --- a/src/com/beem/project/beem/smack/AvatarMetadataProvider.java Sun Sep 12 01:07:36 2010 +0200 +++ b/src/com/beem/project/beem/smack/AvatarMetadataProvider.java Mon Sep 20 23:02:55 2010 +0200 @@ -19,17 +19,13 @@ public PacketExtension parseExtension(XmlPullParser parser) throws Exception { Log.e("PROVIDER", "begin parsing"); - // TODO add id - AvatarMetadataExtension metadata = null; + AvatarMetadataExtension metadata = new AvatarMetadataExtension(); boolean done = false; StringBuilder buffer = new StringBuilder(); while (!done) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { - if (parser.getName().equals("item")){ - String id = parser.getAttributeValue(null, "id"); - metadata = new AvatarMetadataExtension(id); - } else if (parser.getName().equals("info")) { + if (parser.getName().equals("info")) { AvatarMetadataExtension.Info info = new AvatarMetadataExtension.Info(); info.bytes = Integer.parseInt(parser.getAttributeValue(null, "bytes")); info.height = Integer.parseInt(parser.getAttributeValue(null, "height")); diff -r b2a796654230 -r 1eefc5da624a src/com/beem/project/beem/smack/avatar/AvatarManager.java --- a/src/com/beem/project/beem/smack/avatar/AvatarManager.java Sun Sep 12 01:07:36 2010 +0200 +++ b/src/com/beem/project/beem/smack/avatar/AvatarManager.java Mon Sep 20 23:02:55 2010 +0200 @@ -10,15 +10,16 @@ import java.util.List; -import org.jivesoftware.smackx.packet.PEPEvent; -import org.jivesoftware.smackx.packet.PEPItem; -import org.jivesoftware.smackx.PEPListener; -import org.jivesoftware.smackx.PEPManager; import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smackx.pubsub.Item; +import org.jivesoftware.smackx.pubsub.PayloadItem; +import com.beem.project.beem.smack.pep.PepSubManager; +import com.beem.project.beem.smack.pep.PEPListener; public class AvatarManager { - private PEPManager mPep; + private PepSubManager mPep; private XMPPConnection mCon; private boolean mAutoDownload; private AvatarCache mCache; @@ -26,7 +27,7 @@ public AvatarManager(XMPPConnection con, AvatarCache cache, boolean autoDownload) { Log.d("AvatarMgr", "creation"); mCon = con; - mPep = new PEPManager(mCon); + mPep = new PepSubManager(mCon); mAutoDownload = autoDownload; mCache = cache; if (mAutoDownload) @@ -58,16 +59,21 @@ private class Listener implements PEPListener { @Override - public void eventReceived(String from, PEPEvent event) { + public void eventReceived(String from, String node, List items) { - PEPItem item = event.getPEPItem(); - Log.d("AvatarMgr", "Received pep event " + item.toXML()); - if (item instanceof AvatarMetadataExtension) { - AvatarMetadataExtension ext = (AvatarMetadataExtension) item; - Info info = selectAvatar(ext.getInfos()); - if (!mCache.contains(info.getId())) - downloadAvatar(from, info); - } + Log.d("AvatarMgr", "Received pep event "); + Item i = items.get(0); + if (i instanceof PayloadItem) { + PayloadItem pi = (PayloadItem) i; + PacketExtension ex = pi.getPayload(); + if (ex instanceof AvatarMetadataExtension) { + Log.d("AvatarMgr", "Received avatar meta"); + AvatarMetadataExtension ext = (AvatarMetadataExtension) ex; + Info info = selectAvatar(ext.getInfos()); + if (!mCache.contains(info.getId())) + downloadAvatar(from, info); + } + } } } diff -r b2a796654230 -r 1eefc5da624a src/com/beem/project/beem/smack/pep/PEPListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/com/beem/project/beem/smack/pep/PEPListener.java Mon Sep 20 23:02:55 2010 +0200 @@ -0,0 +1,10 @@ +package com.beem.project.beem.smack.pep; + +import org.jivesoftware.smackx.pubsub.Item; +import java.util.List; + +public interface PEPListener { + + void eventReceived(String from, String node, List items); + +} diff -r b2a796654230 -r 1eefc5da624a src/com/beem/project/beem/smack/pep/PepSubManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/com/beem/project/beem/smack/pep/PepSubManager.java Mon Sep 20 23:02:55 2010 +0200 @@ -0,0 +1,65 @@ +package com.beem.project.beem.smack.pep; + +import org.jivesoftware.smack.Connection; +import org.jivesoftware.smack.PacketListener; +import org.jivesoftware.smack.packet.Packet; +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smack.filter.PacketFilter; +import org.jivesoftware.smack.filter.PacketExtensionFilter; +import org.jivesoftware.smackx.pubsub.PubSubManager; +import org.jivesoftware.smackx.pubsub.PayloadItem; +import org.jivesoftware.smackx.pubsub.Item; +import org.jivesoftware.smackx.pubsub.ItemsExtension; +import org.jivesoftware.smackx.pubsub.EventElement; +import org.jivesoftware.smackx.pubsub.EventElementType; + +import java.util.List; +import java.util.ArrayList; + +public class PepSubManager extends PubSubManager { + private List pepListeners = new ArrayList(); + private PacketFilter packetFilter = new PacketExtensionFilter("event", "http://jabber.org/protocol/pubsub#event"); + + public PepSubManager(Connection connection) { + super(connection); + init(connection); + } + + public PepSubManager(Connection connection, String toAddress) { + super(connection, toAddress); + init(connection); + } + + public void addPEPListener(PEPListener listener) { + if (!pepListeners.contains(listener)) + pepListeners.add(listener); + } + + public void removePEPListener(PEPListener listener) { + pepListeners.remove(listener); + } + + private void init(Connection con) { + PacketListener packetListener = new PacketListener() { + + @Override + public void processPacket(Packet packet) { + EventElement e = (EventElement) packet.getExtension("event", "http://jabber.org/protocol/pubsub#event"); + if(e.getEventType() != EventElementType.items) + return; + ItemsExtension it = (ItemsExtension) e.getEvent(); + if (it.getItemsElementType() != ItemsExtension.ItemsElementType.items) + return; + List items = (List) it.getItems(); + firePEPListeners(packet.getFrom(), it.getNode(), items); + } + }; + con.addPacketListener(packetListener, packetFilter); + } + + private void firePEPListeners(String from, String node, List items) { + for(PEPListener listener : pepListeners) { + listener.eventReceived(from, node, items); + } + } +}