[ros-diffs] [mpiulachs] 33350: -Implement reconnect on connection lost as requested. Techbot will now try to re-connect every 60 seconds when a connection lost is detected.

mpiulachs at svn.reactos.org mpiulachs at svn.reactos.org
Wed May 7 21:53:14 CEST 2008


Author: mpiulachs
Date: Wed May  7 14:53:14 2008
New Revision: 33350

URL: http://svn.reactos.org/svn/reactos?rev=33350&view=rev
Log:
-Implement reconnect on connection lost as requested. Techbot will now try to re-connect every 60 seconds when a connection lost is detected.

Modified:
    trunk/irc/TechBot/TechBot.IRCLibrary/IrcClient.cs
    trunk/irc/TechBot/TechBot.Library/TechBotIrcService.cs
    trunk/irc/TechBot/TechBot/TechBotService.cs

Modified: trunk/irc/TechBot/TechBot.IRCLibrary/IrcClient.cs
URL: http://svn.reactos.org/svn/reactos/trunk/irc/TechBot/TechBot.IRCLibrary/IrcClient.cs?rev=33350&r1=33349&r2=33350&view=diff
==============================================================================
--- trunk/irc/TechBot/TechBot.IRCLibrary/IrcClient.cs [iso-8859-1] (original)
+++ trunk/irc/TechBot/TechBot.IRCLibrary/IrcClient.cs [iso-8859-1] Wed May  7 14:53:14 2008
@@ -15,6 +15,10 @@
 	/// Delegate that notifies if the user database for a channel has changed.
 	/// </summary>
 	public delegate void ChannelUserDatabaseChangedHandler(IrcChannel channel);
+
+    public delegate void OnConnectHandler ();
+    public delegate void OnDisconnectHandler();
+    public delegate void OnConnectionLostHandler();
 
 	/// <summary>
 	/// An IRC client.
@@ -202,6 +206,10 @@
 
 		public event ChannelUserDatabaseChangedHandler ChannelUserDatabaseChanged;
 
+        public event OnConnectHandler OnConnect;
+        public event OnConnectionLostHandler OnConnectionLost;
+        public event OnDisconnectHandler OnDisconnect;
+
 		#endregion
 
 		#region Public properties
@@ -291,20 +299,39 @@
 		/// <param name="ar">IAsyncResult object.</param>
 		private void ReadComplete(IAsyncResult ar)
 		{
-			StateObject stateObject = (StateObject) ar.AsyncState;
-			if (stateObject.Stream.CanRead)
-			{
-				int bytesReceived = stateObject.Stream.EndRead(ar);
-				if (bytesReceived > 0)
-				{
-					messageStream.Write(Encoding.GetString(stateObject.Buffer, 0, bytesReceived));
-					while (messageStream.DataAvailable)
-					{
-						OnMessageReceived(new IrcMessage(messageStream.Read()));
-					}
-				}
-			}
-			Receive();
+            try
+            {
+                StateObject stateObject = (StateObject)ar.AsyncState;
+                if (stateObject.Stream.CanRead)
+                {
+                    int bytesReceived = stateObject.Stream.EndRead(ar);
+                    if (bytesReceived > 0)
+                    {
+                        messageStream.Write(Encoding.GetString(stateObject.Buffer, 0, bytesReceived));
+                        while (messageStream.DataAvailable)
+                        {
+                            OnMessageReceived(new IrcMessage(messageStream.Read()));
+                        }
+                    }
+                }
+             
+                Receive();
+            }
+            catch (SocketException)
+            {
+                if (OnConnectionLost != null)
+                    OnConnectionLost();
+            }
+            catch (IOException)
+            {
+                if (OnConnectionLost != null)
+                    OnConnectionLost();
+            }
+            catch (Exception)
+            {
+                if (OnConnectionLost != null)
+                    OnConnectionLost();
+            } 
 		}
 
 		/// <summary>
@@ -498,6 +525,9 @@
 				connected = false;
 				tcpClient.Close();
 				tcpClient = null;
+
+                if (OnDisconnect != null)
+                    OnDisconnect();
 			}
 		}
 
