Add a MemoryAvatarCache.
authorDa Risk <da_risk@geekorum.com>
Sat, 07 Jan 2012 01:43:40 +0100
changeset 946 dc06a2e4d694
parent 945 4076787c45f7
child 947 3b5c343f8850
Add a MemoryAvatarCache.
src/com/beem/project/beem/smack/avatar/AvatarCache.java
src/com/beem/project/beem/smack/avatar/AvatarManager.java
src/com/beem/project/beem/smack/avatar/MemoryAvatarCache.java
--- a/src/com/beem/project/beem/smack/avatar/AvatarCache.java	Fri Jan 06 22:46:28 2012 +0100
+++ b/src/com/beem/project/beem/smack/avatar/AvatarCache.java	Sat Jan 07 01:43:40 2012 +0100
@@ -57,7 +57,7 @@
      * Put some datas in cache.
      *
      * @param id the key id of the data
-     * @param data the datato cache
+     * @param data the data to cache
      * @throws IOException if an IO error occurs while caching the data
      */
     void put(String id, byte[] data) throws IOException;
--- a/src/com/beem/project/beem/smack/avatar/AvatarManager.java	Fri Jan 06 22:46:28 2012 +0100
+++ b/src/com/beem/project/beem/smack/avatar/AvatarManager.java	Sat Jan 07 01:43:40 2012 +0100
@@ -43,23 +43,22 @@
 */
 package com.beem.project.beem.smack.avatar;
 
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.LinkedList;
+import java.util.List;
+
 import com.beem.project.beem.smack.avatar.AvatarMetadataExtension.Info;
 import com.beem.project.beem.smack.pep.PEPListener;
 import com.beem.project.beem.smack.pep.PepSubManager;
 
-import java.io.IOException;
-
-import java.util.List;
-import java.util.LinkedList;
-import java.security.NoSuchAlgorithmException;
-import java.security.MessageDigest;
-
 import org.jivesoftware.smack.Connection;
 import org.jivesoftware.smack.packet.PacketExtension;
+import org.jivesoftware.smack.util.StringUtils;
 import org.jivesoftware.smackx.pubsub.Item;
+import org.jivesoftware.smackx.pubsub.LeafNode;
 import org.jivesoftware.smackx.pubsub.PayloadItem;
-import org.jivesoftware.smackx.pubsub.LeafNode;
-import org.jivesoftware.smack.util.StringUtils;
 
 /**
  * This class deals with the avatar data.
@@ -108,7 +107,7 @@
 	mPep = pepMgr;
 	mAutoDownload = autoDownload;
 	mPep.addPEPListener(new Listener());
-	//TODO add a memory cache
+	mCache = new MemoryAvatarCache(100, 1800000);
     }
 
     /**
@@ -158,7 +157,6 @@
 	try {
 	    AvatarRetriever retriever = AvatarRetrieverFactory.getRetriever(mCon, from, info);
 	    byte[] avatar = retriever.getAvatar();
-	// TODO check the hash before store
 	    mCache.put(avatarId, avatar);
 	    return true;
 	} catch (IOException e) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/smack/avatar/MemoryAvatarCache.java	Sat Jan 07 01:43:40 2012 +0100
@@ -0,0 +1,85 @@
+/*
+    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 <http://www.gnu.org/licenses/>.
+
+    Please send bug reports with examples or suggestions to
+    contact@beem-project.com or http://dev.beem-project.com/
+
+*/
+package com.beem.project.beem.smack.avatar;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.jivesoftware.smack.util.Cache;
+
+/**
+ * An avatar cache which store the avatars in memory.
+ */
+public class MemoryAvatarCache implements AvatarCache {
+    private static final int BUFFER_SIZE = 1024;
+    private Cache<String, byte[]> mCache;
+
+    /**
+     * Create a MemoryAvatarCache.
+     *
+     * @param maxSize the maximum number of objects the cache will hold. -1 means the cache has no max size.
+     * @param maxlifetime the maximum amount of time (in ms) objects can exist in cache before being deleted.
+     *	-1 means objects never expire.
+     */
+    public MemoryAvatarCache(final int maxSize, final long maxlifetime) {
+	mCache = new Cache<String, byte[]>(maxSize, maxlifetime);
+    }
+
+    @Override
+    public void put(String key, byte[] data) throws IOException {
+	mCache.put(key, data);
+    }
+
+    @Override
+    public void put(String key, InputStream in) throws IOException {
+	ByteArrayOutputStream os = new ByteArrayOutputStream();
+	try {
+	    byte[] data = new byte[BUFFER_SIZE];
+	    int nbread;
+	    while ((nbread = in.read(data)) != -1)
+		    os.write(data, 0, nbread);
+	} finally {
+	    in.close();
+	    os.close();
+	}
+	mCache.put(key, os.toByteArray());
+    }
+
+    @Override
+    public byte[] get(String key) throws IOException {
+	return mCache.get(key);
+    }
+
+    @Override
+    public boolean contains(String key) {
+	return mCache.containsKey(key);
+    }
+}