//----------------------------------------------------------------------------
//
//  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 std::string;
using std::vector;
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;
		virtual string GetWithFlags(
			const string &resourceUri,
			const NameValuePairs *s = NULL,
			unsigned long flags = 0) const = 0;

		// Update a resource.
		virtual string Put(
			const string &resourceUri,
			const string &content,
			const NameValuePairs *s = NULL) const = 0;
		virtual string PutWithFlags(
			const string &resourceUri,
			const string &content,
			const NameValuePairs *s = NULL,
			unsigned long flags = 0) 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
