windows-nt/Source/XPSP1/NT/net/ias/protocol/radius/vsadnary.h

145 lines
3.6 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998, Microsoft Corp. All rights reserved.
//
// FILE
//
// vsadnary.h
//
// SYNOPSIS
//
// This file declares the class VSADictionary.
//
// MODIFICATION HISTORY
//
// 03/07/1998 Original version.
// 09/16/1998 Add additional fields to VSA definition.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _VSADNARY_H_
#define _VSADNARY_H_
#if _MSC_VER >= 1000
#pragma once
#endif
#include <hashmap.h>
#include <iaspolcy.h>
#include <nocopy.h>
//////////
// Struct representing an entry in the dictionary.
//////////
struct VSADef
{
DWORD vendorID; // RADIUS Vendor-Id.
DWORD vendorType; // RADIUS Vendor-Type.
DWORD vendorTypeWidth; // Width in bytes of the Vendor-Type field.
DWORD vendorLengthWidth; // Width in bytes of the Vendor-Length field.
DWORD iasID; // IAS protocol-independent attribute ID.
IASTYPE iasType; // The IAS attribute syntax.
/////////
// Functors used for indexing VSADef objects.
/////////
struct HashByIAS {
DWORD operator()(const VSADef& v) const throw ()
{ return v.iasID; }
};
struct EqualByIAS {
bool operator()(const VSADef& lhs, const VSADef& rhs) const throw ()
{ return lhs.iasID == rhs.iasID; }
};
struct HashByRADIUS {
DWORD operator()(const VSADef& v) const throw ()
{ return v.vendorID ^ v.vendorType; }
};
struct EqualByRADIUS {
bool operator()( const VSADef& lhs, const VSADef& rhs) const throw ()
{ return memcmp(&lhs, &rhs, 3 * sizeof(DWORD)) == 0; }
};
};
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// VSADictionary
//
// DESCRIPTION
//
// This class indexes all the information necessary for converting
// vendor specific attributes between RADIUS format and IAS protocol-
// independent format.
//
///////////////////////////////////////////////////////////////////////////////
class VSADictionary
: NonCopyable
{
public:
VSADictionary()
: refCount(0)
{ }
// Retrieve a definition based on the IAS attribute ID.
const VSADef* find(DWORD iasID) const throw ()
{
VSADef key;
key.iasID = iasID;
return byIAS.find(key);
}
// Retrieve a definition based on the RADIUS vendor ID, type, and width.
const VSADef* find(const VSADef& key) const throw ()
{
return byRADIUS.find(key);
}
// Initialize the dictionary for use.
HRESULT initialize() throw ();
// Shutdown the dictionary after use.
void shutdown() throw ();
protected:
// Clear the indices.
void clear() throw ()
{
byIAS.clear();
byRADIUS.clear();
}
// Insert a new definition into the dictionary.
void insert(const VSADef& newDef)
{
byIAS.multi_insert(newDef);
byRADIUS.multi_insert(newDef);
}
typedef hash_table< VSADef,
VSADef::HashByIAS,
VSADef,
identity< VSADef >,
VSADef::EqualByIAS
> IASMap;
typedef hash_table< VSADef,
VSADef::HashByRADIUS,
VSADef,
identity< VSADef >,
VSADef::EqualByRADIUS
> RADIUSMap;
IASMap byIAS; // Indexed by IAS attribute ID.
RADIUSMap byRADIUS; // Indexed by RADIUS Vendor-Id, Vendor-Type, and width.
DWORD refCount; // Initialization reference count.
};
#endif // _VSADNARY_H_