summaryrefslogtreecommitdiff
path: root/Sparkles/ListenerFactory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Sparkles/ListenerFactory.cs')
-rw-r--r--Sparkles/ListenerFactory.cs66
1 files changed, 66 insertions, 0 deletions
diff --git a/Sparkles/ListenerFactory.cs b/Sparkles/ListenerFactory.cs
new file mode 100644
index 0000000..d749534
--- /dev/null
+++ b/Sparkles/ListenerFactory.cs
@@ -0,0 +1,66 @@
+// SparkleShare, a collaboration and sharing tool.
+// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
+//
+// This program 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 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 <http://www.gnu.org/licenses/>.
+
+
+using System;
+using System.Collections.Generic;
+
+namespace Sparkles {
+
+ public static class ListenerFactory {
+
+ static readonly List<BaseListener> listeners = new List<BaseListener> ();
+
+
+ public static BaseListener CreateListener (string folder_name, string folder_identifier)
+ {
+ // Check if the user wants to use a global custom notification service
+ string uri = Configuration.DefaultConfiguration.GetConfigOption ("announcements_url");
+
+ // Check if the user wants a use a custom notification service for this folder
+ if (string.IsNullOrEmpty (uri))
+ uri = Configuration.DefaultConfiguration.GetFolderOptionalAttribute (folder_name, "announcements_url");
+
+ // This is SparkleShare's centralized notification service.
+ // It communicates "It's time to sync!" signals between clients.
+ //
+ // Please see the SparkleShare wiki if you wish to run
+ // your own service instead
+ if (string.IsNullOrEmpty (uri))
+ uri = "tcp://announcements.sparkleshare.org:443";
+
+ var announce_uri = new Uri (uri);
+
+ // Use only one listener per notification service to keep
+ // the number of connections as low as possible
+ foreach (BaseListener listener in listeners) {
+ if (listener.Server.Equals (announce_uri)) {
+ Logger.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
+ listener.AlsoListenTo (folder_identifier);
+ return listener;
+ }
+ }
+
+ listeners.Add (new TcpListener (announce_uri, folder_identifier));
+ Logger.LogInfo ("ListenerFactory", "Issued new listener for " + announce_uri);
+
+ return listeners [listeners.Count - 1];
+ }
+ }
+}