diff --git a/SparkleLib/SparkleListenerBase.cs b/SparkleLib/SparkleListenerBase.cs index 66156f3b..33cbd92d 100755 --- a/SparkleLib/SparkleListenerBase.cs +++ b/SparkleLib/SparkleListenerBase.cs @@ -90,18 +90,17 @@ namespace SparkleLib { // listens for change notifications public abstract class SparkleListenerBase { - // We've connected to the server public event ConnectedEventHandler Connected; public delegate void ConnectedEventHandler (); - // We've disconnected from the server public event DisconnectedEventHandler Disconnected; public delegate void DisconnectedEventHandler (); - // We've been notified about a remote - // change by the channel - public event AnnouncementEventHandler Announcement; - public delegate void AnnouncementEventHandler (SparkleAnnouncement announcement); + public event ReceivedEventHandler Received; + public delegate void ReceivedEventHandler (SparkleAnnouncement announcement); + + public readonly Uri Server; + public abstract void Connect (); public abstract void Announce (SparkleAnnouncement announcent); @@ -109,19 +108,30 @@ namespace SparkleLib { public abstract bool IsConnected { get; } public abstract bool IsConnecting { get; } - protected List channels = new List (); - protected Dictionary> recent_announcements = new Dictionary> (); - protected int max_recent_announcements = 10; - protected Dictionary queue_up = new Dictionary (); - protected Dictionary queue_down = new Dictionary (); - protected Uri server; - protected Timer reconnect_timer = new Timer { Interval = 60 * 1000, Enabled = true }; + protected List channels = new List (); + + + private int max_recent_announcements = 10; + + private Dictionary> recent_announcements = + new Dictionary> (); + + private Dictionary queue_up = + new Dictionary (); + + private Dictionary queue_down = + new Dictionary (); + + private Timer reconnect_timer = new Timer { + Interval = 60 * 1000, + Enabled = true + }; public SparkleListenerBase (Uri server, string folder_identifier) { - this.server = server; + Server = server; this.channels.Add (folder_identifier); this.reconnect_timer.Elapsed += delegate { @@ -135,21 +145,27 @@ namespace SparkleLib { public void AnnounceBase (SparkleAnnouncement announcement) { - if (!this.IsRecentAnnounement (announcement)) { + if (!IsRecentAnnouncement (announcement)) { if (IsConnected) { SparkleHelpers.DebugInfo ("Listener", - "Announcing message " + announcement.Message + " to " + announcement.FolderIdentifier + " on " + this.server); + "Announcing message " + announcement.Message + " to " + + announcement.FolderIdentifier + " on " + Server); Announce (announcement); - this.AddRecentAnnouncement (announcement); + AddRecentAnnouncement (announcement); + } else { - SparkleHelpers.DebugInfo ("Listener", "Can't send message to " + this.server + ". Queuing message"); + SparkleHelpers.DebugInfo ("Listener", + "Can't send message to " + + Server + ". Queuing message"); + this.queue_up [announcement.FolderIdentifier] = announcement; } } else { SparkleHelpers.DebugInfo ("Listener", - "Already processed message " + announcement.Message + " to " + announcement.FolderIdentifier + " from " + this.server); + "Already processed message " + announcement.Message + " to " + + announcement.FolderIdentifier + " from " + Server); } } @@ -157,7 +173,7 @@ namespace SparkleLib { public void Reconnect () { - SparkleHelpers.DebugInfo ("Listener", "Trying to reconnect to " + this.server); + SparkleHelpers.DebugInfo ("Listener", "Trying to reconnect to " + Server); Connect (); } @@ -170,7 +186,8 @@ namespace SparkleLib { Connected (); if (this.queue_up.Count > 0) { - SparkleHelpers.DebugInfo ("Listener", "Delivering " + this.queue_up.Count + " queued messages..."); + SparkleHelpers.DebugInfo ("Listener", + "Delivering " + this.queue_up.Count + " queued messages..."); foreach (KeyValuePair item in this.queue_up) { SparkleAnnouncement announcement = item.Value; @@ -194,34 +211,46 @@ namespace SparkleLib { public void OnAnnouncement (SparkleAnnouncement announcement) { SparkleHelpers.DebugInfo ("Listener", - "Got message " + announcement.Message + " from " + announcement.FolderIdentifier + " on " + this.server); + "Got message " + announcement.Message + " from " + + announcement.FolderIdentifier + " on " + Server); - if (IsRecentAnnounement(announcement) ){ + if (IsRecentAnnouncement (announcement)) { SparkleHelpers.DebugInfo ("Listener", "Ignoring previously processed message " + announcement.Message + - " from " + announcement.FolderIdentifier + " on " + this.server); + " from " + announcement.FolderIdentifier + " on " + Server); return; } SparkleHelpers.DebugInfo ("Listener", - "Processing message " + announcement.Message + " from " + announcement.FolderIdentifier + " on " + this.server); + "Processing message " + announcement.Message + " from " + + announcement.FolderIdentifier + " on " + Server); AddRecentAnnouncement (announcement); this.queue_down [announcement.FolderIdentifier] = announcement; - if (Announcement != null) - Announcement (announcement); + if (Received != null) + Received (announcement); } - private bool IsRecentAnnounement (SparkleAnnouncement announcement) + public virtual void Dispose () { - if (!HasRecentAnnouncements (announcement.FolderIdentifier)) { + this.reconnect_timer.Dispose (); + } + + + private bool IsRecentAnnouncement (SparkleAnnouncement announcement) + { + if (!this.recent_announcements + .ContainsKey (announcement.FolderIdentifier)) { + return false; } else { - foreach (SparkleAnnouncement recent_announcement in GetRecentAnnouncements (announcement.FolderIdentifier)) { + foreach (SparkleAnnouncement recent_announcement in + GetRecentAnnouncements (announcement.FolderIdentifier)) { + if (recent_announcement.Message.Equals (announcement.Message)) return true; } @@ -242,32 +271,15 @@ namespace SparkleLib { private void AddRecentAnnouncement (SparkleAnnouncement announcement) { - List recent_announcements = this.GetRecentAnnouncements (announcement.FolderIdentifier); + List recent_announcements = + GetRecentAnnouncements (announcement.FolderIdentifier); - if (!IsRecentAnnounement (announcement)) + if (!IsRecentAnnouncement (announcement)) recent_announcements.Add (announcement); if (recent_announcements.Count > this.max_recent_announcements) - recent_announcements.RemoveRange (0, (recent_announcements.Count - this.max_recent_announcements)); - } - - - private bool HasRecentAnnouncements (string folder_identifier) - { - return this.recent_announcements.ContainsKey (folder_identifier); - } - - - public virtual void Dispose () - { - this.reconnect_timer.Dispose (); - } - - - public Uri Server { - get { - return this.server; - } + recent_announcements.RemoveRange (0, + (recent_announcements.Count - this.max_recent_announcements)); } } } diff --git a/SparkleLib/SparkleRepoBase.cs b/SparkleLib/SparkleRepoBase.cs index 2ff71f35..6cf73a1e 100755 --- a/SparkleLib/SparkleRepoBase.cs +++ b/SparkleLib/SparkleRepoBase.cs @@ -299,7 +299,7 @@ namespace SparkleLib { }; // Fetch changes when there is a message in the irc channel - this.listener.Announcement += delegate (SparkleAnnouncement announcement) { + this.listener.Received += delegate (SparkleAnnouncement announcement) { string identifier = Identifier; if (announcement.FolderIdentifier.Equals (identifier) &&