diff --git a/SparkleLib/Git/SparkleRepoGit.cs b/SparkleLib/Git/SparkleRepoGit.cs index a2b0947c..7bad384e 100644 --- a/SparkleLib/Git/SparkleRepoGit.cs +++ b/SparkleLib/Git/SparkleRepoGit.cs @@ -92,6 +92,7 @@ namespace SparkleLib { SparkleHelpers.DebugInfo ("Git", "[" + Name + "] Remote changes found. (" + remote_revision + ")"); return true; } else { +// FetchNotes ();TODO return false; } } diff --git a/SparkleShare/Mac/SparkleUI.cs b/SparkleShare/Mac/SparkleUI.cs index e793def9..c2fc2026 100644 --- a/SparkleShare/Mac/SparkleUI.cs +++ b/SparkleShare/Mac/SparkleUI.cs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . - + using System; using System.Collections.Generic; using System.Drawing; @@ -28,7 +28,7 @@ using MonoMac.Growl; namespace SparkleShare { - public partial class AppDelegate : NSApplicationDelegate { + public partial class AppDelegate : NSApplicationDelegate { public override void WillBecomeActive (NSNotification notification) { @@ -45,22 +45,22 @@ namespace SparkleShare { { SparkleShare.Controller.Quit (); } - } + } - public class SparkleUI : AppDelegate { + public class SparkleUI : AppDelegate { - public static SparkleStatusIcon StatusIcon; - public static SparkleEventLog EventLog; - public static SparkleIntro Intro; + public static SparkleStatusIcon StatusIcon; + public static SparkleEventLog EventLog; + public static SparkleIntro Intro; public static SparkleAbout About; - public static NSFont Font; + public static NSFont Font; private NSAlert alert; - public SparkleUI () - { + public SparkleUI () + { string content_path = Directory.GetParent ( System.AppDomain.CurrentDomain.BaseDirectory).ToString (); @@ -95,7 +95,7 @@ namespace SparkleShare { SparkleShare.Controller.NotificationRaised += delegate (string user_name, string user_email, string message, string repository_path) { - InvokeOnMainThread (delegate { + InvokeOnMainThread (delegate { if (EventLog != null) EventLog.UpdateEvents (); @@ -103,7 +103,7 @@ namespace SparkleShare { if (NSApplication.SharedApplication.DockTile.BadgeLabel == null) NSApplication.SharedApplication.DockTile.BadgeLabel = "1"; else - NSApplication.SharedApplication.DockTile.BadgeLabel = + NSApplication.SharedApplication.DockTile.BadgeLabel = (int.Parse (NSApplication.SharedApplication.DockTile.BadgeLabel) + 1).ToString (); if (GrowlApplicationBridge.IsGrowlRunning ()) { @@ -114,13 +114,13 @@ namespace SparkleShare { bubble.Show (); } else { - NSApplication.SharedApplication.RequestUserAttention - (NSRequestUserAttentionType.InformationalRequest); + NSApplication.SharedApplication.RequestUserAttention ( + NSRequestUserAttentionType.InformationalRequest); } } - }); - }; - + }); + }; + SparkleShare.Controller.ConflictNotificationRaised += delegate { string title = "Ouch! Mid-air collision!"; @@ -130,13 +130,13 @@ namespace SparkleShare { }; - SparkleShare.Controller.AvatarFetched += delegate { - InvokeOnMainThread (delegate { - if (EventLog != null) + SparkleShare.Controller.AvatarFetched += delegate { + InvokeOnMainThread (delegate { + if (EventLog != null) EventLog.UpdateEvents (); - }); - }; - + }); + }; + SparkleShare.Controller.OnIdle += delegate { InvokeOnMainThread (delegate { @@ -156,29 +156,29 @@ namespace SparkleShare { }; - if (SparkleShare.Controller.FirstRun) { - Intro = new SparkleIntro (); - Intro.ShowAccountForm (); - } - } - + if (SparkleShare.Controller.FirstRun) { + Intro = new SparkleIntro (); + Intro.ShowAccountForm (); + } + } + - public void SetFolderIcon () - { - string folder_icon_path = Path.Combine (NSBundle.MainBundle.ResourcePath, - "sparkleshare-mac.icns"); + public void SetFolderIcon () + { + string folder_icon_path = Path.Combine (NSBundle.MainBundle.ResourcePath, + "sparkleshare-mac.icns"); - NSImage folder_icon = new NSImage (folder_icon_path); - - NSWorkspace.SharedWorkspace.SetIconforFile (folder_icon, - SparkleShare.Controller.SparklePath, 0); - } + NSImage folder_icon = new NSImage (folder_icon_path); + + NSWorkspace.SharedWorkspace.SetIconforFile (folder_icon, + SparkleShare.Controller.SparklePath, 0); + } - public void Run () - { + public void Run () + { NSApplication.Main (new string [0]); - } + } [Export("registrationDictionaryForGrowl")] diff --git a/SparkleShare/SparkleController.cs b/SparkleShare/SparkleController.cs index 5ecf6d64..b0639a38 100644 --- a/SparkleShare/SparkleController.cs +++ b/SparkleShare/SparkleController.cs @@ -286,6 +286,7 @@ namespace SparkleShare { public string GetHTMLLog (List change_sets) { List activity_days = new List (); + List emails = new List (); change_sets.Sort ((x, y) => (x.Timestamp.CompareTo (y.Timestamp))); change_sets.Reverse (); @@ -294,7 +295,8 @@ namespace SparkleShare { return null; foreach (SparkleChangeSet change_set in change_sets) { - GetAvatar (change_set.UserEmail, 36); + if (!emails.Contains (change_set.UserEmail)) + emails.Add (change_set.UserEmail); bool change_set_inserted = false; foreach (ActivityDay stored_activity_day in activity_days) { @@ -315,6 +317,10 @@ namespace SparkleShare { } } + new Thread (new ThreadStart (delegate { + FetchAvatars (emails, 36); + })).Start (); + string event_log_html = EventLogHTML; string day_entry_html = DayEntryHTML; string event_entry_html = EventEntryHTML; @@ -837,63 +843,69 @@ namespace SparkleShare { // Gets the avatar for a specific email address and size - public string GetAvatar (string email, int size) + public void FetchAvatars (List emails, int size) { - string avatar_path = SparkleHelpers.CombineMore (SparklePaths.SparkleLocalIconPath, - size + "x" + size, "status"); + List old_avatars = new List (); + bool avatar_fetched = false; + string avatar_path = SparkleHelpers.CombineMore ( + SparklePaths.SparkleLocalIconPath, size + "x" + size, "status"); - string avatar_file_path = Path.Combine (avatar_path, "avatar-" + email); + if (!Directory.Exists (avatar_path)) { + Directory.CreateDirectory (avatar_path); + SparkleHelpers.DebugInfo ("Config", "Created '" + avatar_path + "'"); + } - if (File.Exists (avatar_file_path)) { - FileInfo avatar_info = new FileInfo (avatar_file_path); + foreach (string email in emails) { + string avatar_file_path = Path.Combine (avatar_path, "avatar-" + email); - // Delete avatars older than a month and get a new one - if (avatar_info.CreationTime < DateTime.Now.AddMonths (-1)) { - avatar_info.Delete (); - return GetAvatar (email, size); + if (File.Exists (avatar_file_path)) { + FileInfo avatar_info = new FileInfo (avatar_file_path); + + // Delete avatars older than a month + if (avatar_info.CreationTime < DateTime.Now.AddMonths (-1)) { + avatar_info.Delete (); + old_avatars.Add (email); + } } else { - return avatar_file_path; - } + WebClient client = new WebClient (); + string url = "http://gravatar.com/avatar/" + GetMD5 (email) + + ".jpg?s=" + size + "&d=404"; - } else { - if (!Directory.Exists (avatar_path)) { - Directory.CreateDirectory (avatar_path); - SparkleHelpers.DebugInfo ("Config", "Created '" + avatar_path + "'"); - } + try { + // Fetch the avatar + byte [] buffer = client.DownloadData (url); - // Let's try to get the person's gravatar for next time - WebClient web_client = new WebClient (); - Uri uri = new Uri ("https://secure.gravatar.com/avatar/" + GetMD5 (email) + - ".jpg?s=" + size + "&d=404"); + // Write the avatar data to a + // if not empty + if (buffer.Length > 255) { + avatar_fetched = true; + File.WriteAllBytes (avatar_file_path, buffer); + SparkleHelpers.DebugInfo ("Controller", "Fetched gravatar for " + email); + } - string tmp_file_path = SparkleHelpers.CombineMore (SparklePaths.SparkleTmpPath, email + size); - - if (!File.Exists (tmp_file_path)) { - web_client.DownloadFileAsync (uri, tmp_file_path); - - web_client.DownloadFileCompleted += delegate { - if (File.Exists (avatar_file_path)) - File.Delete (avatar_file_path); - - FileInfo tmp_file_info = new FileInfo (tmp_file_path); - - if (tmp_file_info.Length > 255) - File.Move (tmp_file_path, avatar_file_path); - - SparkleHelpers.DebugInfo ("Controller", "Fetched gravatar: " + email); - - if (AvatarFetched != null) - AvatarFetched (); - }; - } - - // Fall back to a generic icon if there is no gravatar - if (File.Exists (avatar_file_path)) - return avatar_file_path; - else - return null; + } catch (WebException) { + SparkleHelpers.DebugInfo ("Controller", "Failed fetching gravatar for " + email); + } + } } + + // Fetch new versions of the avatars that we + // deleted because they were too old + if (old_avatars.Count > 0) + FetchAvatars (old_avatars, size); + + if (AvatarFetched != null && avatar_fetched) + AvatarFetched (); + } + + + public string GetAvatar (string email, int size) + { + string avatar_file_path = SparkleHelpers.CombineMore ( + SparklePaths.SparkleLocalIconPath, size + "x" + size, "status", "avatar-" + email); + + return avatar_file_path; } diff --git a/SparkleShare/SparkleUI.cs b/SparkleShare/SparkleUI.cs index b439a702..8123b7f4 100644 --- a/SparkleShare/SparkleUI.cs +++ b/SparkleShare/SparkleUI.cs @@ -79,12 +79,12 @@ namespace SparkleShare { return; SparkleBubble bubble = new SparkleBubble (user_name, message); - string avatar_file_path = SparkleShare.Controller.GetAvatar (user_email, 32); + string avatar_file_path = SparkleShare.Controller.GetAvatar (user_email, 36); if (avatar_file_path != null) bubble.Icon = new Gdk.Pixbuf (avatar_file_path); else - bubble.Icon = SparkleUIHelpers.GetIcon ("avatar-default", 32); + bubble.Icon = SparkleUIHelpers.GetIcon ("avatar-default", 36); bubble.Show (); });