From 161bfea8b4725547dc4efee905ff851cfaf4c02f Mon Sep 17 00:00:00 2001 From: Hylke Bons Date: Sat, 28 Jul 2012 15:58:09 +0200 Subject: [PATCH] Remove Helpers class, add Logger class --- SparkleLib/Git/SparkleFetcherGit.cs | 14 +-- SparkleLib/Git/SparkleGit.cs | 4 +- SparkleLib/Git/SparkleRepoGit.cs | 45 ++++---- SparkleLib/Makefile.am | 3 +- SparkleLib/SparkleConfig.cs | 32 +++--- SparkleLib/SparkleExtensions.cs | 24 ++++- SparkleLib/SparkleFetcherBase.cs | 20 ++-- SparkleLib/SparkleHelpers.cs | 119 ---------------------- SparkleLib/SparkleLib.csproj | 5 +- SparkleLib/SparkleListenerBase.cs | 22 ++-- SparkleLib/SparkleListenerFactory.cs | 4 +- SparkleLib/SparkleListenerTcp.cs | 6 +- SparkleLib/SparkleLogger.cs | 40 ++++++++ SparkleLib/SparkleRepoBase.cs | 24 ++--- SparkleShare/Mac/Info.plist | 2 + SparkleShare/Mac/SparkleController.cs | 2 +- SparkleShare/Mac/SparkleShare.csproj | 9 +- SparkleShare/Program.cs | 6 +- SparkleShare/SparkleControllerBase.cs | 51 +++++++--- SparkleShare/SparkleEventLogController.cs | 2 +- SparkleShare/SparkleInvite.cs | 6 +- SparkleShare/SparkleKeys.cs | 12 +-- SparkleShare/SparkleSetupController.cs | 4 +- 23 files changed, 219 insertions(+), 237 deletions(-) delete mode 100755 SparkleLib/SparkleHelpers.cs create mode 100755 SparkleLib/SparkleLogger.cs diff --git a/SparkleLib/Git/SparkleFetcherGit.cs b/SparkleLib/Git/SparkleFetcherGit.cs index c1cd5977..bebb2692 100755 --- a/SparkleLib/Git/SparkleFetcherGit.cs +++ b/SparkleLib/Git/SparkleFetcherGit.cs @@ -120,7 +120,7 @@ namespace SparkleLib.Git { number = (number / 100 * 20); // "Compressing objects" stage } else { - SparkleHelpers.DebugInfo ("Fetcher", line); + SparkleLogger.LogInfo ("Fetcher", line); line = line.Trim (new char [] {' ', '@'}); if (line.StartsWith ("fatal:", StringComparison.InvariantCultureIgnoreCase) || @@ -195,7 +195,7 @@ namespace SparkleLib.Git { public override void EnableFetchedRepoCrypto (string password) { // Define the crypto filter in the config - string repo_config_file_path = SparkleHelpers.CombineMore (TargetFolder, ".git", "config"); + string repo_config_file_path = new string [] { TargetFolder, ".git", "config" }.Combine (); string config = File.ReadAllText (repo_config_file_path); string n = Environment.NewLine; @@ -207,11 +207,11 @@ namespace SparkleLib.Git { File.WriteAllText (repo_config_file_path, config); // Pass all files through the crypto filter - string git_attributes_file_path = SparkleHelpers.CombineMore (TargetFolder, ".git", "info", "attributes"); + string git_attributes_file_path = new string [] { TargetFolder, ".git", "info", "attributes" }.Combine (); File.AppendAllText (git_attributes_file_path, "\n* filter=crypto"); // Store the password - string password_file_path = SparkleHelpers.CombineMore (TargetFolder, ".git", "password"); + string password_file_path = new string [] { TargetFolder, ".git", "password" }.Combine (); File.WriteAllText (password_file_path, password.Trim ()); } @@ -269,7 +269,7 @@ namespace SparkleLib.Git { this.git.Dispose (); } catch (Exception e) { - SparkleHelpers.DebugInfo ("Fetcher", "Failed to dispose properly: " + e.Message); + SparkleLogger.LogInfo ("Fetcher", "Failed to dispose properly: " + e.Message); } } @@ -334,7 +334,7 @@ namespace SparkleLib.Git { private void InstallExcludeRules () { string exclude_rules = string.Join (Environment.NewLine, ExcludeRules); - string exclude_rules_file_path = SparkleHelpers.CombineMore (TargetFolder, ".git", "info", "exclude"); + string exclude_rules_file_path = new string [] { TargetFolder, ".git", "info", "exclude" }.Combine (); File.WriteAllText (exclude_rules_file_path, exclude_rules); } @@ -342,7 +342,7 @@ namespace SparkleLib.Git { private void InstallAttributeRules () { - string attribute_rules_file_path = SparkleHelpers.CombineMore (TargetFolder, ".git", "info", "attributes"); + string attribute_rules_file_path = new string [] { TargetFolder, ".git", "info", "attributes" }.Combine (); TextWriter writer = new StreamWriter (attribute_rules_file_path); if (this.use_git_bin) { diff --git a/SparkleLib/Git/SparkleGit.cs b/SparkleLib/Git/SparkleGit.cs index 43f4e68b..f821f38c 100644 --- a/SparkleLib/Git/SparkleGit.cs +++ b/SparkleLib/Git/SparkleGit.cs @@ -33,14 +33,14 @@ namespace SparkleLib.Git { new public void Start () { - SparkleHelpers.DebugInfo ("Cmd | " + System.IO.Path.GetFileName (StartInfo.WorkingDirectory), + SparkleLogger.LogInfo ("Cmd | " + System.IO.Path.GetFileName (StartInfo.WorkingDirectory), System.IO.Path.GetFileName (StartInfo.FileName) + " " + StartInfo.Arguments); try { base.Start (); } catch (Exception e) { - SparkleHelpers.DebugInfo ("Cmd", "Couldn't execute command: " + e.Message); + SparkleLogger.LogInfo ("Cmd", "Couldn't execute command: " + e.Message); Environment.Exit (-1); } } diff --git a/SparkleLib/Git/SparkleRepoGit.cs b/SparkleLib/Git/SparkleRepoGit.cs index 9dc7632e..02d28d28 100644 --- a/SparkleLib/Git/SparkleRepoGit.cs +++ b/SparkleLib/Git/SparkleRepoGit.cs @@ -40,7 +40,7 @@ namespace SparkleLib.Git { this.use_git_bin = (git.ExitCode == 0); - string rebase_apply_path = SparkleHelpers.CombineMore (LocalPath, ".git", "rebase-apply"); + string rebase_apply_path = new string [] { LocalPath, ".git", "rebase-apply" }.Combine (); if (Directory.Exists (rebase_apply_path)) { git = new SparkleGit (LocalPath, "rebase --abort"); @@ -141,7 +141,7 @@ namespace SparkleLib.Git { public override bool HasRemoteChanges { get { - SparkleHelpers.DebugInfo ("Git", Name + " | Checking for remote changes..."); + SparkleLogger.LogInfo ("Git", Name + " | Checking for remote changes..."); string current_revision = CurrentRevision; SparkleGit git = new SparkleGit (LocalPath, "ls-remote --heads --exit-code \"" + RemoteUrl + "\" master"); @@ -153,13 +153,13 @@ namespace SparkleLib.Git { string remote_revision = output.Substring (0, 40); if (!remote_revision.StartsWith (current_revision)) { - SparkleHelpers.DebugInfo ("Git", Name + " | Remote changes found, local: " + + SparkleLogger.LogInfo ("Git", Name + " | Remote changes found, local: " + current_revision + ", remote: " + remote_revision); return true; } else { - SparkleHelpers.DebugInfo ("Git", Name + " | No remote changes, local+remote: " + current_revision); + SparkleLogger.LogInfo ("Git", Name + " | No remote changes, local+remote: " + current_revision); return false; } } @@ -236,7 +236,7 @@ namespace SparkleLib.Git { } } else { - SparkleHelpers.DebugInfo ("Git", Name + " | " + line); + SparkleLogger.LogInfo ("Git", Name + " | " + line); } if (number >= percentage) { @@ -298,7 +298,7 @@ namespace SparkleLib.Git { } } else { - SparkleHelpers.DebugInfo ("Git", Name + " | " + line); + SparkleLogger.LogInfo ("Git", Name + " | " + line); } @@ -341,12 +341,12 @@ namespace SparkleLib.Git { public override bool HasUnsyncedChanges { get { - string unsynced_file_path = SparkleHelpers.CombineMore (LocalPath, ".git", "has_unsynced_changes"); + string unsynced_file_path = new string [] { LocalPath, ".git", "has_unsynced_changes" }.Combine (); return File.Exists (unsynced_file_path); } set { - string unsynced_file_path = SparkleHelpers.CombineMore (LocalPath, ".git", "has_unsynced_changes"); + string unsynced_file_path = new string [] { LocalPath, ".git", "has_unsynced_changes" }.Combine (); if (value) File.WriteAllText (unsynced_file_path, ""); @@ -362,7 +362,7 @@ namespace SparkleLib.Git { SparkleGit git = new SparkleGit (LocalPath, "add --all"); git.StartAndWaitForExit (); - SparkleHelpers.DebugInfo ("Git", Name + " | Changes staged"); + SparkleLogger.LogInfo ("Git", Name + " | Changes staged"); } @@ -403,19 +403,19 @@ namespace SparkleLib.Git { git.StartAndWaitForExit (); if (git.ExitCode != 0) { - SparkleHelpers.DebugInfo ("Git", Name + " | Conflict detected, trying to get out..."); + SparkleLogger.LogInfo ("Git", Name + " | Conflict detected, trying to get out..."); while (HasLocalChanges) { try { ResolveConflict (); } catch (IOException e) { - SparkleHelpers.DebugInfo ("Git", + SparkleLogger.LogInfo ("Git", Name + " | Failed to resolve conflict, trying again... (" + e.Message + ")"); } } - SparkleHelpers.DebugInfo ("Git", Name + " | Conflict resolved"); + SparkleLogger.LogInfo ("Git", Name + " | Conflict resolved"); OnConflictResolved (); } } @@ -452,7 +452,7 @@ namespace SparkleLib.Git { string conflicting_path = line.Substring (3); conflicting_path = EnsureSpecialCharacters (conflicting_path); - SparkleHelpers.DebugInfo ("Git", Name + " | Conflict type: " + line); + SparkleLogger.LogInfo ("Git", Name + " | Conflict type: " + line); // Ignore conflicts in the .sparkleshare file and use the local version if (conflicting_path.EndsWith (".sparkleshare") || @@ -747,7 +747,7 @@ namespace SparkleLib.Git { { try { foreach (string child_path in Directory.GetDirectories (path)) { - if (SparkleHelpers.IsSymlink (child_path)) + if (IsSymlink (child_path)) continue; if (child_path.EndsWith (".git")) { @@ -758,7 +758,7 @@ namespace SparkleLib.Git { if (File.Exists (HEAD_file_path)) { File.Move (HEAD_file_path, HEAD_file_path + ".backup"); - SparkleHelpers.DebugInfo ("Git", Name + " | Renamed " + HEAD_file_path); + SparkleLogger.LogInfo ("Git", Name + " | Renamed " + HEAD_file_path); } continue; @@ -777,13 +777,13 @@ namespace SparkleLib.Git { File.SetAttributes (Path.Combine (path, ".empty"), FileAttributes.Hidden); } catch { - SparkleHelpers.DebugInfo ("Git", Name + " | Failed adding empty folder " + path); + SparkleLogger.LogInfo ("Git", Name + " | Failed adding empty folder " + path); } } } } catch (IOException e) { - SparkleHelpers.DebugInfo ("Git", "Failed preparing directory: " + e.Message); + SparkleLogger.LogInfo ("Git", "Failed preparing directory: " + e.Message); } } @@ -857,7 +857,7 @@ namespace SparkleLib.Git { } } catch (Exception e) { - SparkleHelpers.DebugInfo ("Local", "Error calculating size: " + e.Message); + SparkleLogger.LogInfo ("Local", "Error calculating size: " + e.Message); return 0; } @@ -867,11 +867,18 @@ namespace SparkleLib.Git { size += CalculateSizes (directory); } catch (Exception e) { - SparkleHelpers.DebugInfo ("Local", "Error calculating size: " + e.Message); + SparkleLogger.LogInfo ("Local", "Error calculating size: " + e.Message); return 0; } return size; } + + + private bool IsSymlink (string file) + { + FileAttributes attributes = File.GetAttributes (file); + return ((attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint); + } } } diff --git a/SparkleLib/Makefile.am b/SparkleLib/Makefile.am index aa340d2e..87efac60 100755 --- a/SparkleLib/Makefile.am +++ b/SparkleLib/Makefile.am @@ -4,17 +4,16 @@ TARGET = library ASSEMBLY_INFO_SOURCE = Defines.cs SOURCES = \ - Defines.cs \ SparkleAnnouncement.cs \ SparkleBackend.cs \ SparkleConfig.cs \ SparkleExceptions.cs \ SparkleExtensions.cs \ SparkleFetcherBase.cs \ - SparkleHelpers.cs \ SparkleListenerBase.cs \ SparkleListenerFactory.cs \ SparkleListenerTcp.cs \ + SparkleLogger.cs \ SparkleRepoBase.cs \ SparkleUser.cs \ SparkleWatcher.cs \ diff --git a/SparkleLib/SparkleConfig.cs b/SparkleLib/SparkleConfig.cs index d1d0209b..dfe5f42b 100755 --- a/SparkleLib/SparkleConfig.cs +++ b/SparkleLib/SparkleConfig.cs @@ -38,7 +38,7 @@ namespace SparkleLib { if (GetConfigOption ("home_path") != null) return GetConfigOption ("home_path"); - if (SparkleHelpers.IsWindows) + if (SparkleBackend.Platform == PlatformID.Win32NT) return Environment.GetFolderPath (Environment.SpecialFolder.UserProfile); else return Environment.GetFolderPath (Environment.SpecialFolder.Personal); @@ -139,9 +139,7 @@ namespace SparkleLib { string email = email_node.Value; string pubkey_file_path = Path.Combine ( - Path.GetDirectoryName (FullPath), - "sparkleshare." + email + ".key.pub" - ); + Path.GetDirectoryName (FullPath), "sparkleshare." + email + ".key.pub"); SparkleUser user = new SparkleUser (name, email); @@ -179,19 +177,18 @@ namespace SparkleLib { public void AddFolder (string name, string identifier, string url, string backend) { - XmlNode node_name = CreateElement ("name"); - node_name.InnerText = name; + XmlNode node_name = CreateElement ("name"); + XmlNode node_identifier = CreateElement ("identifier"); + XmlNode node_url = CreateElement ("url"); + XmlNode node_backend = CreateElement ("backend"); - XmlNode node_identifier = CreateElement ("identifier"); + node_name.InnerText = name; node_identifier.InnerText = identifier; - - XmlNode node_url = CreateElement ("url"); - node_url.InnerText = url; - - XmlNode node_backend = CreateElement ("backend"); - node_backend.InnerText = backend; + node_url.InnerText = url; + node_backend.InnerText = backend; XmlNode node_folder = CreateNode (XmlNodeType.Element, "folder", null); + node_folder.AppendChild (node_name); node_folder.AppendChild (node_identifier); node_folder.AppendChild (node_url); @@ -217,9 +214,10 @@ namespace SparkleLib { public void RenameFolder (string identifier, string name) { - XmlNode node_folder = SelectSingleNode (string.Format ("/sparkleshare/folder[identifier=\"{0}\"]", identifier)); - node_folder ["name"].InnerText = name; + XmlNode node_folder = SelectSingleNode ( + string.Format ("/sparkleshare/folder[identifier=\"{0}\"]", identifier)); + node_folder ["name"].InnerText = name; Save (); } @@ -339,8 +337,8 @@ namespace SparkleLib { node_root.AppendChild (node); } - SparkleHelpers.DebugInfo ("Config", "Updated option " + name + ":" + content); Save (); + SparkleLogger.LogInfo ("Config", "Updated option " + name + ":" + content); } @@ -350,7 +348,7 @@ namespace SparkleLib { throw new FileNotFoundException (FullPath + " does not exist"); Save (FullPath); - SparkleHelpers.DebugInfo ("Config", "Wrote to '" + FullPath + "'"); + SparkleLogger.LogInfo ("Config", "Wrote to '" + FullPath + "'"); } } } diff --git a/SparkleLib/SparkleExtensions.cs b/SparkleLib/SparkleExtensions.cs index 38e30e0a..c386a52d 100755 --- a/SparkleLib/SparkleExtensions.cs +++ b/SparkleLib/SparkleExtensions.cs @@ -17,12 +17,14 @@ using System; using System.IO; +using System.Security.Cryptography; +using System.Text; namespace SparkleLib { public static class Extensions { - public static string Combine (this String [] parts) + public static string Combine (this string [] parts) { string new_path = ""; @@ -31,5 +33,25 @@ namespace SparkleLib { return new_path; } + + + public static string SHA1 (this string s) + { + SHA1 sha1 = new SHA1CryptoServiceProvider (); + byte [] bytes = ASCIIEncoding.Default.GetBytes (s); + byte [] enc_bytes = sha1.ComputeHash (bytes); + + return BitConverter.ToString (enc_bytes).ToLower ().Replace ("-", ""); + } + + + public static string MD5 (this string s) + { + MD5 md5 = new MD5CryptoServiceProvider (); + byte [] bytes = ASCIIEncoding.Default.GetBytes (s); + byte [] enc_bytes = md5.ComputeHash (bytes); + + return BitConverter.ToString (enc_bytes).ToLower ().Replace ("-", ""); + } } } diff --git a/SparkleLib/SparkleFetcherBase.cs b/SparkleLib/SparkleFetcherBase.cs index 54581049..4ae56b91 100755 --- a/SparkleLib/SparkleFetcherBase.cs +++ b/SparkleLib/SparkleFetcherBase.cs @@ -116,7 +116,7 @@ namespace SparkleLib { IsActive = true; Started (); - SparkleHelpers.DebugInfo ("Fetcher", TargetFolder + " | Fetching folder: " + RemoteUrl); + SparkleLogger.LogInfo ("Fetcher", TargetFolder + " | Fetching folder: " + RemoteUrl); if (Directory.Exists (TargetFolder)) Directory.Delete (TargetFolder, true); @@ -134,7 +134,7 @@ namespace SparkleLib { string host_fingerprint = GetFingerprint (host_key); if (host_fingerprint == null || !RequiredFingerprint.Equals (host_fingerprint)) { - SparkleHelpers.DebugInfo ("Auth", "Fingerprint doesn't match"); + SparkleLogger.LogInfo ("Auth", "Fingerprint doesn't match"); this.errors.Add ("error: Host fingerprint doesn't match"); Failed (); @@ -143,10 +143,10 @@ namespace SparkleLib { } warn = false; - SparkleHelpers.DebugInfo ("Auth", "Fingerprint matches"); + SparkleLogger.LogInfo ("Auth", "Fingerprint matches"); } else { - SparkleHelpers.DebugInfo ("Auth", "Skipping fingerprint check"); + SparkleLogger.LogInfo ("Auth", "Skipping fingerprint check"); } AcceptHostKey (host_key, warn); @@ -154,7 +154,7 @@ namespace SparkleLib { this.thread = new Thread (() => { if (Fetch ()) { Thread.Sleep (500); - SparkleHelpers.DebugInfo ("Fetcher", "Finished"); + SparkleLogger.LogInfo ("Fetcher", "Finished"); IsActive = false; @@ -164,7 +164,7 @@ namespace SparkleLib { } else { Thread.Sleep (500); - SparkleHelpers.DebugInfo ("Fetcher", "Failed"); + SparkleLogger.LogInfo ("Fetcher", "Failed"); IsActive = false; Failed (); @@ -217,7 +217,7 @@ namespace SparkleLib { public static string CreateIdentifier () { string random = Path.GetRandomFileName (); - return SparkleHelpers.SHA1 (random); + return random.SHA1 (); } @@ -255,7 +255,7 @@ namespace SparkleLib { private string GetHostKey () { string host = RemoteUrl.Host; - SparkleHelpers.DebugInfo ("Auth", "Fetching host key for " + host); + SparkleLogger.LogInfo ("Auth", "Fetching host key for " + host); Process process = new Process () { EnableRaisingEvents = true @@ -312,7 +312,7 @@ namespace SparkleLib { fingerprint = fingerprint.Substring (fingerprint.IndexOf (" ") + 1, 47); } catch (Exception e) { - SparkleHelpers.DebugInfo ("Fetcher", "Not a valid fingerprint: " + e.Message); + SparkleLogger.LogInfo ("Fetcher", "Not a valid fingerprint: " + e.Message); return null; } @@ -346,7 +346,7 @@ namespace SparkleLib { else File.AppendAllText (known_hosts_file_path, "\n" + host_key + "\n"); - SparkleHelpers.DebugInfo ("Auth", "Accepted host key for " + host); + SparkleLogger.LogInfo ("Auth", "Accepted host key for " + host); if (warn) this.warnings.Add ("The following host key has been accepted:\n" + GetFingerprint (host_key)); diff --git a/SparkleLib/SparkleHelpers.cs b/SparkleLib/SparkleHelpers.cs deleted file mode 100755 index b7b575bc..00000000 --- a/SparkleLib/SparkleHelpers.cs +++ /dev/null @@ -1,119 +0,0 @@ -// SparkleShare, a collaboration and sharing tool. -// Copyright (C) 2010 Hylke Bons -// -// This program 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 3 of the License, or -// (at your option) any later version. -// -// This program 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 this program. If not, see . - - -using System; -using System.IO; -using System.Security.Cryptography; -using System.Text; - -namespace SparkleLib { - - public static class SparkleHelpers { - - private static Object debug_lock = new Object (); - - // Show debug info if needed - public static void DebugInfo (string type, string message) - { - string timestamp = DateTime.Now.ToString ("HH:mm:ss"); - string line = timestamp + " | " + type + " | " + message; - - if (SparkleConfig.DebugMode) - Console.WriteLine (line); - - lock (debug_lock) - File.AppendAllText (SparkleConfig.DefaultConfig.LogFilePath, line + Environment.NewLine); - } - - - // 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; - } - - - // Recursively sets access rights of a folder to 'Normal' - public static void ClearAttributes (string path) - { - if (!Directory.Exists (path)) - return; - - string [] folders = Directory.GetDirectories (path); - - foreach (string folder in folders) - ClearAttributes (folder); - - string [] files = Directory.GetFiles(path); - - foreach (string file in files) - if (!IsSymlink (file)) - File.SetAttributes (file, FileAttributes.Normal); - } - - - // Check if a file is a symbolic link - public static bool IsSymlink (string file) - { - FileAttributes attributes = File.GetAttributes (file); - return ((attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint); - } - - - // Converts a UNIX timestamp to a more usable time object - public static DateTime UnixTimestampToDateTime (int timestamp) - { - DateTime unix_epoch = new DateTime (1970, 1, 1, 0, 0, 0, 0); - return unix_epoch.AddSeconds (timestamp); - } - - - public static bool IsWindows { - get { - return (Environment.OSVersion.Platform == PlatformID.Win32NT || - Environment.OSVersion.Platform == PlatformID.Win32S || - Environment.OSVersion.Platform == PlatformID.Win32Windows); - } - } - - - public static string SHA1 (string s) - { - SHA1 sha1 = new SHA1CryptoServiceProvider (); - byte [] bytes = ASCIIEncoding.Default.GetBytes (s); - byte [] enc_bytes = sha1.ComputeHash (bytes); - - return BitConverter.ToString (enc_bytes).ToLower ().Replace ("-", ""); - } - - - public static string MD5 (string s) - { - MD5 md5 = new MD5CryptoServiceProvider (); - byte [] bytes = ASCIIEncoding.Default.GetBytes (s); - byte [] enc_bytes = md5.ComputeHash (bytes); - - return BitConverter.ToString (enc_bytes).ToLower ().Replace ("-", ""); - } - } -} diff --git a/SparkleLib/SparkleLib.csproj b/SparkleLib/SparkleLib.csproj index b092e6b2..ebb359b8 100644 --- a/SparkleLib/SparkleLib.csproj +++ b/SparkleLib/SparkleLib.csproj @@ -1,5 +1,5 @@ - + Debug AnyCPU @@ -37,9 +37,7 @@ - - @@ -50,6 +48,7 @@ + diff --git a/SparkleLib/SparkleListenerBase.cs b/SparkleLib/SparkleListenerBase.cs index 40df07da..c281a91c 100755 --- a/SparkleLib/SparkleListenerBase.cs +++ b/SparkleLib/SparkleListenerBase.cs @@ -76,19 +76,19 @@ namespace SparkleLib { { if (!IsRecentAnnouncement (announcement)) { if (IsConnected) { - SparkleHelpers.DebugInfo ("Listener", "Announcing message " + announcement.Message + + SparkleLogger.LogInfo ("Listener", "Announcing message " + announcement.Message + " to " + announcement.FolderIdentifier + " on " + Server); AnnounceInternal (announcement); AddRecentAnnouncement (announcement); } else { - SparkleHelpers.DebugInfo ("Listener", "Can't send message to " + Server + ". Queuing message"); + SparkleLogger.LogInfo ("Listener", "Can't send message to " + Server + ". Queuing message"); this.queue_up [announcement.FolderIdentifier] = announcement; } } else { - SparkleHelpers.DebugInfo ("Listener", "Already processed message " + announcement.Message + + SparkleLogger.LogInfo ("Listener", "Already processed message " + announcement.Message + " to " + announcement.FolderIdentifier + " from " + Server); } } @@ -97,7 +97,7 @@ namespace SparkleLib { public void AlsoListenTo (string channel) { if (!this.channels.Contains (channel) && IsConnected) { - SparkleHelpers.DebugInfo ("Listener", "Subscribing to channel " + channel + " on " + Server); + SparkleLogger.LogInfo ("Listener", "Subscribing to channel " + channel + " on " + Server); this.channels.Add (channel); AlsoListenToInternal (channel); @@ -107,18 +107,18 @@ namespace SparkleLib { public void Reconnect () { - SparkleHelpers.DebugInfo ("Listener", "Trying to reconnect to " + Server); + SparkleLogger.LogInfo ("Listener", "Trying to reconnect to " + Server); Connect (); } public void OnConnected () { - SparkleHelpers.DebugInfo ("Listener", "Listening for announcements on " + Server); + SparkleLogger.LogInfo ("Listener", "Listening for announcements on " + Server); Connected (); if (this.queue_up.Count > 0) { - SparkleHelpers.DebugInfo ("Listener", "Delivering " + this.queue_up.Count + " queued messages..."); + SparkleLogger.LogInfo ("Listener", "Delivering " + this.queue_up.Count + " queued messages..."); foreach (KeyValuePair item in this.queue_up) { SparkleAnnouncement announcement = item.Value; @@ -132,25 +132,25 @@ namespace SparkleLib { public void OnDisconnected (string message) { - SparkleHelpers.DebugInfo ("Listener", "Disconnected from " + Server + ": " + message); + SparkleLogger.LogInfo ("Listener", "Disconnected from " + Server + ": " + message); Disconnected (); } public void OnAnnouncement (SparkleAnnouncement announcement) { - SparkleHelpers.DebugInfo ("Listener", + SparkleLogger.LogInfo ("Listener", "Got message " + announcement.Message + " from " + announcement.FolderIdentifier + " on " + Server); if (IsRecentAnnouncement (announcement)) { - SparkleHelpers.DebugInfo ("Listener", "Ignoring previously processed message " + announcement.Message + + SparkleLogger.LogInfo ("Listener", "Ignoring previously processed message " + announcement.Message + " from " + announcement.FolderIdentifier + " on " + Server); return; } - SparkleHelpers.DebugInfo ("Listener", "Processing message " + announcement.Message + " from " + + SparkleLogger.LogInfo ("Listener", "Processing message " + announcement.Message + " from " + announcement.FolderIdentifier + " on " + Server); AddRecentAnnouncement (announcement); diff --git a/SparkleLib/SparkleListenerFactory.cs b/SparkleLib/SparkleListenerFactory.cs index 304b97cc..30b12e97 100644 --- a/SparkleLib/SparkleListenerFactory.cs +++ b/SparkleLib/SparkleListenerFactory.cs @@ -54,7 +54,7 @@ namespace SparkleLib { // the number of connections as low as possible foreach (SparkleListenerBase listener in listeners) { if (listener.Server.Equals (announce_uri)) { - SparkleHelpers.DebugInfo ("ListenerFactory", "Refered to existing listener for " + announce_uri); + SparkleLogger.LogInfo ("ListenerFactory", "Refered to existing listener for " + announce_uri); // We already seem to have a listener for this server, // refer to the existing one instead @@ -64,7 +64,7 @@ namespace SparkleLib { } listeners.Add (new SparkleListenerTcp (announce_uri, folder_identifier)); - SparkleHelpers.DebugInfo ("ListenerFactory", "Issued new listener for " + announce_uri); + SparkleLogger.LogInfo ("ListenerFactory", "Issued new listener for " + announce_uri); return (SparkleListenerBase) listeners [listeners.Count - 1]; } diff --git a/SparkleLib/SparkleListenerTcp.cs b/SparkleLib/SparkleListenerTcp.cs index 6f87d736..14ec169b 100755 --- a/SparkleLib/SparkleListenerTcp.cs +++ b/SparkleLib/SparkleListenerTcp.cs @@ -106,7 +106,7 @@ namespace SparkleLib { // We've timed out, let's ping the server to // see if the connection is still up if (i == timeout) { - SparkleHelpers.DebugInfo ("ListenerTcp", + SparkleLogger.LogInfo ("ListenerTcp", "Pinging " + Server); byte [] ping_bytes = Encoding.UTF8.GetBytes ("ping\n"); @@ -118,7 +118,7 @@ namespace SparkleLib { // 10057 means "Socket is not connected" throw new SocketException (10057); - SparkleHelpers.DebugInfo ("ListenerTcp", "Received pong from " + Server); + SparkleLogger.LogInfo ("ListenerTcp", "Received pong from " + Server); i = 0; this.last_ping = DateTime.Now; @@ -135,7 +135,7 @@ namespace SparkleLib { ); if (sleepiness <= 0) { - SparkleHelpers.DebugInfo ("ListenerTcp", "System woke up from sleep"); + SparkleLogger.LogInfo ("ListenerTcp", "System woke up from sleep"); // 10057 means "Socket is not connected" throw new SocketException (10057); diff --git a/SparkleLib/SparkleLogger.cs b/SparkleLib/SparkleLogger.cs new file mode 100755 index 00000000..f6e5a370 --- /dev/null +++ b/SparkleLib/SparkleLogger.cs @@ -0,0 +1,40 @@ +// SparkleShare, a collaboration and sharing tool. +// Copyright (C) 2010 Hylke Bons +// +// This program 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 3 of the License, or +// (at your option) any later version. +// +// This program 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 this program. If not, see . + + +using System; +using System.IO; + +namespace SparkleLib { + + public static class SparkleLogger { + + private static Object debug_lock = new Object (); + + + public static void LogInfo (string type, string message) + { + string timestamp = DateTime.Now.ToString ("HH:mm:ss"); + string line = timestamp + " | " + type + " | " + message; + + if (SparkleConfig.DebugMode) + Console.WriteLine (line); + + lock (debug_lock) + File.AppendAllText (SparkleConfig.DefaultConfig.LogFilePath, line + Environment.NewLine); + } + } +} diff --git a/SparkleLib/SparkleRepoBase.cs b/SparkleLib/SparkleRepoBase.cs index b47a6f86..063a6dd9 100755 --- a/SparkleLib/SparkleRepoBase.cs +++ b/SparkleLib/SparkleRepoBase.cs @@ -95,7 +95,7 @@ namespace SparkleLib { File.WriteAllText (id_path, this.identifier); File.SetAttributes (id_path, FileAttributes.Hidden); - SparkleHelpers.DebugInfo ("Local", Name + " | Assigned identifier: " + this.identifier); + SparkleLogger.LogInfo ("Local", Name + " | Assigned identifier: " + this.identifier); return this.identifier; } @@ -214,7 +214,7 @@ namespace SparkleLib { IsBuffering = true; this.watcher.Disable (); - SparkleHelpers.DebugInfo ("Local", Name + " | Activity detected, waiting for it to settle..."); + SparkleLogger.LogInfo ("Local", Name + " | Activity detected, waiting for it to settle..."); List size_buffer = new List (); @@ -230,7 +230,7 @@ namespace SparkleLib { size_buffer [1].Equals (size_buffer [2]) && size_buffer [2].Equals (size_buffer [3])) { - SparkleHelpers.DebugInfo ("Local", Name + " | Activity has settled"); + SparkleLogger.LogInfo ("Local", Name + " | Activity has settled"); IsBuffering = false; if (HasLocalChanges) { @@ -280,13 +280,13 @@ namespace SparkleLib { { this.watcher.Disable (); - SparkleHelpers.DebugInfo ("SyncUp", Name + " | Initiated"); + SparkleLogger.LogInfo ("SyncUp", Name + " | Initiated"); HasUnsyncedChanges = true; SyncStatusChanged (SyncStatus.SyncUp); if (SyncUp ()) { - SparkleHelpers.DebugInfo ("SyncUp", Name + " | Done"); + SparkleLogger.LogInfo ("SyncUp", Name + " | Done"); ChangeSets = GetChangeSets (); HasUnsyncedChanges = false; @@ -295,7 +295,7 @@ namespace SparkleLib { this.listener.Announce (new SparkleAnnouncement (Identifier, CurrentRevision)); } else { - SparkleHelpers.DebugInfo ("SyncUp", Name + " | Error"); + SparkleLogger.LogInfo ("SyncUp", Name + " | Error"); SyncDownBase (); this.watcher.Disable (); @@ -323,13 +323,13 @@ namespace SparkleLib { { this.watcher.Disable (); - SparkleHelpers.DebugInfo ("SyncDown", Name + " | Initiated"); + SparkleLogger.LogInfo ("SyncDown", Name + " | Initiated"); SyncStatusChanged (SyncStatus.SyncDown); string pre_sync_revision = CurrentRevision; if (SyncDown ()) { - SparkleHelpers.DebugInfo ("SyncDown", Name + " | Done"); + SparkleLogger.LogInfo ("SyncDown", Name + " | Done"); ServerOnline = true; ChangeSets = GetChangeSets (); @@ -361,7 +361,7 @@ namespace SparkleLib { SyncStatusChanged (SyncStatus.Idle); } else { - SparkleHelpers.DebugInfo ("SyncDown", Name + " | Error"); + SparkleLogger.LogInfo ("SyncDown", Name + " | Error"); ServerOnline = false; ChangeSets = GetChangeSets (); @@ -424,7 +424,7 @@ namespace SparkleLib { private void ListenerDisconnectedDelegate () { this.poll_interval = PollInterval.Short; - SparkleHelpers.DebugInfo (Name, "Falling back to polling"); + SparkleLogger.LogInfo (Name, "Falling back to polling"); } @@ -439,12 +439,12 @@ namespace SparkleLib { while (this.is_syncing) Thread.Sleep (100); - SparkleHelpers.DebugInfo ("Listener", "Syncing due to announcement"); + SparkleLogger.LogInfo ("Listener", "Syncing due to announcement"); SyncDownBase (); } else { if (announcement.FolderIdentifier.Equals (identifier)) - SparkleHelpers.DebugInfo ("Listener", "Not syncing, message is for current revision"); + SparkleLogger.LogInfo ("Listener", "Not syncing, message is for current revision"); } } diff --git a/SparkleShare/Mac/Info.plist b/SparkleShare/Mac/Info.plist index 998e6b71..7a893897 100755 --- a/SparkleShare/Mac/Info.plist +++ b/SparkleShare/Mac/Info.plist @@ -10,6 +10,8 @@ SparkleShare CFBundleVersion 1 + LSApplicationCategoryType + public.app-category.productivity LSMinimumSystemVersion 10.6 LSUIElement diff --git a/SparkleShare/Mac/SparkleController.cs b/SparkleShare/Mac/SparkleController.cs index 3d69a953..4d892825 100755 --- a/SparkleShare/Mac/SparkleController.cs +++ b/SparkleShare/Mac/SparkleController.cs @@ -111,7 +111,7 @@ namespace SparkleShare { process.Start (); process.WaitForExit (); - SparkleHelpers.DebugInfo ("Controller", "Added " + NSBundle.MainBundle.BundlePath + " to login items"); + SparkleLogger.LogInfo ("Controller", "Added " + NSBundle.MainBundle.BundlePath + " to login items"); } diff --git a/SparkleShare/Mac/SparkleShare.csproj b/SparkleShare/Mac/SparkleShare.csproj index aebfaaf6..eced0ecd 100644 --- a/SparkleShare/Mac/SparkleShare.csproj +++ b/SparkleShare/Mac/SparkleShare.csproj @@ -14,8 +14,7 @@ - true - full + none false bin\Debug DEBUG @@ -26,7 +25,13 @@ + false + false + false + false false + Mac Developer + 3rd Party Mac Developer Installer diff --git a/SparkleShare/Program.cs b/SparkleShare/Program.cs index 30878322..4b6d39a2 100644 --- a/SparkleShare/Program.cs +++ b/SparkleShare/Program.cs @@ -18,6 +18,8 @@ using System; using System.Threading; +using SparkleLib; + namespace SparkleShare { // This is SparkleShare! @@ -34,7 +36,9 @@ namespace SparkleShare { #endif public static void Main (string [] args) { - if (args.Length != 0 && !args [0].Equals ("start")) { + if (args.Length != 0 && !args [0].Equals ("start") && + SparkleBackend.Platform != PlatformID.MacOSX) { + string n = Environment.NewLine; Console.WriteLine (n + diff --git a/SparkleShare/SparkleControllerBase.cs b/SparkleShare/SparkleControllerBase.cs index cd5761bb..437f5c16 100644 --- a/SparkleShare/SparkleControllerBase.cs +++ b/SparkleShare/SparkleControllerBase.cs @@ -259,7 +259,7 @@ namespace SparkleShare { ); } catch (Exception e) { - SparkleHelpers.DebugInfo ("Controller", + SparkleLogger.LogInfo ("Controller", "Failed to load '" + backend + "' backend for '" + folder_name + "': " + e.Message); return; @@ -342,7 +342,7 @@ namespace SparkleShare { string new_folder_path = Path.Combine (path, folder_name); AddRepository (new_folder_path); - SparkleHelpers.DebugInfo ("Controller", + SparkleLogger.LogInfo ("Controller", "Renamed folder with identifier " + identifier + " to '" + folder_name + "'"); } } @@ -355,7 +355,7 @@ namespace SparkleShare { this.config.RemoveFolder (folder_name); RemoveRepository (folder_path); - SparkleHelpers.DebugInfo ("Controller", + SparkleLogger.LogInfo ("Controller", "Removed folder '" + folder_name + "' from config"); } else { @@ -390,6 +390,31 @@ namespace SparkleShare { } + private void ClearFolderAttributes (string path) + { + if (!Directory.Exists (path)) + return; + + string [] folders = Directory.GetDirectories (path); + + foreach (string folder in folders) + ClearFolderAttributes (folder); + + string [] files = Directory.GetFiles(path); + + foreach (string file in files) + if (!IsSymlink (file)) + File.SetAttributes (file, FileAttributes.Normal); + } + + + private bool IsSymlink (string file) + { + FileAttributes attributes = File.GetAttributes (file); + return ((attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint); + } + + public void OnFolderActivity (object o, FileSystemEventArgs args) { if (args != null && args.FullPath.EndsWith (".xml") && @@ -463,7 +488,7 @@ namespace SparkleShare { ); } catch (Exception e) { - SparkleHelpers.DebugInfo ("Controller", + SparkleLogger.LogInfo ("Controller", "Failed to load '" + backend + "' backend for '" + canonical_name + "' " + e.Message); FolderFetchError (Path.Combine (address, remote_path).Replace (@"\", "/"), @@ -505,10 +530,10 @@ namespace SparkleShare { if (Directory.Exists (this.fetcher.TargetFolder)) { try { Directory.Delete (this.fetcher.TargetFolder, true); - SparkleHelpers.DebugInfo ("Controller", "Deleted " + this.fetcher.TargetFolder); + SparkleLogger.LogInfo ("Controller", "Deleted " + this.fetcher.TargetFolder); } catch (Exception e) { - SparkleHelpers.DebugInfo ("Controller", + SparkleLogger.LogInfo ("Controller", "Failed to delete " + this.fetcher.TargetFolder + ": " + e.Message); } } @@ -554,11 +579,11 @@ namespace SparkleShare { string target_folder_path = Path.Combine (this.config.FoldersPath, target_folder_name); try { - SparkleHelpers.ClearAttributes (this.fetcher.TargetFolder); + ClearFolderAttributes (this.fetcher.TargetFolder); Directory.Move (this.fetcher.TargetFolder, target_folder_path); } catch (Exception e) { - SparkleHelpers.DebugInfo ("Controller", "Error moving directory: " + e.Message); + SparkleLogger.LogInfo ("Controller", "Error moving directory: " + e.Message); return; } @@ -640,7 +665,7 @@ namespace SparkleShare { string avatars_path = new string [] { Path.GetDirectoryName (this.config.FullPath), "avatars", size + "x" + size }.Combine (); - string avatar_file_path = Path.Combine (avatars_path, SparkleHelpers.MD5 (email) + ".jpg"); + string avatar_file_path = Path.Combine (avatars_path, email.MD5 () + ".jpg"); if (File.Exists (avatar_file_path)) { if (new FileInfo (avatar_file_path).CreationTime < DateTime.Now.AddDays (-1)) @@ -650,7 +675,7 @@ namespace SparkleShare { } WebClient client = new WebClient (); - string url = "https://gravatar.com/avatar/" + SparkleHelpers.MD5 (email) + ".jpg?s=" + size + "&d=404"; + string url = "https://gravatar.com/avatar/" + email.MD5 () + ".jpg?s=" + size + "&d=404"; try { byte [] buffer = client.DownloadData (url); @@ -658,11 +683,11 @@ namespace SparkleShare { if (buffer.Length > 255) { if (!Directory.Exists (avatars_path)) { Directory.CreateDirectory (avatars_path); - SparkleHelpers.DebugInfo ("Controller", "Created '" + avatars_path + "'"); + SparkleLogger.LogInfo ("Controller", "Created '" + avatars_path + "'"); } File.WriteAllBytes (avatar_file_path, buffer); - SparkleHelpers.DebugInfo ("Controller", "Fetched " + size + "x" + size + " avatar for " + email); + SparkleLogger.LogInfo ("Controller", "Fetched " + size + "x" + size + " avatar for " + email); return avatar_file_path; @@ -678,7 +703,7 @@ namespace SparkleShare { public string AssignAvatar (string s) { - string hash = "0" + SparkleHelpers.MD5 (s).Substring (0, 8); + string hash = "0" + s.MD5 ().Substring (0, 8); string numbers = Regex.Replace (hash, "[a-z]", ""); int number = int.Parse (numbers); string letters = "abcdefghijklmnopqrstuvwxyz"; diff --git a/SparkleShare/SparkleEventLogController.cs b/SparkleShare/SparkleEventLogController.cs index ff9ad0a4..b772567e 100755 --- a/SparkleShare/SparkleEventLogController.cs +++ b/SparkleShare/SparkleEventLogController.cs @@ -206,7 +206,7 @@ namespace SparkleShare { if (change_sets != null) list.AddRange (change_sets); else - SparkleHelpers.DebugInfo ("Log", "Could not create log for " + repo.Name); + SparkleLogger.LogInfo ("Log", "Could not create log for " + repo.Name); } list.Sort ((x, y) => (x.Timestamp.CompareTo (y.Timestamp))); diff --git a/SparkleShare/SparkleInvite.cs b/SparkleShare/SparkleInvite.cs index bad2cc7c..3b5ceaa4 100644 --- a/SparkleShare/SparkleInvite.cs +++ b/SparkleShare/SparkleInvite.cs @@ -73,7 +73,7 @@ namespace SparkleShare { Initialize (address, remote_path, accept_url, announcements_url, fingerprint); } catch (XmlException e) { - SparkleHelpers.DebugInfo ("Invite", "Invalid XML: " + e.Message); + SparkleLogger.LogInfo ("Invite", "Invalid XML: " + e.Message); return; } } @@ -104,12 +104,12 @@ namespace SparkleShare { response.Close (); } catch (WebException e) { - SparkleHelpers.DebugInfo ("Invite", "Failed uploading public key to " + AcceptUrl + ": " + e.Message); + SparkleLogger.LogInfo ("Invite", "Failed uploading public key to " + AcceptUrl + ": " + e.Message); return false; } if (response != null && response.StatusCode == HttpStatusCode.OK) { - SparkleHelpers.DebugInfo ("Invite", "Uploaded public key to " + AcceptUrl); + SparkleLogger.LogInfo ("Invite", "Uploaded public key to " + AcceptUrl); return true; } else { diff --git a/SparkleShare/SparkleKeys.cs b/SparkleShare/SparkleKeys.cs index 8c217863..60e7059d 100644 --- a/SparkleShare/SparkleKeys.cs +++ b/SparkleShare/SparkleKeys.cs @@ -32,7 +32,7 @@ namespace SparkleShare { string key_file_path = Path.Combine (output_path, key_name); if (File.Exists (key_file_path)) { - SparkleHelpers.DebugInfo ("Auth", "A key pair exists ('" + key_name + "'), leaving it untouched"); + SparkleLogger.LogInfo ("Auth", "A key pair exists ('" + key_name + "'), leaving it untouched"); return new string [] { key_file_path, key_file_path + ".pub" }; } else { @@ -61,9 +61,9 @@ namespace SparkleShare { process.WaitForExit (); if (process.ExitCode == 0) - SparkleHelpers.DebugInfo ("Auth", "Created keypair '" + key_file_path + "'"); + SparkleLogger.LogInfo ("Auth", "Created keypair '" + key_file_path + "'"); else - SparkleHelpers.DebugInfo ("Auth", "Could not create key pair '" + key_file_path + "'"); + SparkleLogger.LogInfo ("Auth", "Could not create key pair '" + key_file_path + "'"); return new string [] { key_file_path, key_file_path + ".pub" }; } @@ -83,9 +83,9 @@ namespace SparkleShare { process.WaitForExit (); if (process.ExitCode == 0) - SparkleHelpers.DebugInfo ("Auth", "Imported key '" + key_file_path + "'"); + SparkleLogger.LogInfo ("Auth", "Imported key '" + key_file_path + "'"); else - SparkleHelpers.DebugInfo ("Auth", "Could not import key '" + key_file_path + "'"); + SparkleLogger.LogInfo ("Auth", "Could not import key '" + key_file_path + "'"); } @@ -106,7 +106,7 @@ namespace SparkleShare { string keys_in_use = process.StandardOutput.ReadToEnd (); process.WaitForExit (); - SparkleHelpers.DebugInfo ("Auth", "The following keys may be used: " + + SparkleLogger.LogInfo ("Auth", "The following keys may be used: " + Environment.NewLine + keys_in_use.Trim ()); } } diff --git a/SparkleShare/SparkleSetupController.cs b/SparkleShare/SparkleSetupController.cs index e0bced2a..36deeefe 100755 --- a/SparkleShare/SparkleSetupController.cs +++ b/SparkleShare/SparkleSetupController.cs @@ -386,11 +386,11 @@ namespace SparkleShare { if (new_plugin != null) { Plugins.Insert (1, new_plugin); - SparkleHelpers.DebugInfo ("Controller", "Added plugin for " + uri.Host); + SparkleLogger.LogInfo ("Controller", "Added plugin for " + uri.Host); } } catch { - SparkleHelpers.DebugInfo ("Controller", "Failed adding plugin for " + uri.Host); + SparkleLogger.LogInfo ("Controller", "Failed adding plugin for " + uri.Host); } }