[gitg] Added Gitg.AvatarCache class to retrieve avatar images
- From: Jesse van den Kieboom <jessevdk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gitg] Added Gitg.AvatarCache class to retrieve avatar images
- Date: Sat, 6 Jul 2013 13:55:31 +0000 (UTC)
commit 702f1dbc4c93ad5224281b73d083c936ab7337e5
Author: Jesse van den Kieboom <jessevdk gmail com>
Date: Sat Jul 6 15:54:35 2013 +0200
Added Gitg.AvatarCache class to retrieve avatar images
libgitg/Makefile.am | 3 +-
libgitg/gitg-avatar-cache.vala | 117 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 119 insertions(+), 1 deletions(-)
---
diff --git a/libgitg/Makefile.am b/libgitg/Makefile.am
index 004d75e..1cac232 100644
--- a/libgitg/Makefile.am
+++ b/libgitg/Makefile.am
@@ -65,7 +65,8 @@ VALA_FILES = \
gitg-stage-status-enumerator.vala \
gitg-sidebar.vala \
gitg-hook.vala \
- gitg-date.vala
+ gitg-date.vala \
+ gitg-avatar-cache.vala
# Ignore all warnings for vala code...
libgitg_1_0_la_CFLAGS = \
diff --git a/libgitg/gitg-avatar-cache.vala b/libgitg/gitg-avatar-cache.vala
new file mode 100644
index 0000000..1a59f92
--- /dev/null
+++ b/libgitg/gitg-avatar-cache.vala
@@ -0,0 +1,117 @@
+/*
+ * This file is part of gitg
+ *
+ * Copyright (C) 2013 - Jesse van den Kieboom
+ *
+ * gitg 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * gitg 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 gitg. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+public class Gitg.AvatarCache : Object
+{
+ private Gee.HashMap<string, Gdk.Pixbuf?> d_cache;
+ private static AvatarCache? s_instance;
+
+ construct
+ {
+ d_cache = new Gee.HashMap<string, Gdk.Pixbuf>();
+ }
+
+ private AvatarCache()
+ {
+ Object();
+ }
+
+ public static AvatarCache @default()
+ {
+ if (s_instance == null)
+ {
+ s_instance = new AvatarCache();
+ }
+
+ return s_instance;
+ }
+
+ public async Gdk.Pixbuf? load(string email, Cancellable? cancellable = null)
+ {
+ var id = Checksum.compute_for_string(ChecksumType.MD5, email.down());
+
+ if (d_cache.has_key(id))
+ {
+ return d_cache[id];
+ }
+
+ var gravatar = @"http://www.gravatar.com/avatar/$(id)?d=404&s=50";
+ var gfile = File.new_for_uri(gravatar);
+
+ InputStream stream;
+
+ try
+ {
+ stream = yield gfile.read_async(Priority.LOW, cancellable);
+ }
+ catch
+ {
+ d_cache[id] = null;
+ return null;
+ }
+
+ uint8[] buffer = new uint8[4096];
+ var loader = new Gdk.PixbufLoader();
+
+ loader.set_size(50, 50);
+
+ var pixbuf = yield read_avatar(id, stream, buffer, loader, cancellable);
+ d_cache[id] = pixbuf;
+
+ return pixbuf;
+ }
+
+ private async Gdk.Pixbuf? read_avatar(string id,
+ InputStream stream,
+ uint8[] buffer,
+ Gdk.PixbufLoader loader,
+ Cancellable? cancellable = null)
+ {
+ ssize_t n;
+
+ try
+ {
+ n = yield stream.read_async(buffer, Priority.LOW, cancellable);
+ }
+ catch { return null; }
+
+ if (n != 0)
+ {
+ try
+ {
+ loader.write(buffer[0:n]);
+ }
+ catch { return null; }
+
+ return yield read_avatar(id, stream, buffer, loader, cancellable);
+ }
+ else
+ {
+ // Finished reading
+ try
+ {
+ loader.close();
+ } catch { return null; }
+
+ return loader.get_pixbuf();
+ }
+ }
+}
+
+// ex: ts=4 noet
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]