//----------------------------------------------------------------------------
//
//  Copyright (C) Intel Corporation, 2003 - 2007.
//            (C) Red Hat, Inc, 2015
//
//  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"
#include "WsmanOptions.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 = string(),
			const string &faultSubcode = string(),
			const string &faultReason = string(),
			const string &faultDetail = string())
			: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;}
	};

        // Exception throw if a resource is not found
        class WsmanResourceNotFound : public WsmanClientException
        {
        public:
                WsmanResourceNotFound(const char *message)
                    : WsmanClientException(message, WSMAN_RESOURCE_NOT_FOUND)
                {
                }
                virtual ~WsmanResourceNotFound() throw() {}
        };

	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;
		virtual void Enumerate(
			const string &resourceUri,
			WsmanFilter & filter,
			vector<string> &enumRes) const = 0;
		virtual void Enumerate(
			const string &resourceUri,
			vector<string> &enumRes,
			const WsmanOptions &options,
			const WsmanFilter &filter = WsmanFilter()) const = 0;

		// Retrieve a resource.
		virtual string Get(
			const string &resourceUri,
			const WsmanOptions &options) const = 0;
		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 WsmanOptions &options) const = 0;
		virtual string Invoke(
			const string &resourceUri,
			const string &methodName,
			const string &content,
			const WsmanOptions &options) const = 0;
		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
