diff --git a/FriendFace/FriendFace.cs b/FriendFace/FriendFace.cs
index b59051aa..19748228 100644
--- a/FriendFace/FriendFace.cs
+++ b/FriendFace/FriendFace.cs
@@ -15,88 +15,137 @@
// along with this program. If not, see .
using Gtk;
+using Mono.Unix;
using System;
+using System.IO;
-namespace FriendFace
-{
+namespace FriendFace {
- public class FaceCollection : IconTheme
- {
+ public class FaceCollection : IconTheme {
- private string Path;
-
- public bool UseTwitter;
+ public bool UseFlickr;
public bool UseGravatar;
public bool UseIdentica;
- public bool UseSystem;
- public bool UseFlickr;
-
- public bool UseAllServices;
+ public bool UseTwitter;
- private string IconThemePath;
+ private string Path;
public FaceCollection ()
{
- Path = "";
-
- UseTwitter = false;
- UseGravatar = false;
- UseIdentica = false;
- UseSystem = false;
- UseFlickr = false;
- UseAllServices = false;
+ UnixUserInfo unix_user_info = new UnixUserInfo (UnixEnvironment.UserName);
+ string default_theme_path = CombineMore (unix_user_info.HomeDirectory, ".icons");
+ new FaceCollection (default_theme_path);
}
+
public FaceCollection (string path)
{
-
- UnixUserInfo unix_user_info = new UnixUserInfo (UnixEnvironment.UserName);
- string home_path = unix_user_info.HomeDirectory;
-
- string IconThemePath = CombineMore (home_path, ".icons");
- SetThemePath (IconThemePath);
-
- if (!Directory.Exists (theme_path))
- Directory.CreateDirectory (theme_path);
-
- Directory.CreateDirectory (CombineMore (ThemePath));
-
-
+ CustomTheme = "FriendFace";
+ SetThemePath (path);
}
-
+
+
public void SetThemePath (string path)
{
- string IconThemePath = path;
+
+ Path = path;
+
+ if (!Directory.Exists (Path))
+ Directory.CreateDirectory (Path);
+
+ AppendSearchPath (path);
+
+ Refresh ();
+
}
+
public string GetThemePath ()
{
-
+ return Path;
}
-
- public Gdk.Pixbuf GetFace (string identifier)
+
+ public Gdk.Pixbuf GetFace (string identifier, int size)
{
- return null;
+ return LoadIcon ("avatar-default-" + identifier, size, IconLookupFlags.GenericFallback);
}
-
+
+
+ public void Refresh ()
+ {foreach (string i in SearchPath) {Console.WriteLine (i);}
+
+ IconProvider provider = new IconProvider ("");
+ string folder = provider.GetTargetFolderPath ();
+ string [] files = Directory.GetFiles (folder);
+
+ int [] sizes = {16, 24, 32, 48};
+
+ foreach (string file_path in files) {
+
+ Gdk.Pixbuf pixbuf = new Gdk.Pixbuf (file_path);
+
+ FileInfo file_info = new FileInfo (file_path);
+
+ // Delete the icon if it turns out to be empty
+ if (file_info.Length == 0) {
+ File.Delete (file_path);
+ Console.WriteLine ("Deleted: " + file_path);
+ }
+
+ for (int i = 0; i < 4; i++) {
+
+ int size = sizes [i];
+
+ Gdk.Pixbuf pixbuf_copy = pixbuf.Copy ();
+
+ if (pixbuf.Width != size || pixbuf.Height != size)
+ pixbuf_copy = pixbuf.ScaleSimple (size, size, Gdk.InterpType.Hyper);
+
+ string size_folder_path = CombineMore (Path, size + "x" + size, "status");
+ string size_file_path = CombineMore (size_folder_path, System.IO.Path.GetFileName (file_path));
+
+ Directory.CreateDirectory (size_folder_path);
+
+ if (File.Exists (size_file_path))
+ File.Delete (size_file_path);
+
+ pixbuf_copy.Save (size_file_path, "png");
+
+ }
+
+ File.Delete (file_path);
+
+ }
+
+ RescanIfNeeded ();
+
+ }
+
+
public bool AddFace (string identifier)
{
- // avatar-twitter-hbons
- // 16, 24, 32, 48
- Gdk.Pixbuf gravatar_icon;
- if (UseGravatar)
- gravatar_icon = new GravatarIcon (identifier);
+
+ if (UseGravatar) {
+ GravatarIconProvider provider = new GravatarIconProvider (identifier);
+ provider.RetrieveIcon ();
+ }
return true;
-
+
}
-
- public bool Refresh ()
+
+
+ // Makes it possible to combine more than
+ // two paths at once
+ private string CombineMore (params string [] parts)
{
- return true;
+ string new_path = "";
+ foreach (string part in parts)
+ new_path = System.IO.Path.Combine (new_path, part);
+ return new_path;
}
}
diff --git a/FriendFace/Gravatar.cs b/FriendFace/Gravatar.cs
deleted file mode 100644
index c11d799b..00000000
--- a/FriendFace/Gravatar.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-// FriendFace creates an icon theme of buddy icons from the web
-// Copyright (C) 2010 Hylke Bons
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-//
-// This library 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
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with this program. If not, see .using Gtk;
-
-using Gtk;
-using System;
-
-namespace FriendFace {
-
- public class Gravatar : Gdk.Pixbuf {
-
- public Gravatar (string identifier)
- {
-
- UnixUserInfo unix_user_info = new UnixUserInfo (UnixEnvironment.UserName);
- string home_path = unix_user_info.HomeDirectory;
-
- string theme_path = CombineMore (home_path, ".icons", "friendface", "48x48", "status");
- string file_name = "avatar-gravatar-" + identifier;
- string file_path = CombineMore (theme_path, file_name);
-
- if (!Directory.Exists (theme_path))
- Directory.CreateDirectory (theme_path);
-
- WebClient WebClient = new WebClient ();
- Uri icon_uri = new Uri ("http://www.gravatar.com/avatar/" + MD5 (identifier) + ".jpg?s=48&d=404");
-
- if (File.Exists (file_path))
- File.Delete (file_path);
-
- WebClient.DownloadFileAsync (icon_uri, file_path);
-
- WebClient.DownloadFileCompleted += delegate {
-
- FileInfo file_info = new FileInfo (file_path);
-
- if (file_info.Length < 256)
- File.Delete (file_path);
-
- };
-
- }
-
- }
-
-
- // Creates an MD5 hash of input
- public static string MD5 (string s)
- {
- MD5 md5 = new MD5CryptoServiceProvider ();
- Byte[] bytes = ASCIIEncoding.Default.GetBytes (s);
- Byte[] encoded_bytes = md5.ComputeHash (bytes);
- return BitConverter.ToString (encoded_bytes).ToLower ().Replace ("-", "");
- }
-
-
- // Makes it possible to combine more than
- // two paths at once
- public static string CombineMore (params string [] parts)
- {
- string new_path = "";
- foreach (string part in parts)
- new_path = Path.Combine (new_path, part);
- return new_path;
- }
-
-}
diff --git a/FriendFace/GravatarIconProvider.cs b/FriendFace/GravatarIconProvider.cs
new file mode 100644
index 00000000..1eee1f02
--- /dev/null
+++ b/FriendFace/GravatarIconProvider.cs
@@ -0,0 +1,66 @@
+// FriendFace creates an icon theme of buddy icons from the web
+// Copyright (C) 2010 Hylke Bons
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library 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
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with this program. If not, see .using Gtk;
+
+using Gtk;
+using Mono.Unix;
+using System;
+using System.IO;
+using System.Net;
+using System.Security.Cryptography;
+using System.Text;
+
+namespace FriendFace {
+
+ public class GravatarIconProvider : IconProvider {
+
+ public GravatarIconProvider (string email) : base (email)
+ {
+ ServiceName = "gravatar";
+ }
+
+
+ new public void RetrieveIcon ()
+ {
+
+ string target_file_path = GetTargetFilePath ();
+
+ if (File.Exists (target_file_path))
+ return;
+
+ WebClient web_client = new WebClient ();
+ Uri icon_uri = new Uri ("http://www.gravatar.com/avatar/" + MD5 (Identifier) + ".jpg?s=48&d=404");
+
+ web_client.DownloadFileAsync (icon_uri, target_file_path);
+
+ web_client.DownloadFileCompleted += delegate {
+ base.RetrieveIcon ();
+ };
+
+ }
+
+
+ // Creates an MD5 hash of input
+ public static string MD5 (string s)
+ {
+ MD5 md5 = new MD5CryptoServiceProvider ();
+ Byte[] bytes = ASCIIEncoding.Default.GetBytes (s);
+ Byte[] encoded_bytes = md5.ComputeHash (bytes);
+ return BitConverter.ToString (encoded_bytes).ToLower ().Replace ("-", "");
+ }
+
+ }
+
+}
diff --git a/FriendFace/IconProvider.cs b/FriendFace/IconProvider.cs
new file mode 100644
index 00000000..c4717c4b
--- /dev/null
+++ b/FriendFace/IconProvider.cs
@@ -0,0 +1,110 @@
+// IconProvider is a base class that can be extended to pull buddy
+// icons from sources so that they can be used by FaceCollection.
+//
+// Copyright (C) 2010 Hylke Bons
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library 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
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with this program. If not, see .using Gtk;
+
+using Gtk;
+using Mono.Unix;
+using System;
+using System.IO;
+
+namespace FriendFace {
+
+ public class IconProvider {
+
+ public string Identifier;
+ public string ServiceName;
+
+ private string TargetFolderPath;
+ private string TargetFilePath;
+
+ public IconProvider (string identifier)
+ {
+
+ Identifier = identifier;
+
+ string XDG_CACHE_HOME = Environment.GetEnvironmentVariable ("XDG_CACHE_HOME");
+
+ if (XDG_CACHE_HOME != null)
+ SetTargetFolderPath (CombineMore (XDG_CACHE_HOME, "friendface"));
+ else
+ SetTargetFolderPath (CombineMore (System.IO.Path.DirectorySeparatorChar.ToString (), "tmp", "friendface"));
+
+ string file_name = "avatar-default-" + Identifier;
+ TargetFilePath = CombineMore (TargetFolderPath, file_name);
+
+ }
+
+
+ public void RetrieveIcon ()
+ {
+
+ if (File.Exists (TargetFilePath)) {
+
+ FileInfo file_info = new FileInfo (TargetFilePath);
+
+ // Delete the icon if it turns out to be empty
+ if (file_info.Length == 0) {
+ File.Delete (TargetFilePath);
+ Console.WriteLine ("Deleted: " + TargetFilePath);
+ }
+
+ }
+
+ }
+
+
+ public void SetTargetFolderPath (string path)
+ {
+
+ TargetFolderPath = path;
+
+ if (!Directory.Exists (TargetFolderPath))
+ Directory.CreateDirectory (TargetFolderPath);
+
+ }
+
+
+ public string GetTargetFolderPath ()
+ {
+ return TargetFolderPath;
+ }
+
+
+ public void SetTargetFilePath (string path)
+ {
+ TargetFilePath = path;
+ }
+
+
+ public string GetTargetFilePath ()
+ {
+ return TargetFilePath;
+ }
+
+
+ // Makes it possible to combine more than two paths at once
+ public string CombineMore (params string [] parts)
+ {
+ string new_path = "";
+ foreach (string part in parts)
+ new_path = Path.Combine (new_path, part);
+ return new_path;
+ }
+
+ }
+
+}
diff --git a/SparkleDiff/Makefile.am b/SparkleDiff/Makefile.am
index 59fd06ce..9651f73f 100644
--- a/SparkleDiff/Makefile.am
+++ b/SparkleDiff/Makefile.am
@@ -5,6 +5,9 @@ LINK = $(REF_SPARKLEDIFF)
SOURCES = \
$(top_srcdir)/SparkleShare/Defines.cs \
+$(top_srcdir)/FriendFace/FriendFace.cs \
+$(top_srcdir)/FriendFace/IconProvider.cs \
+$(top_srcdir)/FriendFace/GravatarIconProvider.cs \
SparkleDiff.cs \
SparkleDiffWindow.cs \
RevisionView.cs \
diff --git a/SparkleDiff/SparkleDiffWindow.cs b/SparkleDiff/SparkleDiffWindow.cs
index d4a831fa..1b69dd62 100644
--- a/SparkleDiff/SparkleDiffWindow.cs
+++ b/SparkleDiff/SparkleDiffWindow.cs
@@ -14,17 +14,13 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
+using FriendFace;
using Gtk;
using Mono.Unix;
using System;
using System.Diagnostics;
using System.Text.RegularExpressions;
-using System.IO;
-using System.Net;
-using System.Security.Cryptography;
-using System.Text;
-
namespace SparkleShare {
// The main window for SparkleDiff
@@ -52,6 +48,9 @@ namespace SparkleShare {
BorderWidth = 12;
IconName = "image-x-generic";
+ FaceCollection face_collection = new FaceCollection ();
+ face_collection.UseGravatar = true;
+
DeleteEvent += Quit;
Title = file_name;
@@ -94,8 +93,10 @@ namespace SparkleShare {
UnixTimestampToDateTime (timestamp).ToString (_("ddd MMM d, yyyy")),
UnixTimestampToDateTime (timestamp).ToString (_("H:mm")));
- ViewLeft.AddRow (GetAvatar (email, 32), author, date);
- ViewRight.AddRow (GetAvatar (email, 32), author, date);
+ face_collection.AddFace (email);
+
+ ViewLeft.AddRow (face_collection.GetFace (email, 32), author, date);
+ ViewRight.AddRow (face_collection.GetFace (email, 32), author, date);
i++;
@@ -243,15 +244,6 @@ namespace SparkleShare {
}
- public string CombineMore (params string [] Parts)
- {
- string NewPath = " ";
- foreach (string Part in Parts)
- NewPath = System.IO.Path.Combine (NewPath, Part);
- return NewPath;
- }
-
-
// Converts a UNIX timestamp to a more usable time object
public DateTime UnixTimestampToDateTime (int timestamp)
{
@@ -260,78 +252,6 @@ namespace SparkleShare {
}
- // Looks up an icon from the system's theme
- public Gdk.Pixbuf GetIcon (string name, int size)
- {
- IconTheme icon_theme = new IconTheme ();
- icon_theme.AppendSearchPath (System.IO.Path.Combine ("/usr/share/sparkleshare", "icons"));
- return icon_theme.LoadIcon (name, size, IconLookupFlags.GenericFallback);
- }
-
-
- // Creates an MD5 hash of input
- public static string GetMD5 (string s)
- {
- MD5 md5 = new MD5CryptoServiceProvider ();
- Byte[] bytes = ASCIIEncoding.Default.GetBytes (s);
- Byte[] encodedBytes = md5.ComputeHash (bytes);
- return BitConverter.ToString (encodedBytes).ToLower ().Replace ("-", "");
- }
-
-
- // TODO: Turn this into an avatar fetching library
- // Gets the avatar for a specific email address and size
- public Gdk.Pixbuf GetAvatar (string Email, int Size)
- {
-
- UnixUserInfo UnixUserInfo = new UnixUserInfo (UnixEnvironment.UserName);
-
- string HomePath = UnixUserInfo.HomeDirectory;
-
- string SparkleLocalIconPath = CombineMore (HomePath, ".icons", "sparkleshare");
-
- string AvatarPath = CombineMore (SparkleLocalIconPath, Size + "x" + Size, "status");
-
- if (!Directory.Exists (AvatarPath)) {
- Directory.CreateDirectory (AvatarPath);
- }
-
- string AvatarFilePath = CombineMore (AvatarPath, Email);
-
- if (File.Exists (AvatarFilePath))
- return new Gdk.Pixbuf (AvatarFilePath);
- else {
-
- // Let's try to get the person's gravatar for next time
- WebClient WebClient = new WebClient ();
- Uri GravatarUri = new Uri ("http://www.gravatar.com/avatar/" + GetMD5 (Email) +
- ".jpg?s=" + Size + "&d=404");
-
- string TmpFile = CombineMore (HomePath, "SparkleShare", ".tmp", Email + Size);
-
- if (!File.Exists (TmpFile)) {
-
- WebClient.DownloadFileAsync (GravatarUri, TmpFile);
- WebClient.DownloadFileCompleted += delegate {
- File.Delete (AvatarFilePath);
- FileInfo TmpFileInfo = new FileInfo (TmpFile);
- if (TmpFileInfo.Length > 255)
- File.Move (TmpFile, AvatarFilePath);
- };
-
- }
-
- // Fall back to a generic icon if there is no gravatar
- if (File.Exists (AvatarFilePath))
- return new Gdk.Pixbuf (AvatarFilePath);
- else
- return GetIcon ("avatar-default", Size);
-
- }
-
- }
-
-
// Quits the program
private void Quit (object o, EventArgs args)
{