/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Copyright (c) 1989-1999 Microsoft Corporation Module Name: iid.cxx Abstract: Generate a file containing UUIDs of [object] interfaces. Notes: History: ----------------------------------------------------------------------------*/ /**************************************************************************** * include files ***************************************************************************/ #include "becls.hxx" #pragma hdrstop CG_STATUS CG_IID_FILE::GenCode( CCB * pCCB) /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Routine Description: Generate the IID file. Arguments: pCCB - The code gen controller block. Return Value: CG_OK if all is well. Notes: ----------------------------------------------------------------------------*/ { ISTREAM Stream( GetFileName(), 4 ); ISTREAM * pStream = pCCB->SetStream( &Stream, this ); CG_INTERFACE * pIntf; EmitFileHeadingBlock( pCCB, "the IIDs and CLSIDs", "link this file in with the server and any clients" ); // Write out the cplusplus guard. pStream->NewLine( 2 ); pStream->Write( "#ifdef __cplusplus\nextern \"C\"{\n#endif " ); pStream->NewLine( 2 ); // Print out the declarations of the types and the procedures. const char * DefinitionBlock[] = { "#include " ,"#include " ,"" ,"#ifdef _MIDL_USE_GUIDDEF_" ,"" ,"#ifndef INITGUID" ,"#define INITGUID" ,"#include " ,"#undef INITGUID" ,"#else" ,"#include " ,"#endif" ,"" ,"#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \\" ," DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)" ,"" ,"#else // !_MIDL_USE_GUIDDEF_" ,"" ,"#ifndef __IID_DEFINED__" ,"#define __IID_DEFINED__" ,"" ,"typedef struct _IID" ,"{" ," unsigned long x;" ," unsigned short s1;" ," unsigned short s2;" ," unsigned char c[8];" ,"} IID;" ,"" ,"#endif // __IID_DEFINED__" ,"" ,"#ifndef CLSID_DEFINED" ,"#define CLSID_DEFINED" ,"typedef IID CLSID;" ,"#endif // CLSID_DEFINED" ,"" ,"#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \\" ," const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}" ,"" ,"#endif !_MIDL_USE_GUIDDEF_" ,"" ,NULL }; pStream->WriteBlock(DefinitionBlock); pIntf = (CG_INTERFACE*) GetChild(); while ( pIntf ) { node_interface * pIntfNode = (node_interface *) pIntf->GetType(); if (!pIntfNode->PrintedIID()) { switch ( pIntf->GetCGID() ) { case ID_CG_DISPINTERFACE: { CG_DISPINTERFACE * pDI = (CG_DISPINTERFACE *)pIntf; node_dispinterface * pType = (node_dispinterface *) pDI->GetType(); node_guid * pGuid = (node_guid *) pType->GetAttribute( ATTR_GUID ); pStream->NewLine(); pStream->Write("MIDL_DEFINE_GUID(IID, DIID_"); pStream->Write(pDI->GetSymName()); pStream->Write(','); Out_Guid(pCCB, pGuid->GetStrs(), GUIDFORMAT_RAW); pStream->Write(");"); pStream->NewLine(2); pIntfNode->SetPrintedIID(); break; } case ID_CG_COCLASS: { CG_COCLASS * pCoclass = (CG_COCLASS *)pIntf; node_coclass * pType = (node_coclass *) pCoclass->GetType(); node_guid * pGuid = (node_guid *) pType->GetAttribute( ATTR_GUID ); pStream->NewLine(); pStream->Write("MIDL_DEFINE_GUID(CLSID, CLSID_"); pStream->Write(pCoclass->GetSymName()); pStream->Write(','); Out_Guid(pCCB, pGuid->GetStrs(), GUIDFORMAT_RAW); pStream->Write(");"); pStream->NewLine(2); pIntfNode->SetPrintedIID(); break; } case ID_CG_OBJECT_INTERFACE: { pStream->NewLine(); pStream->Write("MIDL_DEFINE_GUID(IID, IID_"); pStream->Write(pIntf->GetSymName()); pStream->Write(','); Out_Guid(pCCB, pIntf->GetGuidStrs(), GUIDFORMAT_RAW); pStream->Write(");"); pStream->NewLine(2); pIntfNode->SetPrintedIID(); break; } case ID_CG_LIBRARY: { CG_LIBRARY * pLib = (CG_LIBRARY *)pIntf; node_library * pType = (node_library *) pLib->GetType(); node_guid * pGuid = (node_guid *) pType->GetAttribute( ATTR_GUID ); pStream->NewLine(); pStream->Write("MIDL_DEFINE_GUID(IID, LIBID_"); pStream->Write(pLib->GetSymName()); pStream->Write(','); Out_Guid(pCCB, pGuid->GetStrs(), GUIDFORMAT_RAW); pStream->Write(");"); pStream->NewLine(2); CG_NDR * pChild = (CG_NDR*) pLib->GetChild(); pIntfNode->SetPrintedIID(); while ( pChild ) { node_interface * pChildType = (node_interface *) pChild->GetType(); if (!pChildType->PrintedIID()) { switch ( pChild->GetCGID() ) { case ID_CG_OBJECT_INTERFACE: { if (!pChildType->PrintedIID()) { pStream->NewLine(); pStream->Write("MIDL_DEFINE_GUID(IID, IID_"); pStream->Write(pChild->GetSymName()); pStream->Write(','); Out_Guid(pCCB, ((CG_INTERFACE*)pChild)->GetGuidStrs(), GUIDFORMAT_RAW ); pStream->Write(");"); pStream->NewLine(2); pChildType->SetPrintedIID(); } break; } case ID_CG_DISPINTERFACE: { CG_DISPINTERFACE * pDI = (CG_DISPINTERFACE *)pChild; node_dispinterface * pIntfType = (node_dispinterface *) pDI->GetType(); node_guid * pIntfGuid = (node_guid *) pIntfType->GetAttribute( ATTR_GUID ); pStream->NewLine(); pStream->Write("MIDL_DEFINE_GUID(IID, DIID_"); pStream->Write(pDI->GetSymName()); pStream->Write(','); Out_Guid(pCCB, pIntfGuid->GetStrs(), GUIDFORMAT_RAW); pStream->Write(");"); pStream->NewLine(2); pChildType->SetPrintedIID(); break; } case ID_CG_COCLASS: { CG_COCLASS * pCoclass = (CG_COCLASS *)pChild; node_coclass * pClassType = (node_coclass *) pCoclass->GetType(); node_guid * pClassfGuid = (node_guid *) pClassType->GetAttribute( ATTR_GUID ); pStream->NewLine(); pStream->Write("MIDL_DEFINE_GUID(CLSID, CLSID_"); pStream->Write(pCoclass->GetSymName()); pStream->Write(','); Out_Guid(pCCB, pClassfGuid->GetStrs(), GUIDFORMAT_RAW); pStream->Write(");"); pStream->NewLine(2); pChildType->SetPrintedIID(); break; } case ID_CG_INTERFACE: case ID_CG_INHERITED_OBJECT_INTERFACE: default: break; } } pChild = (CG_INTERFACE *) pChild->GetSibling(); } } case ID_CG_INTERFACE: case ID_CG_INHERITED_OBJECT_INTERFACE: default: break; } } // if pIntfNode not printed pIntf = (CG_INTERFACE *) pIntf->GetSibling(); } // while // print out the closing endifs. // the MIDL_DEFINE_GUID stuff. pStream->Write( "#undef MIDL_DEFINE_GUID" ); pStream->NewLine(); // the cplusplus stuff. pStream->NewLine(); pStream->Write( "#ifdef __cplusplus\n}\n#endif\n" ); pStream->NewLine(); EmitFileClosingBlock( pCCB ); pStream->Close(); return CG_OK; }