302 lines
7.0 KiB
C++
302 lines
7.0 KiB
C++
//
|
|
// WSDLOperationIOParser.cpp
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "Util.h"
|
|
|
|
#include "WSDLOperationIOParser.h"
|
|
|
|
#include "WSDLPortTypeIO.h"
|
|
#include "Attribute.h"
|
|
#include "Content.h"
|
|
#include "Element.h"
|
|
#include "ComplexType.h"
|
|
#include "Emit.h"
|
|
#include "resource.h"
|
|
|
|
TAG_METHOD_IMPL(CWSDLOperationIOParser, OnSoapBody)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
CWSDLPortTypeIO * pCurr = GetIO();
|
|
if (pCurr != NULL)
|
|
{
|
|
CSoapBody *pBody = pCurr->AddSoapBody();
|
|
if (pBody != NULL)
|
|
{
|
|
SetXMLElementInfo(pBody, pCurr, GetLocator());
|
|
|
|
const wchar_t *wszValue;
|
|
int cchValue;
|
|
if (S_OK == GetAttribute(pAttributes, L"use", sizeof("use")-1, &wszValue, &cchValue))
|
|
{
|
|
if (S_OK != pBody->SetUse(wszValue, cchValue))
|
|
{
|
|
EmitInvalidValue("use", wszValue);
|
|
}
|
|
}
|
|
if (S_OK == GetAttribute(pAttributes, L"parts", sizeof("parts")-1, &wszValue, &cchValue))
|
|
{
|
|
pBody->SetParts(wszValue, cchValue);
|
|
}
|
|
|
|
if (S_OK == GetAttribute(pAttributes, L"encodingStyle", sizeof("encodingStyle")-1, &wszValue, &cchValue))
|
|
{
|
|
pBody->SetEncodingStyle(wszValue, cchValue);
|
|
}
|
|
|
|
if (S_OK == GetAttribute(pAttributes, L"namespace", sizeof("namespace")-1, &wszValue, &cchValue))
|
|
{
|
|
pBody->SetNamespace(wszValue, cchValue);
|
|
}
|
|
}
|
|
|
|
return SkipElement();
|
|
}
|
|
|
|
EmitErrorHr(E_OUTOFMEMORY);
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
TAG_METHOD_IMPL(CWSDLOperationIOParser, OnSoapHeader)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
CWSDLPortTypeIO * pCurr = GetIO();
|
|
if (pCurr != NULL)
|
|
{
|
|
CSoapHeader *pElem = pCurr->AddSoapHeader();
|
|
if (pElem != NULL)
|
|
{
|
|
SetXMLElementInfo(pElem, pCurr, GetLocator());
|
|
const wchar_t *wszValue = NULL;
|
|
int cchValue = 0;
|
|
|
|
// message, part, and use are all required attributes
|
|
if (S_OK == GetAttribute(pAttributes, L"message", sizeof("message")-1, &wszValue, &cchValue))
|
|
{
|
|
pElem->SetMessage(wszValue, cchValue);
|
|
if (S_OK == GetAttribute(pAttributes, L"part", sizeof("part")-1, &wszValue, &cchValue))
|
|
{
|
|
pElem->SetParts(wszValue, cchValue);
|
|
if (S_OK == GetAttribute(pAttributes, L"use", sizeof("use")-1, &wszValue, &cchValue))
|
|
{
|
|
if (S_OK == pElem->SetUse(wszValue, cchValue))
|
|
{
|
|
// encodingStyle, namespace, and required are optional attributes
|
|
if (S_OK == GetAttribute(pAttributes, L"encodingStyle", sizeof("encodingStyle")-1, &wszValue, &cchValue))
|
|
{
|
|
pElem->SetEncodingStyle(wszValue, cchValue);
|
|
}
|
|
if (S_OK == GetAttribute(pAttributes, L"namespace", sizeof("namespace")-1, &wszValue, &cchValue))
|
|
{
|
|
pElem->SetNamespace(wszValue, cchValue);
|
|
}
|
|
if (S_OK == GetAttribute(pAttributes, L"required",
|
|
sizeof("required")-1, &wszValue, &cchValue, WSDL_NAMESPACEW, sizeof(WSDL_NAMESPACEA)-1))
|
|
{
|
|
bool bVal;
|
|
if (S_OK == GetBooleanValue(&bVal, wszValue, cchValue))
|
|
{
|
|
pElem->SetRequired(bVal);
|
|
}
|
|
else
|
|
{
|
|
EmitInvalidValue("required", wszValue);
|
|
}
|
|
}
|
|
|
|
return SkipElement();
|
|
}
|
|
EmitInvalidValue("use", wszValue);
|
|
}
|
|
else
|
|
{
|
|
OnMissingAttribute(TRUE, L"use", sizeof("use")-1, L"", 0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
OnMissingAttribute(TRUE, L"part", sizeof("part")-1, L"", 0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
OnMissingAttribute(TRUE, L"message", sizeof("message")-1, L"", 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
EmitErrorHr(E_OUTOFMEMORY);
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
TAG_METHOD_IMPL(CWSDLOperationIOParser, OnSoapHeaderFault)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
// REVIEW: output warning here (probably not necessary)?
|
|
return SkipElement();
|
|
}
|
|
|
|
TAG_METHOD_IMPL(CWSDLOperationIOParser, OnSoapFault)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
CWSDLPortTypeIO * pCurr = GetIO();
|
|
if (pCurr != NULL)
|
|
{
|
|
CSoapFault *pElem = pCurr->AddSoapFault();
|
|
if (pElem != NULL)
|
|
{
|
|
SetXMLElementInfo(pElem, pCurr, GetLocator());
|
|
|
|
const wchar_t *wszValue = NULL;
|
|
int cchValue = 0;
|
|
|
|
// name and use are required attributes
|
|
if (S_OK == GetAttribute(pAttributes, L"name", sizeof("name")-1, &wszValue, &cchValue))
|
|
{
|
|
pElem->SetName(wszValue, cchValue);
|
|
if (S_OK == GetAttribute(pAttributes, L"use", sizeof("use")-1, &wszValue, &cchValue))
|
|
{
|
|
if (S_OK == pElem->SetUse(wszValue, cchValue))
|
|
{
|
|
// encodingStyle and namespace are optional attributes
|
|
if (S_OK == GetAttribute(pAttributes, L"encodingStyle", sizeof("encodingStyle")-1, &wszValue, &cchValue))
|
|
{
|
|
pElem->SetEncodingStyle(wszValue, cchValue);
|
|
}
|
|
if (S_OK == GetAttribute(pAttributes, L"namespace", sizeof("namespace")-1, &wszValue, &cchValue))
|
|
{
|
|
pElem->SetNamespace(wszValue, cchValue);
|
|
}
|
|
|
|
return SkipElement();
|
|
}
|
|
EmitInvalidValue("use", wszValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
EmitErrorHr(E_OUTOFMEMORY);
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
TAG_METHOD_IMPL(CWSDLOperationIOParser, OnMimeContent)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
EmitSkip(wszNamespaceUri, wszLocalName);
|
|
|
|
return SkipElement();
|
|
}
|
|
|
|
TAG_METHOD_IMPL(CWSDLOperationIOParser, OnMimeXML)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
EmitSkip(wszNamespaceUri, wszLocalName);
|
|
|
|
return SkipElement();
|
|
}
|
|
|
|
TAG_METHOD_IMPL(CWSDLOperationIOParser, OnMimeMultipartRelated)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
EmitSkip(wszNamespaceUri, wszLocalName);
|
|
|
|
return SkipElement();
|
|
}
|
|
|
|
TAG_METHOD_IMPL(CWSDLOperationIOParser, OnHttpUrlEncoded)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
EmitSkip(wszNamespaceUri, wszLocalName);
|
|
|
|
return SkipElement();
|
|
}
|
|
|
|
TAG_METHOD_IMPL(CWSDLOperationIOParser, OnDocumentation)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
EmitSkip(wszNamespaceUri, wszLocalName);
|
|
|
|
return SkipElement();
|
|
}
|
|
|
|
ATTR_METHOD_IMPL(CWSDLOperationIOParser, OnName)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
CWSDLPortTypeIO * pCurr = GetIO();
|
|
if (pCurr != NULL)
|
|
{
|
|
return pCurr->SetName(wszValue, cchValue);
|
|
}
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
ATTR_METHOD_IMPL(CWSDLOperationIOParser, OnMessage)
|
|
{
|
|
TRACE_PARSE_ENTRY();
|
|
|
|
CWSDLPortTypeIO * pCurr = GetIO();
|
|
if (pCurr != NULL)
|
|
{
|
|
return pCurr->SetMessage(wszValue, cchValue);
|
|
}
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT __stdcall CWSDLOperationIOParser::startPrefixMapping(
|
|
const wchar_t *wszPrefix,
|
|
int cchPrefix,
|
|
const wchar_t *wszUri,
|
|
int cchUri)
|
|
{
|
|
CWSDLPortTypeIO * pCurr = GetIO();
|
|
if (pCurr != NULL)
|
|
{
|
|
return pCurr->SetNamespaceUri(wszPrefix, cchPrefix, wszUri, cchUri);
|
|
}
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT CWSDLOperationIOParser::OnUnrecognizedTag(
|
|
const wchar_t *wszNamespaceUri, int cchNamespaceUri,
|
|
const wchar_t *wszLocalName, int cchLocalName,
|
|
const wchar_t * /*wszQName*/, int /*cchQName*/,
|
|
ISAXAttributes * /*pAttributes*/) throw()
|
|
{
|
|
CWSDLPortTypeIO * pCurr = GetIO();
|
|
if (pCurr != NULL)
|
|
{
|
|
int nLine;
|
|
int nCol;
|
|
GetLocator()->getLineNumber(&nLine);
|
|
GetLocator()->getColumnNumber(&nCol);
|
|
|
|
EmitFileWarning(IDS_SDL_SKIP_EXTENSIBILITY,
|
|
pCurr->GetParentDocument()->GetDocumentUri(),
|
|
nLine,
|
|
nCol,
|
|
0,
|
|
wszNamespaceUri,
|
|
wszLocalName);
|
|
}
|
|
return SkipElement();
|
|
} |