listener: more code cleanup

This commit is contained in:
Hylke Bons 2012-01-31 23:08:23 +00:00
parent 93f0bf3ee6
commit 343fdba74b
2 changed files with 65 additions and 53 deletions

View file

@ -90,18 +90,17 @@ namespace SparkleLib {
// listens for change notifications // listens for change notifications
public abstract class SparkleListenerBase { public abstract class SparkleListenerBase {
// We've connected to the server
public event ConnectedEventHandler Connected; public event ConnectedEventHandler Connected;
public delegate void ConnectedEventHandler (); public delegate void ConnectedEventHandler ();
// We've disconnected from the server
public event DisconnectedEventHandler Disconnected; public event DisconnectedEventHandler Disconnected;
public delegate void DisconnectedEventHandler (); public delegate void DisconnectedEventHandler ();
// We've been notified about a remote public event ReceivedEventHandler Received;
// change by the channel public delegate void ReceivedEventHandler (SparkleAnnouncement announcement);
public event AnnouncementEventHandler Announcement;
public delegate void AnnouncementEventHandler (SparkleAnnouncement announcement); public readonly Uri Server;
public abstract void Connect (); public abstract void Connect ();
public abstract void Announce (SparkleAnnouncement announcent); public abstract void Announce (SparkleAnnouncement announcent);
@ -109,19 +108,30 @@ namespace SparkleLib {
public abstract bool IsConnected { get; } public abstract bool IsConnected { get; }
public abstract bool IsConnecting { get; } public abstract bool IsConnecting { get; }
protected List<string> channels = new List<string> ();
protected Dictionary<string,List<SparkleAnnouncement>> recent_announcements = new Dictionary<string, List<SparkleAnnouncement>> ();
protected int max_recent_announcements = 10;
protected Dictionary<string, SparkleAnnouncement> queue_up = new Dictionary<string, SparkleAnnouncement> ();
protected Dictionary<string,SparkleAnnouncement> queue_down = new Dictionary<string, SparkleAnnouncement> ();
protected Uri server; protected List<string> channels = new List<string> ();
protected Timer reconnect_timer = new Timer { Interval = 60 * 1000, Enabled = true };
private int max_recent_announcements = 10;
private Dictionary<string, List<SparkleAnnouncement>> recent_announcements =
new Dictionary<string, List<SparkleAnnouncement>> ();
private Dictionary<string, SparkleAnnouncement> queue_up =
new Dictionary<string, SparkleAnnouncement> ();
private Dictionary<string, SparkleAnnouncement> queue_down =
new Dictionary<string, SparkleAnnouncement> ();
private Timer reconnect_timer = new Timer {
Interval = 60 * 1000,
Enabled = true
};
public SparkleListenerBase (Uri server, string folder_identifier) public SparkleListenerBase (Uri server, string folder_identifier)
{ {
this.server = server; Server = server;
this.channels.Add (folder_identifier); this.channels.Add (folder_identifier);
this.reconnect_timer.Elapsed += delegate { this.reconnect_timer.Elapsed += delegate {
@ -135,21 +145,27 @@ namespace SparkleLib {
public void AnnounceBase (SparkleAnnouncement announcement) public void AnnounceBase (SparkleAnnouncement announcement)
{ {
if (!this.IsRecentAnnounement (announcement)) { if (!IsRecentAnnouncement (announcement)) {
if (IsConnected) { if (IsConnected) {
SparkleHelpers.DebugInfo ("Listener", SparkleHelpers.DebugInfo ("Listener",
"Announcing message " + announcement.Message + " to " + announcement.FolderIdentifier + " on " + this.server); "Announcing message " + announcement.Message + " to " +
announcement.FolderIdentifier + " on " + Server);
Announce (announcement); Announce (announcement);
this.AddRecentAnnouncement (announcement); AddRecentAnnouncement (announcement);
} else { } 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; this.queue_up [announcement.FolderIdentifier] = announcement;
} }
} else { } else {
SparkleHelpers.DebugInfo ("Listener", 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 () public void Reconnect ()
{ {
SparkleHelpers.DebugInfo ("Listener", "Trying to reconnect to " + this.server); SparkleHelpers.DebugInfo ("Listener", "Trying to reconnect to " + Server);
Connect (); Connect ();
} }
@ -170,7 +186,8 @@ namespace SparkleLib {
Connected (); Connected ();
if (this.queue_up.Count > 0) { 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<string, SparkleAnnouncement> item in this.queue_up) { foreach (KeyValuePair<string, SparkleAnnouncement> item in this.queue_up) {
SparkleAnnouncement announcement = item.Value; SparkleAnnouncement announcement = item.Value;
@ -194,34 +211,46 @@ namespace SparkleLib {
public void OnAnnouncement (SparkleAnnouncement announcement) public void OnAnnouncement (SparkleAnnouncement announcement)
{ {
SparkleHelpers.DebugInfo ("Listener", 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", SparkleHelpers.DebugInfo ("Listener",
"Ignoring previously processed message " + announcement.Message + "Ignoring previously processed message " + announcement.Message +
" from " + announcement.FolderIdentifier + " on " + this.server); " from " + announcement.FolderIdentifier + " on " + Server);
return; return;
} }
SparkleHelpers.DebugInfo ("Listener", SparkleHelpers.DebugInfo ("Listener",
"Processing message " + announcement.Message + " from " + announcement.FolderIdentifier + " on " + this.server); "Processing message " + announcement.Message + " from " +
announcement.FolderIdentifier + " on " + Server);
AddRecentAnnouncement (announcement); AddRecentAnnouncement (announcement);
this.queue_down [announcement.FolderIdentifier] = announcement; this.queue_down [announcement.FolderIdentifier] = announcement;
if (Announcement != null) if (Received != null)
Announcement (announcement); 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; return false;
} else { } else {
foreach (SparkleAnnouncement recent_announcement in GetRecentAnnouncements (announcement.FolderIdentifier)) { foreach (SparkleAnnouncement recent_announcement in
GetRecentAnnouncements (announcement.FolderIdentifier)) {
if (recent_announcement.Message.Equals (announcement.Message)) if (recent_announcement.Message.Equals (announcement.Message))
return true; return true;
} }
@ -242,32 +271,15 @@ namespace SparkleLib {
private void AddRecentAnnouncement (SparkleAnnouncement announcement) private void AddRecentAnnouncement (SparkleAnnouncement announcement)
{ {
List<SparkleAnnouncement> recent_announcements = this.GetRecentAnnouncements (announcement.FolderIdentifier); List<SparkleAnnouncement> recent_announcements =
GetRecentAnnouncements (announcement.FolderIdentifier);
if (!IsRecentAnnounement (announcement)) if (!IsRecentAnnouncement (announcement))
recent_announcements.Add (announcement); recent_announcements.Add (announcement);
if (recent_announcements.Count > this.max_recent_announcements) if (recent_announcements.Count > this.max_recent_announcements)
recent_announcements.RemoveRange (0, (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;
}
} }
} }
} }

View file

@ -299,7 +299,7 @@ namespace SparkleLib {
}; };
// Fetch changes when there is a message in the irc channel // 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; string identifier = Identifier;
if (announcement.FolderIdentifier.Equals (identifier) && if (announcement.FolderIdentifier.Equals (identifier) &&