// Copyright (c)  Microsoft.  All rights reserved.
//
// This is unpublished source code of Microsoft.
// The copyright notice above does not evidence any
// actual or intended publication of such source code.

// OneLiner  :  Implementation of MNLBPortRule
// DevUnit   :  wlbstest
// Author    :  Murtaza Hakim

// include files
#include "MNLBPortRule.h"


// done
// constructor
//
MNLBPortRule::MNLBPortRule( long startPort,
                            long endPort,
                            Protocol      trafficToHandle )
        : _startPort( startPort ),
          _endPort( endPort ),
          _trafficToHandle( trafficToHandle ),
          _key( startPort )
{}


// done
// default constructor
//
MNLBPortRule::MNLBPortRule()
        :_startPort( 0 ),
         _endPort( 65535 ),
         _trafficToHandle( both ),
         _key( 0 )
{}


// done
// equality operator
bool
MNLBPortRule::operator==(const MNLBPortRule& objToCompare ) const
{
    if( (_startPort == objToCompare._startPort )
        &&
        (_endPort == objToCompare._endPort )        
        &&
        (_trafficToHandle == objToCompare._trafficToHandle )
        )
    {
        return true;
    }
    else
    {
        return false;
    }
}

// done
// inequality operator
bool
MNLBPortRule::operator!=(const MNLBPortRule& objToCompare ) const
{
    return !( *this == objToCompare );
}

// done
// constructor
//
MNLBPortRuleLoadBalanced::MNLBPortRuleLoadBalanced( long          startPort,
                                              long          endPort,
                                              Protocol      trafficToHandle,
                                              bool          isEqualLoadBalanced,
                                              long          load,
                                              Affinity      affinity ) :
        MNLBPortRule( startPort, endPort, trafficToHandle ),
        _isEqualLoadBalanced( isEqualLoadBalanced  ),
        _load( load ),
        _affinity( affinity )
{}

// done
// default constructor
//
MNLBPortRuleLoadBalanced::MNLBPortRuleLoadBalanced()
        : MNLBPortRule(),
          _isEqualLoadBalanced( true ),
          _load( 0 ),
          _affinity( single )
{}


// equality operator
// 
bool
MNLBPortRuleLoadBalanced::operator==(const MNLBPortRuleLoadBalanced& objToCompare ) const
{
    bool retVal;

    // compare bases.
    retVal = MNLBPortRule::operator==( objToCompare );
    if( retVal == true )
    {

        if( ( _isEqualLoadBalanced == objToCompare._isEqualLoadBalanced )
            &&
            ( _affinity == objToCompare._affinity )
            )
        {
            if( _isEqualLoadBalanced == false )
            {
                // as it is Unequal load balanced port rule, 
                // load weight is important.
                if( _load == objToCompare._load )
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                // load weight is not important as it is equal load balanced.
                return true;
            }
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
        
}

// inequality operator
//
bool
MNLBPortRuleLoadBalanced::operator!=(const MNLBPortRuleLoadBalanced& objToCompare ) const
{
    return !( (*this) ==  objToCompare );
}

    

// constructor
//
MNLBPortRuleFailover::MNLBPortRuleFailover( long startPort,
                                      long endPort,
                                      Protocol      trafficToHandle,
                                      long priority )
        :
        MNLBPortRule( startPort, endPort, trafficToHandle ),
        _priority ( priority )
{}



// default constructor
//
MNLBPortRuleFailover::MNLBPortRuleFailover()
        : 
        MNLBPortRule(),
        _priority( 1 )
{}


// equality operator
//
bool
MNLBPortRuleFailover::operator==(const MNLBPortRuleFailover& objToCompare ) const
{
    bool retVal;
    retVal = MNLBPortRule::operator==( objToCompare );
    if( retVal == true )
    {
        if( _priority == objToCompare._priority )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}


// inequality operator
//
bool
MNLBPortRuleFailover::operator!=(const MNLBPortRuleFailover& objToCompare ) const
{
    return !( (*this) ==  objToCompare );
}

// constructor
//
MNLBPortRuleDisabled::MNLBPortRuleDisabled( long startPort,
                                      long endPort,
                                      Protocol      trafficToHandle )
        :
        MNLBPortRule( startPort, endPort, trafficToHandle )
{}


// default constructor
//
MNLBPortRuleDisabled::MNLBPortRuleDisabled()
        :
        MNLBPortRule()
{}


// equality operator
//
bool
MNLBPortRuleDisabled::operator==(const MNLBPortRuleDisabled& objToCompare ) const
{
    bool retVal;

    // compare bases.
    retVal = MNLBPortRule::operator==( objToCompare );

    return retVal;
}


// inequality operator
//
bool
MNLBPortRuleDisabled::operator!=(const MNLBPortRuleDisabled& objToCompare ) const
{
    return !( (*this) ==  objToCompare );
}