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

319 lines
5.5 KiB
C++

//
// WSDLSoapElement.h
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
#pragma once
#include "stdafx.h"
#include "XMLElement.h"
#include "QName.h"
#include "Emit.h"
// this file contains common definitions for
// soap:header
// soap:headerfault
// soap:body
// soap:fault
enum SOAPUSE
{
SOAPUSE_UNK = -1,
SOAPUSE_LITERAL,
SOAPUSE_ENCODED
};
inline SOAPUSE GetSoapUse(const wchar_t *wsz, int cch)
{
struct _soapuse
{
wchar_t *wsz;
int cch;
SOAPUSE soapuse;
};
SOAPUSE retUse = SOAPUSE_UNK;
// data driven is kind of overkill for two options, but makes it
// easy to extend later
static const _soapuse s_uses[] =
{
{ L"literal", sizeof("literal")-1, SOAPUSE_LITERAL },
{ L"encoded", sizeof("encoded")-1, SOAPUSE_ENCODED }
};
for (int i=0; i<(sizeof(s_uses)/sizeof(s_uses[0])); i++)
{
if (cch == s_uses[i].cch && !wcsncmp(wsz, s_uses[i].wsz, cch))
{
retUse = s_uses[i].soapuse;
break;
}
}
return retUse;
}
enum SOAPSTYLE
{
SOAPSTYLE_UNK = -1,
SOAPSTYLE_RPC,
SOAPSTYLE_DOC
};
inline SOAPSTYLE GetStyle(const wchar_t *wsz, int cch)
{
struct _style
{
wchar_t * wszStyle;
int cchStyle;
SOAPSTYLE style;
};
static const _style s_styles[] =
{
{ L"rpc", sizeof("rpc")-1, SOAPSTYLE_RPC },
{ L"document", sizeof("document")-1, SOAPSTYLE_DOC }
};
for (int i=0; i<(sizeof(s_styles)/sizeof(s_styles[0])); i++)
{
if (cch == s_styles[i].cchStyle && !wcsncmp(wsz, s_styles[i].wszStyle, cch))
{
return s_styles[i].style;
}
}
return SOAPSTYLE_UNK;
}
// forward declaration of CWSDLMessage
class CWSDLMessage;
// CWSDLSoapElement is the common base class for
// soap:header
// soap:headerfault
// soap:body
// soap:fault
class CWSDLSoapElement : public CXMLElement
{
private:
SOAPUSE m_use;
CStringW m_strEncodingStyle;
CStringW m_strNamespace;
public:
CWSDLSoapElement()
: m_use(SOAPUSE_UNK)
{
}
inline HRESULT SetUse(const wchar_t *wszName, int cchName)
{
if (!wszName)
{
return E_FAIL;
}
m_use = GetSoapUse(wszName, cchName);
return (m_use != SOAPUSE_UNK) ? S_OK : E_FAIL;
}
inline HRESULT SetUse(const CStringW& strName)
{
return (GetSoapUse(strName, strName.GetLength()) != SOAPUSE_UNK) ? S_OK : E_FAIL;
}
inline const SOAPUSE GetUse()
{
return m_use;
}
inline HRESULT SetNamespace(const wchar_t *wszName, int cchName)
{
if (!wszName)
{
return E_FAIL;
}
m_strNamespace.SetString(wszName, cchName);
return S_OK;
}
inline HRESULT SetNamespace(const CStringW& strName)
{
m_strNamespace = strName;
return S_OK;
}
inline CStringW& GetNamespace()
{
return m_strNamespace;
}
inline HRESULT SetEncodingStyle(const wchar_t *wszName, int cchName)
{
if (!wszName)
{
return E_FAIL;
}
m_strEncodingStyle.SetString(wszName, cchName);
return S_OK;
}
inline HRESULT SetEncodingStyle(const CStringW& strName)
{
m_strEncodingStyle = strName;
return S_OK;
}
inline CStringW& GetEncodingStyle()
{
return m_strEncodingStyle;
}
}; // class CWSDLSoapElement
// CWSDLSoapElementEx is an extended base class for
// soap:body
// soap:header
// soap:headerfault
class CWSDLSoapElementEx : public CWSDLSoapElement
{
private:
CStringW m_strParts;
public:
inline HRESULT SetParts(const wchar_t *wszName, int cchName)
{
if (!wszName)
{
return E_FAIL;
}
m_strParts.SetString(wszName, cchName);
return S_OK;
}
inline HRESULT SetParts(const CStringW& strName)
{
m_strParts = strName;
return S_OK;
}
inline CStringW& GetParts()
{
return m_strParts;
}
};
class CWSDLMessage;
// CWSDLSoapHeaderElement is an extended class for
// soap:header
// soap:headerfault
class CWSDLSoapHeaderElement : public CWSDLSoapElementEx
{
private:
CQName m_message;
CWSDLMessage *m_pMessage;
bool m_bRequired;
public:
CWSDLSoapHeaderElement()
: m_pMessage(NULL), m_bRequired(false)
{
}
inline HRESULT SetMessage(const CStringW& strQName)
{
m_message.SetQName(strQName);
return S_OK;
}
inline HRESULT SetMessage(const CStringW& strPrefix, const CStringW& strName)
{
m_message.SetQName(strPrefix, strName);
return S_OK;
}
inline HRESULT SetMessage(const wchar_t *wszQName, int cchQName)
{
m_message.SetQName(wszQName, cchQName);
return S_OK;
}
inline CQName& GetMessageName()
{
return m_message;
}
// TODO: determine how/when these get set
inline void SetRequired(bool bRequired)
{
m_bRequired = bRequired;
}
inline bool GetRequired()
{
return m_bRequired;
}
CWSDLMessage * GetMessage();
}; // class CWSDLSoapHeaderElement
// CWSDLSoapFaultElement is an extended class for
// soap:fault
class CWSDLSoapFaultElement : public CWSDLSoapElement
{
private:
CStringW m_strName;
public:
inline HRESULT SetName(const wchar_t *wszName, int cchName)
{
if (!wszName)
{
return E_FAIL;
}
m_strName.SetString(wszName, cchName);
return S_OK;
}
inline HRESULT SetName(const CStringW& strName)
{
m_strName = strName;
return S_OK;
}
inline CStringW& GetName()
{
return m_strName;
}
}; // class CWSDLSoapFaultElement
typedef CWSDLSoapElementEx CSoapBody;
typedef CWSDLSoapHeaderElement CSoapHeader;
typedef CWSDLSoapHeaderElement CSoapHeaderFault;
typedef CWSDLSoapFaultElement CSoapFault;