@@ -507,19 +537,37 @@
 		/// <param name="message">The message to be sent.</param>
 		public void SendMessage(IrcMessage message)
 		{
-			if (!connected)
-			{
-				throw new NotConnectedException();
-			}
-			
-			/* Serialize sending messages */
-			lock (typeof(IrcClient))
-			{
-				NetworkStream networkStream = tcpClient.GetStream();
-				byte[] bytes = Encoding.GetBytes(message.Line);
-				networkStream.Write(bytes, 0, bytes.Length);
-				networkStream.Flush();
-			}
+            try
+            {
+                if (!connected)
+                {
+                    throw new NotConnectedException();
+                }
+
+                /* Serialize sending messages */
+                lock (typeof(IrcClient))
+                {
+                    NetworkStream networkStream = tcpClient.GetStream();
+                    byte[] bytes = Encoding.GetBytes(message.Line);
+                    networkStream.Write(bytes, 0, bytes.Length);
+                    networkStream.Flush();
+                }
+            }
+            catch (SocketException)
+            {
+                if (OnConnectionLost != null)
+                    OnConnectionLost();
+            }
+            catch (IOException)
+            {
+                if (OnConnectionLost != null)
+                    OnConnectionLost();
+            }
+            catch (Exception)
+            {
+                if (OnConnectionLost != null)
+                    OnConnectionLost();
+            } 
 		}
 
 		/// <summary>

Modified: trunk/irc/TechBot/TechBot.Library/TechBotIrcService.cs
URL: http://svn.reactos.org/svn/reactos/trunk/irc/TechBot/TechBot.Library/TechBotIrcService.cs?rev=33350&r1=33349&r2=33350&view=diff
==============================================================================
--- trunk/irc/TechBot/TechBot.Library/TechBotIrcService.cs [iso-8859-1] (original)
+++ trunk/irc/TechBot/TechBot.Library/TechBotIrcService.cs [iso-8859-1] Wed May  7 14:53:14 2008
@@ -71,13 +71,27 @@
 
             m_IrcClient = new IrcClient();
             m_IrcClient.Encoding = Encoding.GetEncoding("iso-8859-1");
+            m_IrcClient.OnConnect += new OnConnectHandler(m_IrcClient_OnConnect);
+            m_IrcClient.OnConnectionLost += new OnConnectionLostHandler(m_IrcClient_OnConnectionLost);
+            m_IrcClient.OnDisconnect += new OnDisconnectHandler(m_IrcClient_OnDisconnect);
             m_IrcClient.MessageReceived += new MessageReceivedHandler(client_MessageReceived);
             m_IrcClient.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged);
+
+            Connect();
+        }
+
+        void m_IrcClient_OnConnect()
+        {
+            Console.WriteLine("Connected...");
+        }
+
+        private void Connect()
+        {
             Console.WriteLine("Connecting to {0} port {1}",
                                                    hostname,
                                                    port);
             m_IrcClient.Connect(hostname, port);
-            Console.WriteLine("Connected...");
+            
             m_IrcClient.Register(botname, password, null);
             Console.WriteLine("Registered as {0}...", botname);
             JoinChannels();
@@ -89,7 +103,35 @@
 
             PartChannels();
             m_IrcClient.Diconnect();
+        }
+
+        void m_IrcClient_OnDisconnect()
+        {
             Console.WriteLine("Disconnected...");
+        }
+
+        void m_IrcClient_OnConnectionLost()
+        {
+            //Dispose old connection
+            Disconnect();
+
+            //Sleep for 1 minute
+            Thread.Sleep(1000 * 60);
+
+            //Try to reconnect
+            Connect();
+        }
+
+        private void Disconnect()
+        {
+            try
+            {
+                m_IrcClient.Diconnect();
+            }
+            catch (Exception)
+            {
+                //
+            }
         }
 
 		public void Stop()

Modified: trunk/irc/TechBot/TechBot/TechBotService.cs
URL: http://svn.reactos.org/svn/reactos/trunk/irc/TechBot/TechBot/TechBotService.cs?rev=33350&r1=33349&r2=33350&view=diff
==============================================================================
--- trunk/irc/TechBot/TechBot/TechBotService.cs [iso-8859-1] (original)
+++ trunk/irc/TechBot/TechBot/TechBotService.cs [iso-8859-1] Wed May  7 14:53:14 2008
@@ -9,7 +9,7 @@
 
 namespace TechBot
 {
-	public class TechBotService : System.ServiceProcess.ServiceBase
+	public class TechBotService : ServiceBase
 	{
 		private Thread thread;
 		private ServiceThread threadWorker;



More information about the Ros-diffs mailing list