# HG changeset patch # User Da Risk # Date 1286315601 -7200 # Node ID 8a3a48e85b6308bae21effad33c62a7a240a331c # Parent 20308ad77837c39c0e76c1ebfbcae35118aec49f add an Xmpp Avatar Retriever and a HttpClient avatar retriever. diff -r 20308ad77837 -r 8a3a48e85b63 src/com/beem/project/beem/BeemService.java --- a/src/com/beem/project/beem/BeemService.java Wed Sep 22 14:09:54 2010 +0200 +++ b/src/com/beem/project/beem/BeemService.java Tue Oct 05 23:53:21 2010 +0200 @@ -86,6 +86,7 @@ import com.beem.project.beem.utils.BeemConnectivity; import com.beem.project.beem.utils.Status; import com.beem.project.beem.smack.avatar.AvatarMetadataProvider; +import com.beem.project.beem.smack.avatar.AvatarProvider; import com.beem.project.beem.smack.caps.CapsProvider; /** @@ -363,6 +364,7 @@ //PEP avatar pm.addExtensionProvider("metadata", "urn:xmpp:avatar:metadata", new AvatarMetadataProvider()); + pm.addExtensionProvider("data", "urn:xmpp:avatar:data", new AvatarProvider()); // PEPProvider pep = new PEPProvider(); // AvatarMetadataProvider avaMeta = new AvatarMetadataProvider(); diff -r 20308ad77837 -r 8a3a48e85b63 src/com/beem/project/beem/smack/avatar/AvatarExtension.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/com/beem/project/beem/smack/avatar/AvatarExtension.java Tue Oct 05 23:53:21 2010 +0200 @@ -0,0 +1,109 @@ +/* + BEEM is a videoconference application on the Android Platform. + + Copyright (C) 2009 by Frederic-Charles Barthelery, + Jean-Manuel Da Silva, + Nikita Kozlov, + Philippe Lago, + Jean Baptiste Vergely, + Vincent Veronis. + + This file is part of BEEM. + + BEEM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + BEEM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BEEM. If not, see . + + Please send bug reports with examples or suggestions to + contact@beem-project.com or http://dev.beem-project.com/ + + Epitech, hereby disclaims all copyright interest in the program "Beem" + written by Frederic-Charles Barthelery, + Jean-Manuel Da Silva, + Nikita Kozlov, + Philippe Lago, + Jean Baptiste Vergely, + Vincent Veronis. + + Nicolas Sadirac, November 26, 2009 + President of Epitech. + + Flavien Astraud, November 26, 2009 + Head of the EIP Laboratory. + +*/ +package com.beem.project.beem.smack.avatar; + +import org.jivesoftware.smack.util.Base64; +import org.jivesoftware.smack.packet.PacketExtension; + +/** + * PacketExtension to represent the Avatar data. + * XML namespace urn:xmpp:avatar:data + * + */ +public class AvatarExtension implements PacketExtension { + + private String mData; + + /** + * Create an AvatarExtension. + */ + public AvatarExtension(final String base64) { + mData = base64; + } + + /** + * Create an AvatarExtension. + */ + public AvatarExtension(final byte[] data) { + mData = Base64.encodeBytes(data); + } + + /** + * Get the avatar data as a Base64 string. + * + * @return a base64 string. + */ + public String getBase64() { + return mData; + } + + /** + * Get the avatar data. + * + * @return the decoded data + */ + public byte[] getData() { + return Base64.decode(mData); + } + + @Override + public String getElementName() { + return "data"; + } + + @Override + public String getNamespace() { + return "urn:xmpp:avatar:data"; + } + + @Override + public String toXML() { + StringBuilder builder = new StringBuilder(""); + builder.append(mData); + builder.append(""); + return builder.toString(); + } + +} diff -r 20308ad77837 -r 8a3a48e85b63 src/com/beem/project/beem/smack/avatar/AvatarMetadataExtension.java --- a/src/com/beem/project/beem/smack/avatar/AvatarMetadataExtension.java Wed Sep 22 14:09:54 2010 +0200 +++ b/src/com/beem/project/beem/smack/avatar/AvatarMetadataExtension.java Tue Oct 05 23:53:21 2010 +0200 @@ -94,7 +94,7 @@ public String toXML() { StringBuilder builder = new StringBuilder(""); - for (Info info : infos) { + for (Info info : mInfos) { builder.append(info.toXML()); } builder.append(""); diff -r 20308ad77837 -r 8a3a48e85b63 src/com/beem/project/beem/smack/avatar/AvatarProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/com/beem/project/beem/smack/avatar/AvatarProvider.java Tue Oct 05 23:53:21 2010 +0200 @@ -0,0 +1,82 @@ +/* + BEEM is a videoconference application on the Android Platform. + + Copyright (C) 2009 by Frederic-Charles Barthelery, + Jean-Manuel Da Silva, + Nikita Kozlov, + Philippe Lago, + Jean Baptiste Vergely, + Vincent Veronis. + + This file is part of BEEM. + + BEEM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + BEEM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BEEM. If not, see . + + Please send bug reports with examples or suggestions to + contact@beem-project.com or http://dev.beem-project.com/ + + Epitech, hereby disclaims all copyright interest in the program "Beem" + written by Frederic-Charles Barthelery, + Jean-Manuel Da Silva, + Nikita Kozlov, + Philippe Lago, + Jean Baptiste Vergely, + Vincent Veronis. + + Nicolas Sadirac, November 26, 2009 + President of Epitech. + + Flavien Astraud, November 26, 2009 + Head of the EIP Laboratory. + +*/ +package com.beem.project.beem.smack.avatar; + +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smack.provider.PacketExtensionProvider; +import org.xmlpull.v1.XmlPullParser; + +/** + * A PacketExtensionProvider to parse the Avatar data. + * XML namespace urn:xmpp:avatar:data + */ +public class AvatarProvider implements PacketExtensionProvider { + + /** + * Creates a new AvatarProvider. + * ProviderManager requires that every PacketExtensionProvider has a public, no-argument constructor + */ + public AvatarProvider() { + } + + @Override + public PacketExtension parseExtension(XmlPullParser parser) + throws Exception { + AvatarMetadataExtension metadata = new AvatarMetadataExtension(); + boolean done = false; + StringBuilder buffer = new StringBuilder(); + while (!done) { + int eventType = parser.getEventType(); + if (eventType == XmlPullParser.START_TAG) { + if ("data".equals(parser.getName())) { + String data = parser.nextText(); + AvatarExtension avatar = new AvatarExtension(data); + return avatar; + } + } + parser.next(); + } + return null; + } +} diff -r 20308ad77837 -r 8a3a48e85b63 src/com/beem/project/beem/smack/avatar/AvatarRetrieverFactory.java --- a/src/com/beem/project/beem/smack/avatar/AvatarRetrieverFactory.java Wed Sep 22 14:09:54 2010 +0200 +++ b/src/com/beem/project/beem/smack/avatar/AvatarRetrieverFactory.java Tue Oct 05 23:53:21 2010 +0200 @@ -45,6 +45,9 @@ import com.beem.project.beem.smack.avatar.AvatarMetadataExtension.Info; import org.jivesoftware.smack.Connection; +// API level 8 +//import android.net.http.AndroidHttpClient; +import org.apache.http.client.HttpClient; /** * A factory for AvatarRetriever. @@ -68,8 +71,10 @@ public static AvatarRetriever getRetriever(Connection con, String from, Info info) { String url = info.getUrl(); if (url != null) { - return new HttpAvatarRetriever(url); + // return new HttpAvatarRetriever(url); + // HttpClient client = AndroidHttpClient.newInstance("Beem"); + return new HttpClientAvatarRetriever(url); } - return null; + return new XmppAvatarRetriever(con, from, info.getId()); } } diff -r 20308ad77837 -r 8a3a48e85b63 src/com/beem/project/beem/smack/avatar/HttpClientAvatarRetriever.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/com/beem/project/beem/smack/avatar/HttpClientAvatarRetriever.java Tue Oct 05 23:53:21 2010 +0200 @@ -0,0 +1,113 @@ +/* + BEEM is a videoconference application on the Android Platform. + + Copyright (C) 2009 by Frederic-Charles Barthelery, + Jean-Manuel Da Silva, + Nikita Kozlov, + Philippe Lago, + Jean Baptiste Vergely, + Vincent Veronis. + + This file is part of BEEM. + + BEEM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + BEEM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BEEM. If not, see . + + Please send bug reports with examples or suggestions to + contact@beem-project.com or http://dev.beem-project.com/ + + Epitech, hereby disclaims all copyright interest in the program "Beem" + written by Frederic-Charles Barthelery, + Jean-Manuel Da Silva, + Nikita Kozlov, + Philippe Lago, + Jean Baptiste Vergely, + Vincent Veronis. + + Nicolas Sadirac, November 26, 2009 + President of Epitech. + + Flavien Astraud, November 26, 2009 + Head of the EIP Laboratory. + +*/ +package com.beem.project.beem.smack.avatar; + +import java.io.InputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.URL; +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.HttpResponse; +import org.apache.http.HttpEntity; + +/** + * An AvatarRetriever which retrieve the avatar over HTTP using the Apache HttpClient. + */ +public class HttpClientAvatarRetriever implements AvatarRetriever { + + private String mUrl; + private HttpClient mClient; + + /** + * Create a HttpAvatarRetriever. + * + * @param client the custom HttpClient to use to downlowad + * @param url the url of the avatar to download. + */ + public HttpClientAvatarRetriever(final HttpClient client, final String url) { + mUrl = url; + mClient = client; + } + + /** + * Create a HttpAvatarRetriever. + * + * @param url the url of the avatar to download. + */ + public HttpClientAvatarRetriever(final String url) { + mUrl= url; + mClient = new DefaultHttpClient(); + } + + @Override + public byte[] getAvatar() throws IOException { + HttpUriRequest request; + try { + request = new HttpGet(mUrl); + } catch(IllegalArgumentException e) { + IOException ioe = new IOException("Invalid url " +mUrl); + ioe.initCause(e); + throw ioe; + } + HttpResponse response = mClient.execute(request); + HttpEntity entity = response.getEntity(); + InputStream in = entity.getContent(); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + try { + byte[] data = new byte[1024]; + int nbread; + while ((nbread = in.read(data)) != -1) { + os.write(data, 0, nbread); + } + } finally { + in.close(); + os.close(); + } + return os.toByteArray(); + } + +} diff -r 20308ad77837 -r 8a3a48e85b63 src/com/beem/project/beem/smack/avatar/XmppAvatarRetriever.java --- a/src/com/beem/project/beem/smack/avatar/XmppAvatarRetriever.java Wed Sep 22 14:09:54 2010 +0200 +++ b/src/com/beem/project/beem/smack/avatar/XmppAvatarRetriever.java Tue Oct 05 23:53:21 2010 +0200 @@ -51,6 +51,7 @@ import org.jivesoftware.smackx.pubsub.Node; import org.jivesoftware.smackx.pubsub.LeafNode; import org.jivesoftware.smackx.pubsub.Item; +import org.jivesoftware.smackx.pubsub.PayloadItem; /** * An AvatarRetriever which retrieve the avatar over the XMPP connection. @@ -76,6 +77,9 @@ LeafNode lnode = (LeafNode) node; List items = lnode.getItems(Arrays.asList(mId)); // TODO the rest ^^ + PayloadItem item = (PayloadItem) items.get(0); + AvatarExtension avatar = item.getPayload(); + return avatar.getData(); } } catch (XMPPException e) { return null;