]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-avatar.c
Cache avatars and RequestAvatars only when needed.
[empathy.git] / libempathy / empathy-avatar.c
index 425f23f5530c3a68ce1b25e683efc42453ac0f57..e08dd28c46d9757d85a42496fb829eefce51b61b 100644 (file)
@@ -24,6 +24,8 @@
 #include "config.h"
 
 #include "empathy-avatar.h"
+#include "empathy-utils.h"
+#include "empathy-debug.h"
 
 #define DEBUG_DOMAIN "Avatar"
 
@@ -41,26 +43,113 @@ empathy_avatar_get_type (void)
        return type_id;
 }
 
-EmpathyAvatar *
-empathy_avatar_new (guchar *data,
-                  gsize   len,
-                  gchar  *format)
+static gchar *
+avatar_get_filename (const gchar *token)
 {
-       EmpathyAvatar *avatar;
+       gchar *avatar_path;
+       gchar *avatar_file;
+       gchar *token_escaped;
 
-       g_return_val_if_fail (data != NULL, NULL);
-       g_return_val_if_fail (len > 0, NULL);
-       g_return_val_if_fail (format != NULL, NULL);
+       avatar_path = g_build_filename (g_get_home_dir (),
+                                       ".gnome2",
+                                       PACKAGE_NAME,
+                                       "avatars",
+                                       NULL);
+       g_mkdir_with_parents (avatar_path, 0700);
+
+       token_escaped = empathy_escape_as_identifier (token);
+       avatar_file = g_build_filename (avatar_path, token_escaped, NULL);
+
+       g_free (token_escaped);
+       g_free (avatar_path);
+
+       return avatar_file;
+}
+
+static EmpathyAvatar *
+avatar_new (const guchar *data,
+           const gsize   len,
+           const gchar  *format,
+           const gchar  *token)
+{
+       EmpathyAvatar *avatar;
 
        avatar = g_slice_new0 (EmpathyAvatar);
        avatar->data = g_memdup (data, len);
        avatar->len = len;
        avatar->format = g_strdup (format);
+       avatar->token = g_strdup (token);
        avatar->refcount = 1;
 
        return avatar;
 }
 
+EmpathyAvatar *
+empathy_avatar_new (const guchar *data,
+                   const gsize   len,
+                   const gchar  *format,
+                   const gchar  *token)
+{
+       EmpathyAvatar *avatar;
+       gchar         *filename;
+       GError        *error = NULL;
+
+       g_return_val_if_fail (data != NULL, NULL);
+       g_return_val_if_fail (len > 0, NULL);
+       g_return_val_if_fail (format != NULL, NULL);
+       g_return_val_if_fail (!G_STR_EMPTY (token), NULL);
+
+       avatar = avatar_new (data, len, format, token);
+
+       /* Save to cache if not yet in it */
+       filename = avatar_get_filename (token);
+       if (!g_file_test (filename, G_FILE_TEST_EXISTS)) {
+               if (!g_file_set_contents (filename, data, len, &error)) {
+                       empathy_debug (DEBUG_DOMAIN,
+                                      "Failed to save avatar in cache: %s",
+                                      error ? error->message : "No error given");
+                       g_clear_error (&error);
+               } else {
+                       empathy_debug (DEBUG_DOMAIN, "Avatar saved to %s", filename);
+               }
+       }
+       g_free (filename);
+
+       return avatar;
+}
+
+EmpathyAvatar *
+empathy_avatar_new_from_cache (const gchar *token)
+{
+       EmpathyAvatar *avatar = NULL;
+       gchar         *filename;
+       gchar         *data = NULL;
+       gsize          len;
+       GError        *error = NULL;
+
+       g_return_val_if_fail (!G_STR_EMPTY (token), NULL);
+
+       /* Load the avatar from file if it exists */
+       filename = avatar_get_filename (token);
+       if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
+               if (!g_file_get_contents (filename, &data, &len, &error)) {
+                       empathy_debug (DEBUG_DOMAIN,
+                                      "Failed to load avatar from cache: %s",
+                                      error ? error->message : "No error given");
+                       g_clear_error (&error);
+               }
+       }
+
+       if (data) {
+               empathy_debug (DEBUG_DOMAIN, "Avatar loaded from %s", filename);
+               avatar = avatar_new (data, len, NULL, token);
+       }
+
+       g_free (filename);
+
+       return avatar;
+}
+
 void
 empathy_avatar_unref (EmpathyAvatar *avatar)
 {
@@ -70,6 +159,7 @@ empathy_avatar_unref (EmpathyAvatar *avatar)
        if (avatar->refcount == 0) {
                g_free (avatar->data);
                g_free (avatar->format);
+               g_free (avatar->token);
                g_slice_free (EmpathyAvatar, avatar);
        }
 }