Port the avatar manager on smackx.pubsub.* instead of PEPManager.
--- /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;
Binary file libs/asmack-android-7-beem.jar has changed
--- 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
--- 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() {
--- 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<Info> infos = new LinkedList<Info>();
- public AvatarMetadataExtension(String id) {
- super(id);
+ public AvatarMetadataExtension() {
}
public List<Info> 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("<metadata xmlns=\"");
builder.append(getNode()).append("\">");
@@ -37,6 +46,11 @@
return builder.toString();
}
+ @Override
+ public String toXML() {
+ return getItemDetailsXML();
+ }
+
public static class Info {
public int bytes;
public int height;
--- 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"));
--- 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<Item> 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<PacketExtension> pi = (PayloadItem<PacketExtension>) 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);
+ }
+ }
}
}
--- /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<Item> items);
+
+}
--- /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<PEPListener> pepListeners = new ArrayList<PEPListener>();
+ 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<Item> items = (List<Item>) it.getItems();
+ firePEPListeners(packet.getFrom(), it.getNode(), items);
+ }
+ };
+ con.addPacketListener(packetListener, packetFilter);
+ }
+
+ private void firePEPListeners(String from, String node, List<Item> items) {
+ for(PEPListener listener : pepListeners) {
+ listener.eventReceived(from, node, items);
+ }
+ }
+}