예제 #1
0
        private void server_OnStatusChange(object sender, TFTPStopEventArgs e)
        {
            TFTPServer server = (TFTPServer)sender;

            if (server.Active)
            {
                Log(EventLogEntryType.Information, string.Format("{0} transfers in progress", server.ActiveTransfers));
            }
            else
            {
                if (e.Reason != null)
                {
                    Log(EventLogEntryType.Error, string.Format("Stopped, reason: {0}", e.Reason));
                }
                CleanupAndRetry();
            }
        }
예제 #2
0
 private void CleanupAndRetry()
 {
     lock (m_Lock)
     {
         if (!m_Disposed)
         {
             // stop server
             if (m_Server != null)
             {
                 m_Server.OnStatusChange -= server_OnStatusChange;
                 m_Server.OnTrace        -= server_OnTrace;
                 m_Server.Dispose();
                 m_Server = null;
             }
             // initiate retry timer
             m_RetryTimer.Change(RetryTime, Timeout.Infinite);
         }
     }
 }
예제 #3
0
        private void Resurrect()
        {
            lock (m_Lock)
            {
                if (!m_Disposed)
                {
                    try
                    {
                        m_Server                       = new TFTPServer();
                        m_Server.Name                  = m_Config.Name;
                        m_Server.EndPoint              = m_Config.EndPoint;
                        m_Server.SinglePort            = m_Config.SinglePort;
                        m_Server.Ttl                   = (short)m_Config.Ttl;
                        m_Server.DontFragment          = m_Config.DontFragment;
                        m_Server.RootPath              = m_Config.RootPath;
                        m_Server.AutoCreateDirectories = m_Config.AutoCreateDirectories;
                        m_Server.AllowRead             = m_Config.AllowRead;
                        m_Server.AllowWrite            = m_Config.AllowWrite;
                        m_Server.ResponseTimeout       = m_Config.Timeout;
                        m_Server.Retries               = m_Config.Retries;
                        m_Server.ConvertPathSeparator  = m_Config.ConvertPathSeparator;
                        m_Server.WindowSize            = m_Config.WindowSize;

                        foreach (var alt in m_Config.Alternatives)
                        {
                            TFTPServer.ConfigurationAlternative tftpAlt = alt.IsRegularExpression ? TFTPServer.ConfigurationAlternative.CreateRegex(alt.Filter) : TFTPServer.ConfigurationAlternative.CreateWildcard(alt.Filter);
                            tftpAlt.WindowSize = alt.WindowSize;
                            m_Server.ConfigurationAlternatives.Add(tftpAlt);
                        }

                        m_Server.OnStatusChange += server_OnStatusChange;
                        m_Server.OnTrace        += server_OnTrace;
                        m_Server.Start();
                    }
                    catch (Exception)
                    {
                        CleanupAndRetry();
                    }
                }
            }
        }
예제 #4
0
        protected void Dispose(bool disposing)
        {
            lock (m_Lock)
            {
                if (!m_Disposed)
                {
                    m_Disposed = true;

                    m_RetryTimer.Change(Timeout.Infinite, Timeout.Infinite);
                    m_RetryTimer.Dispose();

                    if (m_Server != null)
                    {
                        m_Server.OnStatusChange -= server_OnStatusChange;
                        m_Server.Dispose();
                        m_Server.OnTrace -= server_OnTrace;
                        m_Server          = null;
                    }
                }
            }
        }