Click here to Skip to main content
15,891,828 members
Articles / Programming Languages / C#

IMAP and POP3 Clients in C#

Rate me:
Please Sign up or sign in to vote.
4.67/5 (21 votes)
28 Sep 2012CPOL1 min read 258.7K   16.6K   48  
IMAP & POP3 Clients C#. A library for intuitive ease of use of these two protocols.
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;

namespace LumiSoft.Net.TCP
{
    /// <summary>
    /// This class implements TCP session collection.
    /// </summary>
    public class TCP_SessionCollection<T> where T : TCP_Session
    {
        private Dictionary<string,T>    m_pItems            = null;
        private Dictionary<string,long> m_pConnectionsPerIP = null;

        /// <summary>
        /// Default constructor.
        /// </summary>
        internal TCP_SessionCollection()
        {
            m_pItems = new Dictionary<string,T>();
            m_pConnectionsPerIP = new Dictionary<string,long>();
        }


        #region method Add

        /// <summary>
        /// Adds specified TCP session to the colletion.
        /// </summary>
        /// <param name="session">TCP server session to add.</param>
        /// <exception cref="ArgumentNullException">Is raised when <b>session</b> is null.</exception>
        internal void Add(T session)
        {
            if(session == null){
                throw new ArgumentNullException("session");
            }

            lock(m_pItems){
                m_pItems.Add(session.ID,session);

                if(session.IsConnected && session.RemoteEndPoint != null){
                    // Increase connections per IP.
                    if(m_pConnectionsPerIP.ContainsKey(session.RemoteEndPoint.Address.ToString())){
                        m_pConnectionsPerIP[session.RemoteEndPoint.Address.ToString()]++;
                    }
                    // Just add new entry for that IP address.
                    else{
                        m_pConnectionsPerIP.Add(session.RemoteEndPoint.Address.ToString(),1);
                    }
                }
            }
        }

        #endregion

        #region method Remove

        /// <summary>
        /// Removes specified TCP server session from the collection.
        /// </summary>
        /// <param name="session">TCP server session to remove.</param>
        /// <exception cref="ArgumentNullException">Is raised when <b>session</b> is null.</exception>
        internal void Remove(T session)
        {
            if(session == null){
                throw new ArgumentNullException("session");
            }

            lock(m_pItems){
                m_pItems.Remove(session.ID);

                // Decrease connections per IP.
                if(session.IsConnected && m_pConnectionsPerIP.ContainsKey(session.RemoteEndPoint.Address.ToString())){
                    m_pConnectionsPerIP[session.RemoteEndPoint.Address.ToString()]--;

                    // Last IP, so remove that IP entry.
                    if(m_pConnectionsPerIP[session.RemoteEndPoint.Address.ToString()] == 0){
                        m_pConnectionsPerIP.Remove(session.RemoteEndPoint.Address.ToString());
                    }
                }                
                
            }
        }

        #endregion

        #region method Clear

        /// <summary>
        /// Removes all items from the collection.
        /// </summary>
        internal void Clear()
        {
            lock(m_pItems){
                m_pItems.Clear();
                m_pConnectionsPerIP.Clear();
            }
        }

        #endregion
        
        #region method ToArray

        /// <summary>
        /// Copies all TCP server session to new array. This method is thread-safe.
        /// </summary>
        /// <returns>Returns TCP sessions array.</returns>
        public T[] ToArray()
        {
            lock(m_pItems){
                T[] retVal = new T[m_pItems.Count];
                m_pItems.Values.CopyTo(retVal,0);

                return retVal;
            }
        }

        #endregion

        #region mehtod GetConnectionsPerIP

        /// <summary>
        /// Gets number of connections per specified IP.
        /// </summary>
        /// <param name="ip">IP address.</param>
        /// <returns>Returns current number of connections of the specified IP.</returns>
        /// <exception cref="ArgumentNullException">Is raised when <b>ip</b> is null reference.</exception>
        public long GetConnectionsPerIP(IPAddress ip)
        {
            if(ip == null){
                throw new ArgumentNullException("ip");
            }

            long retVal = 0;
            m_pConnectionsPerIP.TryGetValue(ip.ToString(),out retVal);

            return retVal;
        }

        #endregion


        #region Properties Implementation

        /// <summary>
        /// Gets number of items in the collection.
        /// </summary>
        public int Count
        {
            get{ return m_pItems.Count; }
        }

        /// <summary>
        /// Gets TCP session with the specified ID.
        /// </summary>
        /// <param name="id">Session ID.</param>
        /// <returns>Returns TCP session with the specified ID.</returns>
        public T this[string id]
        {
            get{ return m_pItems[id]; }
        }

        #endregion

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) D.Net Solution
Italy Italy
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions