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

#include "wsman-types.h"
#include "wsman-soap.h"
#include "wsman-soap-message.h"

#define ENFORCE_MUST_UNDERSTAND	"EnforceMustUnderstand"

/* special hash key to denote method args (where array elements have identical keys) */
#define METHOD_ARGS_KEY "method_args"

int wsman_is_valid_envelope(WsmanMessage * msg, WsXmlDocH doc);

char *wsman_get_soap_header_value( WsXmlDocH doc, const char *nsUri,
				  			const char *name);

WsXmlNodeH wsman_get_soap_header_element(WsXmlDocH doc, const char *nsUri,
					 const char *name);

WsXmlDocH wsman_build_soap_fault( const char *soapNsUri,
				 const char *faultNsUri, const char *code,
				 const char *subCode, const char *reason,
				 const char *detail);


WsXmlDocH wsman_create_response_envelope(WsXmlDocH rqstDoc, const char *action);

WsXmlDocH wsman_build_inbound_envelope( WsmanMessage * msg);

WsXmlDocH wsman_create_fault_envelope(
				      WsXmlDocH rqstDoc,
				      const char *code,
				      const char *subCodeNs,
				      const char *subCode,
				      const char *fault_action,
				      const char *lang,
				      const char *reason, const char *faultDetail);

char *wsman_get_class_name(WsContextH cntx);

char *wsman_get_method_name(WsContextH cntx);

hash_t *wsman_get_method_args(WsContextH cntx, const char *resource_uri);

int wsman_get_max_elements(WsContextH cntx, WsXmlDocH doc);

unsigned long wsman_get_max_envelope_size(WsContextH cntx, WsXmlDocH doc);

char *wsman_get_fragment_string(WsContextH cntx, WsXmlDocH doc);

void wsman_get_fragment_type(char *fragstr, int *fragment_flag, char **element,
	int *index);

void wsman_set_estimated_total(WsXmlDocH in_doc,
			       WsXmlDocH out_doc,
			       WsEnumerateInfo * enumInfo);

char *wsman_get_selector(WsContextH cntx, WsXmlDocH doc, const char *name,
			 const int index);

hash_t *wsman_get_selectors_from_epr(WsContextH cntx, WsXmlNodeH epr_node);

hash_t *wsman_get_selector_list(WsContextH cntx, WsXmlDocH doc);

hash_t *wsman_get_selector_list_from_filter(WsContextH cntx,
					    WsXmlDocH doc);

void wsman_add_selector(WsXmlNodeH baseNode, const char *name, const char *val);

void wsman_add_selector_epr(WsXmlNodeH baseNode, const char *name, const epr_t *val);

char *wsman_get_action(WsContextH cntx, WsXmlDocH doc);

char *wsman_get_resource_uri(WsContextH cntx, WsXmlDocH doc);

int wsman_is_fault_envelope(WsXmlDocH doc);

void wsman_set_fault(WsmanMessage * msg,
		     WsmanFaultCodeType fault_code,
		     WsmanFaultDetailType fault_detail_code,
		     const char *details);

int wsman_is_identify_request(WsXmlDocH doc);
int wsman_check_identify(WsmanMessage * msg);

int wsman_is_event_related_request(WsXmlDocH doc);

int wsman_is_valid_xml_envelope(WsXmlDocH doc);

void wsman_add_namespace_as_selector(WsXmlDocH doc, const char *_namespace);

void wsman_add_fragement_for_header(WsXmlDocH indoc, WsXmlDocH outdoc);

char *wsman_get_option_set(WsContextH cntx, WsXmlDocH doc, const char *op);

int wsman_parse_enum_request(WsContextH cntx, WsEnumerateInfo * enumInfo, WsmanStatus *status);

int wsman_parse_event_request(WsXmlDocH doc, WsSubscribeInfo * subsInfo, WsmanFaultCodeType *faultcode,
	WsmanFaultDetailType *detailcode);

int wsman_parse_credentials(WsXmlDocH doc, WsSubscribeInfo * subsInfo, WsmanFaultCodeType *faultcode,
	WsmanFaultDetailType *detailcode);

void wsman_set_expiretime(WsXmlNodeH  node, unsigned long * expire, WsmanFaultCodeType *fault_code);

int time_expired(unsigned long lt);

WsXmlDocH wsman_create_doc(const char *rootname);

void wsman_destroy_doc(WsXmlDocH doc);

#endif
