Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//////////////////////////////////////////////////////////////////////////////
/*++
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; }
|