windows-nt/Source/XPSP1/NT/net/ias/protocol/radius/portscoll.cpp
2020-09-26 16:20:57 +08:00

152 lines
3.7 KiB
C++

//##--------------------------------------------------------------
//
// File: portscoll.cpp
//
// Synopsis: Implementation of CPortsCollection class responsible
// for holding a collection of ports in a multi_map
//
// History: 10/22/98 MKarki Created
//
// Copyright (C) 1997-98 Microsoft Corporation
// All rights reserved.
//
//----------------------------------------------------------------
#include "radcommon.h"
#include "portscoll.h"
//++--------------------------------------------------------------
//
// Function: Insert
//
// Synopsis: This is CPortsCollection class public method which
// is called to insert a port,address pair into the
// collection
//
// Arguments: [in] DWORD - port
// [in] DWORD - IP Address
//
// Returns: HRESULT
//
// History: MKarki Created 10/22/97
//
//----------------------------------------------------------------
HRESULT CPortsCollection::Insert (
/*[in]*/ WORD wPort,
/*[in]*/ DWORD dwIPAddress
)
{
bool bInsert = true;
//
// check for this port already in map
//
pair <PORTITR, PORTITR>
itrPair = m_mapPorts.equal_range (wPort);
if (itrPair.first != itrPair.second)
{
//
// we already have values with this key in the collection
//
PORTITR itr = itrPair.first;
do
{
if (INADDR_ANY == dwIPAddress)
{
itr = m_mapPorts.erase (itr);
}
else
{
if (INADDR_ANY == (*itr).second)
{
bInsert = false;
}
++itr;
}
}
while (itr != itrPair.second);
}
//
// insert this port,address pair if required
//
if (bInsert)
{
m_mapPorts.insert (
PORTSCOLLECTION::value_type (wPort, dwIPAddress)
);
}
return (S_OK);
} // end of CPortsCollection::Insert method
//++--------------------------------------------------------------
//
// Function: GetNext
//
// Synopsis: This is CPortsCollection class public method which
// is called to get the next element from the map
//
// Arguments: [out] PWORD - port
// [out] PDWORD - IP Address
//
// Returns: HRESULT
//
// History: MKarki Created 10/22/97
//
//----------------------------------------------------------------
HRESULT CPortsCollection::GetNext (
/*[out]*/ PWORD pwPort,
/*[out]*/ PDWORD pdwIPAddress
)
{
HRESULT hr = S_OK;
_ASSERT (pwPort && pdwIPAddress);
if (false == m_bDoneGet)
{
m_itr = m_mapPorts.begin();
m_bDoneGet = true;
}
if (m_itr != m_mapPorts.end ())
{
*pwPort = (*m_itr).first;
*pdwIPAddress =(*m_itr).second;
++m_itr;
}
else
{
hr = E_FAIL;
}
return (hr);
} // end of CPortsCollection::GetNext method
//++--------------------------------------------------------------
//
// Function: ~CPortsCollection
//
// Synopsis: This is CPortsCollection class public destruction
//
// Arguments: none
//
// Returns: none
//
// History: MKarki Created 10/22/97
//
//----------------------------------------------------------------
CPortsCollection::~CPortsCollection ()
{
PORTITR itr = m_mapPorts.begin ();
while (itr != m_mapPorts.end ())
{
itr = m_mapPorts.erase (itr);
}
} // end of CPortsCollection::~CPortsCollection method