windows-nt/Source/XPSP1/NT/com/rpc/midl/codegen/dtable.cxx
2020-09-26 16:20:57 +08:00

179 lines
4.2 KiB
C++

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name:
dtable.cxx
Abstract:
Dispatch table class implementation.
Notes:
History:
Oct-01-1993 VibhasC Created.
----------------------------------------------------------------------------*/
/****************************************************************************
* include files
***************************************************************************/
#include "becls.hxx"
#pragma hdrstop
/****************************************************************************
* local definitions
***************************************************************************/
/****************************************************************************
* local data
***************************************************************************/
/****************************************************************************
* externs
***************************************************************************/
/****************************************************************************/
void
DISPATCH_TABLE::RegisterProcedure(
node_skl * pProc,
DISPATCH_TABLE_FLAGS Flags )
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Routine Description:
Register a procedure into the dispatch table.
Arguments:
pProc - The procedure node to be registered.
Flags - Additional information flags.
Return Value:
None.
Notes:
if the flags field indicates a pure interpreter procedure, then
the node pointer is really a pointer to a name, and not a node_skl
----------------------------------------------------------------------------*/
{
PNAME pProcName;
node_skl * pN = pProc;
DISPATCH_TABLE_ENTRY * pDEntry;
pProcName = pProc->GetSymName();
pN = pProc;
//
// Allocate a dispatch table entry.
//
pDEntry = new DISPATCH_TABLE_ENTRY;
pDEntry->pName = pProcName;
pDEntry->Flags = Flags;
pDEntry->pNode = pN;
AddElement( (IDICTELEMENT) pDEntry );
}
DISPATCH_TABLE::~DISPATCH_TABLE()
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Routine Description:
The destructor.
Arguments:
None.
Return Value:
NA.
Notes:
----------------------------------------------------------------------------*/
{
short i = 0;
short Count = GetNumberOfElements();
DISPATCH_TABLE_ENTRY * pDEntry;
//
// remove the dispatch table entries. The procedure name is NOT
// owned by the dipatch table, DO NOT delete it. Just delete the
// dispatch table entry.
//
for( i = 0; i < Count; ++i )
{
pDEntry = (DISPATCH_TABLE_ENTRY *)GetElement( (IDICTKEY)i );
delete pDEntry;
}
}
unsigned short
DISPATCH_TABLE::GetProcList(
ITERATOR& DTableEntryList,
DISPATCH_TABLE_FLAGS Flags )
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Routine Description:
Return a list of all procedures which conform to the specified dispatch
table flags.
Arguments:
DTableEntryList - A pre-allocated iterator for receiving the list of
dispatch table entries.
Flags - flags which determine what entries will be picked up.
Return Value:
A count of the number of procedures in the list.
Notes:
The flags field is a filter for the dispatch table entries. Only those
dispatch table entries which have conforming properties are returned in
the list.
There are 2 types of entries:
normal (call with DTF_NONE) and interpreter (call with DTF_INTERPRETER).
The way it works is that
- call with DTF_NONE returns DTF_NONEs or DTF_PICKLING_PROCs
- call with DTF_INTERPRETER returns DTF_INTERPRETERs or DTF_PICKLING_PROCs
----------------------------------------------------------------------------*/
{
short ListCount,
i,
Count;
DISPATCH_TABLE_ENTRY * pDEntry;
for( ListCount = 0, i = 0, Count = GetNumberOfElements();
i < Count;
++i
)
{
pDEntry = (DISPATCH_TABLE_ENTRY *)GetElement( (IDICTKEY)i );
if( (pDEntry->Flags & Flags ) == Flags )
{
ITERATOR_INSERT( DTableEntryList, pDEntry );
ListCount++;
}
}
return ListCount;
}