/*******************************************************************************
* 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"

#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);

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);

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
