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

163 lines
3.1 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999, Microsoft Corp. All rights reserved.
//
// FILE
//
// attrdnry.cpp
//
// SYNOPSIS
//
// Defines the class AttributeDictionary.
//
// MODIFICATION HISTORY
//
// 02/04/2000 Original version.
// 04/17/2000 Port to new dictionary API.
//
///////////////////////////////////////////////////////////////////////////////
#include <proxypch.h>
#include <iastlutl.h>
#include <iasutil.h>
#include <attrdnry.h>
///////////////////////////////////////////////////////////////////////////////
//
//
// Various functions used for defining the indices.
//
///////////////////////////////////////////////////////////////////////////////
ULONG
WINAPI
HashById(
const AttributeDefinition& def
) throw ()
{
return def.id;
}
BOOL
WINAPI
EqualById(
const AttributeDefinition& def1, const AttributeDefinition& def2
) throw ()
{
return def1.id == def2.id;
}
ULONG
WINAPI
HashByVendorInfo(
const AttributeDefinition& def
) throw ()
{
return def.vendorID | def.vendorType;
}
BOOL
WINAPI
EqualByVendorInfo(
const AttributeDefinition& def1, const AttributeDefinition& def2
) throw ()
{
return def1.vendorID == def2.vendorID && def1.vendorType == def2.vendorType;
}
BOOL
WINAPI
FilterByVendorInfo(
const AttributeDefinition& def
) throw ()
{
return def.vendorID != 0;
}
AttributeDictionary::~AttributeDictionary() throw ()
{
delete[] first;
}
HRESULT AttributeDictionary::FinalConstruct() throw ()
{
try
{
initialize();
}
CATCH_AND_RETURN();
return S_OK;
}
void AttributeDictionary::initialize()
{
// Names of various columns in the dictionary.
const PCWSTR COLUMNS[] =
{
L"ID",
L"Syntax",
L"VendorID",
L"VendorTypeID",
NULL
};
IASTL::IASDictionary dnary(COLUMNS);
using _com_util::CheckError;
// Allocate memory to hold the definitions.
first = last = new AttributeDefinition[dnary.getNumRows()];
// Iterate through the dictionary and process each definition.
while (dnary.next())
{
// Process each database column.
last->id = (ULONG)dnary.getLong(0);
last->syntax = (ULONG)dnary.getLong(1);
last->vendorID = (ULONG)dnary.getLong(2);
last->vendorType = (ULONG)dnary.getLong(3);
++last;
}
/////////
// Initialize the indices.
/////////
byID.create(
first,
last,
HashById,
EqualById
);
byVendorInfo.create(
first,
last,
HashByVendorInfo,
EqualByVendorInfo,
FilterByVendorInfo
);
}
const AttributeDefinition*
AttributeDictionary::findByID(ULONG id) const throw ()
{
AttributeDefinition key;
key.id = id;
return byID.find(key);
}
const AttributeDefinition*
AttributeDictionary::findByVendorInfo(
ULONG vendorID,
ULONG vendorType
) const throw ()
{
AttributeDefinition key;
key.vendorID = vendorID;
key.vendorType = vendorType;
return byVendorInfo.find(key);
}