Files
Slnkdwf/ATL90/source/SProxy/CppCodeGenerator.h
Jos Groot Lipman 0e37d774d2 Merge SLNKDWF64 branch
svn path=/Slnkdwf/trunk/; revision=23911
2015-01-21 12:09:31 +00:00

854 lines
27 KiB
C++

//
// 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<CCppCodeGenerator>,
public CComObjectRootEx<CComSingleThreadModel>
{
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