347 lines
6.4 KiB
C++
347 lines
6.4 KiB
C++
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
/*++
|
||
|
|
||
|
Copyright (C) Microsoft Corporation, 1997 - 1999
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
Vendors.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Implementation file for NAS Vendor ID info.
|
||
|
|
||
|
Revision History:
|
||
|
mmaguire 02/19/98 created
|
||
|
byao 3/13/98 Modified. use '0' for RADIUS
|
||
|
mmaguire 11/04/98 Revamped to be a static COM object populated from the SDO's.
|
||
|
|
||
|
--*/
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
// BEGIN INCLUDES
|
||
|
//
|
||
|
// standard includes:
|
||
|
//
|
||
|
#include "Precompiled.h"
|
||
|
//
|
||
|
// where we can find declaration for main class in this file:
|
||
|
//
|
||
|
#include "Vendors.h"
|
||
|
//
|
||
|
// where we can find declarations needed in this file:
|
||
|
//
|
||
|
//
|
||
|
// END INCLUDES
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
/*++
|
||
|
|
||
|
CIASNASVendors::CIASNASVendors
|
||
|
|
||
|
Constructor
|
||
|
|
||
|
--*/
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
CIASNASVendors::CIASNASVendors()
|
||
|
{
|
||
|
m_bUninitialized = TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
/*++
|
||
|
|
||
|
CIASNASVendors::InitFromSdo
|
||
|
|
||
|
IIASNASVendors implementation.
|
||
|
|
||
|
--*/
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CIASNASVendors::InitFromSdo( /* [in] */ ISdoCollection *pSdoVendors )
|
||
|
{
|
||
|
|
||
|
// Check to see if we've already been initialized.
|
||
|
if( ! m_bUninitialized )
|
||
|
{
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
CComPtr<IUnknown> spUnknown;
|
||
|
CComPtr<IEnumVARIANT> spEnumVariant;
|
||
|
CComVariant spVariant;
|
||
|
long ulCount;
|
||
|
ULONG ulCountReceived;
|
||
|
|
||
|
if( ! pSdoVendors )
|
||
|
{
|
||
|
return E_FAIL; // Is there a better error to return here?
|
||
|
}
|
||
|
|
||
|
|
||
|
try // push_back can throw exceptions.
|
||
|
{
|
||
|
|
||
|
// We check the count of items in our collection and don't bother getting the
|
||
|
// enumerator if the count is zero.
|
||
|
// This saves time and also helps us to avoid a bug in the the enumerator which
|
||
|
// causes it to fail if we call next when it is empty.
|
||
|
pSdoVendors->get_Count( & ulCount );
|
||
|
|
||
|
if( ulCount > 0 )
|
||
|
{
|
||
|
|
||
|
// Get the enumerator for the Clients collection.
|
||
|
hr = pSdoVendors->get__NewEnum( (IUnknown **) & spUnknown );
|
||
|
if( FAILED( hr ) || ! spUnknown )
|
||
|
{
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
hr = spUnknown->QueryInterface( IID_IEnumVARIANT, (void **) &spEnumVariant );
|
||
|
spUnknown.Release();
|
||
|
if( FAILED( hr ) || ! spEnumVariant )
|
||
|
{
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
// Get the first item.
|
||
|
hr = spEnumVariant->Next( 1, & spVariant, &ulCountReceived );
|
||
|
|
||
|
while( SUCCEEDED( hr ) && ulCountReceived == 1 )
|
||
|
{
|
||
|
|
||
|
// Get an sdo pointer from the variant we received.
|
||
|
if( spVariant.vt != VT_DISPATCH || ! spVariant.pdispVal )
|
||
|
{
|
||
|
_ASSERTE( FALSE );
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
CComPtr<ISdo> spSdo;
|
||
|
hr = spVariant.pdispVal->QueryInterface( IID_ISdo, (void **) &spSdo );
|
||
|
spVariant.Clear();
|
||
|
if( FAILED( hr ) )
|
||
|
{
|
||
|
_ASSERTE( FALSE );
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Get Vendor Name.
|
||
|
hr = spSdo->GetProperty( PROPERTY_SDO_NAME, &spVariant );
|
||
|
if( FAILED( hr ) )
|
||
|
{
|
||
|
_ASSERTE( FALSE );
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
_ASSERTE( spVariant.vt == VT_BSTR );
|
||
|
CComBSTR bstrVendorName = spVariant.bstrVal;
|
||
|
spVariant.Clear();
|
||
|
|
||
|
|
||
|
// Get Vendor ID.
|
||
|
hr = spSdo->GetProperty( PROPERTY_NAS_VENDOR_ID, &spVariant );
|
||
|
if( FAILED( hr ) )
|
||
|
{
|
||
|
_ASSERTE( FALSE );
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
_ASSERTE( spVariant.vt == VT_I4 );
|
||
|
LONG lVendorID = spVariant.lVal;
|
||
|
spVariant.Clear();
|
||
|
|
||
|
|
||
|
// Add the vendor infor to the list of vendors.
|
||
|
push_back( std::make_pair(bstrVendorName, lVendorID) );
|
||
|
|
||
|
|
||
|
// Get the next item.
|
||
|
hr = spEnumVariant->Next( 1, & spVariant, &ulCountReceived );
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// There are no items in the enumeration
|
||
|
// Do nothing.
|
||
|
}
|
||
|
|
||
|
}
|
||
|
catch(...)
|
||
|
{
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
m_bUninitialized = FALSE;
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
/*++
|
||
|
|
||
|
CIASNASVendors::get_Size
|
||
|
|
||
|
IIASNASVendors implementation.
|
||
|
|
||
|
--*/
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CIASNASVendors::get_Size( /* [retval][out] */ long *plCount )
|
||
|
{
|
||
|
|
||
|
if( m_bUninitialized )
|
||
|
{
|
||
|
return OLE_E_BLANK;
|
||
|
}
|
||
|
|
||
|
*plCount = size();
|
||
|
|
||
|
return S_OK;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
/*++
|
||
|
|
||
|
CIASNASVendors::get_VendorName
|
||
|
|
||
|
IIASNASVendors implementation.
|
||
|
|
||
|
--*/
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CIASNASVendors::get_VendorName( long lIndex, /* [retval][out] */ BSTR *pbstrVendorName )
|
||
|
{
|
||
|
if( m_bUninitialized )
|
||
|
{
|
||
|
return OLE_E_BLANK;
|
||
|
}
|
||
|
|
||
|
|
||
|
try
|
||
|
{
|
||
|
*pbstrVendorName = operator[]( lIndex ).first.Copy();
|
||
|
}
|
||
|
catch(...)
|
||
|
{
|
||
|
return ERROR_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
HRESULT MakeVendorNameFromVendorID(DWORD dwVendorId, BSTR* pbstrVendorName )
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||
|
|
||
|
if(!pbstrVendorName) return E_INVALIDARG;
|
||
|
::CString str, str1;
|
||
|
str1.LoadString(IDS_IAS_VAS_VENDOR_ID);
|
||
|
str.Format(str1, dwVendorId);
|
||
|
|
||
|
USES_CONVERSION;
|
||
|
*pbstrVendorName = T2BSTR((LPTSTR)(LPCTSTR)str);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
/*++
|
||
|
|
||
|
CIASNASVendors::get_VendorID
|
||
|
|
||
|
IIASNASVendors implementation.
|
||
|
|
||
|
--*/
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CIASNASVendors::get_VendorID( long lIndex, /* [retval][out] */ long *plVendorID )
|
||
|
{
|
||
|
if( m_bUninitialized )
|
||
|
{
|
||
|
return OLE_E_BLANK;
|
||
|
}
|
||
|
|
||
|
|
||
|
try
|
||
|
{
|
||
|
*plVendorID = operator[]( lIndex ).second;
|
||
|
}
|
||
|
catch(...)
|
||
|
{
|
||
|
return ERROR_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
/*++
|
||
|
|
||
|
CIASNASVendors::get_VendorIDToOrdinal
|
||
|
|
||
|
IIASNASVendors implementation.
|
||
|
|
||
|
--*/
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CIASNASVendors::get_VendorIDToOrdinal( long lVendorID, /* [retval][out] */ long *plIndex )
|
||
|
{
|
||
|
if( m_bUninitialized )
|
||
|
{
|
||
|
return OLE_E_BLANK;
|
||
|
}
|
||
|
|
||
|
try
|
||
|
{
|
||
|
|
||
|
for (int i = 0; i < size() ; ++i)
|
||
|
{
|
||
|
if( lVendorID == operator[](i).second )
|
||
|
{
|
||
|
*plIndex = i;
|
||
|
return S_OK;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
catch(...)
|
||
|
{
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
// When we can't find a vendor, we have arranged the dictionary so
|
||
|
// that the zero'th vendor is the default "RADIUS Standard" so
|
||
|
// use this as the fallback.
|
||
|
*plIndex = 0;
|
||
|
return S_FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|