/*******************************************************************************
 * 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 Vadim Revyakin
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>

#include "wsman-soap.h"
#include "wsman-xml.h"
#include "wsman-soap.h"
#include "wsman-xml-serializer.h"
#include "wsman-xml-serialize.h"
#include "wsman-epr.h"
#include "wsman-debug.h"

#define CLASSNAME "Sample"



static void example1(void)
{

#define EX1_NS "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ComputerSystem"

	XML_TYPE_UINT16 myshorts[] = { 5, 11, 14, 19, 27, 36 };
	SER_TYPEINFO_UINT16;
	struct __Sample_Servie {
		XML_TYPE_BOOL AcceptPause;
		XML_TYPE_BOOL AcceptStop;
		XML_TYPE_STR Caption;
		XML_TYPE_UINT32 CheckPoint;
		XML_TYPE_STR CreationClassName;
		XML_TYPE_STR Description;
		XML_TYPE_BOOL DesktopInteract;
		XML_TYPE_STR DisplayName;
		XML_TYPE_STR ErrorControl;
		XML_TYPE_UINT32 ExitCode;
		XML_TYPE_STR InstallDate;
		XML_TYPE_STR Name;
		XML_TYPE_STR PathName;
		XML_TYPE_UINT32 ProcessId;
		XML_TYPE_UINT32 ServiceSpecificExitCode;
		XML_TYPE_STR ServiceType;
		XML_TYPE_BOOL Started;
		XML_TYPE_STR StartMode;
		XML_TYPE_STR StartName;
		XML_TYPE_STR State;
		XML_TYPE_STR Status;
		XML_TYPE_STR SystemCreationClassName;
		XML_TYPE_STR SystemName;
		XML_TYPE_UINT32 TagId;
		XML_TYPE_UINT32 WaitHint;
		XML_TYPE_UINT64 Uint64;
		XML_TYPE_DYN_ARRAY shorts;
	};
	typedef struct __Sample_Servie Sample_Servie;

	Sample_Servie servie = {
		0,
		1,
		"Caption",
		30,
		"CreationClassName",
		"Description",
		1,
		"DisplayName",
		"ErrorControl",
		50,
		"InstallDate",
		"Name",
		"PathName",
		60,
		70,
		"ServiceType",
		0,
		"StartMode",
		"StartName",
		"State",
		"Status",
		"SystemCreationClassName",
		"SystemName",
		90,
		100,
		1000000,
		{6, myshorts }
	};

	SER_START_ITEMS(Sample_Servie)
	    SER_BOOL("AcceptPause", 1),
	    SER_BOOL("AcceptStop", 1),
	    SER_STR("Caption", 1),
	    SER_UINT32("CheckPoint", 1),
	    SER_STR("CreationClassName", 1),
	    SER_STR("Description", 1),
	    SER_BOOL("DesktopInteract", 1),
	    SER_NS_STR(EX1_NS, "DisplayName", 1),
	    SER_STR("ErrorControl", 1),
	    SER_UINT32("ExitCode", 1),
	    SER_STR("InstallDate", 1),
	    SER_STR("Name", 1),
	    SER_STR("PathName", 1),
	    SER_UINT32("ProcessId", 1),
	    SER_UINT32("ServiceSpecificExitCode", 1),
	    SER_STR("ServiceType", 1),
	    SER_BOOL("Started", 1),
	    SER_STR("StartMode", 1),
	    SER_STR("StartName", 1),
	    SER_STR("State", 1),
	    SER_STR("Status", 1),
	    SER_STR("SystemCreationClassName", 1),
	    SER_STR("SystemName", 1),
	    SER_UINT32("TagId", 1),
	    SER_UINT32("WaitHint", 1), 
	    SER_UINT64("Uint64", 1), 
	    SER_DYN_ARRAY("shorts", 0, 1000, uint16),
	    SER_END_ITEMS(Sample_Servie);

	WsSerializerContextH cntx;
	WsXmlDocH doc;
	WsXmlNodeH node;
	int retval;

	printf("\n\n   ********   example1. Basic types  ********\n");

	cntx = ws_serializer_init();
	if (cntx == NULL) {
		printf("Error ws_create_runtime\n");
		return;
	}
	doc = ws_xml_create_doc( NULL, "example");
	node = ws_xml_get_doc_root(doc);

	retval = ws_serialize(cntx, node, &servie, Sample_Servie_TypeInfo,
			      CLASSNAME, NULL, NULL, 0);
	printf("ws_serialize: %d\n", retval);
	ws_xml_dump_node_tree(stdout, node);
	node = ws_xml_get_doc_root(doc);

	//WsXmlDocH xx = ws_xml_read_file( ws_context_get_runtime(cntx), "./test.xml", "UTF-8", 0 );
	//node = ws_xml_get_doc_root(xx);
	Sample_Servie *cs = (Sample_Servie *) ws_deserialize(cntx,
							     node,
							     Sample_Servie_TypeInfo,
							     CLASSNAME,
							     NULL, NULL,
							     0, 0);
	if (cs == NULL) {
		printf("Error in ws_serialize\n");
		return;
	}
	

	retval = memcmp(cs, &servie, sizeof(&servie));
	if (retval) {
		printf("Not compared (%d)   -    FAILED\n", retval);
		printf("%d   :  %d\n", servie.AcceptPause, cs->AcceptPause);
		printf("%d   :  %d\n", servie.AcceptStop, cs->AcceptStop);
		printf("%s   :  %s\n", servie.Caption, cs->Caption);
	}
}




static void example2(void)
{

	typedef struct {
		XML_TYPE_UINT8 byte1;
		XML_TYPE_UINT32 int1;
		XML_TYPE_UINT8 byte2;
	} Foo;

	typedef struct {
		XML_TYPE_UINT8 byte1;
		XML_TYPE_UINT16 short1;
		XML_TYPE_UINT32 int1;
		char *string1;
		Foo foo;
	} Sample;


	Sample sample = { 1, 2, 4, "string", {5, 196, 8} };

	SER_START_ITEMS(Foo)
	    SER_UINT8("FOOBYTE1", 1),
	    SER_UINT32("FOOINT32", 1),
	    SER_UINT8("FOOBYTE2", 1), 
	SER_END_ITEMS(Foo);


	SER_START_ITEMS(Sample)
	    SER_UINT8("BYTE", 1),
	    SER_UINT16("SHORT", 1),
	    SER_UINT32("INT32", 1),
	    SER_STR("STRING", 1),
	    SER_STRUCT("FOO", 1, Foo), 
	SER_END_ITEMS(Sample);

	WsSerializerContextH cntx;
	WsXmlDocH doc;
	WsXmlNodeH node;
	int retval;

	printf
	    ("\n\n   ********   example2. Structure with pads.  ********\n");

	cntx = ws_serializer_init();
	if (cntx == NULL) {
		printf("Error ws_create_runtime\n");
		return;
	}
	doc = ws_xml_create_doc( NULL, "example");
	node = ws_xml_get_doc_root(doc);

	retval = ws_serialize(cntx, node, &sample, Sample_TypeInfo,
			      CLASSNAME, NULL, NULL, 0);
	printf("ws_serialize: %d\n", retval);
	ws_xml_dump_node_tree(stdout, node);

	node = ws_xml_get_doc_root(doc);
	Sample *cs = (Sample *) ws_deserialize(cntx,
					       node,
					       Sample_TypeInfo,
					       CLASSNAME, NULL, NULL,
					       0, 0);
	if (cs == NULL) {
		printf("Errror ws_deserialize\n");
		return;
	}

	printf("\n      initial and deserialized structures\n");
	printf("     byte1    =    %d : %d\n", sample.byte1, cs->byte1);
	printf("     short1   =    %d : %d\n", sample.short1, cs->short1);
	printf("     int1     =    %d : %d\n", sample.int1, cs->int1);
	printf("     string1  =    <%s> : <%s>\n", sample.string1,
	       cs->string1);
	printf("     foo :\n");
	printf("        byte1    =    %d : %d\n", sample.foo.byte1,
	       cs->foo.byte1);
	printf("        int1     =    %d : %d\n", sample.foo.int1,
	       cs->foo.int1);
	printf("        byte2    =    %d : %d\n", sample.foo.byte2,
	       cs->foo.byte2);
}



static void example3(void)
{
	typedef struct {
		XML_TYPE_UINT8 a;
		XML_TYPE_UINT8 b;
		XML_TYPE_UINT8 c;
		XML_TYPE_UINT8 pad;
		XML_TYPE_STR string;
	} Sample;



	SER_START_ITEMS(Sample)
	    SER_UINT8("a", 1),
	    SER_UINT8("b", 1),
	    SER_UINT8("c", 1),
	    SER_IN_UINT8("pad", 1),
	    SER_STR("string", 1), SER_END_ITEMS(Sample);

	Sample sample = { 'a', 'b', 'c', 'x', "simple string" };
	// Sample *p = NULL;


	WsSerializerContextH cntx;
	WsXmlDocH doc;
	WsXmlNodeH node;
	int retval;

	printf("\n\n   ********   example3. Skip elements.  ********\n");

	cntx = ws_serializer_init();
	if (cntx == NULL) {
		printf("Error ws_create_runtime\n");
		return;
	}
	doc = ws_xml_create_doc( NULL, "example");
	node = ws_xml_get_doc_root(doc);

	retval = ws_serialize(cntx, node, &sample, Sample_TypeInfo,
			      CLASSNAME, NULL, NULL, 0);
	printf("ws_serialize: %d\n", retval);
	ws_xml_dump_node_tree(stdout, node);

	printf("\n\nws_deserialize (prints original : result):\n");

	node = ws_xml_get_doc_root(doc);
	Sample *cs = (Sample *) ws_deserialize(cntx,
					       node,
					       Sample_TypeInfo,
					       CLASSNAME, NULL, NULL,
					       0, 0);
	if (cs == NULL) {
		printf("Errror ws_serialize\n");
		return;
	}

	printf("a   = %c   :  %c\n", sample.a, cs->a);
	printf("b   = %c   :  %c\n", sample.b, cs->b);
	printf("c   = %c   :  %c\n", sample.c, cs->c);
	printf("pad = %c(%d)   :  %c(%d)\n", sample.pad, sample.pad,
	       cs->pad, cs->pad);
	printf("string = <%s>   :  <%s>\n", sample.string, cs->string);
}


static void example4(void)
{

	typedef struct {
		XML_TYPE_BOOL a;
		XML_TYPE_STR string;
		XML_TYPE_BOOL b;
	} Embed;

	typedef struct {
		XML_TYPE_UINT32 A;
		Embed EMBED[2];
		XML_TYPE_STR STRING;
	} Sample;


	Sample sample = {
		10,
		{{1, "string 1", 0}, {0, "string 2", 1},},
		"STRING",
	};

	SER_START_ITEMS(Embed)
	    SER_BOOL("a", 1),
	    SER_STR("string", 1), SER_BOOL("b", 1), SER_END_ITEMS(Embed);

	SER_START_ITEMS(Sample)
	    SER_UINT32("A", 1),
	    SER_STRUCT("EMBED", 2, Embed),
	    SER_STR("STRING", 1), SER_END_ITEMS(Sample);

	WsSerializerContextH cntx;
	WsXmlDocH doc;
	WsXmlNodeH node;
	int retval;

	printf
	    ("\n\n   ********   example4. Static structure array  ********\n");
	cntx = ws_serializer_init();
	if (cntx == NULL) {
		printf("Error ws_create_runtime\n");
		return;
	}
	doc = ws_xml_create_doc(NULL, "example");
	node = ws_xml_get_doc_root(doc);

	retval = ws_serialize(cntx, node, &sample, Sample_TypeInfo,
			      CLASSNAME, NULL, NULL, 0);
	printf("ws_serialize: %d\n", retval);
	ws_xml_dump_node_tree(stdout, node);
}





static void example5(void)
{


	typedef struct {
		XML_TYPE_BOOL AcceptPause;
		XML_TYPE_STR Caption;
	} Foo;

	Foo foos[] = {
		{1, "Caption 1"},
		{0, "Caption 2"},
		{1, "Caption 1",},
		{0, "Caption 2",},
	};


	SER_START_ITEMS(Foo)
	    SER_BOOL("AcceptPause", 1),
	    SER_STR("Caption", 1), SER_END_ITEMS(Foo);

	XML_TYPE_UINT16 myshorts[] = { 5, 11, 14, 19, 27, 36 };
	SER_TYPEINFO_UINT16;

	typedef struct {
		XML_TYPE_STR city;
		XML_TYPE_DYN_ARRAY shorts;
		XML_TYPE_DYN_ARRAY foos;
		XML_TYPE_UINT16 tag;
	} Sample;

	Sample sample = { "Moscow", {6, myshorts}, {2, foos}, 99 };

	SER_START_ITEMS(Sample)
	    SER_STR("city", 1),
	    SER_DYN_ARRAY("shorts", 0, 1000, uint16),
	    SER_DYN_ARRAY("foos", 0, 1000, Foo),
	    SER_UINT16("tag", 1), SER_END_ITEMS(Sample);

	WsSerializerContextH cntx;
	WsXmlDocH doc;
	WsXmlNodeH node;
	int retval;

	printf("\n\n   ********   example 5: Dynamic arrays  ********\n");

	cntx = ws_serializer_init();
	if (cntx == NULL) {
		printf("Error ws_create_runtime\n");
		return;
	}
	doc = ws_xml_create_doc( NULL, "example");
	node = ws_xml_get_doc_root(doc);

	retval = ws_serialize(cntx, node, &sample, Sample_TypeInfo,
			      CLASSNAME, NULL, NULL, 0);
	printf("\n\nws_serialize: %d\n", retval);
	ws_xml_dump_node_tree(stdout, node);

	node = ws_xml_get_doc_root(doc);

	printf("\n\nws_deserialize:\n");
	Sample *cs = (Sample *) ws_deserialize(cntx,
					       node,
					       Sample_TypeInfo,
					       CLASSNAME, NULL, NULL,
					       0, 0);
	if (cs == NULL) {
		printf("Error ws_deserialize\n");
		return;
	}
	int i;
	printf("shorts count = %d\n", cs->shorts.count);
	printf("foos count   = %d\n", cs->foos.count);
	printf("\n");
	printf("    city = <%s>\n", cs->city);
	if (cs->shorts.data == NULL) {
		printf("No uint16 objects\n");
		goto AFTER_SHORTS;
	}
	unsigned short *newuints = (unsigned short *) cs->shorts.data;
	printf("    shorts = {");
	for (i = 0; i < cs->shorts.count; i++) {
		printf("%u, ", *newuints);
		newuints++;
	}
	printf("}\n");
      AFTER_SHORTS:
	if (cs->foos.data == NULL) {
		printf("No foo objects\n");
		goto AFTER_FOOS;
	}
	Foo *newfoos = cs->foos.data;
	for (i = 0; i < cs->foos.count; i++) {
		printf("   ====   Foo %d =====\n", i);
		printf("    AcceptPause  =   %d\n", newfoos->AcceptPause);
		printf("    Caption       =   <%s>\n", newfoos->Caption);
		printf("   ====   End of Foo %d =====\n", i);
		newfoos++;
	}
      AFTER_FOOS:
	printf("    tag = %d\n", cs->tag);
}

static void example6(void)
{
	typedef struct {
		struct {
			XML_TYPE_UINT8 body;
			XML_NODE_ATTR *attrs;
		} uint8_with_attrs;
		struct {
			XML_TYPE_UINT16 body;
			XML_NODE_ATTR *attrs;
		} uint16_with_attrs;
		struct {
			XML_TYPE_UINT32 body;
			XML_NODE_ATTR *attrs;
		} uint32_with_attrs;
		struct {
			XML_TYPE_BOOL body;
			XML_NODE_ATTR *attrs;
		} bool_with_attrs;
		struct {
			XML_TYPE_STR body;
			XML_NODE_ATTR *attrs;
		} str_with_attrs;
	} Dummy;

	typedef struct {
		struct {
			Dummy body;
			XML_NODE_ATTR *attrs;
		} struct_with_attrs;
	} Sample;

	XML_NODE_ATTR attrs[] = {
		{NULL, NULL, "Uint8AttrName1", "Uint8AttrValue1"},
		{NULL, NULL, "Uint16AttrName1", "Uint16AttrValue1"},
		{NULL, NULL, "Uint32AttrName1", "Uint32AttrValue1"},
		{NULL, NULL, "BoolAttrName1", "BoolAttrValue1"},
		{NULL, NULL, "StringAttrName1", "StringAttrValue1"},
	};
	XML_NODE_ATTR str_attrs[3] = {
		{NULL, NULL, "AttrName1", "AttrValue1"},
		{NULL, NULL, "AttrName2", "AttrValue2"},
		{NULL, XML_NS_ADDRESSING, "AttrQName", "AttrValue3"},
	};
	Sample sample = {
		{
		 {
		  {8, &attrs[0]},
		  {16, &attrs[1]},
		  {32, &attrs[2]},
		  {0, &attrs[3]},
		  {"string", &attrs[4]},
		  },
		 &str_attrs[0]
		 }
	};
	str_attrs[0].next = &str_attrs[1];
	str_attrs[1].next = &str_attrs[2];

	SER_START_ITEMS(Dummy)
	    SER_ATTR_NS_UINT8_FLAGS(NULL, "UINT8", 1, 0),
	    SER_ATTR_NS_UINT16_FLAGS(NULL, "UINT16", 1, 0),
	    SER_ATTR_NS_UINT32_FLAGS(NULL, "UINT32", 1, 0),
	    SER_ATTR_NS_BOOL_FLAGS(NULL, "BOOL", 1, 0),
	    SER_ATTR_NS_STR_FLAGS(NULL, "STRING", 1, 0),
	    SER_END_ITEMS(Dummy);

	SER_START_ITEMS(Sample)
	    SER_ATTR_NS_STRUCT_FLAGS(XML_NS_WS_MAN, "STRUCT", 1, 0, Dummy),
	    SER_END_ITEMS(Sample);

	WsSerializerContextH cntx;
	WsXmlDocH doc;
	WsXmlNodeH node;
	int retval;

	printf
	    ("\n\n   ********   example 6. Nodes with attributes  ********\n");

	cntx = ws_serializer_init();
	if (cntx == NULL) {
		printf("Error ws_create_runtime\n");
		return;
	}
	doc = ws_xml_create_doc( NULL, "example");
	node = ws_xml_get_doc_root(doc);

	retval = ws_serialize(cntx, node, &sample, Sample_TypeInfo,
			      CLASSNAME, XML_NS_WS_MAN, NULL, 0);
	printf("\n\nws_serialize: %d\n", retval);
	ws_xml_dump_node_tree(stdout, node);

	Sample *news;
	printf("\n\nws_deserialize:\n");
	news = (Sample *) ws_deserialize(cntx,
					 node,
					 Sample_TypeInfo,
					 CLASSNAME,
					 XML_NS_ADDRESSING, NULL, 0, 0);
	if (news == NULL) {
		printf("Errror ws_deserialize\n");
		return;
	}

	XML_NODE_ATTR *nattrs;
	Dummy *dm = &(news->struct_with_attrs.body);
	printf("****     Deserialized document  %p *****\n", news);
	printf("struct_with_attrs.body (");
	nattrs = news->struct_with_attrs.attrs;
	while (nattrs) {
		printf("%s:%s=\"%s\" ", nattrs->ns, nattrs->name,
		       nattrs->value);
		nattrs = nattrs->next;
	}
	printf(")\n");

	printf("    uint8_with_attrs = %d (", dm->uint8_with_attrs.body);
	nattrs = dm->uint8_with_attrs.attrs;
	while (nattrs) {
		printf("%s:%s=\"%s\" ", nattrs->ns, nattrs->name,
		       nattrs->value);
		nattrs = nattrs->next;
	}
	printf(")\n");

	printf("    uint16_with_attrs = %d (", dm->uint16_with_attrs.body);
	nattrs = dm->uint16_with_attrs.attrs;
	while (nattrs) {
		printf("%s:%s=\"%s\" ", nattrs->ns, nattrs->name,
		       nattrs->value);
		nattrs = nattrs->next;
	}
	printf(")\n");

	printf("    uint32_with_attrs = %d (", dm->uint32_with_attrs.body);
	nattrs = dm->uint32_with_attrs.attrs;
	while (nattrs) {
		printf("%s:%s=\"%s\" ", nattrs->ns, nattrs->name,
		       nattrs->value);
		nattrs = nattrs->next;
	}
	printf(")\n");

	printf("    bool_with_attrs = %d (", dm->bool_with_attrs.body);
	nattrs = dm->bool_with_attrs.attrs;
	while (nattrs) {
		printf("%s:%s=\"%s\" ", nattrs->ns, nattrs->name,
		       nattrs->value);
		nattrs = nattrs->next;
	}
	printf(")\n");

	printf("    str_with_attrs = %s (", dm->str_with_attrs.body);
	nattrs = dm->str_with_attrs.attrs;
	while (nattrs) {
		printf("%s:%s=\"%s\" ", nattrs->ns, nattrs->name,
		       nattrs->value);
		nattrs = nattrs->next;
	}
	printf(")\n");
}




static void example7(void)
{
	typedef struct {
		XML_TYPE_STR value;
		XML_NODE_ATTR *attrs;
	} Selector;

	SER_TYPEINFO_STRING_ATTR;


	typedef struct {
		XML_TYPE_DYN_ARRAY selectors;
	} SelectorSet;

	SER_START_ITEMS(SelectorSet)
	    SER_NS_DYN_ARRAY(XML_NS_WS_MAN, WSM_SELECTOR, 0, 1000,
			     string_attr), SER_END_ITEMS(SelectorSet);


	typedef struct {
		XML_TYPE_STR uri;
		SelectorSet selectorset;
	} ReferenceParameters;

	SER_START_ITEMS(ReferenceParameters)
	    SER_NS_STR(XML_NS_WS_MAN, WSM_RESOURCE_URI, 1),
	    SER_NS_STRUCT(XML_NS_WS_MAN, WSM_SELECTOR_SET, 1, SelectorSet),
	    SER_END_ITEMS(ReferenceParameters);

	typedef struct {
		XML_TYPE_STR address;
		ReferenceParameters refparams;
	} EPR;

	SER_START_ITEMS(EPR)
	    SER_NS_STR(XML_NS_ADDRESSING, WSA_ADDRESS, 1),
	    SER_NS_STRUCT(XML_NS_ADDRESSING, WSA_REFERENCE_PARAMETERS, 1,
			  ReferenceParameters), SER_END_ITEMS(EPR);

	XML_NODE_ATTR attrs[3] = {
		{NULL, NULL, "Name", "SelName1"},
		{NULL, NULL, "Name", "SelName2"},
		{NULL, NULL, "Name", "SelName3"},
	};
	Selector selectors[] = {
		{"selector1", &attrs[0]},
		{"selector2", &attrs[1]},
		{"selector3", &attrs[2]}
	};
	EPR Epr = {
		"http://localhost:8889/wsman",
		{"http://acme.org/hardware/2005/02/storage/physDisk",
		 {{3, selectors}}
		 }
	};

	WsSerializerContextH cntx;
	WsXmlDocH doc;
	WsXmlNodeH node;
	int retval;

	printf
	    ("\n\n   ********   example7. Endpoint Reference  ********\n");

	cntx = ws_serializer_init();
	if (cntx == NULL) {
		printf("Error ws_create_runtime\n");
		return;
	}
	doc = ws_xml_create_doc( NULL, "example");
	node = ws_xml_get_doc_root(doc);

	retval = ws_serialize(cntx, node, &Epr, EPR_TypeInfo,
			      "EndpointReference", XML_NS_ADDRESSING, NULL,
			      0);
	printf("\n\nws_serialize: %d\n", retval);
	ws_xml_dump_node_tree(stdout, node);

	EPR *newEPR;
	node = ws_xml_get_doc_root(doc);

	printf("\n\nws_deserialize:\n");
	newEPR = (EPR *) ws_deserialize(cntx,
					node,
					EPR_TypeInfo,
					"EndpointReference",
					XML_NS_ADDRESSING, NULL, 0, 0);
	if (newEPR == NULL) {
		printf("Errror ws_deserialize\n");
		return;
	}

	printf("****     Deserialized document   *****\n");
	printf("address             = %s\n", newEPR->address);
	printf("refparams.uri       = %s\n", newEPR->refparams.uri);
	int i;
	Selector *ss =
	    (Selector *) newEPR->refparams.selectorset.selectors.data;
	if (ss == NULL) {
		printf
		    ("    !!!!  newEPR->refparams.selectors.data == NULL\n");
		return;
	}
	for (i = 0; i < newEPR->refparams.selectorset.selectors.count; i++) {
		Selector *s;
		s = ss + i;
		printf("    Selector(");
		XML_NODE_ATTR *a = s->attrs;
		while (a) {
			printf("%s:%s=%s",
			       a->ns ? a->ns : "", a->name, a->value);
			a = a->next;
		}
		printf(")  =  %s\n", s->value);
	}
}



static void example8(void)
{

	printf
	    ("\n\n   ********   example8. XML datetime deserialization  ********\n");

	char xml_dttm[] = "2007-02-13T12:39:14-03:30";
	XML_DATETIME dttm;

	if (ws_deserialize_datetime(xml_dttm, &dttm)) {
		printf("deserialization failed\n");
		return;
	}
	printf("XML datetime =  %s\n", xml_dttm);
	printf("deserialed = %u-%u-%uT%u:%u:%u  %i\n", dttm.tm.tm_year,
	       dttm.tm.tm_mon, dttm.tm.tm_mday, dttm.tm.tm_hour,
	       dttm.tm.tm_min, dttm.tm.tm_sec, dttm.tz_min);
}





// No serialization examples(shttpd_0)

#if 0
static void example106()
{
	char *data =
	    "<dummy><qq>This is qq body</qq><pp>This is pp</pp></dummy>";
	//      WsXmlDocH       response;
	WsManClient *cl = wsman_create_client("mstevbakrov.ims.intel.com",
					      8889,
					      "/wsman",
					      "http",
					      "wsman",
					      "secret");

	client_opt_t *options = wsmc_options_init();

	WsXmlDocH request = wsmc_create_request(cl,
							"http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ComputerSystem",
							options,
							WSMAN_ACTION_TRANSFER_CREATE,
							NULL, NULL);
	WsXmlDocH d =
	    wsmc_read_memory(cl, data, strlen(data), NULL, 0);
	ws_xml_dump_node_tree(stdout, ws_xml_get_doc_root(d));
	//      WsXmlNodeH n = ws_xml_get_doc_root(d);

	ws_xml_duplicate_tree(ws_xml_get_soap_body(request),
			      ws_xml_get_doc_root(d));
	ws_xml_destroy_doc(d);
	//      ws_xml_copy_node(ws_xml_get_doc_root(d), ws_xml_get_soap_body(request));
	ws_xml_dump_node_tree(stdout, ws_xml_get_doc_root(request));
	wsman_release_client(cl);
	ws_xml_destroy_doc(request);
}

#endif


static void example9(void)
{
	typedef struct {
	}empty;
	SER_START_ITEMS(empty)
	SER_END_ITEMS(empty);
	char xmlstring[] = "<example></example>";
	WsXmlDocH doc = ws_xml_read_memory(xmlstring, strlen(xmlstring), "UTF-8", 0);
	WsXmlNodeH node = ws_xml_get_doc_root(doc);
	WsSerializerContextH cntx = ws_serializer_init();
	if (cntx == NULL) {
                printf("Error ws_create_runtime\n");
                return;
        }
	void *ptr = NULL;
	ptr = ws_deserialize(cntx,
                                        node,
                                        empty_TypeItems,
                                        NULL,
                                        NULL, NULL, 0, 0);
	printf("ptr = %p\n", ptr);
	ws_serializer_cleanup(cntx); 

}

static void example10()
{
	char xmlstring[] = "<example><PowerState xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/></example>";
//	char xmlstring[] = "<example><PowerState state = \"critical\">5</PowerState></example>";
	typedef struct {
                XML_TYPE_STR value;
                XML_NODE_ATTR *attrs;
        } item;
        SER_TYPEINFO_STRING_ATTR;
	WsXmlDocH doc = ws_xml_read_memory(xmlstring, strlen(xmlstring), "UTF-8", 0);
	WsXmlNodeH node = ws_xml_get_doc_root(doc);
	 printf
            ("\n\n   ********   example10. xsi:nil attibute test  ********\n");
	WsSerializerContextH cntx = ws_serializer_init();
	if (cntx == NULL) {
                printf("Error ws_create_runtime\n");
                return;
        }
	item *value = (item *)ws_deserialize(cntx, node, string_attr_TypeInfo, "PowerState", NULL, NULL, 0, 0);
	if(value->attrs)
		printf("*********attrs->ns = %s attrs->name = %s attrs->value = %s*********\n", value->attrs->ns, value->attrs->name, value->attrs->value);
	if(ws_havenilvalue(value->attrs))
		printf("******** the attribute has xsi:nil ********\n");
	ws_xml_destroy_doc(doc);
	ws_serializer_cleanup(cntx);
}

static void example11()
{
	typedef struct {
		XML_TYPE_INT8 byte1;
		XML_TYPE_INT32 int1;
		XML_TYPE_INT8 byte2;
	} Foo;

	typedef struct {
		XML_TYPE_INT8 byte1;
		XML_TYPE_INT16 short1;
		XML_TYPE_INT32 int1;
		char *string1;
		Foo foo;
	} Sample;


	Sample sample = { -1, -127, 4, "string", {-12, 196, 8} };

	SER_START_ITEMS(Foo)
	    SER_INT8("FOOBYTE1", 1),
	    SER_INT32("FOOINT32", 1),
	    SER_INT8("FOOBYTE2", 1), 
	SER_END_ITEMS(Foo);


	SER_START_ITEMS(Sample)
	    SER_INT8("BYTE", 1),
	    SER_INT16("SHORT", 1),
	    SER_INT32("INT32", 1),
	    SER_STR("STRING", 1),
	    SER_STRUCT("FOO", 1, Foo), 
	SER_END_ITEMS(Sample);

	WsSerializerContextH cntx;
	WsXmlDocH doc;
	WsXmlNodeH node;
	int retval;

	printf
	    ("\n\n   ********   example11. Structure with pads (signed int test).  ********\n");

	cntx = ws_serializer_init();
	if (cntx == NULL) {
		printf("Error ws_create_runtime\n");
		return;
	}
	doc = ws_xml_create_doc( NULL, "example");
	node = ws_xml_get_doc_root(doc);

	retval = ws_serialize(cntx, node, &sample, Sample_TypeInfo,
			      CLASSNAME, NULL, NULL, 0);
	printf("ws_serialize: %d\n", retval);
	ws_xml_dump_node_tree(stdout, node);

	node = ws_xml_get_doc_root(doc);
	Sample *cs = (Sample *) ws_deserialize(cntx,
					       node,
					       Sample_TypeInfo,
					       CLASSNAME, NULL, NULL,
					       0, 0);
	if (cs == NULL) {
		printf("Errror ws_deserialize\n");
		return;
	}

	printf("\n      initial and deserialized structures\n");
	printf("     byte1    =    %d : %d\n", sample.byte1, cs->byte1);
	printf("     short1   =    %d : %d\n", sample.short1, cs->short1);
	printf("     int1     =    %d : %d\n", sample.int1, cs->int1);
	printf("     string1  =    <%s> : <%s>\n", sample.string1,
	       cs->string1);
	printf("     foo :\n");
	printf("        byte1    =    %d : %d\n", sample.foo.byte1,
	       cs->foo.byte1);
	printf("        int1     =    %d : %d\n", sample.foo.int1,
	       cs->foo.int1);
	printf("        byte2    =    %d : %d\n", sample.foo.byte2,
	       cs->foo.byte2);
}

static void example12()
{
	typedef struct {
                XML_TYPE_REAL32 value;
                XML_NODE_ATTR *attrs;
        } item;
	item org = {1.257,NULL};
	SER_TYPEINFO_REAL32_ATTR;
	WsXmlDocH doc;
	WsXmlNodeH node = ws_xml_get_doc_root(doc);
	 printf
            ("\n\n   ********   example12. real32/64 deserialize/serialize  ********\n");
	WsSerializerContextH cntx = ws_serializer_init();
	if (cntx == NULL) {
                printf("Error ws_create_runtime\n");
                return;
        }
	doc = ws_xml_create_doc( NULL, "example");
        node = ws_xml_get_doc_root(doc);

        int retval = ws_serialize(cntx, node, &org, real32_TypeInfo,
                              "PowerState", NULL, NULL, 0);
        printf("ws_serialize: %d\n", retval);
        ws_xml_dump_node_tree(stdout, node);

	item *con = (item *)ws_deserialize(cntx, node, real32_TypeInfo, "PowerState", NULL, NULL, 0, 0);
	if(con->value != org.value) {
		printf("Mismatched! org.value = %f con->value = %f\n", org.value, con->value);
	}
	ws_xml_destroy_doc(doc);
	ws_serializer_cleanup(cntx);
}

static void example13()
{
	XML_TYPE_UINT8 myshorts[] = { 5, 11, 14};
	typedef struct {
		XML_TYPE_UINT16 id;
		XML_TYPE_DYN_ARRAY shorts;
	}item;
	XML_TYPE_DYN_ARRAY array_int8;
	SER_TYPEINFO_UINT8;
	SER_TYPEINFO_UINT16;
	SER_START_ITEMS(item)
	SER_INT16("id", 1),
	SER_DYN_ARRAY("temp", 0, 100, uint8),
	SER_END_ITEMS(item);
	char xmlstring[] = "<example><Sample><id>3</id></Sample></example>";
	printf
	    ("\n\n ****** example 13. de-serialize to int8 array (empty array de-serialization test)  ******\n");
	WsXmlDocH doc = ws_xml_read_memory(xmlstring, strlen(xmlstring), "UTF-8", 0);
	WsXmlNodeH node = ws_xml_get_doc_root(doc);

	WsSerializerContextH cntx = ws_serializer_init();
	if (cntx == NULL) {
                printf("Error ws_create_runtime\n");
                return;
        }
	item *desvalue = (item *)ws_deserialize(cntx, node, item_TypeInfo, CLASSNAME, NULL, NULL, 0, 0);
	printf("desvlaue = %p\n", desvalue);
	array_int8 = desvalue->shorts;
	int i = 0;
	printf("id = %d, array_int8->count = %d\n",desvalue->id,  array_int8.count);
	while(i < array_int8.count) {
		printf("%d ", ((char *)array_int8.data)[i]);
		i++;
	}
	printf("\n");
	ws_serializer_cleanup(cntx);
}

static void example14()
{
	typedef struct{
	}empty;
	SER_START_ITEMS(empty)
	SER_END_ITEMS(empty);
	typedef struct {
		XML_TYPE_INT16 num;
		empty empty1;
	}A;
	SER_TYPEINFO_INT16;
	SER_START_ITEMS(A)
	SER_INT16("id",1),
	SER_NS_STRUCT(NULL, "empty", 1, empty),
	SER_END_ITEMS(A);
	A a1 = {-12, {}};
	printf
	     ("\n\n ******* example 14. serialize/de-serialze with empty t_TypeItems *******\n");
	WsSerializerContextH cntx = ws_serializer_init();
        if (cntx == NULL) {
                printf("Error ws_create_runtime\n");
                return;
        }
	WsXmlDocH doc = ws_xml_create_doc(NULL, "example");
	WsXmlNodeH node = ws_xml_get_doc_root(doc);
	empty values = {};
	int ret = ws_serialize(cntx, node, &values, A_TypeInfo, CLASSNAME, NULL, NULL, 0);
	printf("serialize  %i bytes\n", ret);
	ws_xml_dump_node_tree(stdout, node);
	
	void *ptr = ws_deserialize(cntx, node, A_TypeInfo, CLASSNAME, NULL, NULL, 0, 0);
	printf("ptr = %p\n", ptr);
	ws_serializer_cleanup(cntx);
}

static void initialize_logging(void)
{
	debug_add_handler(wsman_debug_message_handler, DEBUG_LEVEL_ALWAYS,
			  NULL);
}

int debug_level = 0;
int main(int argc, char **argv)
{
	int num;
	int i;
	char retval = 0;
	u_error_t *error = NULL;
	u_option_entry_t opt[] = {
		{"debug", 'd', U_OPTION_ARG_INT, &debug_level,
		 "Set the verbosity of debugging output.", "1-6"}
	};
	u_option_context_t *opt_ctx;
	opt_ctx = u_option_context_new("");
	u_option_context_set_ignore_unknown_options(opt_ctx, FALSE);
	u_option_context_add_main_entries(opt_ctx, opt, "wsmid_identify");
	retval = u_option_context_parse(opt_ctx, &argc, &argv, &error);

	u_option_context_free(opt_ctx);

	if (error) {
		if (error->message)
			printf("%s\n", error->message);
		u_error_free(error);
		return 1;
	}
	u_error_free(error);

	if (debug_level) {
		initialize_logging();
		wsman_debug_set_level(debug_level);
	}

	if (argc == 1) {
		// execute all
		example1();
		example2();
		example3();
		example4();
		example5();
		example6();
		example7();
		example8();
		example9();
		example10();
		example11();
		example12();
		example13();
		example14();
		return 0;
	}

	for (i = 1; i < argc; i++) {
		num = atoi(argv[i]);
		switch (num) {
		case 1:
			example1();
			break;
		case 2:
			example2();
			break;
		case 3:
			example3();
			break;
		case 4:
			example4();
			break;
	        case 5: 
			example5(); 
			break;
		case 6:
			example6();
			break;
		case 7:
			example7();
			break;
		case 8:
			example8();
			break;
		case 9:
			example9();
			break;
		case 10:
			example10();
			break;
		case 11:
			example11();
			break;
		case 12:
			example12();
			break;
		case 13:
			example13();
			break;
		case 14:
			example14();
			break;
		default:
			printf("\n    No example%d()\n", num);
			break;
		}
	}
	return 0;
}
