#include <stdio.h>

/*--* AXIS2/C Headers *--*/
#include <axiom.h>

#define MAX_COUNTER			99999

/* Function Prototypes */
static axiom_node_t *build_om_from_stream( const axutil_env_t * env, axis2_char_t *szData );

int main( int argc, char **argv )
{
	long counter = 0;
	const axutil_env_t * env = NULL;
	axiom_node_t       *payload       = NULL;
	char               *pBuff         = "<Echo xmlns=\"http://localhost/namespace/\"><str>Hello World!</str></Echo>";

   printf( "Enter any key to start...\n" );
	getch();

	/* Create Environment */
	env = axutil_env_create_all( "AXIOM_LEAK1.log", AXIS2_LOG_LEVEL_CRITICAL );
	if( !env )
	{
		return  1;
	}

	printf( "Enter any key to start the loop...\n" );
	getch();

	/* Loop to test for memory leaks */
	do
	{
		payload = build_om_from_stream( env, pBuff );
		axiom_node_free_tree(payload, env);
		payload = NULL;
		printf( "." );

	} while( counter++ < MAX_COUNTER );

	printf( "\nCounter:%d\n", counter );
	printf( "Enter any key to exit...\n" );
	getch();

	/* Free Environment */
	if( env )
	{
		axutil_env_free((axutil_env_t *) env);
		env = NULL;
	}	

	return 0;
}

/*
 *Function Name:build_om_from_stream
 *
 *Parameters:
 *
 *Description: Returns OM created from an XML stream
 *
 *Returns:
 *
 */

static axiom_node_t *build_om_from_stream( const axutil_env_t * env, axis2_char_t *szData )
{
	axiom_xml_reader_t *r = NULL;
	axiom_stax_builder_t *sb = NULL;
	axiom_document_t *doc = NULL;
	axiom_node_t *rtn_node = NULL;

	do
	{
		if( !szData )
			break;

		r = axiom_xml_reader_create_for_memory(env, szData, strlen (szData), NULL, AXIS2_XML_PARSER_TYPE_BUFFER);
		if( !r )
			break;

		sb = axiom_stax_builder_create(env, r);
		if( !sb )
			break;

		doc = axiom_stax_builder_get_document(sb, env);
		if( doc )
			rtn_node =  axiom_document_build_all(doc, env);

	}while( 0 );

	axiom_stax_builder_free_self( sb, env);
	sb = NULL;
	//axiom_xml_reader_free( r, env);

	return rtn_node;
}
