/// <summary> /// Dns relay session constructor. /// </summary> /// <param name="server">Owner relay server.</param> /// <param name="realyItem">Relay item.</param> /// <exception cref="ArgumentNullException">Is raised when <b>server</b> or <b>realyItem</b> is null.</exception> /// <exception cref="ArgumentException">Is raised when any of the arguments has invalid value.</exception> internal Relay_Session(Relay_Server server,Relay_QueueItem realyItem) { if(server == null){ throw new ArgumentNullException("server"); } if(realyItem == null){ throw new ArgumentNullException("realyItem"); } m_pServer = server; m_pRelayItem = realyItem; m_SessionID = Guid.NewGuid().ToString(); m_SessionCreateTime = DateTime.Now; m_pTargets = new List<Relay_Target>(); m_pSmtpClient = new SMTP_Client(); }
/// <summary> /// Completes relay session and does clean up. This method is thread-safe. /// </summary> /// <param name="exception">Exception happened or null if relay completed successfully.</param> public void Dispose(Exception exception) { try{ lock(this){ if(m_IsDisposed){ return; } try{ m_pServer.OnSessionCompleted(this,exception); } catch{ } m_pServer.Sessions.Remove(this); m_IsDisposed = true; m_pLocalBindInfo = null; m_pRelayItem = null; m_pSmartHosts = null; if(m_pSmtpClient != null){ m_pSmtpClient.Dispose(); m_pSmtpClient = null; } m_pTargets = null; if(m_pActiveTarget != null){ m_pServer.RemoveIpUsage(m_pActiveTarget.Target.Address); m_pActiveTarget = null; } m_pServer = null; } } catch(Exception x){ if(m_pServer != null){ m_pServer.OnError(x); } } }