Port the avatar manager on smackx.pubsub.* instead of PEPManager.
authorDa Risk <darisk972@gmail.com>
Mon, 20 Sep 2010 23:02:55 +0200
changeset 800 1eefc5da624a
parent 799 b2a796654230
child 801 9093c2de4159
Port the avatar manager on smackx.pubsub.* instead of PEPManager.
doc/asmack-beem/beem_patches/10-PubSubManager-non-final.patch
libs/asmack-android-7-beem.jar
src/com/beem/project/beem/BeemService.java
src/com/beem/project/beem/service/XmppConnectionAdapter.java
src/com/beem/project/beem/smack/AvatarMetadataExtension.java
src/com/beem/project/beem/smack/AvatarMetadataProvider.java
src/com/beem/project/beem/smack/avatar/AvatarManager.java
src/com/beem/project/beem/smack/pep/PEPListener.java
src/com/beem/project/beem/smack/pep/PepSubManager.java
--- /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);
+	}
+    }
+}