// // CppCodeGenerator.h // // Copyright (c) Microsoft Corporation. All rights reserved. // #pragma once #include "stdafx.h" #include "CodeTypes.h" struct CXSDEntry { char * szType; int cchType; char * szCppType; int cchCppType; }; extern bool g_bUseWchar_t; #define DECLARE_XSD_ENTRY(__name, __cppType) \ { __name, sizeof(__name)-1, __cppType, sizeof(__cppType)-1 }, extern __declspec(selectany) const CXSDEntry g_soapTypes[] = { DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_BOOLEAN", "bool") DECLARE_XSD_ENTRY("SOAPTYPE_FLOAT", "float") DECLARE_XSD_ENTRY("SOAPTYPE_DOUBLE", "double") DECLARE_XSD_ENTRY("SOAPTYPE_DECIMAL", "double") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_DURATION", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_HEXBINARY", "ATLSOAP_BLOB") DECLARE_XSD_ENTRY("SOAPTYPE_BASE64BINARY", "ATLSOAP_BLOB") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_ANYURI", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_ID", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_IDREF", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_ENTITY", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_NOTATION", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_QNAME", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_NORMALIZEDSTRING", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_TOKEN", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_LANGUAGE", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_IDREFS", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_ENTITIES", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_NMTOKEN", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_NMTOKENS", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_NAME", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_NCNAME", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_INTEGER", "__int64") DECLARE_XSD_ENTRY("SOAPTYPE_NONPOSITIVEINTEGER", "__int64") DECLARE_XSD_ENTRY("SOAPTYPE_NEGATIVEINTEGER", "__int64") DECLARE_XSD_ENTRY("SOAPTYPE_LONG", "__int64") DECLARE_XSD_ENTRY("SOAPTYPE_INT", "int") DECLARE_XSD_ENTRY("SOAPTYPE_SHORT", "short") DECLARE_XSD_ENTRY("SOAPTYPE_BYTE", "char") DECLARE_XSD_ENTRY("SOAPTYPE_NONNEGATIVEINTEGER", "unsigned __int64") DECLARE_XSD_ENTRY("SOAPTYPE_UNSIGNEDLONG", "unsigned __int64") DECLARE_XSD_ENTRY("SOAPTYPE_UNSIGNEDINT", "unsigned int") DECLARE_XSD_ENTRY("SOAPTYPE_UNSIGNEDSHORT", "wchar_t") DECLARE_XSD_ENTRY("SOAPTYPE_UNSIGNEDBYTE", "unsigned char") DECLARE_XSD_ENTRY("SOAPTYPE_POSITIVEINTEGER", "unsigned __int64") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_DATETIME", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_TIME", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_DATE", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_GMONTH", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_GYEARMONTH", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_GYEAR", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_GMONTHDAY", "BSTR") DECLARE_XSD_ENTRY("SOAPTYPE_STRING", "BSTR") // DECLARE_XSD_ENTRY("SOAPTYPE_GDAY", "BSTR") }; class CCppCodeGenerator : public ITagReplacerImpl, public CComObjectRootEx { public: BEGIN_COM_MAP(CCppCodeGenerator) COM_INTERFACE_ENTRY(IUnknown) COM_INTERFACE_ENTRY(ITagReplacer) END_COM_MAP() private: CCodeProxy *m_pProxy; POSITION m_currFunctionPos; POSITION m_currParameterPos; POSITION m_currStructPos; POSITION m_currStructFieldPos; POSITION m_currEnumPos; POSITION m_currEnumFieldPos; POSITION m_currMemberPos; POSITION m_currHeaderPos; CWriteStreamHelper m_writeHelper; // generic counter int m_nCntr; // function counter int m_nFuncIndex; bool m_bPragma; bool m_bEmitNamespace; bool m_bGenProxy; const char *m_szNamespace; protected: public: CCppCodeGenerator(CCodeProxy *pProxy = NULL) : m_pProxy(pProxy), m_currFunctionPos(NULL), m_currParameterPos(NULL), m_currStructPos(NULL), m_currStructFieldPos(NULL), m_currEnumPos(NULL), m_currEnumFieldPos(NULL), m_currMemberPos(NULL), m_currHeaderPos(NULL), m_nCntr(0), m_nFuncIndex(-1), m_bPragma(true), m_bEmitNamespace(true), m_szNamespace(NULL), m_bGenProxy(true) { } HTTP_CODE WriteCString(const CStringA& str) { CStringA strTemp(str); strTemp.Replace("\\", "\\\\"); strTemp.Replace("\"", "\\\""); strTemp.Replace("?", "\\?"); strTemp.Replace("\r", "\\r"); strTemp.Replace("\t", "\\t"); strTemp.Replace("\'", "\\\'"); strTemp.Replace("\n", "\\n"); return (m_pStream->WriteStream((LPCSTR) strTemp, strTemp.GetLength(), NULL) == S_OK) ? HTTP_SUCCESS : HTTP_FAIL; } HTTP_CODE WriteCString(const CStringW& str) { CStringA strTemp(str); return WriteCString(strTemp); } inline ULONG AtlSoapHashStr(const wchar_t * sz) { ULONG nHash = 0; while (*sz != 0) { nHash = (nHash<<5)+nHash+(*sz); sz++; } return nHash; } HTTP_CODE WriteHash(ULONG nHash) { char szBuf[256]; int nLen = sprintf(szBuf, "0x%.8X", nHash); return (m_pStream->WriteStream(szBuf, nLen, NULL) == S_OK) ? HTTP_SUCCESS : HTTP_FAIL; } HTTP_CODE GetHashW(LPCSTR szStr) { return WriteHash(AtlSoapHashStr( CA2W(szStr) )); } HTTP_CODE GetHashW(LPCWSTR szStr) { return WriteHash(AtlSoapHashStr( szStr )); } CCodeEnum * GetCurrentEnum() { POSITION pos = m_currEnumPos; CCodeEnum *p = m_pProxy->GetNextEnum(pos); ATLASSERT( p != NULL ); return p; } CCodeTypedElement * GetCurrentEnumElement() { CCodeEnum * p = GetCurrentEnum(); POSITION pos = m_currEnumFieldPos; CCodeTypedElement *pElem = p->GetNextElement(pos); ATLASSERT( pElem != NULL ); return pElem; } CCodeStruct * GetCurrentStruct() { POSITION pos = m_currStructPos; CCodeStruct *p = m_pProxy->GetNextStruct(pos); ATLASSERT( p != NULL ); return p; } CCodeTypedElement * GetCurrentStructField() { CCodeStruct * p = GetCurrentStruct(); POSITION pos = m_currStructFieldPos; CCodeTypedElement *pElem = p->GetNextElement(pos); ATLASSERT( pElem != NULL ); return pElem; } CCodeTypedElement * GetCurrentMember() { POSITION pos = m_currMemberPos; CCodeTypedElement *p = m_pProxy->GetNextHeader(pos); ATLASSERT( p != NULL ); return p; } HTTP_CODE IsFixedArray(CCodeTypedElement *p) { if (p->GetDims() != 0) { return HTTP_SUCCESS; } return HTTP_S_FALSE; } HTTP_CODE GetDimsDecl(CCodeTypedElement *p) { if (p->GetDims() != 0) { m_pStream->WriteStream("{", 1, NULL); for (int i=0; i<=p->GetDimension(0); i++) { if ((m_writeHelper.Write(p->GetDimension(i)) == FALSE) || (S_OK != m_pStream->WriteStream(", ", 2, NULL))) { return HTTP_FAIL; } } m_pStream->WriteStream("}", 1, NULL); } return HTTP_SUCCESS; } HTTP_CODE GetAtlSoapType(CCodeTypedElement *p) { XSDTYPE xsdType = p->GetXSDType(); ATLASSERT( xsdType != XSDTYPE_ERR ); if (xsdType != XSDTYPE_UNK) { if (SUCCEEDED(m_pStream->WriteStream( g_soapTypes[xsdType].szType, g_soapTypes[xsdType].cchType, NULL))) { return HTTP_SUCCESS; } } else { if (SUCCEEDED(m_pStream->WriteStream("SOAPTYPE_UNK", sizeof("SOAPTYPE_UNK")-1, NULL))) { return HTTP_SUCCESS; } } return HTTP_FAIL; } HTTP_CODE IsUDT(CCodeTypedElement *p) { ATLASSERT( p != NULL ); ATLASSERT( p->GetXSDType() != XSDTYPE_ERR ); if (p->GetXSDType() != XSDTYPE_UNK) { return HTTP_S_FALSE; } return HTTP_SUCCESS; } CCodeFunction * GetCurrentFunction() { POSITION pos = m_currFunctionPos; CCodeFunction *p = m_pProxy->GetNextFunction(pos); ATLASSERT( p != NULL ); return p; } CCodeTypedElement * GetCurrentParameter() { CCodeFunction * p = GetCurrentFunction(); POSITION pos = m_currParameterPos; CCodeTypedElement *pElem = p->GetNextElement(pos); ATLASSERT( pElem != NULL ); return pElem; } CCodeTypedElement * GetCurrentHeader() { CCodeFunction * p = GetCurrentFunction(); POSITION pos = m_currHeaderPos; CCodeTypedElement *pElem = p->GetNextHeader(pos); ATLASSERT( pElem != NULL ); return pElem; } HTTP_CODE GetCppType(CCodeTypedElement *p) { XSDTYPE xsdType = p->GetXSDType(); ATLASSERT( xsdType != XSDTYPE_ERR ); if (xsdType != XSDTYPE_UNK) { if (!g_bUseWchar_t && xsdType == XSDTYPE_UNSIGNEDSHORT) { if (SUCCEEDED(m_pStream->WriteStream( "unsigned short", sizeof("unsigned short")-1, NULL))) { return HTTP_SUCCESS; } } else { if (SUCCEEDED(m_pStream->WriteStream( g_soapTypes[xsdType].szCppType, g_soapTypes[xsdType].cchCppType, NULL))) { return HTTP_SUCCESS; } } } else { return WriteCString(p->GetCodeTypeName()); } return HTTP_FAIL; } HTTP_CODE GetSafeCppType(CCodeTypedElement *p) { XSDTYPE xsdType = p->GetXSDType(); ATLASSERT( xsdType != XSDTYPE_ERR ); if (xsdType != XSDTYPE_UNK) { if (!g_bUseWchar_t && xsdType == XSDTYPE_UNSIGNEDSHORT) { if (SUCCEEDED(m_pStream->WriteStream( "unsigned short", sizeof("unsigned short")-1, NULL))) { return HTTP_SUCCESS; } } else { if (SUCCEEDED(m_pStream->WriteStream( g_soapTypes[xsdType].szCppType, g_soapTypes[xsdType].cchCppType, NULL))) { return HTTP_SUCCESS; } } } else { return WriteCString(p->GetSafeCodeTypeName()); } return HTTP_FAIL; } HTTP_CODE GetTypeSuffix(CCodeTypedElement *p) { if (p->GetDims() == 0) { return HTTP_SUCCESS; } HTTP_CODE hcErr = HTTP_SUCCESS; for (int i=1; (i<=p->GetDimension(0)) && (hcErr == HTTP_SUCCESS); i++) { hcErr = HTTP_FAIL; if (SUCCEEDED(m_pStream->WriteStream("[", 1, NULL))) { if (m_writeHelper.Write(p->GetDimension(i)) != FALSE) { m_pStream->WriteStream("]", 1, NULL); hcErr = HTTP_SUCCESS; } } } return hcErr; } HTTP_CODE OnGetNextEnum(); HTTP_CODE OnGetEnumSafeQName(); HTTP_CODE OnGetNextEnumElement(); HTTP_CODE OnGetEnumElementHashW(); HTTP_CODE OnGetEnumElementName(); HTTP_CODE OnGetEnumElementValue(); HTTP_CODE OnResetCounter(); HTTP_CODE OnGetEnumNameHashW(); HTTP_CODE OnGetEnumName(); HTTP_CODE OnGetEnumQName(); HTTP_CODE OnGetEnumCppName(); HTTP_CODE OnGetEnumSafeCppQName(); HTTP_CODE OnGetEnumElementCppName(); HTTP_CODE OnGetEnumCppQName(); HTTP_CODE OnGetNextStruct(); HTTP_CODE OnGetStructSafeQName(); HTTP_CODE OnGetNextStructField(); HTTP_CODE OnGetStructFieldType(); HTTP_CODE OnGetStructFieldSuffix(); HTTP_CODE OnGetStructSafeCppQName(); HTTP_CODE OnGetStructFieldCppType(); HTTP_CODE OnIsFieldNullable(); HTTP_CODE OnIsFieldFixedArray(); HTTP_CODE OnGetStructFieldName(); HTTP_CODE OnGetStructFieldDimsDecl(); HTTP_CODE OnGetStructFieldHashW(); HTTP_CODE OnGetStructFieldAtlSoapType(); HTTP_CODE OnGetStructQName(); HTTP_CODE OnIsFieldUDT(); HTTP_CODE OnGetStructFieldTypeSafeQName(); HTTP_CODE OnGetStructNameHashW(); HTTP_CODE OnGetStructName(); HTTP_CODE OnGetStructFieldCount(); HTTP_CODE OnGetStructFieldCppName(); HTTP_CODE OnGetStructCppQName(); HTTP_CODE OnGetStructCppName(); HTTP_CODE OnGetStructFieldTypeSafeCppQName(); HTTP_CODE OnGetNextFunction(); HTTP_CODE OnGetNextParameter(); HTTP_CODE OnIsParameterNullable(); HTTP_CODE OnIsParameterFixedArray(); HTTP_CODE OnGetClassSafeQName(); HTTP_CODE OnGetFunctionName(); HTTP_CODE OnGetParameterName(); HTTP_CODE OnGetParameterNameRaw(); HTTP_CODE OnGetParameterDimsDecl(); HTTP_CODE OnGetParameterType(); HTTP_CODE OnIsParameterDynamicArray(); HTTP_CODE OnGetParameterSuffix(); HTTP_CODE OnIsInParameter(); HTTP_CODE OnHasRetval(); HTTP_CODE OnGetRetval(); HTTP_CODE OnGetParameterHashW(); HTTP_CODE OnGetFunctionCppName(); HTTP_CODE OnGetParameterCppName(); HTTP_CODE OnGetParameterCppType(); HTTP_CODE OnGetParameterAtlSoapType(); HTTP_CODE OnIsOutParameter(); HTTP_CODE OnIsParameterUDT(); HTTP_CODE OnGetParameterTypeQName(); HTTP_CODE OnGetSizeIsIndex(); HTTP_CODE OnGetCurrentParameterIndex(); HTTP_CODE OnResetParameterIndex(); HTTP_CODE OnNotIsRetval(); HTTP_CODE OnGetFunctionNameHashW(); HTTP_CODE OnGetFunctionResultNameHashW(); HTTP_CODE OnGetFunctionResultName(); HTTP_CODE OnGetFunctionSendName(); HTTP_CODE OnGetExpectedParameterCount(); HTTP_CODE OnGetParameterTypeCppQName(); HTTP_CODE OnIsPAD(); HTTP_CODE OnIsChain(); HTTP_CODE OnIsPID(); HTTP_CODE OnIsDocument(); HTTP_CODE OnIsRpc(); HTTP_CODE OnIsLiteral(); HTTP_CODE OnIsEncoded(); HTTP_CODE OnIsOneWay(); HTTP_CODE OnGetClassName(); HTTP_CODE OnNotIsParameterFixedArray(); HTTP_CODE OnNotIsLastParameter(); HTTP_CODE OnGetParameterFixedArraySize(); HTTP_CODE OnGetDateTime(); HTTP_CODE OnGetURL(); HTTP_CODE OnGetSoapAction(); HTTP_CODE OnGetNamespace(); HTTP_CODE OnEmitNamespace(); HTTP_CODE OnGetCppNamespace(); HTTP_CODE OnClassHasHeaders(); HTTP_CODE OnGetNextMember(); HTTP_CODE OnGetMemberType(); HTTP_CODE OnGetMemberName(); HTTP_CODE OnGetMemberSuffix(); HTTP_CODE OnIsMemberFixedArray(); HTTP_CODE OnIsMemberUDT(); HTTP_CODE OnIsMemberEnum(); HTTP_CODE OnGetMemberCppType(); HTTP_CODE OnGetMemberCppName(); HTTP_CODE OnGetNextHeader(); HTTP_CODE OnIsHeaderFixedArray(); HTTP_CODE OnGetHeaderValue(); HTTP_CODE OnGetHeaderDimsDecl(); HTTP_CODE OnGetHeaderHashW(); HTTP_CODE OnGetHeaderAtlSoapType(); HTTP_CODE OnGetHeaderCppValue(); HTTP_CODE OnIsHeaderNullable(); HTTP_CODE OnIsInHeader(); HTTP_CODE OnIsOutHeader(); HTTP_CODE OnIsRequiredHeader(); HTTP_CODE OnIsHeaderUDT(); HTTP_CODE OnGetHeaderTypeQName(); HTTP_CODE OnGetExpectedHeaderCount(); HTTP_CODE OnHeaderHasNamespace(); HTTP_CODE OnGetHeaderNamespace(); HTTP_CODE OnGetHeaderNamespaceHashW(); HTTP_CODE OnGetFunctionIndex(); HTTP_CODE OnEmitPragma(); HTTP_CODE OnGetEnumNamespaceHashW(); HTTP_CODE OnEnumHasUniqueNamespace(); HTTP_CODE OnGetEnumNamespace(); HTTP_CODE OnGetStructNamespaceHashW(); HTTP_CODE OnStructHasUniqueNamespace(); HTTP_CODE OnGetStructNamespace(); HTTP_CODE OnGetFunctionNamespaceHashW(); HTTP_CODE OnGetFunctionNamespace(); HTTP_CODE OnGetHeaderTypeCppQName(); HTTP_CODE OnIsFieldDynamicArray(); HTTP_CODE OnIsFieldDynamicArrayWrapper(); HTTP_CODE OnIsFieldSizeIs(); HTTP_CODE OnFieldHasSizeIs(); HTTP_CODE OnGetFieldSizeIsName(); HTTP_CODE OnGetFieldSizeIsIndex(); HTTP_CODE OnGetCurrentFieldIndex(); HTTP_CODE OnGenProxy(); BEGIN_REPLACEMENT_METHOD_MAP(CCppCodeGenerator) REPLACEMENT_METHOD_ENTRY("GetNextEnum", OnGetNextEnum) REPLACEMENT_METHOD_ENTRY("GetEnumSafeQName", OnGetEnumSafeQName) REPLACEMENT_METHOD_ENTRY("GetNextEnumElement", OnGetNextEnumElement) REPLACEMENT_METHOD_ENTRY("GetEnumElementHashW", OnGetEnumElementHashW) REPLACEMENT_METHOD_ENTRY("GetEnumElementName", OnGetEnumElementName) REPLACEMENT_METHOD_ENTRY("GetEnumElementValue", OnGetEnumElementValue) REPLACEMENT_METHOD_ENTRY("ResetCounter", OnResetCounter) REPLACEMENT_METHOD_ENTRY("GetEnumNameHashW", OnGetEnumNameHashW) REPLACEMENT_METHOD_ENTRY("GetEnumName", OnGetEnumName) REPLACEMENT_METHOD_ENTRY("GetEnumQName", OnGetEnumQName) REPLACEMENT_METHOD_ENTRY("GetNextStruct", OnGetNextStruct) REPLACEMENT_METHOD_ENTRY("GetStructSafeQName", OnGetStructSafeQName) REPLACEMENT_METHOD_ENTRY("GetNextStructField", OnGetNextStructField) REPLACEMENT_METHOD_ENTRY("GetStructFieldType", OnGetStructFieldType) REPLACEMENT_METHOD_ENTRY("GetStructFieldSuffix", OnGetStructFieldSuffix) REPLACEMENT_METHOD_ENTRY("IsFieldNullable", OnIsFieldNullable) REPLACEMENT_METHOD_ENTRY("IsFieldFixedArray", OnIsFieldFixedArray) REPLACEMENT_METHOD_ENTRY("GetStructFieldName", OnGetStructFieldName) REPLACEMENT_METHOD_ENTRY("GetStructFieldDimsDecl", OnGetStructFieldDimsDecl) REPLACEMENT_METHOD_ENTRY("GetStructFieldHashW", OnGetStructFieldHashW) REPLACEMENT_METHOD_ENTRY("GetStructFieldName", OnGetStructFieldName) REPLACEMENT_METHOD_ENTRY("GetStructFieldAtlSoapType", OnGetStructFieldAtlSoapType) REPLACEMENT_METHOD_ENTRY("GetStructQName", OnGetStructQName) REPLACEMENT_METHOD_ENTRY("IsFieldUDT", OnIsFieldUDT) REPLACEMENT_METHOD_ENTRY("GetStructFieldTypeSafeQName", OnGetStructFieldTypeSafeQName) REPLACEMENT_METHOD_ENTRY("GetStructNameHashW", OnGetStructNameHashW) REPLACEMENT_METHOD_ENTRY("GetStructName", OnGetStructName) REPLACEMENT_METHOD_ENTRY("GetStructFieldCount", OnGetStructFieldCount) REPLACEMENT_METHOD_ENTRY("GetNextFunction", OnGetNextFunction) REPLACEMENT_METHOD_ENTRY("GetNextParameter", OnGetNextParameter) REPLACEMENT_METHOD_ENTRY("IsParameterNullable", OnIsParameterNullable) REPLACEMENT_METHOD_ENTRY("IsParameterFixedArray", OnIsParameterFixedArray) REPLACEMENT_METHOD_ENTRY("GetClassSafeQName", OnGetClassSafeQName) REPLACEMENT_METHOD_ENTRY("GetFunctionName", OnGetFunctionName) REPLACEMENT_METHOD_ENTRY("GetParameterName", OnGetParameterName) REPLACEMENT_METHOD_ENTRY("GetParameterNameRaw", OnGetParameterNameRaw) REPLACEMENT_METHOD_ENTRY("GetParameterDimsDecl", OnGetParameterDimsDecl) REPLACEMENT_METHOD_ENTRY("GetParameterType", OnGetParameterType) REPLACEMENT_METHOD_ENTRY("IsParameterDynamicArray", OnIsParameterDynamicArray) REPLACEMENT_METHOD_ENTRY("GetParameterSuffix", OnGetParameterSuffix) REPLACEMENT_METHOD_ENTRY("IsInParameter", OnIsInParameter) REPLACEMENT_METHOD_ENTRY("HasRetval", OnHasRetval) REPLACEMENT_METHOD_ENTRY("GetRetval", OnGetRetval) REPLACEMENT_METHOD_ENTRY("GetParameterHashW", OnGetParameterHashW) REPLACEMENT_METHOD_ENTRY("GetParameterAtlSoapType", OnGetParameterAtlSoapType) REPLACEMENT_METHOD_ENTRY("IsOutParameter", OnIsOutParameter) REPLACEMENT_METHOD_ENTRY("IsParameterUDT", OnIsParameterUDT) REPLACEMENT_METHOD_ENTRY("GetParameterTypeQName", OnGetParameterTypeQName) REPLACEMENT_METHOD_ENTRY("GetSizeIsIndex", OnGetSizeIsIndex) REPLACEMENT_METHOD_ENTRY("GetCurrentParameterIndex", OnGetCurrentParameterIndex) REPLACEMENT_METHOD_ENTRY("ResetParameterIndex", OnResetParameterIndex) REPLACEMENT_METHOD_ENTRY("NotIsRetval", OnNotIsRetval) REPLACEMENT_METHOD_ENTRY("GetFunctionNameHashW", OnGetFunctionNameHashW) REPLACEMENT_METHOD_ENTRY("GetFunctionResultNameHashW", OnGetFunctionResultNameHashW) REPLACEMENT_METHOD_ENTRY("GetFunctionResultName", OnGetFunctionResultName) REPLACEMENT_METHOD_ENTRY("GetFunctionSendName", OnGetFunctionSendName) REPLACEMENT_METHOD_ENTRY("GetExpectedParameterCount", OnGetExpectedParameterCount) REPLACEMENT_METHOD_ENTRY("IsPAD", OnIsPAD) REPLACEMENT_METHOD_ENTRY("IsChain", OnIsChain) REPLACEMENT_METHOD_ENTRY("IsPID", OnIsPID) REPLACEMENT_METHOD_ENTRY("IsDocument", OnIsDocument) REPLACEMENT_METHOD_ENTRY("IsRpc", OnIsRpc) REPLACEMENT_METHOD_ENTRY("IsLiteral", OnIsLiteral) REPLACEMENT_METHOD_ENTRY("IsEncoded", OnIsEncoded) REPLACEMENT_METHOD_ENTRY("IsOneWay", OnIsOneWay) REPLACEMENT_METHOD_ENTRY("GetClassName", OnGetClassName) REPLACEMENT_METHOD_ENTRY("NotIsParameterFixedArray", OnNotIsParameterFixedArray) REPLACEMENT_METHOD_ENTRY("NotIsLastParameter", OnNotIsLastParameter) REPLACEMENT_METHOD_ENTRY("GetParameterFixedArraySize", OnGetParameterFixedArraySize) REPLACEMENT_METHOD_ENTRY("GetSoapAction", OnGetSoapAction) REPLACEMENT_METHOD_ENTRY("GetDateTime", OnGetDateTime) REPLACEMENT_METHOD_ENTRY("GetURL", OnGetURL) REPLACEMENT_METHOD_ENTRY("GetNamespace", OnGetNamespace) REPLACEMENT_METHOD_ENTRY("EmitNamespace", OnEmitNamespace) REPLACEMENT_METHOD_ENTRY("GetCppNamespace", OnGetCppNamespace) REPLACEMENT_METHOD_ENTRY("ClassHasHeaders", OnClassHasHeaders) REPLACEMENT_METHOD_ENTRY("GetNextMember", OnGetNextMember) REPLACEMENT_METHOD_ENTRY("GetMemberType", OnGetMemberType) REPLACEMENT_METHOD_ENTRY("GetMemberName", OnGetMemberName) REPLACEMENT_METHOD_ENTRY("GetMemberSuffix", OnGetMemberSuffix) REPLACEMENT_METHOD_ENTRY("IsMemberFixedArray", OnIsMemberFixedArray) REPLACEMENT_METHOD_ENTRY("IsMemberUDT", OnIsMemberUDT) REPLACEMENT_METHOD_ENTRY("IsMemberEnum", OnIsMemberEnum) REPLACEMENT_METHOD_ENTRY("GetNextHeader", OnGetNextHeader) REPLACEMENT_METHOD_ENTRY("IsHeaderFixedArray", OnIsHeaderFixedArray) REPLACEMENT_METHOD_ENTRY("GetHeaderValue", OnGetHeaderValue) REPLACEMENT_METHOD_ENTRY("GetHeaderDimsDecl", OnGetHeaderDimsDecl) REPLACEMENT_METHOD_ENTRY("GetHeaderHashW", OnGetHeaderHashW) REPLACEMENT_METHOD_ENTRY("GetHeaderAtlSoapType", OnGetHeaderAtlSoapType) REPLACEMENT_METHOD_ENTRY("IsHeaderNullable", OnIsHeaderNullable) REPLACEMENT_METHOD_ENTRY("IsInHeader", OnIsInHeader) REPLACEMENT_METHOD_ENTRY("IsOutHeader", OnIsOutHeader) REPLACEMENT_METHOD_ENTRY("IsRequiredHeader", OnIsRequiredHeader) REPLACEMENT_METHOD_ENTRY("IsHeaderUDT", OnIsHeaderUDT) REPLACEMENT_METHOD_ENTRY("GetHeaderTypeQName", OnGetHeaderTypeQName) REPLACEMENT_METHOD_ENTRY("GetExpectedHeaderCount", OnGetExpectedHeaderCount) REPLACEMENT_METHOD_ENTRY("GetFunctionIndex", OnGetFunctionIndex) REPLACEMENT_METHOD_ENTRY("HeaderHasNamespace", OnHeaderHasNamespace) REPLACEMENT_METHOD_ENTRY("GetHeaderNamespace", OnGetHeaderNamespace) REPLACEMENT_METHOD_ENTRY("GetHeaderNamespaceHashW", OnGetHeaderNamespaceHashW) REPLACEMENT_METHOD_ENTRY("EmitPragma", OnEmitPragma) REPLACEMENT_METHOD_ENTRY("GetEnumNamespaceHashW", OnGetEnumNamespaceHashW) REPLACEMENT_METHOD_ENTRY("EnumHasUniqueNamespace", OnEnumHasUniqueNamespace) REPLACEMENT_METHOD_ENTRY("GetEnumNamespace", OnGetEnumNamespace) REPLACEMENT_METHOD_ENTRY("GetStructNamespaceHashW", OnGetStructNamespaceHashW) REPLACEMENT_METHOD_ENTRY("StructHasUniqueNamespace", OnStructHasUniqueNamespace) REPLACEMENT_METHOD_ENTRY("GetStructNamespace", OnGetStructNamespace) REPLACEMENT_METHOD_ENTRY("GetFunctionNamespaceHashW", OnGetFunctionNamespaceHashW) REPLACEMENT_METHOD_ENTRY("GetFunctionNamespace", OnGetFunctionNamespace) REPLACEMENT_METHOD_ENTRY("IsFieldSizeIs", OnIsFieldSizeIs) REPLACEMENT_METHOD_ENTRY("IsFieldDynamicArray", OnIsFieldDynamicArray) REPLACEMENT_METHOD_ENTRY("IsFieldDynamicArrayWrapper", OnIsFieldDynamicArrayWrapper) REPLACEMENT_METHOD_ENTRY("FieldHasSizeIs", OnFieldHasSizeIs) REPLACEMENT_METHOD_ENTRY("GetFieldSizeIsIndex", OnGetFieldSizeIsIndex) REPLACEMENT_METHOD_ENTRY("GetCurrentFieldIndex", OnGetCurrentFieldIndex) REPLACEMENT_METHOD_ENTRY("GetFieldSizeIsName", OnGetFieldSizeIsName) // safe-naming functions REPLACEMENT_METHOD_ENTRY("GetHeaderTypeCppQName", OnGetHeaderTypeCppQName) REPLACEMENT_METHOD_ENTRY("GetMemberCppType", OnGetMemberCppType) REPLACEMENT_METHOD_ENTRY("GetMemberCppName", OnGetMemberCppName) REPLACEMENT_METHOD_ENTRY("GetParameterTypeCppQName", OnGetParameterTypeCppQName) REPLACEMENT_METHOD_ENTRY("GetFunctionCppName", OnGetFunctionCppName) REPLACEMENT_METHOD_ENTRY("GetParameterCppName", OnGetParameterCppName) REPLACEMENT_METHOD_ENTRY("GetParameterCppType", OnGetParameterCppType) REPLACEMENT_METHOD_ENTRY("GetStructFieldCppName", OnGetStructFieldCppName) REPLACEMENT_METHOD_ENTRY("GetStructCppQName", OnGetStructCppQName) REPLACEMENT_METHOD_ENTRY("GetStructCppName", OnGetStructCppName) REPLACEMENT_METHOD_ENTRY("GetStructSafeCppQName", OnGetStructSafeCppQName) REPLACEMENT_METHOD_ENTRY("GetStructFieldCppType", OnGetStructFieldCppType) REPLACEMENT_METHOD_ENTRY("GetEnumCppName", OnGetEnumCppName) REPLACEMENT_METHOD_ENTRY("GetEnumSafeCppQName", OnGetEnumSafeCppQName) REPLACEMENT_METHOD_ENTRY("GetEnumElementCppName", OnGetEnumElementCppName) REPLACEMENT_METHOD_ENTRY("GetStructFieldTypeSafeCppQName", OnGetStructFieldTypeSafeCppQName) REPLACEMENT_METHOD_ENTRY("GetHeaderCppValue", OnGetHeaderCppValue) REPLACEMENT_METHOD_ENTRY("GetEnumCppQName", OnGetEnumCppQName) REPLACEMENT_METHOD_ENTRY("GenProxy", OnGenProxy) END_REPLACEMENT_METHOD_MAP() HRESULT Generate(LPCWSTR wszFile, CCodeProxy *pProxy, bool bPragma, bool bNoClobber, bool bEmitNamespace, bool bGenProxy, const char *szNamespace); }; //////////////////////////////////////////////////////////////////////////////// // // CWriteStreamOnFileA // //////////////////////////////////////////////////////////////////////////////// class CWriteStreamOnFileA : public IWriteStream { private: HANDLE m_hFile; public: CWriteStreamOnFileA() :m_hFile(INVALID_HANDLE_VALUE) { } ~CWriteStreamOnFileA() { if (m_hFile != INVALID_HANDLE_VALUE) { CloseHandle(m_hFile); } } HRESULT Init(LPCWSTR wszFile, DWORD dwCreationDisposition = CREATE_NEW) { if ((wszFile == NULL) || (*wszFile == L'\0')) { return E_INVALIDARG; } m_hFile = CreateFileW(wszFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL); if (m_hFile == INVALID_HANDLE_VALUE) { return AtlHresultFromLastError(); } return S_OK; } HRESULT WriteStream(LPCSTR szOut, int nLen, LPDWORD pdwWritten) { ATLASSERT( szOut != NULL ); ATLASSERT( m_hFile != INVALID_HANDLE_VALUE ); if (nLen < 0) { nLen = (int) strlen(szOut); } DWORD dwWritten = 0; if (WriteFile(m_hFile, szOut, nLen, &dwWritten, NULL) != FALSE) { if (pdwWritten != NULL) { *pdwWritten = dwWritten; } return S_OK; } return AtlHresultFromLastError(); } HRESULT FlushStream() { ATLASSERT( m_hFile != INVALID_HANDLE_VALUE ); if (FlushFileBuffers(m_hFile) != FALSE) { return S_OK; } return AtlHresultFromLastError(); } }; // class CWriteStreamOnFileA #ifdef _DEBUG class CWriteStreamOnStdout : public IWriteStream { public: HRESULT WriteStream(LPCSTR szOut, int nLen, LPDWORD pdwWritten) { ATLASSERT( szOut != NULL ); if (nLen < 0) { nLen = (int) strlen(szOut); } printf("%.*s", nLen, szOut); return S_OK; } HRESULT FlushStream() { return S_OK; } }; // class CWriteStreamOnStdout #endif