|
|
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name: ccb.hxx
Abstract:
Code generation control block.
Notes:
History:
Aug-15-1993 VibhasC Created.
----------------------------------------------------------------------------*/ #ifndef __CCB_HXX__
#define __CCB_HXX__
#include "nodeskl.hxx"
#include "listhndl.hxx"
#include "stream.hxx"
#include "resdict.hxx"
#include "dtable.hxx"
#include "frmtstr.hxx"
#include "treg.hxx"
#include "sdesc.hxx"
#include "paddict.hxx"
#include "listhndl.hxx"
#include "ndrtypes.h"
class CG_NDR; class CG_HANDLE; class RESOURCE; class expr_node; class CG_INTERFACE; class CG_FILE; class CG_ENCODE_PROC; class CG_QUALIFIED_POINTER; class CG_IUNKNOWN_OBJECT_INTERFACE; class CG_OBJECT_INTERFACE; class CG_PARAM; class CG_PROC; class CG_FIELD; class GenNdr64Format; //
// some typedefs for entities used within the code gen controller block.
//
typedef unsigned int PROCNUM; typedef unsigned long RPC_FLAGS; typedef IndexedStringList CsTypeList; typedef IndexedStringList CsTagRoutineList; typedef IndexedList NotifyRoutineList;
//
// This class is for managing context rundown and generic binding routine
// indexes used in the Stub Descriptor structure.
//
#define MGR_INDEX_TABLE_SIZE 256
#define EXPR_INDEX_TABLE_SIZE 65535
#define OSF_MODE 0
#define MSEXT_MODE 1
/////////////////////////////////////////////////////////////////////////////
// This definition specifies a context for a registered expr eval routines.
// For some reason I couldn't get it work in cgcommon.hxx (rkk)
/////////////////////////////////////////////////////////////////////////////
typedef struct expr_EVAL_CONTEXT { CG_NDR * pContainer; expr_node * pMinExpr; expr_node * pSizeExpr; char * pRoutineName; char * pPrintPrefix; unsigned long Displacement; } EXPR_EVAL_CONTEXT;
typedef enum _TYPE_ENCODE_FLAGS { TYPE_ENCODE_FLAGS_NONE ,TYPE_ENCODE_WITH_IMPL_HANDLE } TYPE_ENCODE_FLAGS;
typedef struct _TYPE_ENCODE_INFO { PNAME pName; TYPE_ENCODE_FLAGS Flags; } TYPE_ENCODE_INFO;
class CCB_RTN_INDEX_MGR { private: char * NameId[ MGR_INDEX_TABLE_SIZE ]; long NextIndex;
public:
CCB_RTN_INDEX_MGR() { //
// The zeroth entry is reserved or invalid.
//
NameId[0] = NULL; NextIndex = 1; }
long Lookup( char * pName ); char * Lookup( long Index );
long GetIndex() { return NextIndex; }
BOOL IsEmpty() { return NextIndex == 1; } };
class CCB_EXPR_INDEX_MGR { private: char * NameId[ EXPR_INDEX_TABLE_SIZE ]; long Offset[ EXPR_INDEX_TABLE_SIZE ]; long NextIndex;
public:
CCB_EXPR_INDEX_MGR() { //
// The zeroth entry is reserved or invalid.
//
NameId[0] = NULL; NextIndex = 1; }
long Lookup( char * pName ); char * Lookup( long Index );
long GetIndex() { return NextIndex; }
BOOL IsEmpty() { return NextIndex == 1; }
void SetOffset(long Index, long lOffset) {Offset[Index] = lOffset;}
long GetOffset(long Index) { return Offset[Index]; }
}; /////////////////////////////////////////////////////////////////////////////
//
// This class is a captive class for the code generation controller block.
// Stores running expression stuff for inline stubs.
//
/////////////////////////////////////////////////////////////////////////////
class CCBexprINFO { private:
expr_node * pSrcExpr; expr_node * pDestExpr;
public:
//
// The constructor.
//
CCBexprINFO() { SetSrcExpression( 0 ); SetDestExpression( 0 ); } //
// Get and set methods.
//
expr_node * SetSrcExpression( expr_node * pSrc ) { return (pSrcExpr = pSrc); }
expr_node * GetSrcExpression() { return pSrcExpr; }
expr_node * SetDestExpression( expr_node * pDest ) { return (pDestExpr = pDest); }
expr_node * GetDestExpression() { return pDestExpr; } };
struct ICreateTypeInfo; struct ICreateTypeLib; struct tagVARDESC; typedef tagVARDESC VARDESC; struct tagTYPEDESC; typedef tagTYPEDESC TYPEDESC;
/////////////////////////////////////////////////////////////////////////////
//
// This class defines the code generation control block.
//
/////////////////////////////////////////////////////////////////////////////
class CCB { private: class VTableLayOutInfo { public: CG_CLASS* pLayOutNode; ICreateTypeInfo* pTypeInfo;
VTableLayOutInfo( CG_CLASS* pIf, ICreateTypeInfo* pInfo) : pLayOutNode(pIf), pTypeInfo(pInfo) { } ~VTableLayOutInfo() { } }; gplistmgr VTableLayOutList;
// Is pointee to be deferred in code generation.
unsigned long fDeferPointee : 1;
// Has At least one deferred pointee.
unsigned long fAtLeastOneDeferredPointee : 1;
// This flag indicates memory allocated for the entity being
// marshalled / unmarshalled.
unsigned long fMemoryAllocDone: 1;
// This flag indicates a reference allocated.
unsigned long fRefAllocDone : 1;
// This flag indicates a return context
unsigned long fReturnContext : 1;
// Are we in a callback proc?
unsigned long fInCallback : 1;
// Generate a call thru the epv only. Corresponds to the -use_epv
// on midl command line.
unsigned long fMEpV : 1;
unsigned long fNoDefaultEpv : 1;
// Generate MIDL 1.0 style names. No mangling.
unsigned long fOldNames : 1;
unsigned long Mode : 2; // OSF_MODE or MSEXT_MODE
// REVIEW: As best I can tell fRpcSSSwitchSet is passed to the analysis
// package which then does nothing with it.
unsigned long fRpcSSSwitchSet : 1;
unsigned long fMustCheckAllocationError : 1;
unsigned long fMustCheckEnum : 1;
unsigned long fMustCheckRef : 1;
unsigned long fMustCheckBounds : 1; unsigned long fMustCheckStubData : 1;
unsigned long fInObjectInterface : 1;
unsigned long fInterpretedRoutinesUseGenHandle : 1;
unsigned long fExprEvalExternEmitted : 1; unsigned long fQuintupleExternEmitted : 1; unsigned long fQuadrupleExternEmitted : 1; unsigned long fRundownExternEmitted : 1; unsigned long fGenericHExternEmitted : 1;
unsigned long fSkipFormatStreamGeneration : 1;
unsigned long fTypePicklingInfoEmitted : 1;
//
// stream to write the generated code into.
//
ISTREAM * pStream;
//
// current file (client stub, etc)
// REVIEW: We may be able to merge pStream/pFile
//
CG_FILE * pFile;
//
// optimization options in effect.
//
OPTIM_OPTION OptimOption;
//
// Store the current CG_INTERFACE node
//
CG_INTERFACE * pInterfaceCG;
//
// Store the current CG_FILE node
//
CG_FILE * pFileCG;
//
// Store the IUnknown's CG_OBJECT_INTERFACE node
//
CG_IUNKNOWN_OBJECT_INTERFACE * pIUnknownCG;
//
// Store the IClassFactory's CG_OBJECT_INTERFACE node
//
CG_OBJECT_INTERFACE * pIClassfCG;
//
// Store the interface name.
//
PNAME pInterfaceName;
//
// store the interface version.
//
unsigned short MajorVersion; unsigned short MinorVersion;
//
// The current procedure number is stored to emit the descriptor structure.
//
PROCNUM CurrentProcNum; PROCNUM CurrentVarNum;
//
// Store rpc flags. As of now, this field assumes a value only when
// datagram specific attributes are applied. Otherwise it is 0. Keep
// the type of this the same as in the actual rpc_message field.
//
RPC_FLAGS RpcFlags;
//
// Keep the default allocation and free routine names. These may
// be overriden by the parameters / types or procedures depending
// upon user specifications. Any code generation node which overrides
// the default names, is responsible for restoring it back.
// The default allocation routine is midl_user_allocate and the default
// free is MIDL_user_free for now.
//
PNAME pAllocRtnName; PNAME pFreeRtnName;
//
// This is set of names of internal rpc api that we need to call to
// perform our job. We store these names in order to make it easy to
// call a different api set if necessary, as long as the stub-runtime
// call paradigm stays the same.
//
PNAME pGetBufferRtnName; PNAME pSendReceiveRtnName; PNAME pFreeBufferRtnName;
//
// This field stores the current resource dictionary data base. The
// data base is NOT owned by this class and must NOT be deleted by this
// class either.
//
RESOURCE_DICT_DATABASE * pResDictDatabase;
//
// The standard stub descriptor resource available for use by both the
// client and server stub.
//
RESOURCE * pStubDescResource;
//
// This field is a class keeping the current expressions to be used during
// generation pass.
//
CCBexprINFO ExprInfo;
//
// These registries represent various types that get registered during
// code generation, for the purpose of generating the prototypes during
// header generation.
TREGISTRY * pGenericHandleRegistry; TREGISTRY * pContextHandleRegistry;
TREGISTRY * pPresentedTypeRegistry; TREGISTRY * pRepAsWireTypeRegistry; TREGISTRY * pQuintupleRegistry;
TREGISTRY * pExprEvalRoutineRegistry;
TREGISTRY * pSizingRoutineRegistry; TREGISTRY * pMarshallRoutineRegistry; TREGISTRY * pUnMarshallRoutineRegistry; TREGISTRY * pMemorySizingRoutineRegistry; TREGISTRY * pFreeRoutineRegistry;
// REVIEW, do we really need five type pickling registries?
TREGISTRY * pTypeAlignSizeRegistry; TREGISTRY * pTypeEncodeRegistry; TREGISTRY * pTypeDecodeRegistry; TREGISTRY * pTypeFreeRegistry; IndexedList * pPickledTypeList;
TREGISTRY * pProcEncodeDecodeRegistry; TREGISTRY * pCallAsRoutineRegistry;
TREGISTRY * pRecPointerFixupRegistry;
// This stores the interface wide implicit handle ID Node.
node_skl * pImplicitHandleIDNode;
//
// Current code generation phase.
//
CGPHASE CodeGenPhase;
//
// Current code generation side (client/server).
//
CGSIDE CodeGenSide;
//
// The type format string. Shared across mulitple interfaces and identical
// for client and server.
//
FORMAT_STRING * pFormatString;
//
// The proc/param format string. Used only for fully interpreted stubs.
//
FORMAT_STRING * pProcFormatString;
//
// Format string for expression evaluator. Used in post Windows 2000 only
FORMAT_STRING * pExprFormatString;
// The current embedding context. We increment this to indicate if we are
// in a top level or embedded context.
short EmbeddingLevel;
// This indicates the ptr indirection level. Each pointer must note its
// indirection level and then bump this field to indicate to the next
// pointer its (that pointer's) level.
short IndirectionLevel;
//
// This field is set by CG_PROC and all procedure CG classes. It is
// then used by the array classes when computing their conformance and/or
// variance descriptions for the new Ndr format strings.
//
CG_NDR * pCGNodeContext;
//
// This is the currently active region field if one if active.
//
CG_FIELD * pCurrentRegionField;
//
// Param/Field placeholder.
//
CG_NDR * pPlaceholderClass;
CG_PARAM * pCurrentParam;
// The stub descriptor structure.
SDESCMGR SSDescMgr;
SDESCMGR CSDescMgr;
RESOURCE * PtrToPtrInBuffer;
//
// Generic Binding and Context Rundown routine index managers.
//
CCB_RTN_INDEX_MGR * pGenericIndexMgr; CCB_RTN_INDEX_MGR * pContextIndexMgr;
//
// Expression evaluation routine index manager.
//
CCB_RTN_INDEX_MGR * pExprEvalIndexMgr; CCB_EXPR_INDEX_MGR * pExprFrmtStrIndexMgr;
//
// Transmited As routine index manager.
//
CCB_RTN_INDEX_MGR * pTransmitAsIndexMgr; // prototypes
CCB_RTN_INDEX_MGR * pRepAsIndexMgr; // prototypes
QuintupleDict * pQuintupleDictionary; // routines
QuadrupleDict * pQuadrupleDictionary; // routines
// List of international character types
CsTypeList CsTypes; CsTagRoutineList CsTagRoutines;
//
// Dictionary kept for unknown represent as types to do padding
// and sizing macros.
//
RepAsPadExprDict * pRepAsPadExprDictionary; RepAsSizeDict * pRepAsSizeDictionary;
// Keep the current prefix to generate the proper code for
// embedded stuff.
char * pPrefix;
//
// These keeps track of the total memory and buffer size of all currently
// imbeding structures. For NDR format string generation, a struct or
// array node will check this field when generating it's pointer layout
// field so it knows how much to add to its offset fields.
//
long ImbedingMemSize; long ImbedingBufSize;
CG_QUALIFIED_POINTER * pCurrentSizePointer;
long InterpreterOutSize;
// members used for TypeInfo generation
ICreateTypeLib * pCreateTypeLib; ICreateTypeInfo * pCreateTypeInfo; char * szDllName; BOOL fInDispinterface; unsigned long lcid;
// notify and notify_flag procs.
NotifyRoutineList NotifyProcList;
GenNdr64Format * pNdr64Format;
public:
//
// The constructors.
//
CCB( PNAME pGBRtnName, PNAME pSRRtnName, PNAME pFBRtnName, OPTIM_OPTION OptimOption, BOOL fManagerEpvFlag, BOOL fNoDefaultEpv, BOOL fOldNames, unsigned long Mode, BOOL fRpcSSSwitchSetInCompiler, BOOL fMustCheckAllocError, BOOL fMustCheckRefPtrs, BOOL fMustCheckEnumValues, BOOL fMustCheckBoundValues, BOOL fCheckStubData );
unsigned long SetLcid(unsigned long l) { return (lcid = l); }
unsigned long GetLcid(void) { return lcid; }
void SetInterpretedRoutinesUseGenHandle() { fInterpretedRoutinesUseGenHandle = 1; }
BOOL GetInterpretedRoutinesUseGenHandle() { return (BOOL)(fInterpretedRoutinesUseGenHandle == 1); }
BOOL GetExprEvalExternEmitted() { return (BOOL)(fExprEvalExternEmitted == 1); }
void SetExprEvalExternEmitted() { fExprEvalExternEmitted = 1; }
BOOL GetQuintupleExternEmitted() { return (BOOL)(fQuintupleExternEmitted == 1); }
CsTypeList & GetCsTypeList() { return CsTypes; }
CsTagRoutineList & GetCsTagRoutineList() { return CsTagRoutines; }
void SetQuintupleExternEmitted() { fQuintupleExternEmitted = 1; }
BOOL GetQuadrupleExternEmitted() { return (BOOL)(fQuadrupleExternEmitted == 1); }
void SetQuadrupleExternEmitted() { fQuadrupleExternEmitted = 1; }
BOOL GetRundownExternEmitted() { return (BOOL)(fRundownExternEmitted == 1); }
void SetRundownExternEmitted() { fRundownExternEmitted = 1; }
BOOL GetGenericHExternEmitted() { return (BOOL)(fGenericHExternEmitted == 1); }
void SetGenericHExternEmitted() { fGenericHExternEmitted = 1; }
// REVIEW: Straigten out the dependencies between ccb.hxx and filecls.cxx
// to make these inline
BOOL GetMallocAndFreeStructExternEmitted(); /*
{ return pFile->GetMallocAndFreeStructExternEmitted(); } */
void SetMallocAndFreeStructExternEmitted(); /*
{ pFile->SetMallocAndFreeStructExternEmitted(); } */
void ClearOptionalExternFlags() { fExprEvalExternEmitted = 0; fQuintupleExternEmitted = 0; fQuadrupleExternEmitted = 0; fRundownExternEmitted = 0; fGenericHExternEmitted = 0; fTypePicklingInfoEmitted = 0; }
BOOL GetSkipFormatStreamGeneration() { return (BOOL)(fSkipFormatStreamGeneration == 1); }
void SetSkipFormatStreamGeneration( BOOL Has ) { fSkipFormatStreamGeneration = Has ? 1 : 0; }
void SetMustCheckAllocationError( BOOL f ) { fMustCheckAllocationError = f; }
BOOL MustCheckAllocationError() { return (BOOL)(fMustCheckAllocationError == 1); }
void SetMustCheckRef( BOOL f ) { fMustCheckRef = f; }
BOOL MustCheckRef() { return (BOOL)(fMustCheckRef == 1); }
void SetMustCheckEnum( BOOL f ) { fMustCheckEnum = f; }
BOOL MustCheckEnum() { return (BOOL)(fMustCheckEnum == 1); }
void SetMustCheckBounds( BOOL f ) { fMustCheckBounds = f; }
BOOL MustCheckBounds() { return (BOOL)(fMustCheckBounds == 1); }
SDESC * SetSStubDescriptor( PNAME AllocRtnName, PNAME FreeRtnName, PNAME RundownRtnName ) { return SSDescMgr.Register( AllocRtnName, FreeRtnName, RundownRtnName ); }
SDESC * SetCStubDescriptor( PNAME AllocRtnName, PNAME FreeRtnName, PNAME RundownRtnName ) { return CSDescMgr.Register( AllocRtnName, FreeRtnName, RundownRtnName ); } //
// Get and set of members.
//
void SetMustCheckStubData( BOOL f ) { fMustCheckStubData = f; }
BOOL IsMustCheckStubDataSpecified() { return (BOOL) fMustCheckStubData; }
void SetRpcSSSwitchSet( BOOL f) { fRpcSSSwitchSet = f; }
BOOL IsRpcSSSwitchSet() { return fRpcSSSwitchSet; }
void SetMode( unsigned long M ) { Mode = M; }
unsigned long GetMode() { return Mode; }
bool InOSFMode() { return OSF_MODE == GetMode(); }
void SetOldNames( unsigned long Flag ) { fOldNames = Flag; }
BOOL IsOldNames() { return (BOOL)( fOldNames == 1 ); }
BOOL IsMEpV() { return (BOOL)( fMEpV == 1 ); }
BOOL IsNoDefaultEpv() { return (BOOL)( fNoDefaultEpv == 1 ); }
char * SetPrefix( char * pP ) { return (pPrefix = pP); } char * GetPrefix() { return pPrefix; } unsigned long SetReturnContext() { return (fReturnContext = 1); } unsigned long ResetReturnContext() { return (fReturnContext = 0); }
BOOL IsReturnContext() { return (fReturnContext == 1); }
void SetCurrentSizePointer( CG_QUALIFIED_POINTER * pPtr ) { pCurrentSizePointer = pPtr; }
CG_QUALIFIED_POINTER * GetCurrentSizePointer() { return pCurrentSizePointer; }
void SetMemoryAllocDone() { fMemoryAllocDone = 1; }
void ResetMemoryAllocDone() { fMemoryAllocDone = 0; }
void SetRefAllocDone() { fRefAllocDone = 1; }
void ResetRefAllocDone() { fRefAllocDone = 0; } BOOL IsMemoryAllocDone() { return (BOOL)(fMemoryAllocDone == 1); }
BOOL IsRefAllocDone() { return (fRefAllocDone == 1); }
unsigned long SetHasAtLeastOneDeferredPointee() { return (fAtLeastOneDeferredPointee = 1); }
unsigned long ResetHasAtLeastOneDeferredPointee() { return (fAtLeastOneDeferredPointee = 0); }
BOOL HasAtLeastOneDeferredPointee() { return (fAtLeastOneDeferredPointee == 1); }
unsigned long SetDeferPointee() { return (fDeferPointee = 1); }
unsigned long ResetDeferPointee() { return (fDeferPointee = 0); }
BOOL IsPointeeDeferred() { return (fDeferPointee == 1); }
void ClearInCallback() { fInCallback = 0; }
void SetInCallback() { fInCallback = 1; }
BOOL IsInCallback() { return (fInCallback == 1); }
node_skl * SetImplicitHandleIDNode( node_skl * pID ) { return (pImplicitHandleIDNode = pID); }
node_skl * GetImplicitHandleIDNode() { return pImplicitHandleIDNode; }
BOOL IsInObjectInterface() { return fInObjectInterface; }
void SetInObjectInterface( BOOL fInObj ) { fInObjectInterface = fInObj; }
short ResetEmbeddingLevel() { return (EmbeddingLevel = 0); }
// bumps up embedding level, but returns the old one.
short PushEmbeddingLevel() { return EmbeddingLevel++; }
// pops embedding level but returns the current one.
short PopEmbeddingLevel() { if( EmbeddingLevel > 0 ) return EmbeddingLevel--; else return EmbeddingLevel; }
short GetCurrentEmbeddingLevel() { return EmbeddingLevel; }
short SetCurrentEmbeddingLevel( short E) { return (EmbeddingLevel = E); }
short ResetIndirectionLevel() { return (IndirectionLevel = 0); }
// This pushes the indirection level, but returns the current one.
short PushIndirectionLevel() { return IndirectionLevel++; }
// This pops the indirection Level but returns the current one.
short PopIndirectionLevel() { if( IndirectionLevel > 0 ) return IndirectionLevel--; else return IndirectionLevel; }
short GetCurrentIndirectionLevel() { return IndirectionLevel; }
ISTREAM * GetStream() { return pStream; }
ISTREAM * SetStream( ISTREAM * S, CG_FILE *file ) { pFile = file; return (pStream = S); }
void SetVersion( unsigned short Major, unsigned short Minor ) { MajorVersion = Major; MinorVersion = Minor; }
void GetVersion( unsigned short * pMaj, unsigned short * pMin ) { if( pMaj ) *pMaj = MajorVersion; if( pMin ) *pMin = MinorVersion; }
CG_INTERFACE * SetInterfaceCG( CG_INTERFACE *pCG ) { return (pInterfaceCG = pCG); }
CG_INTERFACE * GetInterfaceCG() { return pInterfaceCG; }
CG_FILE * SetFileCG( CG_FILE *pCG ) { return (pFileCG = pCG); }
CG_FILE * GetFileCG() { return pFileCG; }
CG_IUNKNOWN_OBJECT_INTERFACE * SetIUnknownCG( CG_IUNKNOWN_OBJECT_INTERFACE *pCG ) { return (pIUnknownCG = pCG); }
CG_IUNKNOWN_OBJECT_INTERFACE * GetIUnknownCG() { return pIUnknownCG; }
CG_OBJECT_INTERFACE * SetIClassfCG( CG_OBJECT_INTERFACE *pCG ) { return (pIClassfCG = pCG); }
CG_OBJECT_INTERFACE * GetIClassfCG() { return pIClassfCG; }
PNAME SetInterfaceName( PNAME pIN ) { return (pInterfaceName = pIN); }
PNAME GetInterfaceName() { return pInterfaceName; }
OPTIM_OPTION SetOptimOption( OPTIM_OPTION OpO ) { return (OptimOption = OpO); }
OPTIM_OPTION GetOptimOption() { return OptimOption; }
PROCNUM SetProcNum( unsigned short n ) { return (CurrentProcNum = n); }
PROCNUM GetProcNum() { return CurrentProcNum; }
PROCNUM SetVarNum( unsigned short n ) { return (CurrentVarNum = n); }
PROCNUM GetVarNum() { return CurrentVarNum; }
RPC_FLAGS SetRpcFlags( RPC_FLAGS F ) { return (RpcFlags = F); }
RPC_FLAGS GetRpcFlags() { return RpcFlags; }
void SetAllocFreeRtnNamePair( PNAME pAllocN, PNAME pFreeN ) { pAllocRtnName = pAllocN; pFreeRtnName = pFreeN; }
PNAME GetAllocRtnName() { return pAllocRtnName; }
PNAME GetFreeRtnName() { return pFreeRtnName; }
long LookupRundownRoutine( char * pName ) { long RetCode; if ( ! strcmp(pName,"") ) RetCode = INVALID_RUNDOWN_ROUTINE_INDEX; else RetCode = pContextIndexMgr->Lookup( pName );
return RetCode; }
BOOL HasRundownRoutines() { return ! pContextIndexMgr->IsEmpty(); }
BOOL HasExprEvalRoutines() { return ! pExprEvalIndexMgr->IsEmpty(); }
BOOL HasExprFormatString() { return ( NULL != pExprFrmtStrIndexMgr ); }
BOOL HasQuintupleRoutines() { return GetQuintupleDictionary()->GetCount() != 0; }
BOOL HasQuadrupleRoutines() { return GetQuadrupleDictionary()->GetCount() != 0; }
BOOL HasCsTypes() { return CsTypes.NonNull(); }
void OutputRundownRoutineTable();
void OutputExprEvalRoutineTable(); void OutputOldExprEvalRoutine(EXPR_EVAL_CONTEXT *pExprEvalContext);
void OutputRegisteredExprEvalRoutines();
void OutputQuintupleTable(); void OutputTransmitAsQuintuple( void * pQContext ); void OutputRepAsQuintuple( void * pQContext ); void OutputQuintupleRoutines();
void OutputQuadrupleTable(); void OutputCsRoutineTables();
void OutputSimpleRoutineTable( CCB_RTN_INDEX_MGR * pIndexMgr, char * TypeName, char * VarName );
void OutputExpressionFormatString();
void OutputExternsToMultipleInterfaceTables(); void OutputMultipleInterfaceTables();
CCB_RTN_INDEX_MGR * GetGenericIndexMgr() { return pGenericIndexMgr; }
CCB_RTN_INDEX_MGR * GetExprEvalIndexMgr() { return pExprEvalIndexMgr; }
CCB_EXPR_INDEX_MGR * GetExprFrmtStrIndexMgr() { if (pExprFrmtStrIndexMgr == NULL ) { pExprFrmtStrIndexMgr = new CCB_EXPR_INDEX_MGR(); }
return pExprFrmtStrIndexMgr; }
CCB_RTN_INDEX_MGR * GetTransmitAsIndexMgr() { return pTransmitAsIndexMgr; } CCB_RTN_INDEX_MGR * GetRepAsIndexMgr() { return pRepAsIndexMgr; }
long LookupBindingRoutine( char * pName ) { return pGenericIndexMgr->Lookup( pName ); }
void OutputBindingRoutines();
void OutputMallocAndFreeStruct();
BOOL HasBindingRoutines( CG_HANDLE * pImplicitHandle );
RESOURCE_DICT_DATABASE * SetResDictDatabase( RESOURCE_DICT_DATABASE * p ) { return ( pResDictDatabase = p ); }
RESOURCE_DICT_DATABASE * GetResDictDatabase() { return pResDictDatabase; }
void GetListOfLocalResources( ITERATOR& Iter ) { GetResDictDatabase()-> GetLocalResourceDict()-> GetListOfResources( Iter ); }
void GetListOfParamResources( ITERATOR& Iter ) { GetResDictDatabase()-> GetParamResourceDict()-> GetListOfResources( Iter ); }
void GetListOfTransientResources( ITERATOR& Iter ) { GetResDictDatabase()-> GetTransientResourceDict()-> GetListOfResources( Iter ); }
RESOURCE * GetParamResource( PNAME p ) { return GetResDictDatabase()-> GetParamResourceDict()->Search( p ); }
RESOURCE * GetLocalResource( PNAME p ) { return GetResDictDatabase()-> GetLocalResourceDict()->Search( p ); }
RESOURCE * GetTransientResource( PNAME pResName ) { return pResDictDatabase-> GetTransientResourceDict()->Search( pResName ); }
RESOURCE * GetGlobalResource( PNAME p ) { return GetResDictDatabase()-> GetLocalResourceDict()->Search( p ); }
RESOURCE * AddParamResource( PNAME p, node_skl *pT ) { return DoAddResource( GetResDictDatabase()-> GetParamResourceDict(), p, pT ); }
RESOURCE * AddTransientResource( PNAME p, node_skl *pT ) { return DoAddResource( GetResDictDatabase()-> GetTransientResourceDict(), p, pT ); }
void ClearTransientResourceDict() { pResDictDatabase-> GetTransientResourceDict()->Clear(); }
void ClearParamResourceDict() { pResDictDatabase-> GetParamResourceDict()->Clear(); }
RESOURCE * DoAddResource( RESOURCE_DICT * pResDict, PNAME pName, node_skl * pType ); //
// Get one of the standard resources.
//
RESOURCE * GetStandardResource( STANDARD_RES_ID ResID );
//
// This routine sets the names of the stub runtime interface routines.
// This routine can take any parameter which is 0, and will not overwrite
// the runtime routine name for that functionality, allowing the caller to
// selectively change the runtime routine for a functionality easily.
//
void SetRuntimeRtnNames( PNAME pGBRtnName, PNAME pSRRtnName, PNAME pFBRtnName ) { if( pGBRtnName ) pGetBufferRtnName = pGBRtnName; if( pSRRtnName ) pSendReceiveRtnName = pSRRtnName; if( pFBRtnName ) pFreeBufferRtnName = pFBRtnName; }
PNAME GetGetBufferRtnName() { return pGetBufferRtnName; }
PNAME GetSendReceiveRtnName() { return pSendReceiveRtnName; }
PNAME GetFreeBufferRtnName() { return pFreeBufferRtnName; }
expr_node * SetSourceExpression( expr_node * pSrcExpr ) { return (ExprInfo.SetSrcExpression( pSrcExpr ) ); }
expr_node * GetSourceExpression() { return ExprInfo.GetSrcExpression(); }
expr_node * SetDestExpression( expr_node * pDestExpr ) { return (ExprInfo.SetDestExpression( pDestExpr ) ); }
expr_node * GetDestExpression() { return ExprInfo.GetDestExpression(); }
node_skl * RegisterGenericHandleType( node_skl * pType ) { return pGenericHandleRegistry->Register( pType ); }
node_skl * RegisterContextHandleType( node_skl * pType ) { return pContextHandleRegistry->Register( pType ); }
node_skl * RegisterRepAsWireType( node_skl * pType ) { return pRepAsWireTypeRegistry->Register( pType ); } node_skl * RegisterPresentedType( node_skl * pType ) { return pPresentedTypeRegistry->Register( pType ); } node_skl * RegisterExprEvalRoutine( node_skl * pType ) { return pExprEvalRoutineRegistry->Register( pType ); }
node_skl * RegisterQuintuple( void * pContext ) { return pQuintupleRegistry->Register( (node_skl *)pContext ); }
QuintupleDict * GetQuintupleDictionary() { return pQuintupleDictionary; }
QuadrupleDict * GetQuadrupleDictionary() { return pQuadrupleDictionary; }
RepAsPadExprDict * GetRepAsPadExprDict() { return pRepAsPadExprDictionary; }
RepAsSizeDict * GetRepAsSizeDict() { return pRepAsSizeDictionary; }
node_skl * RegisterSizingRoutineForType( node_skl * pType ) { return pSizingRoutineRegistry->Register( pType ); } node_skl * RegisterMarshallRoutineForType( node_skl * pType ) { return pMarshallRoutineRegistry->Register( pType ); } node_skl * RegisterUnMarshallRoutineForType( node_skl * pType ) { return pUnMarshallRoutineRegistry->Register( pType ); } node_skl * RegisterMemorySizingRoutineForType( node_skl * pType ) { return pMemorySizingRoutineRegistry->Register( pType ); } node_skl * RegisterFreeRoutineForType( node_skl * pType ) { return pFreeRoutineRegistry->Register( pType ); }
node_skl * RegisterTypeAlignSize( TYPE_ENCODE_INFO * pTEInfo ) { // cheat by casting.
return pTypeAlignSizeRegistry->Register( (node_skl *) pTEInfo ); }
node_skl * RegisterTypeEncode( TYPE_ENCODE_INFO * pTEInfo ) { // cheat by casting.
return pTypeEncodeRegistry->Register( (node_skl *) pTEInfo ); }
node_skl * RegisterTypeDecode( TYPE_ENCODE_INFO * pTEInfo ) { return pTypeDecodeRegistry->Register( (node_skl *) pTEInfo ); }
node_skl * RegisterTypeFree( TYPE_ENCODE_INFO * pTEInfo ) { return pTypeFreeRegistry->Register( (node_skl *) pTEInfo ); }
ulong RegisterPickledType( CG_TYPE_ENCODE *type ) { return pPickledTypeList->Insert( type ); }
node_skl * RegisterEncodeDecodeProc( CG_ENCODE_PROC * pProc ) { return pProcEncodeDecodeRegistry->Register( (node_skl *)pProc ); } node_skl * RegisterCallAsRoutine( node_proc * pProc ) { return pCallAsRoutineRegistry->Register( pProc ); }
TREGISTRY * GetRecPointerFixupRegistry() { return pRecPointerFixupRegistry; }
short GetListOfRecPointerFixups( ITERATOR& I ) { return pRecPointerFixupRegistry->GetListOfTypes( I ); }
void RegisterRecPointerForFixup( CG_NDR * pNdr, long AbsoluteOffset );
void FixupRecPointers(); unsigned short RegisterNotify( CG_PROC * pNotifyProc ) { return (unsigned short) ITERATOR_INSERT( NotifyProcList, pNotifyProc ); }
BOOL GetListOfNotifyTableEntries( ITERATOR& I ) { I.Discard(); I.Clone(&NotifyProcList); return I.NonNull(); }
short GetListOfGenHdlTypes( ITERATOR& I ) { return pGenericHandleRegistry->GetListOfTypes( I ); } short GetListOfCtxtHdlTypes( ITERATOR& I ) { return pContextHandleRegistry->GetListOfTypes( I ); }
short GetListOfRepAsWireTypes( ITERATOR& I ) { return pRepAsWireTypeRegistry->GetListOfTypes( I ); }
short GetListOfPresentedTypes( ITERATOR& I ) { return pPresentedTypeRegistry->GetListOfTypes( I ); } short GetListOfExprEvalRoutines( ITERATOR& I ) { return pExprEvalRoutineRegistry->GetListOfTypes( I ); }
short GetListOfQuintuples( ITERATOR& I ) { return pQuintupleRegistry->GetListOfTypes( I ); }
short GetListOfSizingRoutineTypes( ITERATOR& I ) { return pSizingRoutineRegistry->GetListOfTypes( I ); }
short GetListOfMarshallingRoutineTypes( ITERATOR& I ) { return pMarshallRoutineRegistry->GetListOfTypes( I ); }
short GetListOfUnMarshallingRoutineTypes( ITERATOR& I ) { return pUnMarshallRoutineRegistry->GetListOfTypes( I ); }
short GetListOfMemorySizingRoutineTypes( ITERATOR& I ) { return pMemorySizingRoutineRegistry->GetListOfTypes( I ); }
short GetListOfFreeRoutineTypes( ITERATOR& I ) { return pFreeRoutineRegistry->GetListOfTypes( I ); }
short GetListOfTypeAlignSizeTypes( ITERATOR& I ) { return pTypeAlignSizeRegistry->GetListOfTypes( I ); }
short GetListOfTypeEncodeTypes( ITERATOR& I ) { return pTypeEncodeRegistry->GetListOfTypes( I ); }
short GetListOfTypeDecodeTypes( ITERATOR& I ) { return pTypeDecodeRegistry->GetListOfTypes( I ); }
short GetListOfTypeFreeTypes( ITERATOR& I ) { return pTypeFreeRegistry->GetListOfTypes( I ); }
IndexedList & GetListOfPickledTypes() { return *pPickledTypeList; }
short GetListOfEncodeDecodeProcs( ITERATOR& I ) { return pProcEncodeDecodeRegistry->GetListOfTypes(I); }
short GetListOfCallAsRoutines( ITERATOR& I ) { return pCallAsRoutineRegistry->GetListOfTypes( I ); }
//
// miscellaneous methods.
//
void InitForNewProc( PROCNUM PNum, RPC_FLAGS Flags, PNAME pAllocN, PNAME pFreeN, RESOURCE_DICT_DATABASE * pRDDB ) { SetProcNum( ( unsigned short ) PNum ); SetRpcFlags( Flags ); SetAllocFreeRtnNamePair( pAllocN, pFreeN ); SetResDictDatabase( pRDDB ); }
//
// This method generates a mangled name out of the interface and
// version number. The user provided string is appended to the
// mangled part. The memory area is allocated by this routine using
// new, but freed by the caller.
//
char * GenMangledName();
//
// set stub descriptor resource.
//
RESOURCE * SetStubDescResource();
RESOURCE * GetStubDescResource() { return pStubDescResource; }
//
// Set and get the format string.
//
void SetFormatString( FORMAT_STRING * pFS ) { pFormatString = pFS; }
FORMAT_STRING * GetFormatString() { return pFormatString; }
void SetProcFormatString( FORMAT_STRING * pFS ) { pProcFormatString = pFS; }
FORMAT_STRING * GetProcFormatString() { return pProcFormatString; }
void SetExprFormatString( FORMAT_STRING * pFS ) { pExprFormatString = pFS; }
FORMAT_STRING * GetExprFormatString() { return pExprFormatString; }
//
// Set and get the code generation phase.
//
void SetCodeGenPhase( CGPHASE phase ) { CodeGenPhase = phase; }
CGPHASE GetCodeGenPhase() { return CodeGenPhase; }
//
// Set and get the code generation side.
//
void SetCodeGenSide( CGSIDE side ) { CodeGenSide = side; }
CGSIDE GetCodeGenSide() { return CodeGenSide; }
//
// Set and Get current code generation node context.
//
CG_NDR * SetCGNodeContext( CG_NDR * pNewCGNodeContext ) { CG_NDR * pOldCGNodeContext;
pOldCGNodeContext = pCGNodeContext; pCGNodeContext = pNewCGNodeContext;
return pOldCGNodeContext; }
CG_NDR * GetCGNodeContext() { return pCGNodeContext; }
//
// Region stuff
//
CG_FIELD * GetCurrentRegionField() { return pCurrentRegionField; } CG_FIELD * StartRegion() { CG_FIELD *pOldRegionField = pCurrentRegionField; pCurrentRegionField = (CG_FIELD*) GetLastPlaceholderClass(); return pOldRegionField; } void EndRegion( CG_FIELD *pOldRegionField ) { pCurrentRegionField = pOldRegionField; } //
// Set and Get current placeholder class.
//
CG_NDR * SetLastPlaceholderClass( CG_NDR * pNew ) { CG_NDR * pOld;
pOld = pPlaceholderClass; pPlaceholderClass = pNew;
return pOld; }
CG_NDR * GetLastPlaceholderClass() { return pPlaceholderClass; }
void SetCurrentParam( CG_PARAM * pCurrent ) { pCurrentParam = pCurrent; }
CG_PARAM * GetCurrentParam() { return pCurrentParam; }
RESOURCE * SetPtrToPtrInBuffer( RESOURCE * p) { return (PtrToPtrInBuffer = p); } RESOURCE * GetPtrToPtrInBuffer() { return PtrToPtrInBuffer; }
void SetImbedingMemSize( long Size ) { ImbedingMemSize = Size; }
long GetImbedingMemSize() { return ImbedingMemSize; }
void SetImbedingBufSize( long Size ) { ImbedingBufSize = Size; }
long GetImbedingBufSize() { return ImbedingBufSize; }
void SetInterpreterOutSize( long Size ) { InterpreterOutSize = Size; }
long GetInterpreterOutSize() { return InterpreterOutSize; }
PNAME GenTRNameOffLastParam( char * Prefix );
// methods for generating typeinfo
void SetCreateTypeLib(ICreateTypeLib * p) { pCreateTypeLib = p; }
void SetCreateTypeInfo(ICreateTypeInfo * p) { pCreateTypeInfo = p; }
ICreateTypeLib * GetCreateTypeLib() { return pCreateTypeLib; }
ICreateTypeInfo * GetCreateTypeInfo() { return pCreateTypeInfo; }
void SetDllName(char * sz) { szDllName = sz; }
char * GetDllName() { return szDllName; }
void SetInDispinterface(BOOL f) { fInDispinterface = f; }
BOOL IsInDispinterface() { return fInDispinterface; } BOOL SaveVTableLayOutInfo( CG_CLASS* pIf, ICreateTypeInfo* pInfo ) { BOOL fRet = FALSE; VTableLayOutInfo* pNew = new VTableLayOutInfo(pIf, pInfo); if (pNew) { fRet = (VTableLayOutList.Insert(pNew) == STATUS_OK); if (!fRet) { delete pNew; } } return fRet; } BOOL GetNextVTableLayOutInfo ( CG_CLASS** ppIf, ICreateTypeInfo** ppInfo ) { VTableLayOutInfo* pTmp = 0; if (VTableLayOutList.GetNext((void**)&pTmp) == STATUS_OK) { *ppIf = pTmp->pLayOutNode; *ppInfo = pTmp->pTypeInfo; delete pTmp; return TRUE; } return FALSE; } void InitVTableLayOutList() { VTableLayOutList.Init(); } void DiscardVTableLayOutList() { VTableLayOutList.Discard(); }
void SetTypePicklingInfoEmitted() { fTypePicklingInfoEmitted = 1; }
BOOL HasTypePicklingInfoBeenEmitted() { return (BOOL) fTypePicklingInfoEmitted; }
GenNdr64Format * GetNdr64Format() { return pNdr64Format; } void SetNdr64Format( GenNdr64Format * pNewFormat ) { pNdr64Format = pNewFormat; } };
#endif // __CCB_HXX__
|