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.
144 lines
3.7 KiB
144 lines
3.7 KiB
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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_
|