From b27725ab72ba2ffbaf0ef61f70196c2f3ff64bc3 Mon Sep 17 00:00:00 2001 From: Alex Hudson Date: Tue, 28 Jun 2011 19:36:47 +0100 Subject: [PATCH] Make listener type configurable from config file --- SparkleLib/SparkleConfig.cs | 14 ++++++++++ SparkleLib/SparkleListenerBase.cs | 46 ++++++++++++++++--------------- SparkleLib/SparkleListenerIrc.cs | 11 ++++---- SparkleLib/SparkleListenerTcp.cs | 11 ++++---- SparkleLib/SparkleRepoBase.cs | 7 ++--- SparkleShare/SparkleController.cs | 15 +++++++++- 6 files changed, 65 insertions(+), 39 deletions(-) diff --git a/SparkleLib/SparkleConfig.cs b/SparkleLib/SparkleConfig.cs index ffc493ed..87276474 100644 --- a/SparkleLib/SparkleConfig.cs +++ b/SparkleLib/SparkleConfig.cs @@ -153,6 +153,20 @@ namespace SparkleLib { Save (); } + public bool SetFolderOptionalAttribute (string name, string key, string value) + { + XmlNode folder = this.GetFolder(name); + if (folder == null) return false; + + if (folder[key] != null) { + folder[key].InnerText = value; + } else { + XmlNode new_node = CreateElement(key); + new_node.InnerText = value; + folder.AppendChild(new_node); + } + return true; + } public void RemoveFolder (string name) { diff --git a/SparkleLib/SparkleListenerBase.cs b/SparkleLib/SparkleListenerBase.cs index bcf12c93..c502978c 100644 --- a/SparkleLib/SparkleListenerBase.cs +++ b/SparkleLib/SparkleListenerBase.cs @@ -39,31 +39,32 @@ namespace SparkleLib { private static List listeners; - public static SparkleListenerIrc CreateIrcListener (string server, string folder_identifier, - string announcements) + public static SparkleListenerBase CreateListener (string uri, string folder_identifier) { if (listeners == null) listeners = new List (); - // This is SparkleShare's centralized notification service. - // Don't worry, we only use this server as a backup if you - // don't have your own. All data needed to connect is hashed and - // we don't store any personal information ever - if (announcements == null) - server = "204.62.14.135"; - else - server = announcements; - + Uri listen_on = new Uri(uri); + foreach (SparkleListenerBase listener in listeners) { - if (listener.Server.Equals (server)) { - SparkleHelpers.DebugInfo ("ListenerFactory", "Refered to existing listener for " + server); + if (listener.Server.Equals (uri)) { + SparkleHelpers.DebugInfo ("ListenerFactory", "Refered to existing listener for " + uri); listener.AlsoListenTo (folder_identifier); - return (SparkleListenerIrc) listener; + return (SparkleListenerBase) listener; } } - SparkleHelpers.DebugInfo ("ListenerFactory", "Issued new listener for " + server); - listeners.Add (new SparkleListenerIrc (server, folder_identifier, announcements)); + SparkleHelpers.DebugInfo ("ListenerFactory", "Issued new listener for " + uri); + switch (listen_on.Scheme) { + case "tcp": + listeners.Add (new SparkleListenerTcp (listen_on, folder_identifier)); + break; + case "irc": + default: + listeners.Add (new SparkleListenerIrc (listen_on, folder_identifier)); + break; + } + return (SparkleListenerIrc) listeners [listeners.Count - 1]; } } @@ -97,16 +98,17 @@ namespace SparkleLib { protected List queue_up = new List (); protected List queue_down = new List (); protected bool is_connecting; - protected string server; + protected Uri server; protected Timer reconnect_timer = new Timer { Interval = 60 * 1000, Enabled = true }; - public SparkleListenerBase (string server, string folder_identifier, string announcements) { - this.reconnect_timer.Elapsed += delegate { + public SparkleListenerBase (Uri server, string folder_identifier) { + this.reconnect_timer.Elapsed += delegate { if (!IsConnected && !this.is_connecting) Reconnect (); - }; + }; - this.reconnect_timer.Start (); + this.server = server; + this.reconnect_timer.Start (); } @@ -185,7 +187,7 @@ namespace SparkleLib { } - public string Server { + public Uri Server { get { return this.server; } diff --git a/SparkleLib/SparkleListenerIrc.cs b/SparkleLib/SparkleListenerIrc.cs index 8ab5f5bb..1932ef3e 100644 --- a/SparkleLib/SparkleListenerIrc.cs +++ b/SparkleLib/SparkleListenerIrc.cs @@ -31,11 +31,9 @@ namespace SparkleLib { private string nick; - public SparkleListenerIrc (string server, string folder_identifier, string announcements) : - base (server, folder_identifier, announcements) + public SparkleListenerIrc (Uri server, string folder_identifier) : + base (server, folder_identifier) { - base.server = server; - // Try to get a uniqueish nickname this.nick = SHA1 (DateTime.Now.ToString ("ffffff") + "sparkles"); @@ -90,9 +88,10 @@ namespace SparkleLib { this.thread = new Thread ( new ThreadStart (delegate { try { - // Connect, login, and join the channel - this.client.Connect (new string [] {base.server}, 6667); + int port = base.server.Port; + if (port < 0) port = 6667; + this.client.Connect (base.server.Host, port); this.client.Login (this.nick, this.nick); foreach (string channel in base.channels) { diff --git a/SparkleLib/SparkleListenerTcp.cs b/SparkleLib/SparkleListenerTcp.cs index 027d0ed1..6f72f221 100644 --- a/SparkleLib/SparkleListenerTcp.cs +++ b/SparkleLib/SparkleListenerTcp.cs @@ -28,10 +28,9 @@ namespace SparkleLib { private Thread thread; private Socket socket; - public SparkleListenerTcp (string server, string folder_identifier, string announcements) : - base (server, folder_identifier, announcements) + public SparkleListenerTcp (Uri server, string folder_identifier) : + base (server, folder_identifier) { - base.server = server; base.channels.Add (folder_identifier); this.socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /* @@ -69,7 +68,7 @@ namespace SparkleLib { // Starts a new thread and listens to the channel public override void Connect () { - SparkleHelpers.DebugInfo ("ListenerTcp", "Connecting to " + Server); + SparkleHelpers.DebugInfo ("ListenerTcp", "Connecting to " + Server.Host); base.is_connecting = true; @@ -78,7 +77,9 @@ namespace SparkleLib { try { // Connect and subscribe to the channel - this.socket.Connect (Server, 9999); + int port = Server.Port; + if (port < 0) port = 9999; + this.socket.Connect (Server.Host, port); base.is_connecting = false; foreach (string channel in base.channels) { diff --git a/SparkleLib/SparkleRepoBase.cs b/SparkleLib/SparkleRepoBase.cs index d2cace77..e87b7d93 100644 --- a/SparkleLib/SparkleRepoBase.cs +++ b/SparkleLib/SparkleRepoBase.cs @@ -91,8 +91,6 @@ namespace SparkleLib { if (CurrentRevision == null) CreateInitialChangeSet (); - CreateListener (); - this.local_timer.Elapsed += delegate (object o, ElapsedEventArgs args) { CheckForChanges (); }; @@ -219,10 +217,9 @@ namespace SparkleLib { } - private void CreateListener () + public void CreateListener (string uri, string folder_name) { - this.listener = SparkleListenerFactory.CreateIrcListener (Domain, Identifier, - SparkleConfig.DefaultConfig.GetAnnouncementsForFolder (Name)); + this.listener = SparkleListenerFactory.CreateListener(uri, this.Identifier); // Stop polling when the connection to the irc channel is succesful this.listener.Connected += delegate { diff --git a/SparkleShare/SparkleController.cs b/SparkleShare/SparkleController.cs index 31670bfb..7d2e9fff 100644 --- a/SparkleShare/SparkleController.cs +++ b/SparkleShare/SparkleController.cs @@ -530,7 +530,6 @@ namespace SparkleShare { if (backend == null) return; - SparkleRepoBase repo = null; @@ -543,6 +542,20 @@ namespace SparkleShare { else repo = new SparkleRepoGit (folder_path, SparkleBackend.DefaultBackend); + + string notify_uri = SparkleConfig.DefaultConfig.GetNotificationUrlForFolder (folder_name); + if (notify_uri == null) { + string announcements = SparkleConfig.DefaultConfig.GetAnnouncementsForFolder (folder_name); + if (announcements == null) + // This is SparkleShare's centralized notification service. + // Don't worry, we only use this server as a backup if you + // don't have your own. All data needed to connect is hashed and + // we don't store any personal information ever + announcements = "204.62.14.135"; + + notify_uri = String.Format("irc://{0}/", announcements); + } + repo.CreateListener(notify_uri, folder_name); repo.NewChangeSet += delegate (SparkleChangeSet change_set, string repository_path) { string message = FormatMessage (change_set);