/*******************************************************************************
 * Copyright (C) 2004-2006 Intel Corp. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 *  - Neither the name of Intel Corp. nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/

/**
 * @author Anas Nashif
 */

#ifndef WSMANCLIENT_API_H_
#define WSMANCLIENT_API_H_


#ifdef __cplusplus
extern "C" {
#endif				/* __cplusplus */

#include "u/libu.h"
#include "wsman-xml-api.h"
#include "wsman-names.h"
#include "wsman-types.h"
#include "wsman-xml-serializer.h"
#include "wsman-epr.h"
#include "wsman-filter.h"

/**
 * @defgroup Client Client
 * @brief WS-Management Client
 *
 * @{
 */


// Possible authentication methods

typedef enum {
    WS_NO_AUTH,
    WS_BASIC_AUTH,
    WS_DIGEST_AUTH,
    WS_PASS_AUTH,
    WS_NTLM_AUTH,
    WS_GSSNEGOTIATE_AUTH,
    WS_MAX_AUTH,
} wsman_auth_type_t;

	struct _WsManClient;
	typedef struct _WsManClient WsManClient;

        typedef void (*wsman_auth_request_func_t)( WsManClient *client, wsman_auth_type_t t,
                    char **usr,
                    char **pwd);

	typedef enum {
		WS_LASTERR_OK = 0,
		WS_LASTERR_OTHER_ERROR,	// not recognized error
		WS_LASTERR_FAILED_INIT,
		WS_LASTERR_UNSUPPORTED_PROTOCOL,
		WS_LASTERR_URL_MALFORMAT,
		WS_LASTERR_COULDNT_RESOLVE_PROXY,
		WS_LASTERR_COULDNT_RESOLVE_HOST,
		WS_LASTERR_COULDNT_CONNECT,
		WS_LASTERR_HTTP_RETURNED_ERROR,
		WS_LASTERR_WRITE_ERROR,
		WS_LASTERR_READ_ERROR,
		WS_LASTERR_OUT_OF_MEMORY,
		WS_LASTERR_OPERATION_TIMEOUTED,	// the timeout time was reached
		WS_LASTERR_HTTP_POST_ERROR,
		WS_LASTERR_BAD_DOWNLOAD_RESUME,	//couldn't resume download
		WS_LASTERR_TOO_MANY_REDIRECTS,	// catch endless re-direct loops
		WS_LASTERR_SSL_CONNECT_ERROR,
		WS_LASTERR_SSL_PEER_CERTIFICATE,	// peer's certificate wasn't ok
		WS_LASTERR_SSL_ENGINE_NOTFOUND,	// SSL crypto engine not found
		WS_LASTERR_SSL_ENGINE_SETFAILED,	// can't set SSL crypto engine default
		WS_LASTERR_SSL_CERTPROBLEM,	// problem with the local certificate
		WS_LASTERR_SSL_CACERT,	// problem with the CA cert (path?)
		WS_LASTERR_SSL_ENGINE_INITFAILED,	// failed to initialise ENGINE
		WS_LASTERR_SEND_ERROR,	// failed sending network data
		WS_LASTERR_RECV_ERROR,	// failure in receiving network data
		WS_LASTERR_BAD_CONTENT_ENCODING,	// Unrecognized transfer encoding
		WS_LASTERR_LOGIN_DENIED,	// user, password or similar was not
		// accepted and we failed to login

		WS_LASTERR_BAD_CRL_FILE, //bad CRL file provided (Format, Path or permission)
		WS_LASTERR_LAST	// never use!
	} WS_LASTERR_Code;


	typedef enum {
		WSMAN_ACTION_NONE = 0,
		WSMAN_ACTION_TRANSFER_GET,
		WSMAN_ACTION_TRANSFER_PUT,
		WSMAN_ACTION_ENUMERATION,
		WSMAN_ACTION_PULL,
		WSMAN_ACTION_RELEASE,
		WSMAN_ACTION_CUSTOM,
		WSMAN_ACTION_TRANSFER_CREATE,
		WSMAN_ACTION_TRANSFER_DELETE,
		WSMAN_ACTION_IDENTIFY,
		WSMAN_ACTION_ANON_IDENTIFY,
		WSMAN_ACTION_SUBSCRIBE,
		WSMAN_ACTION_UNSUBSCRIBE,
		WSMAN_ACTION_RENEW,
		WSMAN_ACTION_ASSOCIATORS,
		WSMAN_ACTION_REFERENCES,
		WSMAN_ACTION_TEST
	} WsmanAction;

typedef enum {
	WSMAN_DELIVERY_PUSH = 0,
	WSMAN_DELIVERY_PUSHWITHACK,
	WSMAN_DELIVERY_EVENTS,
	WSMAN_DELIVERY_PULL
}WsmanDeliveryMode;

typedef enum {
	WSMAN_DELIVERY_SEC_AUTO = 0,
	WSMAN_DELIVERY_SEC_HTTP_BASIC,
	WSMAN_DELIVERY_SEC_HTTP_DIGEST,
	WSMAN_DELIVERY_SEC_HTTPS_BASIC,
	WSMAN_DELIVERY_SEC_HTTPS_DIGEST,
	WSMAN_DELIVERY_SEC_HTTPS_MUTUAL,
	WSMAN_DELIVERY_SEC_HTTPS_MUTUAL_BASIC,
	WSMAN_DELIVERY_SEC_HTTPS_MUTUAL_DIGEST,
	WSMAN_DELIVERY_SEC_HTTPS_SPNEGO_KERBEROS,
	WSMAN_DELIVERY_SEC_HTTPS_MUTUAL_SPNEGO_KERBEROS,
	WSMAN_DELIVERY_SEC_HTTP_SPNEGO_KERBEROS
}WsManDeliverySecurityMode;

// options flags values
#define FLAG_NONE                            0x0000
#define FLAG_ENUMERATION_COUNT_ESTIMATION    0x0001
#define FLAG_ENUMERATION_OPTIMIZATION        0x0002
#define FLAG_ENUMERATION_ENUM_EPR            0x0004
#define FLAG_ENUMERATION_ENUM_OBJ_AND_EPR    0x0008
#define FLAG_DUMP_REQUEST                    0x0010
#define FLAG_IncludeSubClassProperties       0x0020
#define FLAG_INCLUDESUBCLASSPROPERTIES       FLAG_IncludeSubClassProperties
#define FLAG_ExcludeSubClassProperties       0x0040
#define FLAG_EXCLUDESUBCLASSPROPERTIES       FLAG_ExcludeSubClassProperties
#define FLAG_POLYMORPHISM_NONE               0x0080
#define FLAG_MUND_MAX_ESIZE                  0x0100
#define FLAG_MUND_LOCALE                     0x0200
#define FLAG_MUND_OPTIONSET                  0x0400
#define FLAG_MUND_FRAGMENT                   0x0800
#define FLAG_CIM_EXTENSIONS                  0x1000
#define FLAG_CIM_REFERENCES                  0x2000
#define FLAG_CIM_ASSOCIATORS                 0x4000
#define FLAG_EVENT_SENDBOOKMARK		     0X8000
#define FLAG_CIM_SCHEMA_OPT		    0X10000
#define FLAG_EXCLUDE_NIL_PROPS		    0X20000

	typedef struct {
		unsigned long flags;
		char *fragment;
		char *cim_ns;
		char * delivery_uri;
		char * reference;
		WsmanDeliveryMode delivery_mode; //eventing delivery mode
		WsManDeliverySecurityMode delivery_sec_mode; //security mode of eventing delivery
		char *delivery_username; // username for delivery, if it is necessary
		char *delivery_password; // password for delivery, if it is necessary
		char *delivery_certificatethumbprint; // certificate thumbprint of event sink, if it is necessary
		float heartbeat_interval;
		float expires;
		hash_t *selectors;
		hash_t *properties;
		unsigned int timeout;
		unsigned int max_envelope_size;
		unsigned int max_elements;
	} client_opt_t;



	struct _WsManFault {
		const char *code;
		const char *subcode;
		const char *reason;
		const char *fault_detail;
	};
	typedef struct _WsManFault WsManFault;



	/**
	 * Create a client using an endpoint as the argument
	 * @param endpoint an URI describing the endpoint, with user/pass, port and path
	 * @return client handle
	 */
	WsManClient *wsmc_create_from_uri(const char *endpoint);


	/**
 	* Create client and initialize context
 	* @param hostname Hostname or IP
 	* @param port port
 	* @param path HTTP path, for example /wsman
 	* @param scheme scheme, HTTP or HTTPS
 	* @param username User name
 	* @param password Passwrod
 	* @return client handle
 	*/
	WsManClient *wsmc_create(const char *hostname,
					 const int port, const char *path,
					 const char *scheme,
					 const char *username,
					 const char *password);

	/**
	* Set request/response content encoding type. Default encoding type is "UTF-8"
	* @param cl Client handle
	* @param encoding type of encoding, for example "UTF-16"
	* @ return zero for success, others for an error
	*/
	int wsmc_set_encoding(WsManClient *cl, const char *encoding);

	/**
	* Set request CIM namespace
	* @param cl Client handle
	* @param ns requested CIM class namespace
	* @ return zero for success, others for an error
	*/
	int wsmc_set_namespace(WsManClient *cl, const char *ns);

	/**
        * Return request CIM namespace
        * @param cl Client handle
        * @ return requested CIM class namespace
        */
	char *wsmc_get_namespace(WsManClient *cl);

	/**
	 * Release client
	 * @param cl Client handle that was created with wsman_create_client
	 * @return void
	 */
	void wsmc_release(WsManClient * cl);

	/**
	 * Reset client connection and prepare handle for a new connection
	 * @param cl Client handle
	 * @return void
	 */
	void wsmc_reinit_conn(WsManClient * cl);


	/* WsManClient handling */

	/**
	 * Get serialization context
	 * @param cl Client handle
	 * @return Context
	 */
	WsSerializerContextH wsmc_get_serialization_context(WsManClient * cl);

	/**
	 * Get host name from handle
	 * @param cl Client handle
	 * @return host name
	 */
	char *wsmc_get_hostname(WsManClient * cl);

	/**
	 * Get port from handle
	 * @param cl Client handle
	 * @return host name
	 */
	unsigned int wsmc_get_port(WsManClient * cl);

	/**
	 * Get uri path from handle
	 * @param cl Client handle
	 * @return uri path
	 */
	char *wsmc_get_path(WsManClient * cl);

	/**
	 * Get uri scheme from handle
	 * @param cl Client handle
	 * @return scheme
	 */
	char *wsmc_get_scheme(WsManClient * cl);

	/**
	 * Get username from handle
	 * @param cl Client handle
	 * @return username
	 */
	char *wsmc_get_user(WsManClient * cl);

	/**
	 * Get password from handle
	 * @param cl Client handle
	 * @return username
	 */
	char *wsmc_get_password(WsManClient * cl);

	/**
	* Get request/response content encoding type. Default encoding type is "UTF-8"
	* @param cl Client handle
	* @ return request encoding string
	*/
	char *wsmc_get_encoding(WsManClient *cl);

	/**
	 * Get endpoint from handle
	 * @param cl Client handle
	 * @return endpoint
	 */
	char *wsmc_get_endpoint(WsManClient * cl);

	/**
	 * Get response code from client
	 * @param cl Client handle
	 * @return response code
	 */
	long wsmc_get_response_code(WsManClient * cl);

	/**
	 * Get fault string
	 * @param cl Client handle
	 * @return host name
	 */
	char *wsmc_get_fault_string(WsManClient * cl);

	/**
	 * Get last error code
	 * @param cl Client handle
	 * @return last error code
	 */
	WS_LASTERR_Code wsmc_get_last_error(WsManClient * cl);


	/**
	 * Read XML file
	 * @param cl Client handle
	 * @param filename File name
	 * @param encoding Encoding
	 * @param XML options
	 * @return XML document
	 */
	WsXmlDocH wsmc_read_file( const char *filename,
					 const char *encoding,
					 unsigned long options);
	/**
	 * Read buffer into an XML document
	 * @param cl Client handle
	 * @param buf Buffer with xml text
	 * @param size Size of buffer
	 * @param encoding Encoding
	 * @param XML options
	 * @return XML document
	 */
	WsXmlDocH wsmc_read_memory( char *buf,
					   size_t size, const char *encoding,
					   unsigned long options);

	/**
	 * Create runtime context for client
	 * @param cl Client handle
	 * @return void
	 */
	WsContextH wsmc_create_runtime(void);

	/**
	 * Parse response and create a new envelope based on it
	 * @param cl Client handle
	 * @return New envelope
	 */
	WsXmlDocH wsmc_build_envelope_from_response(WsManClient * cl);

	/* Wsman actions handling */

	/**
	 * Send an Identify request
	 * @param cl Client handle
	 * @param client_opt_t Request options and flags
	 * @return response document
	 */
	WsXmlDocH wsmc_action_identify(WsManClient * cl,
				 client_opt_t * options);


	/**
	 * Send a Transfer Get request
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @return response document
	 */
	WsXmlDocH wsmc_action_get(WsManClient * cl,
				  const char *resource_uri,
				  client_opt_t * options);


	WsXmlDocH wsmc_action_get_from_epr(WsManClient *cl, epr_t *epr,
			        client_opt_t *options);



	/**
	 * Send a Transfer Put request
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param source_doc A document with the new resource, for example the result of a Get request with modified properties.
	 * @return response document
	 */
	WsXmlDocH wsmc_action_put(WsManClient * cl, const char *resource_uri, client_opt_t * options,
				  WsXmlDocH source_doc);

	/**
	 * Send a Transfer Put request using a text buffer XML representation
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param data Buffer
	 * @param size Buffer size
	 * @param encoding XML encoding
	 * @return response document
	 */
	WsXmlDocH wsmc_action_put_fromtext(WsManClient * cl,
					   const char *resource_uri,
					   client_opt_t * options,
					   const char *data, size_t size,
					   const char *encoding);

	/**
	 * Send a Transfer Put request using serialized data
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param typeInfo Data type information
	 * @param data  Pointer to data
	 * @return response document
	 */
	WsXmlDocH wsmc_action_put_serialized(WsManClient * cl,
					     const char *resource_uri,
					     client_opt_t * options,
					     void *typeInfo, void *data);

	/**
	 * Send a Transfer Get and then Transfer Put modifying properties defined in the options structure
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @return response document
	 */
	WsXmlDocH wsmc_action_get_and_put(WsManClient * cl,
					  const char *resource_uri,
					  client_opt_t * options);

	/**
	 * Send a Transfer Create using existing document with a new resource
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param source_doc A document with the new resource, for example the result of a
     *        Get request with modified properties.
	 * @return response document
	 */
	WsXmlDocH wsmc_action_create(WsManClient * cl, const char *resource_uri, client_opt_t * options,
				     WsXmlDocH source_doc);

	/**
	 * Send a Transfer Create request using a text buffer XML representation
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param data Buffer
	 * @param size Buffer size
	 * @param encoding XML encoding
	 * @return response document
	 */
	WsXmlDocH wsmc_action_create_fromtext(WsManClient * cl, const char *resource_uri, client_opt_t * options,
					      const char *data, size_t size, const char *encoding);

	/**
	 * Send a Transfer Create request using serialized data
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param typeInfo Data type information
	 * @param data  Pointer to data
	 * @return response document
	 */
	WsXmlDocH wsmc_action_create_serialized(WsManClient * cl,
						const char *resource_uri,
						client_opt_t * options,
						void *typeInfo,
						void *data);

	/**
	 * Send a Transfer Delete
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @return response document
	 */
	WsXmlDocH wsmc_action_delete(WsManClient * cl,
				     const char *resource_uri,
				     client_opt_t * options);

	WsXmlDocH wsmc_action_delete_from_epr(WsManClient *cl, epr_t *epr,
			        client_opt_t *options);

	/**
	 * Send a Enumerate request
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @return response document
	 */
	WsXmlDocH wsmc_action_enumerate(WsManClient * cl,
				   const char *resource_uri,
				   client_opt_t * options,
				   filter_t *filter
				   );

	/**
	 * Send a Pull request
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param enumContext enumeration context
	 * @return response document
	 */
	WsXmlDocH wsmc_action_pull(WsManClient * cl, const char *resource_uri,
			      client_opt_t * options,
				   filter_t *filter,
			      const char *enumContext);

	/**
	 * Send a Release request
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param enumContext enumeration context
	 * @return response document
	 */
	WsXmlDocH wsmc_action_release(WsManClient * cl, const char *resource_uri,
				 client_opt_t * options,
				 const char *enumContext);

	/**
	 * Send a Release request
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @return response document
	 */
	WsXmlDocH wsmc_action_subscribe(WsManClient * cl, const char *resource_uri,
				 client_opt_t * options, filter_t *filter);


	/**
	 * Send a Release request
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param uuid Subscription reference parameter
	 * @return response document
	 */
	WsXmlDocH wsmc_action_unsubscribe(WsManClient * cl, const char *resource_uri,
				 client_opt_t * options,
				 const char *subsContext);


	/**
	 * Send a Release request
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param uuid Subscription reference parameter
	 * @return response document
	 */
	WsXmlDocH wsmc_action_renew(WsManClient * cl, const char *resource_uri,
				 client_opt_t * options,
				 const char *subsContext);



	/**
	 * Send a custom method request
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param method  Custom method name
	 * @param source_doc A document with the new resource, for example the result of a Get request with modified properties.
	 * @return response document
	 */
	WsXmlDocH wsmc_action_invoke(WsManClient * cl, const char *resource_uri,
			       client_opt_t * options, const char *method,
			       WsXmlDocH source_doc);

	/**
	 * Send a custom method request using text input of XML data
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param method  Custom method name
	 * @param data Buffer
	 * @param size Buffer size
	 * @param encoding XML encoding
	 * @return response document
	 */
	WsXmlDocH wsmc_action_invoke_fromtext(WsManClient * cl,
					const char *resource_uri,
					client_opt_t * options,
					const char *method,
					const char *data, size_t size,
					const char *encoding);

	/**
	 * Send a custom method request using serialized data of resource
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param method  Custom method name
	 * @param typeInfo Data type information
	 * @param data  Pointer to data
	 * @return response document
	 */
	WsXmlDocH wsmc_action_invoke_serialized(WsManClient * cl,
					  const char *resource_uri,
					  client_opt_t * options,
					  const char *method,
					  void *typeInfo, void *data);

	typedef int (*SoapResponseCallback) (WsManClient *, WsXmlDocH,
					     void *);

	/**
	 * Send a Enumerate request and then use callback for subsequent Pull calls
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param callback Function to handle Pull requests and Responses
	 * @param callback_data Pointer to callback data
	 * @return success
	 */
	int wsmc_action_enumerate_and_pull(WsManClient * cl,
				      const char *resource_uri,
				      client_opt_t * options,
					  filter_t *filter,
				      SoapResponseCallback callback,
				      void *callback_data);

	/**
	 * Create a request envelope based on client data
	 * @param cl Client handle
	 * @param resource_uri Resource URI
	 * @param client_opt_t Request options and flags
	 * @param action Requested Action (e.g., Get, Put, Create)
	 * @param method custom method ( can be NULL)
	 * @param data client data
	 * @return Request document
	 */
	WsXmlDocH wsmc_create_request(WsManClient * cl,
					      const char *resource_uri,
					      client_opt_t * options,
					      filter_t *filter,
					      WsmanAction action,
					      char *method, void *data);

	/**
	 * Get enumeration context from response
	 * @param doc Response document
	 * @return enumeration context
	 */
	char *wsmc_get_enum_context(WsXmlDocH doc);

	/**
	* Get enumeration context from subscription response
	* @param doc Response document
	* @return enumeration context
	*/
	char *wsmc_get_event_enum_context(WsXmlDocH doc);

	/**
	 * Free enumeration context
	 * @param enumctx Enumeration context
	 * @return enumeration context
	 */
	void wsmc_free_enum_context(char * enumctx);

	/**
	 * Add a selector from URI with query string containing selectors
	 * @param doc request to add selectors to
	 * @param resource_uri Resource URI
	 * @return void
	 */
	void wsmc_add_selector_from_uri(WsXmlDocH doc,
					 const char *resource_uri);


	/**
	 * Initialize client requeust options
	 * @return initialized options structure
	 */
	client_opt_t *wsmc_options_init(void);

	/**
	 * destroy client request options
	 * @param options structure
	 * @return void
	 */
	void wsmc_options_destroy(client_opt_t * op);

	void wsmc_add_selectors_from_str(client_opt_t * options,
						   const char
						   *query_string);

	void wsmc_add_prop_from_str(client_opt_t * options,
						    const char
						    *query_string);

	void wsmc_add_selector_from_options(WsXmlDocH doc,
					     client_opt_t * options);

	void wsmc_set_action_option(client_opt_t * options,
				     unsigned int);

	void wsmc_clear_action_option(client_opt_t * options,
				     unsigned int);

	void wsmc_set_options_from_uri(const char *resource_uri,
					client_opt_t * options);

	void wsmc_set_filter(filter_t *filter, client_opt_t * options);

	void wsmc_add_selector(client_opt_t * options,
				       const char *key, const char *value);

	void wsmc_add_property(client_opt_t * options,
				       const char *key, const char *value);

	/* Misc */

	/* Place holder */
	void wsmc_remove_query_string(const char *resource_uri,
				       char **result);
	int wsmc_check_for_fault(WsXmlDocH doc);

	void wsmc_node_to_buf(WsXmlNodeH node, char **buf);

	char *wsmc_node_to_formatbuf(WsXmlNodeH node);

	void wsmc_get_fault_data(WsXmlDocH doc,
					 WsManFault * fault);

	WsManFault *wsmc_fault_new(void);


	void wsmc_fault_destroy(WsManFault *fault);

	void wsmc_set_dumpfile(WsManClient *cl, FILE * f);

	FILE *wsmc_get_dumpfile(WsManClient *cl);

#ifndef _WIN32
	void wsmc_set_conffile(WsManClient *cl, char * f);

	char * wsmc_get_conffile(WsManClient *cl);
#endif
	void
	wsmc_set_delivery_uri(const char *delivery_uri, client_opt_t * options);


	void
	wsmc_set_sub_expiry(int event_subscription_expire, client_opt_t * options);


	void
	wsmc_set_heartbeat_interval(int heartbeat_interval, client_opt_t * options);


	void
	wsmc_set_delivery_mode(WsmanDeliveryMode delivery_mode, client_opt_t * options);


	void
	wsmc_set_delivery_security_mode(WsManDeliverySecurityMode delivery_sec_mode, client_opt_t * options);


/** @} */


#ifdef __cplusplus
}
#endif				/* __cplusplus */
#endif				/* WSMANCLIENT_H_ */
