Newer
Older
Import / applications / MakePDF / Tests / exip-0.5.4 / examples / simpleEncoding / encodeTestEXI.c
/*==================================================================*\
|                EXIP - Embeddable EXI Processor in C                |
|--------------------------------------------------------------------|
|          This work is licensed under BSD 3-Clause License          |
|  The full license terms and conditions are located in LICENSE.txt  |
\===================================================================*/

/**
 * @file encodeTestEXI.c
 * @brief Testing the EXI encoder
 *
 * @date Nov 4, 2010
 * @author Rumen Kyusakov
 * @version 0.5
 * @par[Revision] $Id: encodeTestEXI.c 328 2013-10-30 16:00:10Z kjussakov $
 */

#include "encodeTestEXI.h"
#include "EXISerializer.h"
#include "stringManipulate.h"
#include <stdio.h>
#include <string.h>

#define OUTPUT_BUFFER_SIZE 200

const String NS_STR = {"http://www.ltu.se/EISLAB/schema-test", 36};
const String NS_NESTED_STR = {"http://www.ltu.se/EISLAB/nested-xsd", 35};
const String NS_TYPES_STR = {"http://www.ltu.se/EISLAB/types", 30};
const String NS_EMPTY_STR = {NULL, 0};

const String ELEM_ENCODE_STR = {"EXIPEncoder", 11};
const String ELEM_MULT_TEST_STR = {"MultipleXSDsTest", 16};
const String ELEM_DESCR_STR = {"description", 11};
const String ELEM_TYPE_TEST_STR = {"type-test", 9};
const String ELEM_TEST_SETUP_STR = {"testSetup", 9};
const String ELEM_BOOL_STR = {"bool", 4};
const String ELEM_INT_STR = {"int", 3};
const String ELEM_EXT_TYPES_STR = {"extendedTypeTest", 16};
const String ELEM_BYTE_TYPES_STR = {"byteTest", 8};
const String ELEM_DATE_TYPES_STR = {"dateTimeTest", 12};
const String ELEM_BIN_TYPES_STR = {"binaryTest", 10};
const String ELEM_ENUM_TYPES_STR = {"enumTest", 8};

const String ATTR_BYTE_STR = {"testByte", 8};
const String ATTR_VERSION_STR = {"version", 7};
const String ATTR_GOAL_STR = {"goal", 4};
const String ATTR_ID_STR = {"id", 2};

static char SOME_BINARY_DATA[] = {0x02, 0x6d, 0x2f, 0xa5, 0x20, 0xf2, 0x61, 0x9c, 0xee, 0x0f};
static String SOME_BINARY_DATA_BASE64 = {"i3sd7fatzxad", 12};
//static String ENUM_DATA_1 = {"hello", 5};
//static String ENUM_DATA_2 = {"hi", 2};
//static String ENUM_DATA_3 = {"hey", 3};
static String ENUM_DATA_4 = {"hej", 3};

#define TRY_CATCH_ENCODE(func) TRY_CATCH(func, serialize.closeEXIStream(&testStrm))

