aboutsummaryrefslogtreecommitdiff
path: root/libdino
diff options
context:
space:
mode:
authorMarvin W <git@larma.de>2019-06-11 14:45:26 +0200
committerMarvin W <git@larma.de>2019-07-09 15:25:40 +0200
commitc32990dff19c17936a6b55085f9b1b513b37e39d (patch)
treeefa595e0a77f4e51ed5cc8251e007f24620773a6 /libdino
parent6c480b862eefc38b2d3ba8dc7e02ddbe8d13edee (diff)
downloaddino-c32990dff19c17936a6b55085f9b1b513b37e39d.tar.gz
dino-c32990dff19c17936a6b55085f9b1b513b37e39d.zip
Ensure avatars are not loaded multiple times
Diffstat (limited to 'libdino')
-rw-r--r--libdino/src/service/avatar_manager.vala10
-rw-r--r--libdino/src/service/avatar_storage.vala2
2 files changed, 11 insertions, 1 deletions
diff --git a/libdino/src/service/avatar_manager.vala b/libdino/src/service/avatar_manager.vala
index c9c078ab..a47273ee 100644
--- a/libdino/src/service/avatar_manager.vala
+++ b/libdino/src/service/avatar_manager.vala
@@ -23,6 +23,7 @@ public class AvatarManager : StreamInteractionModule, Object {
private HashMap<Jid, string> vcard_avatars = new HashMap<Jid, string>(Jid.hash_func, Jid.equals_func);
private AvatarStorage avatar_storage = new AvatarStorage(get_storage_dir());
private HashMap<string, Pixbuf> cached_pixbuf = new HashMap<string, Pixbuf>();
+ private HashMap<string, Gee.List<SourceFuncWrapper>> pending_pixbuf = new HashMap<string, Gee.List<SourceFuncWrapper>>();
private const int MAX_PIXEL = 192;
public static void start(StreamInteractor stream_interactor, Database db) {
@@ -50,12 +51,21 @@ public class AvatarManager : StreamInteractionModule, Object {
if (cached_pixbuf.has_key(hash)) {
return cached_pixbuf[hash];
}
+ if (pending_pixbuf.has_key(hash)) {
+ pending_pixbuf[hash].add(new SourceFuncWrapper(get_avatar_by_hash.callback));
+ yield;
+ return cached_pixbuf[hash];
+ }
+ pending_pixbuf[hash] = new ArrayList<SourceFuncWrapper>();
Pixbuf? image = yield avatar_storage.get_image(hash);
if (image != null) {
cached_pixbuf[hash] = image;
} else {
db.avatar.delete().with(db.avatar.hash, "=", hash).perform();
}
+ foreach (SourceFuncWrapper sfw in pending_pixbuf[hash]) {
+ sfw.sfun();
+ }
return image;
}
diff --git a/libdino/src/service/avatar_storage.vala b/libdino/src/service/avatar_storage.vala
index d6bdd30e..26c98e12 100644
--- a/libdino/src/service/avatar_storage.vala
+++ b/libdino/src/service/avatar_storage.vala
@@ -33,7 +33,7 @@ public class AvatarStorage : Xep.PixbufStorage, Object {
File file = File.new_for_path(Path.build_filename(folder, id));
FileInputStream stream = yield file.read_async();
- uint8 fbuf[100];
+ uint8 fbuf[1024];
size_t size;
Checksum checksum = new Checksum (ChecksumType.SHA1);