mirror of https://github.com/tongzx/nt5src
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.
1043 lines
26 KiB
1043 lines
26 KiB
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
Copyright (c) 1989-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
misccls.hxx
|
|
|
|
Abstract:
|
|
|
|
cg classes for miscellaneous nodes.
|
|
|
|
Notes:
|
|
|
|
|
|
History:
|
|
|
|
----------------------------------------------------------------------------*/
|
|
#ifndef __MISCCLS_HXX__
|
|
#define __MISCCLS_HXX__
|
|
|
|
#include "ndrcls.hxx"
|
|
#include "auxcls.hxx"
|
|
#include "bindcls.hxx"
|
|
|
|
|
|
class node_file;
|
|
class node_interface;
|
|
class node_source;
|
|
|
|
class CG_INTERFACE : public CG_NDR
|
|
{
|
|
private:
|
|
|
|
//
|
|
// CG nodes for the implicit handle, if any...
|
|
//
|
|
|
|
CG_HANDLE * pImpHdlCG;
|
|
|
|
//
|
|
// Store the Protseq endpoint count. This count is 0 if the
|
|
// endpoint attribute was not specified.
|
|
//
|
|
|
|
short ProtSeqEPCount;
|
|
|
|
//
|
|
// flags.
|
|
//
|
|
|
|
BOOL fMopsPresent : 1;
|
|
BOOL fCallbacksPresent : 1;
|
|
BOOL fAllRpcSS : 1;
|
|
BOOL fUsesRpcSS : 1;
|
|
BOOL fHasPipes : 1;
|
|
BOOL fTypeInfoInitialized: 1;
|
|
BOOL fHasMSConfStructAttr: 1;
|
|
|
|
NdrVersionControl VersionControl; // compiler evaluation
|
|
//
|
|
// This set of fields gathers info about dispatch tables. There is a
|
|
// normal dispatch table and a callback dispatch table. We keep separate
|
|
// dictionaries for these dispatch tables.
|
|
//
|
|
|
|
DISPATCH_TABLE * pNormalDispatchTable;
|
|
|
|
DISPATCH_TABLE * pCallbackDispatchTable;
|
|
|
|
DISPATCH_TABLE ** ppDispatchTable;
|
|
|
|
DISPATCH_TABLE ** ppDispatchTableSaved;
|
|
|
|
void * _pCTI;
|
|
|
|
protected:
|
|
char* pStubDescName; // Interface's stub descriptor name.
|
|
char* pSyntaxInfoName; // name for MIDL_SYNTAX_INFO of this interface
|
|
char* pProxyInfoName; // name for MIDL_STUBLESS_PROXY_INFO
|
|
GUID_STRS GuidStrs; // Store the 5 are components of the guid.
|
|
char* pIntfName; // handy place to cache the interface name
|
|
BOOL fVisited; // used when enumerating all base classes
|
|
BOOL fLocal : 1; // whether intf is local
|
|
CG_INTERFACE* pCGBase;
|
|
|
|
public:
|
|
|
|
//
|
|
// The constructor.
|
|
//
|
|
CG_INTERFACE(
|
|
node_interface * pI,
|
|
GUID_STRS GStrs,
|
|
BOOL CallbacksYes,
|
|
BOOL fMopsYes,
|
|
CG_HANDLE * pIH,
|
|
CG_INTERFACE* pIFBase
|
|
);
|
|
|
|
//
|
|
// code generation methods.
|
|
//
|
|
|
|
CG_INTERFACE * SetBaseInterfaceCG( CG_INTERFACE * pCG )
|
|
{
|
|
return ( pCGBase = pCG );
|
|
}
|
|
|
|
CG_INTERFACE * GetBaseInterfaceCG()
|
|
{
|
|
return pCGBase;
|
|
}
|
|
|
|
unsigned long LayOut();
|
|
|
|
virtual
|
|
ID_CG GetCGID()
|
|
{
|
|
return ID_CG_INTERFACE;
|
|
}
|
|
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
// interfaces in the current file that are [local] are delegated
|
|
virtual
|
|
BOOL IsDelegated()
|
|
{
|
|
return fLocal;
|
|
}
|
|
|
|
virtual
|
|
BOOL IsObject()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
virtual
|
|
BOOL IsIUnknown()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL IsDispatchable(BOOL fInTypeLib)
|
|
{
|
|
CG_CLASS * pCG;
|
|
named_node * pBaseIntf;
|
|
|
|
if (0 == _stricmp("IDispatch", pIntfName ) )
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
if (0 == _stricmp("IUnknown", pIntfName ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
node_skl * pType = GetType();
|
|
if (pBaseIntf = ((node_interface *)(pType))->GetMyBaseInterfaceReference())
|
|
{
|
|
node_interface_reference * pRef = (node_interface_reference *)pBaseIntf;
|
|
// skip forward reference if necessary
|
|
if (pRef->NodeKind() == NODE_FORWARD)
|
|
{
|
|
pRef = (node_interface_reference *)pRef->GetChild();
|
|
}
|
|
pCG = ((node_interface *)(pRef->GetChild()))->GetCG( fInTypeLib );
|
|
|
|
return ((CG_INTERFACE *)pCG)->IsDispatchable(fInTypeLib);
|
|
}
|
|
else
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
char * GetInterfaceName()
|
|
{
|
|
return pIntfName;
|
|
}
|
|
|
|
virtual
|
|
CG_STATUS GenClientInfo( CCB * pCCB );
|
|
|
|
virtual
|
|
CG_STATUS OutputClientStub( CCB * pCCB );
|
|
|
|
virtual
|
|
CG_STATUS GenServerInfo( CCB * pCCB );
|
|
|
|
virtual
|
|
CG_STATUS OutputServerStub( CCB * pCCB );
|
|
|
|
void OutputComplexReturnThunks( CCB * pCCB );
|
|
virtual
|
|
CG_STATUS GenHeader( CCB * pCCB );
|
|
|
|
virtual
|
|
CG_STATUS GenProxyInfo( CCB *pCCB,
|
|
BOOL IsForCallback );
|
|
|
|
virtual
|
|
CG_STATUS GenSyntaxInfo( CCB *pCCB,
|
|
BOOL IsForCallback);
|
|
|
|
virtual
|
|
void Out_InterpreterServerInfo( CCB * pCCB,
|
|
CGSIDE Side );
|
|
virtual
|
|
void Out_ServerInfo(CCB *pCCB,
|
|
BOOL fHasThunk,
|
|
BOOL IsForCallback );
|
|
|
|
virtual
|
|
void Out_ProxyInfo( CCB * pCCB,
|
|
BOOL IsForCallback );
|
|
|
|
//
|
|
// Generate typeinfo
|
|
//
|
|
virtual
|
|
CG_STATUS GenTypeInfo( CCB * pCCB);
|
|
|
|
//
|
|
// only create a typeinfo
|
|
//
|
|
virtual
|
|
CG_STATUS CreateTypeInfo( CCB * pCCB);
|
|
|
|
//
|
|
// Get And set methods.
|
|
//
|
|
|
|
CG_HANDLE * GetImplicitHandle()
|
|
{
|
|
return pImpHdlCG;
|
|
}
|
|
|
|
char * GetStubDescName()
|
|
{
|
|
return pStubDescName;
|
|
}
|
|
|
|
char * GetProxyInfoName()
|
|
{
|
|
return pProxyInfoName;
|
|
}
|
|
|
|
char * GetMulSyntaxInfoName()
|
|
{
|
|
return pSyntaxInfoName;
|
|
}
|
|
|
|
BOOL SetAllRpcSS( BOOL f )
|
|
{
|
|
return (fAllRpcSS = f);
|
|
}
|
|
|
|
BOOL IsAllRpcSS()
|
|
{
|
|
return fAllRpcSS;
|
|
}
|
|
|
|
void SetUsesRpcSS( BOOL f )
|
|
{
|
|
fUsesRpcSS = f;
|
|
}
|
|
|
|
BOOL GetUsesRpcSS()
|
|
{
|
|
return fUsesRpcSS;
|
|
}
|
|
|
|
BOOL SetHasPipes( BOOL f )
|
|
{
|
|
return (fHasPipes = f);
|
|
}
|
|
|
|
BOOL HasPipes()
|
|
{
|
|
return fHasPipes;
|
|
}
|
|
|
|
NdrVersionControl & GetNdrVersionControl()
|
|
{
|
|
return( VersionControl );
|
|
}
|
|
virtual
|
|
void EvaluateVersionControl();
|
|
|
|
virtual
|
|
BOOL HasStublessProxies()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL HasItsOwnOi2();
|
|
|
|
virtual
|
|
BOOL HasOi2()
|
|
{
|
|
return VersionControl.HasOi2();
|
|
}
|
|
|
|
|
|
//
|
|
// Dispatch table management functions.
|
|
//
|
|
|
|
void CreateDispatchTables();
|
|
|
|
void SetDispatchTBLPtrForCallback()
|
|
{
|
|
ppDispatchTable = &pCallbackDispatchTable;
|
|
}
|
|
|
|
void RestoreDispatchTBLPtr()
|
|
{
|
|
ppDispatchTable = &pNormalDispatchTable;
|
|
}
|
|
|
|
void RegisterProcedure( node_skl * pProc,
|
|
DISPATCH_TABLE_FLAGS Flags )
|
|
{
|
|
(*ppDispatchTable)->RegisterProcedure(pProc, Flags);
|
|
}
|
|
|
|
unsigned short GetNormalProcedureCount()
|
|
{
|
|
return pNormalDispatchTable->GetCount();
|
|
}
|
|
|
|
unsigned short GetCallbackProcedureCount()
|
|
{
|
|
return pCallbackDispatchTable->GetCount();
|
|
}
|
|
|
|
unsigned short GetNormalProcedureList(
|
|
ITERATOR& NormalProcList,
|
|
DISPATCH_TABLE_FLAGS Flags
|
|
)
|
|
{
|
|
return pNormalDispatchTable->GetProcList(
|
|
NormalProcList,
|
|
Flags
|
|
);
|
|
}
|
|
|
|
unsigned short GetCallbackProcedureList(
|
|
ITERATOR& CallbackProcList,
|
|
DISPATCH_TABLE_FLAGS Flags )
|
|
{
|
|
return pCallbackDispatchTable->GetProcList(
|
|
CallbackProcList,
|
|
Flags
|
|
);
|
|
}
|
|
|
|
|
|
//
|
|
// miscellaneous methods.
|
|
//
|
|
|
|
ITERATOR * GetProtSeqEps();
|
|
|
|
char * GetCBDispatchTableName()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
char * GetMopIInfoName()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
BOOL HasInterpretedProc();
|
|
BOOL HasOnlyInterpretedProcs();
|
|
BOOL HasInterpretedCallbackProc();
|
|
BOOL HasClientInterpretedCommOrFaultProc(
|
|
CCB * pCCB );
|
|
|
|
BOOL IsLastInterface()
|
|
{
|
|
return ( NULL == GetSibling() );
|
|
}
|
|
|
|
CG_STATUS InitializeCCB( CCB * pCCB );
|
|
|
|
void Out_ProcOffsetTable( CCB *pCCB, BOOL IsForCallback = FALSE );
|
|
|
|
void OutputProcOffsets( CCB * pCCB, BOOL fLast, BOOL IsForCallback );
|
|
|
|
void OutputThunkTableEntries( CCB * pCCB, BOOL fLast );
|
|
|
|
virtual
|
|
node_skl * GetThisDeclarator()
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
void GetMyMemberFunctions( ITERATOR & I )
|
|
{
|
|
GetMembers( I );
|
|
}
|
|
|
|
void GetMyMemberFunctions( CG_ITERATOR & I )
|
|
{
|
|
GetMembers( I );
|
|
}
|
|
|
|
virtual
|
|
void GetAllMemberFunctions( ITERATOR & I )
|
|
{
|
|
GetMyMemberFunctions( I );
|
|
}
|
|
|
|
BOOL HasPicklingStuff()
|
|
{
|
|
CG_ITERATOR I;
|
|
CG_NDR * pCG;
|
|
|
|
if( GetMembers( I ) )
|
|
{
|
|
while( ITERATOR_GETNEXT( I, pCG ) )
|
|
{
|
|
if (pCG->GetCGID() == ID_CG_ENCODE_PROC ||
|
|
pCG->GetCGID() == ID_CG_TYPE_ENCODE_PROC
|
|
)
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL HasPicklingStuffOnly()
|
|
{
|
|
CG_ITERATOR I;
|
|
CG_NDR * pCG;
|
|
|
|
if( GetMembers( I ) )
|
|
{
|
|
while( ITERATOR_GETNEXT( I, pCG ) )
|
|
{
|
|
if (pCG->GetCGID() != ID_CG_ENCODE_PROC &&
|
|
pCG->GetCGID() != ID_CG_TYPE_ENCODE_PROC
|
|
)
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
virtual
|
|
void GetListOfUniqueBaseInterfaces( ITERATOR & )
|
|
{
|
|
}
|
|
|
|
void MarkVisited( BOOL fMark )
|
|
{
|
|
fVisited = fMark;
|
|
}
|
|
|
|
|
|
BOOL IsVisited()
|
|
{
|
|
return fVisited;
|
|
}
|
|
|
|
void GetGuidStrs( char * &p1,
|
|
char * &p2,
|
|
char * &p3,
|
|
char * &p4,
|
|
char * &p5 )
|
|
{
|
|
GuidStrs.GetStrs( p1, p2, p3, p4, p5 );
|
|
}
|
|
|
|
GUID_STRS & GetGuidStrs()
|
|
{
|
|
return GuidStrs;
|
|
}
|
|
|
|
void OutputInterfaceIdComment( CCB * pCCB );
|
|
|
|
void SetHasMSConfStructAttr() { fHasMSConfStructAttr = TRUE; }
|
|
BOOL GetHasMSConfStructAttr() { return fHasMSConfStructAttr; }
|
|
|
|
};
|
|
|
|
|
|
class CG_OBJECT_INTERFACE : public CG_INTERFACE
|
|
{
|
|
// a node_id declaration for the this pointer for this interface
|
|
node_skl * pThisDeclarator;
|
|
|
|
BOOL fForcedDelegation; // some weird cases
|
|
|
|
public:
|
|
|
|
//
|
|
// The constructor.
|
|
//
|
|
|
|
CG_OBJECT_INTERFACE(
|
|
node_interface * pI,
|
|
GUID_STRS GStrs,
|
|
BOOL fCallbacksYes,
|
|
BOOL fMopsYes,
|
|
CG_OBJECT_INTERFACE * pBCG
|
|
);
|
|
//
|
|
// code generation methods.
|
|
//
|
|
virtual
|
|
ID_CG GetCGID()
|
|
{
|
|
return ID_CG_OBJECT_INTERFACE;
|
|
}
|
|
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
|
|
virtual
|
|
BOOL IsObject()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
// interfaces in the current file that are [local] are delegated
|
|
virtual
|
|
BOOL IsDelegated()
|
|
{
|
|
return fLocal;
|
|
}
|
|
|
|
BOOL HasForcedDelegation()
|
|
{
|
|
return fForcedDelegation;
|
|
}
|
|
|
|
void SetHasForcedDelegation()
|
|
{
|
|
fForcedDelegation = 1;
|
|
}
|
|
|
|
CG_OBJECT_INTERFACE * GetDelegatedInterface()
|
|
{
|
|
CG_INTERFACE* pBaseIF = GetBaseInterfaceCG();
|
|
|
|
while ( pBaseIF != 0 )
|
|
{
|
|
if ( pBaseIF->IsDelegated() )
|
|
return (CG_OBJECT_INTERFACE*) pBaseIF;
|
|
pBaseIF = pBaseIF->GetBaseInterfaceCG();
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
BOOL IsLastObjectInterface();
|
|
BOOL HasOnlyInterpretedMethods();
|
|
|
|
BOOL IsLocal()
|
|
{
|
|
return fLocal;
|
|
}
|
|
|
|
BOOL HasItsOwnStublessProxies();
|
|
|
|
virtual
|
|
void EvaluateVersionControl();
|
|
|
|
virtual
|
|
BOOL HasStublessProxies()
|
|
{
|
|
return GetNdrVersionControl()
|
|
.HasStublessProxies();
|
|
}
|
|
|
|
virtual
|
|
CG_STATUS GenProxy( CCB * pCCB );
|
|
|
|
virtual
|
|
CG_STATUS OutputProxy( CCB * pCCB );
|
|
|
|
virtual
|
|
CG_STATUS GenHeader( CCB * pCCB );
|
|
|
|
//
|
|
// miscellaneous methods.
|
|
//
|
|
|
|
CG_STATUS CPlusPlusLanguageBinding(CCB *pCCB);
|
|
|
|
CG_STATUS CLanguageBinding(CCB *pCCB);
|
|
|
|
CG_STATUS ProxyPrototypes(CCB *pCCB);
|
|
|
|
CG_STATUS GenInterfaceProxy( CCB *pCCB, unsigned long index);
|
|
|
|
CG_STATUS GenInterfaceStub( CCB *pCCB, unsigned long index);
|
|
|
|
unsigned long CountMemberFunctions();
|
|
|
|
unsigned long PrintProxyMemberFunctions( ISTREAM * pStream,
|
|
BOOL fForcesDelegation );
|
|
|
|
unsigned long PrintStubMemberFunctions( ISTREAM * pStream );
|
|
|
|
STATUS_T PrintVtableEntries( CCB * pCCB );
|
|
|
|
STATUS_T PrintMemberFunctions( ISTREAM * pStream,
|
|
BOOL fAbstract = TRUE );
|
|
|
|
virtual
|
|
node_skl * GetThisDeclarator()
|
|
{
|
|
return pThisDeclarator;
|
|
}
|
|
|
|
virtual
|
|
void GetAllMemberFunctions( ITERATOR & I )
|
|
{
|
|
CG_OBJECT_INTERFACE* pBaseCG = (CG_OBJECT_INTERFACE*)GetBaseInterfaceCG();
|
|
if ( pBaseCG )
|
|
pBaseCG->GetAllMemberFunctions( I );
|
|
|
|
GetMyMemberFunctions( I );
|
|
}
|
|
|
|
CG_STATUS CLanguageMacros(CCB *pCCB);
|
|
|
|
CG_STATUS PrintCMacros(CCB *pCCB);
|
|
};
|
|
|
|
class CG_INHERITED_OBJECT_INTERFACE : public CG_OBJECT_INTERFACE
|
|
{
|
|
public:
|
|
|
|
//
|
|
// The constructor.
|
|
//
|
|
|
|
CG_INHERITED_OBJECT_INTERFACE(
|
|
node_interface * pI,
|
|
GUID_STRS GStrs,
|
|
BOOL fCallbacksYes,
|
|
BOOL fMopsYes,
|
|
CG_OBJECT_INTERFACE * pBCG
|
|
) : CG_OBJECT_INTERFACE(
|
|
pI,
|
|
GStrs,
|
|
fCallbacksYes,
|
|
fMopsYes,
|
|
pBCG )
|
|
{
|
|
};
|
|
|
|
//
|
|
// code generation methods.
|
|
//
|
|
virtual
|
|
ID_CG GetCGID()
|
|
{
|
|
return ID_CG_INHERITED_OBJECT_INTERFACE;
|
|
}
|
|
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
virtual
|
|
CG_STATUS GenProxy( CCB * pCCB );
|
|
|
|
virtual
|
|
CG_STATUS OutputProxy( CCB * pCCB );
|
|
|
|
virtual
|
|
CG_STATUS GenHeader( CCB * )
|
|
{
|
|
return CG_OK;
|
|
}
|
|
|
|
CG_STATUS GenInterfaceProxy( CCB *,
|
|
unsigned long )
|
|
{
|
|
return CG_OK;
|
|
}
|
|
|
|
CG_STATUS GenInterfaceStub( CCB *,
|
|
unsigned long )
|
|
{
|
|
return CG_OK;
|
|
}
|
|
|
|
//
|
|
// miscellaneous methods.
|
|
//
|
|
|
|
// interfaces inherited from another file are delegated
|
|
virtual
|
|
BOOL IsDelegated()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
};
|
|
|
|
class CG_IUNKNOWN_OBJECT_INTERFACE : public CG_INHERITED_OBJECT_INTERFACE
|
|
{
|
|
BOOL fInherited;
|
|
|
|
public:
|
|
|
|
//
|
|
// The constructor.
|
|
//
|
|
|
|
CG_IUNKNOWN_OBJECT_INTERFACE(
|
|
node_interface * pI,
|
|
GUID_STRS GStrs,
|
|
BOOL fCallbacksYes,
|
|
BOOL fMopsYes,
|
|
CG_OBJECT_INTERFACE * pBCG,
|
|
BOOL fInh
|
|
) : CG_INHERITED_OBJECT_INTERFACE(
|
|
pI,
|
|
GStrs,
|
|
fCallbacksYes,
|
|
fMopsYes,
|
|
pBCG ), fInherited( fInh )
|
|
{
|
|
}
|
|
|
|
//
|
|
// code generation methods.
|
|
//
|
|
virtual
|
|
ID_CG GetCGID()
|
|
{
|
|
if ( fInherited )
|
|
return CG_INHERITED_OBJECT_INTERFACE::GetCGID();
|
|
else
|
|
return CG_OBJECT_INTERFACE::GetCGID();
|
|
}
|
|
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
|
|
virtual
|
|
CG_STATUS GenProxy( CCB * pCCB )
|
|
{
|
|
if ( fInherited )
|
|
return CG_INHERITED_OBJECT_INTERFACE::GenProxy( pCCB );
|
|
else
|
|
return CG_OBJECT_INTERFACE::GenProxy( pCCB );
|
|
}
|
|
|
|
virtual
|
|
CG_STATUS OutputProxy( CCB * pCCB )
|
|
{
|
|
if ( fInherited )
|
|
return CG_INHERITED_OBJECT_INTERFACE::OutputProxy( pCCB );
|
|
else
|
|
return CG_OBJECT_INTERFACE::OutputProxy( pCCB );
|
|
}
|
|
|
|
virtual
|
|
CG_STATUS GenHeader( CCB * pCCB )
|
|
{
|
|
if ( fInherited )
|
|
return CG_INHERITED_OBJECT_INTERFACE::GenHeader( pCCB );
|
|
else
|
|
return CG_OBJECT_INTERFACE::GenHeader( pCCB );
|
|
}
|
|
|
|
CG_STATUS GenInterfaceProxy( CCB *pCCB,
|
|
unsigned long index)
|
|
{
|
|
if ( fInherited )
|
|
return CG_INHERITED_OBJECT_INTERFACE::GenInterfaceProxy( pCCB, index );
|
|
else
|
|
return CG_OBJECT_INTERFACE::GenInterfaceProxy( pCCB, index );
|
|
}
|
|
|
|
CG_STATUS GenInterfaceStub( CCB *pCCB,
|
|
unsigned long index)
|
|
{
|
|
if ( fInherited )
|
|
return CG_INHERITED_OBJECT_INTERFACE::GenInterfaceStub( pCCB, index );
|
|
else
|
|
return CG_OBJECT_INTERFACE::GenInterfaceStub( pCCB, index );
|
|
}
|
|
|
|
//
|
|
// miscellaneous methods.
|
|
//
|
|
|
|
// IUnknown is never delegated
|
|
virtual
|
|
BOOL IsDelegated()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
virtual
|
|
BOOL IsIUnknown()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
};
|
|
|
|
class CG_LIBRARY : public CG_NDR
|
|
{
|
|
public:
|
|
CG_LIBRARY ( node_library * pLib, XLAT_SIZE_INFO & szInfo )
|
|
: CG_NDR ( pLib, szInfo )
|
|
{
|
|
}
|
|
|
|
CG_STATUS GenTypeInfo(CCB * pCCB);
|
|
|
|
virtual
|
|
CG_STATUS GenHeader(CCB *pCCB);
|
|
|
|
CG_STATUS GenCode(CCB * )
|
|
{
|
|
return CG_OK;
|
|
}
|
|
|
|
ID_CG GetCGID()
|
|
{
|
|
return ID_CG_LIBRARY;
|
|
}
|
|
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
};
|
|
|
|
class CG_INTERFACE_REFERENCE : public CG_NDR
|
|
{
|
|
private:
|
|
public:
|
|
CG_INTERFACE_REFERENCE ( node_interface_reference * pRef, XLAT_SIZE_INFO & szInfo )
|
|
: CG_NDR ( pRef, szInfo )
|
|
{
|
|
}
|
|
|
|
CG_STATUS GenTypeInfo(CCB * pCCB);
|
|
|
|
virtual
|
|
CG_STATUS GenHeader(CCB *pCCB);
|
|
|
|
CG_STATUS GenCode(CCB * )
|
|
{
|
|
return CG_OK;
|
|
}
|
|
|
|
ID_CG GetCGID()
|
|
{
|
|
return ID_CG_INTERFACE_REFERENCE;
|
|
}
|
|
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
};
|
|
|
|
class CG_DISPINTERFACE : public CG_OBJECT_INTERFACE
|
|
{
|
|
private:
|
|
GUID_STRS GuidStrs;
|
|
void * _pCTI;
|
|
CG_CLASS * _pcgDispatch;
|
|
public:
|
|
|
|
CG_DISPINTERFACE (
|
|
node_dispinterface * pI,
|
|
GUID_STRS GStrs,
|
|
CG_OBJECT_INTERFACE * pBCG
|
|
) : CG_OBJECT_INTERFACE(pI, GStrs, FALSE, FALSE, pBCG)
|
|
{
|
|
GuidStrs = GStrs;
|
|
GuidStrs.SetValue();
|
|
_pCTI = NULL;
|
|
_pcgDispatch = pBCG;
|
|
}
|
|
|
|
CG_STATUS GenTypeInfo(CCB * pCCB);
|
|
|
|
virtual
|
|
CG_STATUS GenHeader(CCB *pCCB);
|
|
|
|
CG_STATUS GenCode(CCB * )
|
|
{
|
|
return CG_OK;
|
|
}
|
|
|
|
ID_CG GetCGID()
|
|
{
|
|
return ID_CG_DISPINTERFACE;
|
|
}
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
CG_CLASS * GetCGDispatch(void)
|
|
{
|
|
return _pcgDispatch;
|
|
}
|
|
};
|
|
|
|
class CG_MODULE : public CG_NDR
|
|
{
|
|
private:
|
|
void * _pCTI;
|
|
public:
|
|
CG_MODULE ( node_module * pMod, XLAT_SIZE_INFO & szInfo )
|
|
: CG_NDR ( pMod, szInfo )
|
|
{
|
|
_pCTI = NULL;
|
|
}
|
|
|
|
CG_STATUS GenTypeInfo(CCB * pCCB);
|
|
|
|
virtual
|
|
CG_STATUS GenHeader(CCB *pCCB);
|
|
|
|
CG_STATUS GenCode(CCB * )
|
|
{
|
|
return CG_OK;
|
|
}
|
|
|
|
ID_CG GetCGID()
|
|
{
|
|
return ID_CG_MODULE;
|
|
}
|
|
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
unsigned long LayOut();
|
|
};
|
|
|
|
class CG_COCLASS : public CG_NDR
|
|
{
|
|
private:
|
|
void * _pCTI;
|
|
public:
|
|
CG_COCLASS ( node_coclass * pCoclass, XLAT_SIZE_INFO & szInfo )
|
|
: CG_NDR ( pCoclass, szInfo )
|
|
{
|
|
_pCTI = NULL;
|
|
}
|
|
|
|
virtual
|
|
CG_STATUS GenTypeInfo(CCB * pCCB);
|
|
|
|
virtual
|
|
CG_STATUS GenHeader(CCB *pCCB);
|
|
|
|
CG_STATUS GenCode(CCB * )
|
|
{
|
|
return CG_OK;
|
|
}
|
|
|
|
ID_CG GetCGID()
|
|
{
|
|
return ID_CG_COCLASS;
|
|
}
|
|
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
unsigned long LayOut();
|
|
};
|
|
|
|
class CG_SAFEARRAY : public CG_NDR
|
|
{
|
|
public:
|
|
CG_SAFEARRAY ( node_safearray * pSA, XLAT_SIZE_INFO & szInfo )
|
|
: CG_NDR ( pSA, szInfo )
|
|
{
|
|
}
|
|
|
|
//
|
|
// TYPEDESC generation routine
|
|
//
|
|
virtual
|
|
CG_STATUS GetTypeDesc(TYPEDESC * &ptd, CCB * pCCB);
|
|
|
|
ID_CG
|
|
GetCGID()
|
|
{
|
|
return ID_CG_SAFEARRAY;
|
|
}
|
|
|
|
virtual
|
|
void Visit( CG_VISITOR *pVisitor )
|
|
{
|
|
pVisitor->Visit( this );
|
|
}
|
|
|
|
};
|
|
|
|
extern GUID_STRS FakeNDR64TransferSyntaxGuidStrs;
|
|
extern GUID_STRS NDR64TransferSyntaxGuidStrs;
|
|
extern GUID_STRS TransferSyntaxGuidStrs;
|
|
|
|
#endif // __MISCCLS_HXX__
|