// WMSOAPWSDLClient.h: interface for the WMSOAPWSDLClient class.
//
//////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2003 Robert Cunnings. All rights reserved.
//
// You may copy, modify, distribute or publish this code free of charge.
//
// NO WARRANTY: This software is provided AS IS, without warranty of any kind.
//
//////////////////////////////////////////////////////////////////////
//
// WMSOAPWSDLClient class - implementation of WSDL client class
//  
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WMSOAPWSDLCLIENT_H__16BB52ED_9A58_4F27_95C0_02F76F9D5C5F__INCLUDED_)
#define AFX_WMSOAPWSDLCLIENT_H__16BB52ED_9A58_4F27_95C0_02F76F9D5C5F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "WMWSDLParser.h"
#include "WMSOAPBindingHandlers.h"

class WMSOAPWSDLClient : public WMWSDLParser  
{
public:
	WMSOAPWSDLClient();
	virtual ~WMSOAPWSDLClient();

	// get and parse WSDL file
	bool ReadServiceDesc(   const wstring& wstrServiceName,
							const wstring& wstrPortName,
							const string& strWSDLFileURL);
	// soap binding queries
	bool GetMethodSOAPAction(const wstring& wstrMethod, wstring& wstrSOAPAction);
	bool SOAPActionRequired(const wstring& wstrOpName, bool& bIsRequired);
	bool GetMethodNamespaceURI(const wstring& wstrMethod, wstring& wstrSOAPMethodNS);
	const wstring& GetSOAPSvcHost() { return m_wstrSOAPHost; }
	const wstring& GetSOAPSvcURI() { return m_wstrSOAPSvcURI; }
	int GetSOAPSvcPortNbr() { return m_nSOAPHTTPPort; }
	bool GetSOAPInputBodyUse(const wstring& wstrOpName, wstring& wstrUse);
	bool GetSOAPOutputBodyUse(const wstring& wstrOpName, wstring& wstrUse);
	bool GetSOAPInputBodyEncStyle(const wstring& wstrOpName, wstring& wstrEncStyle);
	bool GetSOAPOutputBodyEncStyle(const wstring& wstrOpName, wstring& wstrEncStyle);
	bool GetSOAPBindingStyle(wstring& wstrStyle);
	bool GetSOAPBindingTransport(wstring& wstrTransport);
	bool GetSOAPBindingVersion(wstring& wstrVersionURI);
	bool GetOpNamesBySOAPAction(const wstring& wstrSOAPAction,
								wstring& wstrOpName,
								wstring& wstrOpNS);
	bool GetOpBindingStyle(const wstring& wstrOpName, wstring& wstrStyle);
	bool IsOperationParam(const wstring& wstrMethod, const wstring& wstrParam);

