Click here to Skip to main content
15,892,005 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 322.9K   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;

using LumiSoft.Net;

namespace LumiSoft.MailServer.API.UserAPI
{
    /// <summary>
    /// The GlobalMessageRuleCollection object represents global message rules in LumiSoft Mail Server virtual server.
    /// </summary>
    public class GlobalMessageRuleCollection : IEnumerable
    {
        private VirtualServer           m_pVirtualServer      = null;
        private List<GlobalMessageRule> m_pGlobalMessageRules = null;

        /// <summary>
        /// Default constructor.
        /// </summary>
        /// <param name="virtualServer">Owner virtual server.</param>
        internal GlobalMessageRuleCollection(VirtualServer virtualServer)
        {
            m_pVirtualServer      = virtualServer;
            m_pGlobalMessageRules = new List<GlobalMessageRule>();

            Bind();
        }


        #region method Add

        /// <summary>
        /// Adds new global message rule to virtual server.
        /// </summary>
        /// <param name="enabled">Specifies if global message rules is enabled.</param>
        /// <param name="description">Global message rule description.</param>
        /// <param name="matchExpression">Match expression.</param>
        /// <param name="checkNext">Specifies when next rule is checked.</param>
        /// <returns></returns>
        public GlobalMessageRule Add(bool enabled,string description,string matchExpression,GlobalMessageRule_CheckNextRule_enum checkNext)
        {
            /* AddGlobalMessageRule <virtualServerID> "<ruleID>" <cost> <enabled> "<description>" "<matchExpression>" <checkNext>
                  Responses:
                    +OK                     
                    -ERR <errorText>
            */

            string id   = Guid.NewGuid().ToString();
            long   cost = DateTime.Now.Ticks;

            // Call TCP AddGlopbalMessageRule
            m_pVirtualServer.Server.Socket.WriteLine("AddGlobalMessageRule " + 
                m_pVirtualServer.VirtualServerID + " " + 
                TextUtils.QuoteString(id) + " " + 
                cost + " " +
                enabled + " " +
                TextUtils.QuoteString(description) + " " + 
                TextUtils.QuoteString(matchExpression) + " " + 
                (int)checkNext
            );
                        
            string response = m_pVirtualServer.Server.Socket.ReadLine();
            if(!response.ToUpper().StartsWith("+OK")){
                throw new Exception(response);
            }

            GlobalMessageRule rule = new GlobalMessageRule(m_pVirtualServer,this,id,cost,enabled,description,matchExpression,checkNext);
            m_pGlobalMessageRules.Add(rule);
            return rule;
        }

        #endregion

        #region method Remove

        /// <summary>
        /// Deletes specified global message rule from virtual server.
        /// </summary>
        /// <param name="rule">Global message rule to delete.</param>
        public void Remove(GlobalMessageRule rule)
        {
            /* DeleteGlobalMessageRule <virtualServerID> "<ruleID>"
                  Responses:
                    +OK                     
                    -ERR <errorText>
            */

            string id = Guid.NewGuid().ToString();

            // Call TCP DeleteGlobalMessageRule
            m_pVirtualServer.Server.Socket.WriteLine("DeleteGlobalMessageRule " + m_pVirtualServer.VirtualServerID + " " + TextUtils.QuoteString(rule.ID));
                        
            string response = m_pVirtualServer.Server.Socket.ReadLine();
            if(!response.ToUpper().StartsWith("+OK")){
                throw new Exception(response);
            }

            m_pGlobalMessageRules.Remove(rule);
        }

        #endregion

        #region method Refresh

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

        #endregion


        #region method Bind

        /// <summary>
        /// Gets server global message rules and binds them to this, if not binded already.
        /// </summary>
        private void Bind()
        {
            /* GetGlobalMessageRules <virtualServerID>
                  Responses:
                    +OK <sizeOfData>
                    <data>
                    
                    -ERR <errorText>
            */

            lock(m_pVirtualServer.Server.LockSynchronizer){
                // Call TCP GetGlobalMessageRules
                m_pVirtualServer.Server.Socket.WriteLine("GetGlobalMessageRules " + m_pVirtualServer.VirtualServerID);

                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("GlobalMessageRules")){
                    foreach(DataRow dr in ds.Tables["GlobalMessageRules"].Rows){
                        m_pGlobalMessageRules.Add(new GlobalMessageRule(
                            m_pVirtualServer,
                            this,
                            dr["RuleID"].ToString(),
                            Convert.ToInt64(dr["Cost"]),
                            Convert.ToBoolean(dr["Enabled"]),
                            dr["Description"].ToString(),
                            dr["MatchExpression"].ToString(),
                            (GlobalMessageRule_CheckNextRule_enum)Convert.ToInt32(dr["CheckNextRuleIf"])
                        ));
                    }
                }
            }
        }

        #endregion


        #region interface IEnumerator

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

		#endregion


        #region Properties Implementation

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

        /// <summary>
        /// Gets number of global message rules in virtual server.
        /// </summary>
        public int Count
        {
            get{ return m_pGlobalMessageRules.Count; }
        }

        /// <summary>
        /// Gets a GlobalMessageRule object in the collection by index number.
        /// </summary>
        /// <param name="index">An Int32 value that specifies the position of the GlobalMessageRule object in the GlobalMessageRuleCollection collection.</param>
        /// <returns>A GlobalMessageRule object value that represents the global message rule in virtual server.</returns>
        public GlobalMessageRule this[int index]
        {
            get{ return m_pGlobalMessageRules[index]; }
        }

        /// <summary>
        /// Gets a GlobalMessageRule object in the collection by global message rule ID.
        /// </summary>
        /// <param name="globalMessageRuleID">A String value that specifies the global message rule ID of the GlobalMessageRule object in the GlobalMessageRuleCollection collection.</param>
        /// <returns>A GlobalMessageRule object value that represents the global message rule in virtual server.</returns>
        public GlobalMessageRule this[string globalMessageRuleID]
        {
            get{ 
                foreach(GlobalMessageRule rule in m_pGlobalMessageRules){
                    if(rule.ID.ToLower() == globalMessageRuleID.ToLower()){
                        return rule;
                    }
                }

                throw new Exception("GlobalMessageRule with specified ID '" + globalMessageRuleID + "' doesn't exist !"); 
            }
        }

        #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