/*******************************************************************************
 * 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_H_
#define WSMANCLIENT_H_


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

#ifndef WIN32
#include <pthread.h>
#endif				/* // !WIN32 */

#include "u/buf.h"
#include "wsman-client-api.h"
#include "wsman-xml-serialize.h"
#define WSMAN_CLIENT_BUSY       0x0001
#define WSMAN_CLIENT_SUPRESS_100_CONTINUE 0x0002

	struct _WsManConnection {
		u_buf_t *request;
		u_buf_t *response;
	};
	typedef struct _WsManConnection WsManConnection;


	typedef struct {
		char *hostname;
		unsigned int port;
		char *path;
		char *user;
		char *pwd;
		char *scheme;
		char *endpoint;
		unsigned int auth_method;
		long auth_set;
		int status;
	} WsManClientData;


	struct _WsManAuthData {
		char *cainfo;
		char *caoid;
		unsigned char certificatethumbprint[20];
#ifdef _WIN32
		BOOL calocal;
#endif
		char *capath;
		char *sslcert;
		char *sslkey;
		unsigned int verify_peer;
		unsigned int verify_host;
	        wsman_auth_request_func_t auth_request_func;
	        char *method;

		unsigned int crl_check;
		char *crl_file;
	};
	typedef struct _WsManAuthData WsManAuthData;

	struct _WsManProxyData {
		char *proxy;
		char *proxy_auth;
		char *proxy_username;
		char *proxy_password;
	};
	typedef struct _WsManProxyData WsManProxyData;

	struct _WsManClient {
		void *hdl;
		int flags;
		pthread_mutex_t mutex;
		WsSerializerContextH serctx;
		WsManClientData data;
		WsManConnection *connection;
		WsManAuthData authentication;
		WsManProxyData proxy_data;

#ifdef _WIN32
		void* session_handle;
		long lock_session_handle;
#endif

		long response_code;
		char *fault_string;
		WS_LASTERR_Code last_error;
		void *transport;
		char *content_encoding;
		char *cim_ns;
		unsigned long transport_timeout;
		char * user_agent;
		FILE *dumpfile;
		long initialized;
#ifndef _WIN32
		char *client_config_file;
#endif

	};




	int wsmc_lock(WsManClient * cl);
	void wsmc_unlock(WsManClient * cl);


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