	// message part queries
	bool GetInputMsgPartType(   const wstring& wstrOpName,
								const wstring& wstrPartName,
								wstring& wstrType,
								wstring& wstrTypeNS);
	bool GetOutputMsgPartType(  const wstring& wstrOpName,
								const wstring& wstrPartName,
								wstring& wstrType,
								wstring& wstrTypeNS);
	bool GetOperationReturnType(const wstring& wstrOpName,
								const wstring& wstrPartName,
								wstring& wstrType,
								wstring& wstrTypeNS);
	bool GetInputHeaderPartType(const wstring& wstrOpName,
								const wstring& wstrPartName,
								const wstring& wstrPartNS,
								wstring& wstrType,
								wstring& wstrTypeNS);
	bool GetOutputHeaderPartType(const wstring& wstrOpName,
								const wstring& wstrPartName,
								const wstring& wstrPartNS,
								wstring& wstrType,
								wstring& wstrTypeNS);
	bool GetInputHeaderPartEncStyle(const wstring& wstrOpName,
								    const wstring& wstrPartName,
								    const wstring& wstrPartNS,
								    wstring& wstrEncStyle);
	bool GetOutputHeaderPartEncStyle(const wstring& wstrOpName,
								    const wstring& wstrPartName,
								    const wstring& wstrPartNS,
								    wstring& wstrEncStyle);
	bool GetInHeaderFaultPartEncStyle(  const wstring& wstrOpName,
									    const wstring& wstrPartName,
									    const wstring& wstrPartNS,
									    wstring& wstrEncStyle);
	bool GetOutHeaderFaultPartEncStyle( const wstring& wstrOpName,
									    const wstring& wstrPartName,
									    const wstring& wstrPartNS,
									    wstring& wstrEncStyle);
	bool GetInHeaderFaultPartType(  const wstring& wstrOpName,
									const wstring& wstrPartName,
									const wstring& wstrPartNS,
									wstring& wstrType,
									wstring& wstrTypeNS);
	bool GetOutHeaderFaultPartType( const wstring& wstrOpName,
									const wstring& wstrPartName,
									const wstring& wstrPartNS,
									wstring& wstrType,
									wstring& wstrTypeNS);
	bool GetFaultDetailPartType(const wstring& wstrOpName,
								const wstring& wstrPartName,
								const wstring& wstrPartNS,
								wstring& wstrType,
								wstring& wstrTypeNS);
    bool GetFaultDetailEncStyle(const wstring& wstrOpName,
								const wstring& wstrPartName,
								const wstring& wstrPartNS,
								wstring& wstrEncStyle);
    bool GetFaultDetailUse( const wstring& wstrOpName,
							const wstring& wstrPartName,
							const wstring& wstrPartNS,
							wstring& wstrUse);
	bool IsInputMsgPart(const wstring& wstrOpName, const wstring& wstrPartName);
	bool IsOutputMsgPart(const wstring& wstrOpName, const wstring& wstrPartName);
	bool GetFirstInParamName(const wstring& wstrOpName, wstring& wstrName, long& lPosition);
	bool GetNextInParamName(const wstring& wstrOpName, wstring& wstrName, long& lPosition);
	bool GetFirstOutParamName(const wstring& wstrOpName, wstring& wstrName, long& lPosition);
	bool GetNextOutParamName(const wstring& wstrOpName, wstring& wstrName, long& lPosition);
	bool GetOperationParamIndex(const wstring& wstrMethod, const wstring& wstrParam, long *lIndex);
	bool GetHeaderElemType( const wstring& wstrElemName,
							const wstring& wstrElemNS,
							wstring& wstrType,
							wstring& wstrTypeNS);
	bool GetArrayType(  const wstring& wstrArrayName,
						const wstring& wstrArrayNS,
						wstring& wstrType,
						wstring& wstrTypeNS);
	bool GetArrayTypeLit(   const wstring& wstrArrayName,
						    const wstring& wstrArrayNS,
						    wstring& wstrItemType,
						    wstring& wstrItemTypeNS,
                            wstring& wstrItemName,
                            wstring& wstrItemNS);
	bool GetArrayDims(  const wstring& wstrArrayName,
						const wstring& wstrArrayNS,
						unsigned int& nDims);
	bool GetComplexBaseType(const wstring& wstrName,
							const wstring& wstrNS,
							wstring& wstrBaseType,
							wstring& wstrBaseTypeNS);
	bool GetStructMemberType(   const wstring& wstrStructName,
								const wstring& wstrStructNS,
								const wstring& wstrMemberName,
								const wstring& wstrMemberNS,
								wstring& wstrType,
								wstring& wstrTypeNS);


	// definitions target namespace
	const wstring& GetDefinitionsTNS();

	// for http requests
	void SetUserAgent(const string& strAgent) { m_strUserAgent = strAgent; }
	const string& GetUserAgent() { return m_strUserAgent; }
	void SetHTTPTimeout(int nPeriod) { m_nHTTPTimeout = nPeriod; }
	void SetHTTPHeaders(const string& strHeaders) { m_strHTTPHeaders = strHeaders; }

protected:

	// helpers
	WMSOAPBindingHandler *GetSOAPBinding();
	WMMessageHandler *GetInputMessage(const wstring& wstrMethod);
	WMMessageHandler *GetOutputMessage(const wstring& wstrMethod);

	// client info
	string	    m_strUserAgent;
	string	    m_strHTTPHeaders;
	int		    m_nHTTPTimeout;
	// used to query WSDL file
	wstring	    m_wstrServiceName;
	wstring	    m_wstrPortName;
	// query results from WSDL file
	wstring     m_wstrSOAPAddress;
	wstring     m_wstrSOAPHost;
	wstring     m_wstrSOAPSvcURI;
	int		    m_nSOAPHTTPPort;
};

class WMSOAPWSDLImporter : public WMSOAPWSDLClient  
{
public:
	WMSOAPWSDLImporter();
	virtual ~WMSOAPWSDLImporter();

	// get and parse WSDL file
	bool ReadServiceDesc(const string& strWSDLFileURL, const string& strDocBase);
};

#endif // !defined(AFX_WMSOAPWSDLCLIENT_H__16BB52ED_9A58_4F27_95C0_02F76F9D5C5F__INCLUDED_)
