listener: more code cleanup
This commit is contained in:
parent
62e53ca4bd
commit
747eac768f
|
@ -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<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 Timer reconnect_timer = new Timer { Interval = 60 * 1000, Enabled = true };
|
||||
protected List<string> channels = new List<string> ();
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
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<string, SparkleAnnouncement> 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<SparkleAnnouncement> recent_announcements = this.GetRecentAnnouncements (announcement.FolderIdentifier);
|
||||
List<SparkleAnnouncement> 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) &&
|
||||
|
|
Loading…
Reference in a new issue