//----------------------------------------------------------------------------
//
//  Copyright (C) Intel Corporation, 2003 - 2007.
//
//  File:       WsmanClient.h 
//
//  Contents:   A WS-MAN client interface
//
//----------------------------------------------------------------------------

#ifndef __WSMAN_CLIENT_INTERFACE
#define __WSMAN_CLIENT_INTERFACE

#include <string>
#include <vector>
#include <map>
#include "Exception.h"
#include "WsmanFilter.h"

using namespace std;
using namespace WsmanExceptionNamespace;

namespace WsmanClientNamespace
{
	// WS-MAN Client exceptions
	// Exception thrown when server error occurs
	class WsmanClientException : public GeneralWsmanException
	{
	public:
		WsmanClientException(const char* message,
			unsigned int err = WSMAN_GENERAL_ERROR)
			:GeneralWsmanException(message, err){}
		virtual ~WsmanClientException() throw() {}
	};

	// Exception thrown if the server returned a soap fault
	class WsmanSoapFault : public WsmanClientException
	{
	private:		
		string soapCodeValue;
		string soapSubcodeValue;
		string soapReason;
		string soapDetail;
	public:
		WsmanSoapFault(const char* message,
			const string& faultCode = "",
			const string& faultSubcode = "",
			const string& faultReason = "", 
			const string& faultDetail = "")
			:WsmanClientException(message, WSMAN_SOAP_FAULT)
		{
			SetWsmanFaultFields(faultCode, faultSubcode, faultReason, faultDetail);
		}
		virtual ~WsmanSoapFault() throw() {}		
		void SetWsmanFaultFields(const string& faultCode,
			const string& faultSubcode,
			const string& faultReason,
			const string& faultDetail) throw()
		{
			soapCodeValue = faultCode;
			soapSubcodeValue = faultSubcode;
			soapReason = faultReason;
			soapDetail = faultDetail;
		}
		string GetFaultCode() const throw() {return soapCodeValue;}
		string GetFaultSubcode() const throw() {return soapSubcodeValue;}
		string GetFaultReason() const throw() {return soapReason;}
		string GetFaultDetail() const throw() {return soapDetail;}
	};

	typedef enum {
		WSMAN_DELIVERY_PUSH = 0,
		WSMAN_DELIVERY_PUSHWITHACK,
		WSMAN_DELIVERY_EVENTS,
		WSMAN_DELIVERY_PULL
	}NotificationDeliveryMode;

	typedef struct __SubscribeInfo{
		string filter;
		string dialect;
		string delivery_uri;
		string refenceParam;
		NotificationDeliveryMode delivery_mode;
		NameValuePairs *selectorset;
		float heartbeat_interval;
		float expires;
	}SubscribeInfo;

	// Wsman Client Interface class
	class WsmanClient
	{
	public:
		// Destructor.
		virtual ~WsmanClient(){}

		// Identify
		virtual string Identify() const = 0;
		
		// Creates a new instance of a resource.
		virtual string Create(const string &resourceUri, const string &xmlData) const = 0;

		// Delete a resource.
		virtual void Delete(const string &resourceUri, const NameValuePairs *s = NULL) const = 0;

		// Enumerate a resource. 
		virtual void Enumerate(const string &resourceUri, vector<string> &enumRes, const NameValuePairs *s = NULL) const = 0;

		//Enumerate2
		virtual void Enumerate(const string &resourceUri, WsmanFilter &filter, vector<string> &enumRes) const = 0;

		// Retrieve a resource.
		virtual string Get(const string &resourceUri, const NameValuePairs *s = NULL) const = 0;

		// Update a resource.
		virtual string Put(const string &resourceUri, const string &content, const NameValuePairs *s = NULL) const = 0;

		// Invokes a method and returns the results of the method call.
		virtual string Invoke(const string &resourceUri, const string &methodName, const string &content, const NameValuePairs *s = NULL) const = 0;

		// Submit a subscription
		virtual string Subscribe(const string &resourceUri, const SubscribeInfo &info, string &subsContext) const = 0;

		// Renew a subscription
		virtual string Renew(const string &resourceUri, const string &subsContext, float expire, const NameValuePairs *s = NULL) const = 0;

		// Terminate a subscription
		virtual void Unsubscribe(const string &resourceUri, const string &subsContext, const NameValuePairs *s = NULL) const = 0;
	};
} // namespace WsmanClientNamespace
#endif
