Click here to Skip to main content
15,886,110 members
Articles / Programming Languages / C#

LumiSoft MailServer

Rate me:
Please Sign up or sign in to vote.
3.79/5 (22 votes)
17 Nov 2006CPOL1 min read 321.8K   4.9K   74  
Full featured SMTP/POP3/IMAP server
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace LumiSoft.MailServer.API.UserAPI
{
    /// <summary>
    /// The Queues object represents SMTP/Relay queue in LumiSoft Mail Server virtual server.
    /// </summary>
    public class QueueItemCollection : IEnumerable
    {
        private VirtualServer   m_pVirtualServer = null;
        private List<QueueItem> m_pCollection    = null;
        private bool            m_smtp_relay     = false;

        /// <summary>
        /// Default constructor.
        /// </summary>
        /// <param name="virtualServer">Owner virtual server.</param>
        /// <param name="smtp_relay">Specifies if smtp or relay queue collection.</param>
        internal QueueItemCollection(VirtualServer virtualServer,bool smtp_relay)
        {
            m_pVirtualServer = virtualServer;
            m_smtp_relay     = smtp_relay;
            m_pCollection    = new List<QueueItem>();

            Bind();
        }


        #region method Refresh

        /// <summary>
        /// Refreshes sessions.
        /// </summary>
        public void Refresh()
        {
            m_pCollection.Clear();
            Bind();
        }

        #endregion


        #region method Bind

        /// <summary>
        /// Gets server groups and binds them to this.
        /// </summary>
        private void Bind()
        {
            /* GetQueue <virtualServerID> <queueType>
                  Responses:
                    +OK <sizeOfData>
                    <data>
                    
                    -ERR <errorText>
            */

            lock(m_pVirtualServer.Server.LockSynchronizer){
                // Call TCP GetQueue
                if(m_smtp_relay){
                    m_pVirtualServer.Server.Socket.WriteLine("GetQueue " + m_pVirtualServer.VirtualServerID + " 1");
                }
                else{
                    m_pVirtualServer.Server.Socket.WriteLine("GetQueue " + m_pVirtualServer.VirtualServerID + " 0");
                }

                string response = m_pVirtualServer.Server.Socket.ReadLine();
                if(!response.ToUpper().StartsWith("+OK")){
                    throw new Exception(response);
                }

                int sizeOfData = Convert.ToInt32(response.Split(new char[]{' '},2)[1]);
                MemoryStream ms = new MemoryStream();
                m_pVirtualServer.Server.Socket.ReadSpecifiedLength(sizeOfData,ms);
                
                // Decompress dataset
                DataSet ds = Utils.DecompressDataSet(ms);
                
                if(ds.Tables.Contains("Queue")){
                    foreach(DataRow dr in ds.Tables["Queue"].Rows){
                        m_pCollection.Add(new QueueItem(                        
                            Convert.ToDateTime(dr["CreateTime"]),
                            dr["Header"].ToString()
                        ));
                    }
                }
            }
        }

        #endregion


        #region interface IEnumerator

		/// <summary>
		/// Gets enumerator.
		/// </summary>
		/// <returns></returns>
		public IEnumerator GetEnumerator()
		{
			return m_pCollection.GetEnumerator();
		}

		#endregion


        #region Properties Implementaion

        /// <summary>
        /// Gets the VirtualServer object that is the owner of this collection.
        /// </summary>
        public VirtualServer VirtualServer
        {
            get{ return m_pVirtualServer; }
        }

        /// <summary>
        /// Gets number of queue itmes in collection.
        /// </summary>
        public int Count
        {
            get{ return m_pCollection.Count; }
        }

        /// <summary>
        /// Gets a QueueItem object in the collection by index number.
        /// </summary>
        /// <param name="index">An Int32 value that specifies the position of the QueueItem object in the QueueCollection collection.</param>
        /// <returns>A QueueItem object value that represents the queue item in virtual server.</returns>
        public QueueItem this[int index]
        {
            get{ return m_pCollection[index]; }
        }

        #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
Estonia Estonia
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions