diff options
author | Marvin W <git@larma.de> | 2019-06-11 14:45:26 +0200 |
---|---|---|
committer | Marvin W <git@larma.de> | 2019-07-09 15:25:40 +0200 |
commit | c32990dff19c17936a6b55085f9b1b513b37e39d (patch) | |
tree | efa595e0a77f4e51ed5cc8251e007f24620773a6 /libdino/src/service | |
parent | 6c480b862eefc38b2d3ba8dc7e02ddbe8d13edee (diff) | |
download | dino-c32990dff19c17936a6b55085f9b1b513b37e39d.tar.gz dino-c32990dff19c17936a6b55085f9b1b513b37e39d.zip |
Ensure avatars are not loaded multiple times
Diffstat (limited to 'libdino/src/service')
-rw-r--r-- | libdino/src/service/avatar_manager.vala | 10 | ||||
-rw-r--r-- | libdino/src/service/avatar_storage.vala | 2 |
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); |