[gitg] Added Gitg.AvatarCache class to retrieve avatar images



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]