errorCode encode(EXIPSchema* schemaPtr, FILE *outfile, size_t (*outputStream)(void* buf, size_t size, void* stream))
{
	errorCode tmp_err_code = EXIP_UNEXPECTED_ERROR;
	EXIStream testStrm;
	String uri;
	String ln;
	QName qname = {&uri, &ln, NULL};
	String chVal;
	char buf[OUTPUT_BUFFER_SIZE];
	BinaryBuffer buffer;
	EXITypeClass valueType;

	buffer.buf = buf;
	buffer.bufLen = OUTPUT_BUFFER_SIZE;
	buffer.bufContent = 0;

	// Serialization steps:

	// I: First initialize the header of the stream
	serialize.initHeader(&testStrm);

	// II: Set any options in the header (including schemaID and schemaIDMode), if different from the defaults.
	testStrm.header.has_cookie = TRUE;
	testStrm.header.has_options = TRUE;
	testStrm.header.opts.valueMaxLength = 300;
	testStrm.header.opts.valuePartitionCapacity = 50;
	SET_STRICT(testStrm.header.opts.enumOpt);

	// III: Define an external stream for the output if any, otherwise set to NULL
	buffer.ioStrm.readWriteToStream = outputStream;
	buffer.ioStrm.stream = outfile;

	// IV: Initialize the stream
	TRY_CATCH_ENCODE(serialize.initStream(&testStrm, buffer, schemaPtr));

	// V: Start building the stream step by step: header, document, element etc...
	TRY_CATCH_ENCODE(serialize.exiHeader(&testStrm));

	TRY_CATCH_ENCODE(serialize.startDocument(&testStrm));

	qname.uri = &NS_STR;
	qname.localName = &ELEM_MULT_TEST_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <MultipleXSDsTest>

	qname.uri = &NS_STR;
	qname.localName = &ELEM_ENCODE_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <EXIPEncoder>

	// NOTE: attributes should come lexicographically sorted during serialization

	qname.uri = &NS_EMPTY_STR;
	qname.localName = &ATTR_BYTE_STR;

	if(schemaPtr != NULL)
	{
		// schema mode
		TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // testByte="
		TRY_CATCH_ENCODE(serialize.intData(&testStrm, 55));
	}
	else
	{
		// schema-less mode
		TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // testByte="
		TRY_CATCH_ENCODE(asciiToString("55", &chVal, &testStrm.memList, FALSE));
		TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
	}

	qname.localName = &ATTR_VERSION_STR;
	TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // version="

	TRY_CATCH_ENCODE(asciiToString("0.2", &chVal, &testStrm.memList, FALSE));
	TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));

	TRY_CATCH_ENCODE(asciiToString("This is an example of serializing EXI streams using EXIP low level API", &chVal, &testStrm.memList, FALSE));
	TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));

	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </EXIPEncoder>

	qname.uri = &NS_STR;
	qname.localName = &ELEM_DESCR_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <description>

	TRY_CATCH_ENCODE(asciiToString("This is a test of processing XML schemes with multiple XSD files", &chVal, &testStrm.memList, FALSE));
	TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));

	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </description>

	qname.uri = &NS_NESTED_STR;
	qname.localName = &ELEM_TEST_SETUP_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <testSetup>

	qname.uri = &NS_EMPTY_STR;
	qname.localName = &ATTR_GOAL_STR;
	TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // goal="

	TRY_CATCH_ENCODE(asciiToString("Verify that the implementation works!", &chVal, &testStrm.memList, FALSE));
	TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));

	TRY_CATCH_ENCODE(asciiToString("Simple test element with single attribute", &chVal, &testStrm.memList, FALSE));
	TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));

	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </testSetup>

	qname.uri = &NS_STR;
	qname.localName = &ELEM_TYPE_TEST_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <type-test>

	if(schemaPtr != NULL)
	{
		// schema mode
		qname.uri = &NS_EMPTY_STR;
		qname.localName = &ATTR_ID_STR;
		TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // id="
		TRY_CATCH_ENCODE(serialize.intData(&testStrm, 1001));
	}
	else
	{
		// schema-less mode
		qname.uri = &NS_EMPTY_STR;
		qname.localName = &ATTR_ID_STR;
		TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // id="
		TRY_CATCH_ENCODE(asciiToString("1001", &chVal, &testStrm.memList, FALSE));
		TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
	}

	qname.uri = &NS_NESTED_STR;
	qname.localName = &ELEM_BOOL_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <bool>

	if(schemaPtr != NULL)
	{
		// schema mode
		TRY_CATCH_ENCODE(serialize.booleanData(&testStrm, TRUE));
	}
	else
	{
		// schema-less mode
		TRY_CATCH_ENCODE(asciiToString("true", &chVal, &testStrm.memList, FALSE));
		TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
	}

	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </bool>

	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </type-test>

	qname.uri = &NS_STR;
	qname.localName = &ELEM_EXT_TYPES_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <extendedTypeTest>

	qname.uri = &NS_EMPTY_STR;
	qname.localName = &ELEM_BYTE_TYPES_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <byteTest>

	if(schemaPtr != NULL)
	{
		// schema mode
		TRY_CATCH_ENCODE(serialize.intData(&testStrm, 11));
	}
	else
	{
		// schema-less mode
		TRY_CATCH_ENCODE(asciiToString("11", &chVal, &testStrm.memList, FALSE));
		TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
	}

	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </byteTest>

	qname.uri = &NS_EMPTY_STR;
	qname.localName = &ELEM_DATE_TYPES_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <dateTimeTest>

	if(schemaPtr != NULL)
	{
		// schema mode
		EXIPDateTime dt;

		dt.presenceMask = FRACT_PRESENCE;

		dt.dateTime.tm_year = 112; // 2012
		dt.dateTime.tm_mon = 6;	// July
		dt.dateTime.tm_mday = 31;
		dt.dateTime.tm_hour = 13;
		dt.dateTime.tm_min = 33;
		dt.dateTime.tm_sec = 55;
		dt.fSecs.value = 839;
		dt.fSecs.offset = 5;

		TRY_CATCH_ENCODE(serialize.dateTimeData(&testStrm, dt));
	}
	else
	{
		// schema-less mode
		TRY_CATCH_ENCODE(asciiToString("2012 Jul 31 13:33", &chVal, &testStrm.memList, FALSE));
		TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
	}

	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </dateTimeTest>

	qname.uri = &NS_EMPTY_STR;
	qname.localName = &ELEM_BIN_TYPES_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <binaryTest>

	if(schemaPtr != NULL)
	{
		// schema mode
		TRY_CATCH_ENCODE(serialize.binaryData(&testStrm, SOME_BINARY_DATA, 10));
	}
	else
	{
		// schema-less mode
		TRY_CATCH_ENCODE(serialize.stringData(&testStrm, SOME_BINARY_DATA_BASE64));
	}

	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </binaryTest>

	qname.uri = &NS_EMPTY_STR;
	qname.localName = &ELEM_ENUM_TYPES_STR;
	TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <enumTest>
	TRY_CATCH_ENCODE(serialize.stringData(&testStrm, ENUM_DATA_4));
	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </enumTest>


	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </extendedTypeTest>

	TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </MultipleXSDsTest>
	TRY_CATCH_ENCODE(serialize.endDocument(&testStrm));

	// VI: Free the memory allocated by the EXI stream object
	TRY_CATCH_ENCODE(serialize.closeEXIStream(&testStrm));

	return tmp_err_code;
}