1161 lines
27 KiB
C++
1161 lines
27 KiB
C++
//
|
|
// CppCodeGenerator.cpp
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "CppCodeGenerator.h"
|
|
#include "Emit.h"
|
|
#include "resource.h"
|
|
#include "Element.h"
|
|
|
|
HRESULT CCppCodeGenerator::Generate(LPCWSTR wszFile, CCodeProxy *pProxy, bool bPragma, bool bNoClobber, bool bEmitNamespace, bool bGenProxy, const char *szNamespace)
|
|
{
|
|
ATLASSERT( (wszFile != NULL) && (*wszFile != L'\0') );
|
|
|
|
CWriteStreamOnFileA fileStream;
|
|
HRESULT hr = fileStream.Init(wszFile, (bNoClobber != false) ? CREATE_NEW : CREATE_ALWAYS);
|
|
if (FAILED(hr))
|
|
{
|
|
EmitErrorHr(hr);
|
|
return hr;
|
|
}
|
|
|
|
CStencil s;
|
|
HMODULE hModule = _AtlBaseModule.GetResourceInstance();
|
|
if (hModule == NULL)
|
|
{
|
|
EmitError(IDS_SDL_INTERNAL);
|
|
return E_FAIL;
|
|
}
|
|
HTTP_CODE hcErr = s.LoadFromResource(hModule, IDR_SPROXYSRF, "SRF");
|
|
if (hcErr != HTTP_SUCCESS)
|
|
{
|
|
EmitError(IDS_SDL_INTERNAL);
|
|
return E_FAIL;
|
|
}
|
|
|
|
if (s.ParseReplacements(this) == false)
|
|
{
|
|
EmitError(IDS_SDL_INTERNAL);
|
|
return E_FAIL;
|
|
}
|
|
|
|
s.FinishParseReplacements();
|
|
if (s.ParseSuccessful() == false)
|
|
{
|
|
#ifdef _DEBUG
|
|
|
|
CWriteStreamOnStdout errStream;
|
|
s.RenderErrors(&errStream);
|
|
|
|
#endif
|
|
EmitError(IDS_SDL_INTERNAL);
|
|
return E_FAIL;
|
|
}
|
|
m_pProxy = pProxy;
|
|
m_writeHelper.Attach(&fileStream);
|
|
|
|
m_bPragma = bPragma;
|
|
m_bGenProxy = bGenProxy;
|
|
m_szNamespace = szNamespace;
|
|
if (m_szNamespace && !*m_szNamespace)
|
|
{
|
|
m_bEmitNamespace = false;
|
|
}
|
|
else
|
|
{
|
|
m_bEmitNamespace = bEmitNamespace;
|
|
}
|
|
|
|
hcErr = s.Render(this, &fileStream);
|
|
if (hcErr != HTTP_SUCCESS)
|
|
{
|
|
EmitError(IDS_SDL_INTERNAL);
|
|
return E_FAIL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetNextEnum()
|
|
{
|
|
if (m_currEnumPos == NULL)
|
|
{
|
|
m_nCntr = 0;
|
|
m_currEnumPos = m_pProxy->GetFirstEnum();
|
|
}
|
|
else
|
|
{
|
|
m_pProxy->GetNextEnum(m_currEnumPos);
|
|
}
|
|
|
|
if (m_currEnumPos != NULL)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumSafeQName()
|
|
{
|
|
return WriteCString(GetCurrentEnum()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetNextEnumElement()
|
|
{
|
|
CCodeEnum *p = GetCurrentEnum();
|
|
|
|
if (m_currEnumFieldPos == NULL)
|
|
{
|
|
m_currEnumFieldPos = p->GetFirstElement();
|
|
}
|
|
else
|
|
{
|
|
p->GetNextElement(m_currEnumFieldPos);
|
|
}
|
|
|
|
if (m_currEnumFieldPos != NULL)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumElementHashW()
|
|
{
|
|
return GetHashW(GetCurrentEnumElement()->GetCodeTypeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumElementName()
|
|
{
|
|
return WriteCString(GetCurrentEnumElement()->GetCodeTypeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumElementValue()
|
|
{
|
|
m_writeHelper << m_nCntr++;
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnResetCounter()
|
|
{
|
|
m_nCntr = 0;
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumNameHashW()
|
|
{
|
|
return GetHashW(GetCurrentEnum()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumName()
|
|
{
|
|
return WriteCString(GetCurrentEnum()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumQName()
|
|
{
|
|
return WriteCString(GetCurrentEnum()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetNextStruct()
|
|
{
|
|
if (m_currStructPos == NULL)
|
|
{
|
|
m_currStructPos = m_pProxy->GetFirstStruct();
|
|
}
|
|
else
|
|
{
|
|
m_pProxy->GetNextStruct(m_currStructPos);
|
|
}
|
|
|
|
if (m_currStructPos != NULL)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructSafeQName()
|
|
{
|
|
return WriteCString(GetCurrentStruct()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetNextStructField()
|
|
{
|
|
CCodeStruct *p = GetCurrentStruct();
|
|
|
|
if (m_currStructFieldPos == NULL)
|
|
{
|
|
m_currStructFieldPos = p->GetFirstElement();
|
|
}
|
|
else
|
|
{
|
|
p->GetNextElement(m_currStructFieldPos);
|
|
}
|
|
|
|
if (m_currStructFieldPos != NULL)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldType()
|
|
{
|
|
return GetCppType(GetCurrentStructField());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldSuffix()
|
|
{
|
|
return GetTypeSuffix(GetCurrentStructField());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsFieldNullable()
|
|
{
|
|
if ((GetCurrentStructField()->GetFlags() & CODEFLAG_NULLABLE) ||
|
|
(GetCurrentStructField()->GetXSDType() == XSDTYPE_STRING) ||
|
|
(GetCurrentStructField()->GetXSDType() == XSDTYPE_BASE64BINARY) ||
|
|
(GetCurrentStructField()->GetXSDType() == XSDTYPE_HEXBINARY) ||
|
|
(OnIsFieldDynamicArray() == HTTP_SUCCESS))
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsFieldDynamicArray()
|
|
{
|
|
if (GetCurrentStructField()->GetFlags() & CODEFLAG_DYNARRAY)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsFieldDynamicArrayWrapper()
|
|
{
|
|
if (GetCurrentStructField()->GetFlags() & CODEFLAG_DYNARRAYWRAPPER)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnFieldHasSizeIs()
|
|
{
|
|
if (GetCurrentStructField()->GetSizeIs().GetLength() != 0)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFieldSizeIsName()
|
|
{
|
|
return WriteCString(GetCurrentStructField()->GetSizeIs());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFieldSizeIsIndex()
|
|
{
|
|
CCodeStruct *p = GetCurrentStruct();
|
|
int nCntr = -1;
|
|
|
|
POSITION pos = p->GetFirstElement();
|
|
while (pos != NULL)
|
|
{
|
|
nCntr++;
|
|
CCodeTypedElement *pElem = p->GetNextElement(pos);
|
|
ATLASSERT( pElem != NULL );
|
|
if (pElem->GetName() == ((LPCSTR)GetCurrentStructField()->GetSizeIs()))
|
|
{
|
|
m_writeHelper << nCntr;
|
|
return HTTP_SUCCESS;
|
|
}
|
|
}
|
|
|
|
return HTTP_FAIL;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsFieldSizeIs()
|
|
{
|
|
CCodeStruct *p = GetCurrentStruct();
|
|
|
|
POSITION pos = p->GetFirstElement();
|
|
while (pos != NULL)
|
|
{
|
|
CCodeTypedElement *pElem = p->GetNextElement(pos);
|
|
ATLASSERT( pElem != NULL );
|
|
if (GetCurrentStructField()->GetName() == ((LPCSTR)pElem->GetSizeIs()))
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetCurrentFieldIndex()
|
|
{
|
|
CCodeStruct *p = GetCurrentStruct();
|
|
int nCntr = 0;
|
|
POSITION pos = p->GetFirstElement();
|
|
while ((pos != NULL) && (pos != m_currStructFieldPos))
|
|
{
|
|
nCntr++;
|
|
CCodeTypedElement *pElem = p->GetNextElement(pos);
|
|
if ((pElem->GetFlags() & CODEFLAG_DYNARRAY) && (pElem->GetSizeIs().GetLength()==0))
|
|
{
|
|
nCntr++;
|
|
}
|
|
}
|
|
m_writeHelper << nCntr;
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsFieldFixedArray()
|
|
{
|
|
return IsFixedArray(GetCurrentStructField());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldName()
|
|
{
|
|
return WriteCString(GetCurrentStructField()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldDimsDecl()
|
|
{
|
|
return GetDimsDecl(GetCurrentStructField());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldHashW()
|
|
{
|
|
return GetHashW(GetCurrentStructField()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldAtlSoapType()
|
|
{
|
|
return GetAtlSoapType(GetCurrentStructField());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructQName()
|
|
{
|
|
return WriteCString(GetCurrentStruct()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsFieldUDT()
|
|
{
|
|
return IsUDT(GetCurrentStructField());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldTypeSafeQName()
|
|
{
|
|
return WriteCString(GetCurrentStructField()->GetCodeTypeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructNameHashW()
|
|
{
|
|
return GetHashW(GetCurrentStruct()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructName()
|
|
{
|
|
return WriteCString(GetCurrentStruct()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldCount()
|
|
{
|
|
return (m_writeHelper.Write(GetCurrentStruct()->GetElementCount()) != FALSE) ? HTTP_SUCCESS : HTTP_FAIL;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetNextFunction()
|
|
{
|
|
if (m_currFunctionPos == NULL)
|
|
{
|
|
m_currFunctionPos = m_pProxy->GetFirstFunction();
|
|
m_nFuncIndex = 0;
|
|
}
|
|
else
|
|
{
|
|
m_pProxy->GetNextFunction(m_currFunctionPos);
|
|
m_nFuncIndex++;
|
|
}
|
|
|
|
if (m_currFunctionPos != NULL)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
m_nFuncIndex = 0;
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetNextParameter()
|
|
{
|
|
CCodeFunction *p = GetCurrentFunction();
|
|
|
|
if (m_currParameterPos == NULL)
|
|
{
|
|
m_nCntr = 0;
|
|
m_currParameterPos = p->GetFirstElement();
|
|
}
|
|
else
|
|
{
|
|
m_nCntr++;
|
|
p->GetNextElement(m_currParameterPos);
|
|
}
|
|
|
|
if (m_currParameterPos != NULL)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
m_nCntr = 0;
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsParameterFixedArray()
|
|
{
|
|
return IsFixedArray(GetCurrentParameter());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetClassSafeQName()
|
|
{
|
|
return WriteCString(m_pProxy->GetClassName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFunctionName()
|
|
{
|
|
return WriteCString(GetCurrentFunction()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterName()
|
|
{
|
|
CCodeTypedElement *p = GetCurrentParameter();
|
|
if (p->GetName() == "return")
|
|
{
|
|
return (m_pStream->WriteStream("__retval", sizeof("__retval")-1, NULL) == S_OK) ?
|
|
HTTP_SUCCESS : HTTP_FAIL;
|
|
}
|
|
|
|
return WriteCString(GetCurrentParameter()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterNameRaw()
|
|
{
|
|
return WriteCString(GetCurrentParameter()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterDimsDecl()
|
|
{
|
|
return GetDimsDecl(GetCurrentParameter());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterType()
|
|
{
|
|
return GetCppType(GetCurrentParameter());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsParameterDynamicArray()
|
|
{
|
|
if (GetCurrentParameter()->GetFlags() & CODEFLAG_DYNARRAY)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterSuffix()
|
|
{
|
|
return GetTypeSuffix(GetCurrentParameter());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsInParameter()
|
|
{
|
|
if (GetCurrentParameter()->GetFlags() & CODEFLAG_IN)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnHasRetval()
|
|
{
|
|
// meaningless for client side stuff
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetRetval()
|
|
{
|
|
// should never get called
|
|
ATLASSERT( FALSE );
|
|
return HTTP_FAIL;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterHashW()
|
|
{
|
|
return GetHashW(GetCurrentParameter()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterAtlSoapType()
|
|
{
|
|
return GetAtlSoapType(GetCurrentParameter());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsParameterNullable()
|
|
{
|
|
if ((GetCurrentParameter()->GetFlags() & CODEFLAG_NULLABLE) ||
|
|
(GetCurrentParameter()->GetXSDType() == XSDTYPE_STRING) ||
|
|
(GetCurrentParameter()->GetXSDType() == XSDTYPE_BASE64BINARY) ||
|
|
(GetCurrentParameter()->GetXSDType() == XSDTYPE_HEXBINARY) ||
|
|
(GetCurrentParameter()->GetFlags() & CODEFLAG_DYNARRAY))
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsOutParameter()
|
|
{
|
|
if (GetCurrentParameter()->GetFlags() & CODEFLAG_OUT)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsParameterUDT()
|
|
{
|
|
return IsUDT(GetCurrentParameter());
|
|
}
|
|
|
|
/*
|
|
HTTP_CODE CCppCodeGenerator::OnNotIsParameterUDT()
|
|
{
|
|
return (OnIsParameterUDT() == HTTP_SUCCESS) ? HTTP_S_FALSE : HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsRpcLiteralWithElement()
|
|
{
|
|
if ((GetCurrentParameter()->GetFlags() & (CODEFLAG_LITERAL | CODEFLAG_RPC | CODEFLAG_ELEMENT)) ==
|
|
(CODEFLAG_LITERAL | CODEFLAG_RPC | CODEFLAG_ELEMENT))
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnNotIsParameterUDT_AND_IsRpcLiteralWithElement()
|
|
{
|
|
return ((OnNotIsParameterUDT() == HTTP_SUCCESS) &&
|
|
(OnIsRpcLiteralWithElement() == HTTP_SUCCESS))
|
|
? HTTP_SUCCESS : HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterElementHashW()
|
|
{
|
|
CXSDElement *pXSDElement = GetCurrentParameter()->GetElement();
|
|
if (pXSDElement->GetElementType() == XSD_ELEMENT)
|
|
{
|
|
CElement *pElem = static_cast<CElement *>(pXSDElement);
|
|
return GetHashW(pElem->GetName());
|
|
}
|
|
EmitError(IDS_SDL_INTERNAL);
|
|
return HTTP_FAIL;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterElementName()
|
|
{
|
|
CXSDElement *pXSDElement = GetCurrentParameter()->GetElement();
|
|
if (pXSDElement->GetElementType() == XSD_ELEMENT)
|
|
{
|
|
CElement *pElem = static_cast<CElement *>(pXSDElement);
|
|
return WriteCString(pElem->GetName());
|
|
}
|
|
EmitError(IDS_SDL_INTERNAL);
|
|
return HTTP_FAIL;
|
|
}
|
|
*/
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterTypeQName()
|
|
{
|
|
return WriteCString(GetCurrentParameter()->GetCodeTypeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetSizeIsIndex()
|
|
{
|
|
// should never get called
|
|
ATLASSERT( FALSE );
|
|
return HTTP_FAIL;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetCurrentParameterIndex()
|
|
{
|
|
if (m_writeHelper.Write(m_nCntr++) != FALSE)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_FAIL;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnResetParameterIndex()
|
|
{
|
|
// nothing to do here on the client side
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnNotIsRetval()
|
|
{
|
|
// always true on the client side
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFunctionNameHashW()
|
|
{
|
|
return GetHashW(GetCurrentFunction()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFunctionResultNameHashW()
|
|
{
|
|
return GetHashW(GetCurrentFunction()->GetResponseName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFunctionResultName()
|
|
{
|
|
return WriteCString(GetCurrentFunction()->GetResponseName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFunctionSendName()
|
|
{
|
|
return WriteCString(GetCurrentFunction()->GetSendName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetExpectedParameterCount()
|
|
{
|
|
int nCnt = 0;
|
|
while (OnGetNextParameter() == HTTP_SUCCESS)
|
|
{
|
|
if (OnIsOutParameter() == HTTP_SUCCESS)
|
|
{
|
|
nCnt++;
|
|
}
|
|
}
|
|
|
|
if (m_writeHelper.Write(nCnt) != FALSE)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_FAIL;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsPAD()
|
|
{
|
|
return (GetCurrentFunction()->GetCallFlags() & CODEFLAG_PAD) ? HTTP_SUCCESS : HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsChain()
|
|
{
|
|
return (GetCurrentFunction()->GetCallFlags() & CODEFLAG_CHAIN) ? HTTP_SUCCESS : HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsPID()
|
|
{
|
|
return (GetCurrentFunction()->GetCallFlags() & CODEFLAG_PID) ? HTTP_SUCCESS : HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsDocument()
|
|
{
|
|
return (GetCurrentFunction()->GetCallFlags() & CODEFLAG_DOCUMENT) ? HTTP_SUCCESS : HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsRpc()
|
|
{
|
|
return (GetCurrentFunction()->GetCallFlags() & CODEFLAG_RPC) ? HTTP_SUCCESS : HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsOneWay()
|
|
{
|
|
return (GetCurrentFunction()->GetCallFlags() & CODEFLAG_ONEWAY) ? HTTP_SUCCESS : HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsLiteral()
|
|
{
|
|
return (GetCurrentFunction()->GetCallFlags() & CODEFLAG_LITERAL) ? HTTP_SUCCESS : HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsEncoded()
|
|
{
|
|
return (GetCurrentFunction()->GetCallFlags() & CODEFLAG_ENCODED) ? HTTP_SUCCESS : HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetClassName()
|
|
{
|
|
return WriteCString(m_pProxy->GetClassName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnNotIsParameterFixedArray()
|
|
{
|
|
return (IsFixedArray(GetCurrentParameter()) == HTTP_SUCCESS) ? HTTP_S_FALSE : HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnNotIsLastParameter()
|
|
{
|
|
CCodeFunction *p = GetCurrentFunction();
|
|
POSITION pos = m_currParameterPos;
|
|
p->GetNextElement(pos);
|
|
if (pos == NULL)
|
|
{
|
|
return HTTP_S_FALSE;
|
|
}
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterFixedArraySize()
|
|
{
|
|
CCodeTypedElement *p = GetCurrentParameter();
|
|
if (p->GetDims() != 0)
|
|
{
|
|
int i = 1;
|
|
for (int j=1; j<=p->GetDimension(0); j++)
|
|
{
|
|
i*= p->GetDimension(j);
|
|
}
|
|
|
|
if (m_writeHelper.Write(i) != FALSE)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
}
|
|
return HTTP_FAIL;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetDateTime()
|
|
{
|
|
SYSTEMTIME systime;
|
|
SYSTEMTIME loctime;
|
|
TIME_ZONE_INFORMATION tz;
|
|
memset(&systime, 0x00, sizeof(systime));
|
|
memset(&loctime, 0x00, sizeof(loctime));
|
|
memset(&tz, 0x00, sizeof(tz));
|
|
GetSystemTime(&systime);
|
|
GetTimeZoneInformation(&tz);
|
|
SystemTimeToTzSpecificLocalTime(&tz, &systime, &loctime);
|
|
|
|
char szDate[256];
|
|
int n = sprintf(szDate, "%.02d/%.02d/%d@%.02d:%.02d:%d",
|
|
loctime.wMonth, loctime.wDay, loctime.wYear, loctime.wHour,
|
|
loctime.wMinute, loctime.wSecond);
|
|
|
|
return (m_pStream->WriteStream(szDate, n, NULL) == S_OK) ? HTTP_SUCCESS : HTTP_FAIL;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetURL()
|
|
{
|
|
return WriteCString(m_pProxy->GetAddressUri());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetSoapAction()
|
|
{
|
|
CStringA m_strSoapAction = GetCurrentFunction()->GetSoapAction();
|
|
return WriteCString(m_strSoapAction);
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetNamespace()
|
|
{
|
|
return WriteCString(m_pProxy->GetTargetNamespace());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnEmitNamespace()
|
|
{
|
|
if (m_bEmitNamespace != false)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetCppNamespace()
|
|
{
|
|
ATLASSERT( m_bEmitNamespace != false );
|
|
|
|
if ((m_szNamespace != NULL) && (*m_szNamespace))
|
|
{
|
|
return WriteCString(CStringA(m_szNamespace));
|
|
//return (m_writeHelper.Write(m_szNamespace) == TRUE) ? HTTP_SUCCESS : HTTP_FAIL;
|
|
}
|
|
|
|
return WriteCString(m_pProxy->GetServiceName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnClassHasHeaders()
|
|
{
|
|
POSITION pos = m_pProxy->GetFirstHeader();
|
|
if (pos != NULL)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetNextMember()
|
|
{
|
|
if (m_currMemberPos == NULL)
|
|
{
|
|
m_currMemberPos = m_pProxy->GetFirstHeader();
|
|
}
|
|
else
|
|
{
|
|
m_pProxy->GetNextHeader(m_currMemberPos);
|
|
}
|
|
|
|
if (m_currMemberPos != NULL)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetMemberType()
|
|
{
|
|
return GetCppType(GetCurrentMember());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetMemberName()
|
|
{
|
|
return WriteCString(GetCurrentMember()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetMemberSuffix()
|
|
{
|
|
return GetTypeSuffix(GetCurrentMember());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsMemberFixedArray()
|
|
{
|
|
if (GetCurrentMember()->GetDims() != 0)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsMemberUDT()
|
|
{
|
|
if (GetCurrentMember()->GetCodeType() == CODETYPE_STRUCT)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsMemberEnum()
|
|
{
|
|
if (GetCurrentMember()->GetCodeType() == CODETYPE_ENUM)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetNextHeader()
|
|
{
|
|
CCodeFunction *p = GetCurrentFunction();
|
|
|
|
if (m_currHeaderPos == NULL)
|
|
{
|
|
m_currHeaderPos = p->GetFirstHeader();
|
|
}
|
|
else
|
|
{
|
|
p->GetNextHeader(m_currHeaderPos);
|
|
}
|
|
|
|
if (m_currHeaderPos != NULL)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsHeaderFixedArray()
|
|
{
|
|
return IsFixedArray(GetCurrentHeader());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetHeaderValue()
|
|
{
|
|
return WriteCString(GetCurrentHeader()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetHeaderDimsDecl()
|
|
{
|
|
return GetDimsDecl(GetCurrentHeader());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetHeaderHashW()
|
|
{
|
|
return GetHashW(GetCurrentHeader()->GetName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetHeaderAtlSoapType()
|
|
{
|
|
return GetAtlSoapType(GetCurrentHeader());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsInHeader()
|
|
{
|
|
if (GetCurrentHeader()->GetFlags() & CODEFLAG_IN)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsOutHeader()
|
|
{
|
|
if (GetCurrentHeader()->GetFlags() & CODEFLAG_OUT)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsRequiredHeader()
|
|
{
|
|
if (GetCurrentHeader()->GetFlags() & CODEFLAG_MUSTUNDERSTAND)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsHeaderNullable()
|
|
{
|
|
if (GetCurrentHeader()->GetXSDType() == XSDTYPE_STRING)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnIsHeaderUDT()
|
|
{
|
|
return IsUDT(GetCurrentHeader());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetHeaderTypeQName()
|
|
{
|
|
return WriteCString(GetCurrentHeader()->GetCodeTypeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetExpectedHeaderCount()
|
|
{
|
|
CCodeFunction *p = GetCurrentFunction();
|
|
POSITION pos = p->GetFirstHeader();
|
|
int nCnt = 0;
|
|
while (pos != NULL)
|
|
{
|
|
CCodeTypedElement *pElem = p->GetNextHeader(pos);
|
|
if (pElem->GetFlags() & CODEFLAG_MUSTUNDERSTAND)
|
|
{
|
|
nCnt++;
|
|
}
|
|
}
|
|
|
|
m_writeHelper << nCnt;
|
|
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnHeaderHasNamespace()
|
|
{
|
|
if (GetCurrentHeader()->GetNamespace().GetLength() != 0)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetHeaderNamespace()
|
|
{
|
|
return WriteCString(GetCurrentHeader()->GetNamespace());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetHeaderNamespaceHashW()
|
|
{
|
|
return GetHashW(GetCurrentHeader()->GetNamespace());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFunctionIndex()
|
|
{
|
|
m_writeHelper << m_nFuncIndex;
|
|
return HTTP_SUCCESS;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnEmitPragma()
|
|
{
|
|
if (m_bPragma != false)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumNamespaceHashW()
|
|
{
|
|
return GetHashW(GetCurrentEnum()->GetNamespace());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnEnumHasUniqueNamespace()
|
|
{
|
|
if (GetCurrentEnum()->GetNamespace() != m_pProxy->GetTargetNamespace())
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumNamespace()
|
|
{
|
|
return WriteCString(GetCurrentEnum()->GetNamespace());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructNamespaceHashW()
|
|
{
|
|
return GetHashW(GetCurrentStruct()->GetNamespace());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnStructHasUniqueNamespace()
|
|
{
|
|
if (GetCurrentStruct()->GetNamespace() != m_pProxy->GetTargetNamespace())
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructNamespace()
|
|
{
|
|
return WriteCString(GetCurrentStruct()->GetNamespace());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFunctionNamespaceHashW()
|
|
{
|
|
return GetHashW(GetCurrentFunction()->GetNamespace());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFunctionNamespace()
|
|
{
|
|
return WriteCString(GetCurrentFunction()->GetNamespace());
|
|
}
|
|
|
|
// safe-naming stuffs
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetHeaderTypeCppQName()
|
|
{
|
|
return WriteCString(GetCurrentHeader()->GetSafeCodeTypeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetMemberCppType()
|
|
{
|
|
return GetSafeCppType(GetCurrentMember());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetMemberCppName()
|
|
{
|
|
return WriteCString(GetCurrentMember()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterTypeCppQName()
|
|
{
|
|
return WriteCString(GetCurrentParameter()->GetSafeCodeTypeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetFunctionCppName()
|
|
{
|
|
return WriteCString(GetCurrentFunction()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterCppName()
|
|
{
|
|
CCodeTypedElement *p = GetCurrentParameter();
|
|
if (p->GetName() == "return")
|
|
{
|
|
return (m_pStream->WriteStream("__retval", sizeof("__retval")-1, NULL) == S_OK) ?
|
|
HTTP_SUCCESS : HTTP_FAIL;
|
|
}
|
|
|
|
return WriteCString(GetCurrentParameter()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetParameterCppType()
|
|
{
|
|
return GetSafeCppType(GetCurrentParameter());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldCppName()
|
|
{
|
|
return WriteCString(GetCurrentStructField()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructCppQName()
|
|
{
|
|
return WriteCString(GetCurrentStruct()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructCppName()
|
|
{
|
|
return WriteCString(GetCurrentStruct()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructSafeCppQName()
|
|
{
|
|
return WriteCString(GetCurrentStruct()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldCppType()
|
|
{
|
|
return GetSafeCppType(GetCurrentStructField());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumCppName()
|
|
{
|
|
return WriteCString(GetCurrentEnum()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumSafeCppQName()
|
|
{
|
|
return WriteCString(GetCurrentEnum()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumElementCppName()
|
|
{
|
|
return WriteCString(GetCurrentEnumElement()->GetSafeCodeTypeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetStructFieldTypeSafeCppQName()
|
|
{
|
|
return WriteCString(GetCurrentStructField()->GetSafeCodeTypeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetHeaderCppValue()
|
|
{
|
|
return WriteCString(GetCurrentHeader()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGetEnumCppQName()
|
|
{
|
|
return WriteCString(GetCurrentEnum()->GetSafeName());
|
|
}
|
|
|
|
HTTP_CODE CCppCodeGenerator::OnGenProxy()
|
|
{
|
|
if (m_bGenProxy != false)
|
|
{
|
|
return HTTP_SUCCESS;
|
|
}
|
|
return HTTP_S_FALSE;
|
|
}
|