exip  Alpha 0.5.4
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
encodeTestEXI.c
Go to the documentation of this file.
1 /*==================================================================*\
2 | EXIP - Embeddable EXI Processor in C |
3 |--------------------------------------------------------------------|
4 | This work is licensed under BSD 3-Clause License |
5 | The full license terms and conditions are located in LICENSE.txt |
6 \===================================================================*/
7 
18 #include "encodeTestEXI.h"
19 #include "EXISerializer.h"
20 #include "stringManipulate.h"
21 #include <stdio.h>
22 #include <string.h>
23 
24 #define OUTPUT_BUFFER_SIZE 200
25 
26 const String NS_STR = {"http://www.ltu.se/EISLAB/schema-test", 36};
27 const String NS_NESTED_STR = {"http://www.ltu.se/EISLAB/nested-xsd", 35};
28 const String NS_TYPES_STR = {"http://www.ltu.se/EISLAB/types", 30};
29 const String NS_EMPTY_STR = {NULL, 0};
30 
31 const String ELEM_ENCODE_STR = {"EXIPEncoder", 11};
32 const String ELEM_MULT_TEST_STR = {"MultipleXSDsTest", 16};
33 const String ELEM_DESCR_STR = {"description", 11};
34 const String ELEM_TYPE_TEST_STR = {"type-test", 9};
35 const String ELEM_TEST_SETUP_STR = {"testSetup", 9};
36 const String ELEM_BOOL_STR = {"bool", 4};
37 const String ELEM_INT_STR = {"int", 3};
38 const String ELEM_EXT_TYPES_STR = {"extendedTypeTest", 16};
39 const String ELEM_BYTE_TYPES_STR = {"byteTest", 8};
40 const String ELEM_DATE_TYPES_STR = {"dateTimeTest", 12};
41 const String ELEM_BIN_TYPES_STR = {"binaryTest", 10};
42 const String ELEM_ENUM_TYPES_STR = {"enumTest", 8};
43 
44 const String ATTR_BYTE_STR = {"testByte", 8};
45 const String ATTR_VERSION_STR = {"version", 7};
46 const String ATTR_GOAL_STR = {"goal", 4};
47 const String ATTR_ID_STR = {"id", 2};
48 
49 static char SOME_BINARY_DATA[] = {0x02, 0x6d, 0x2f, 0xa5, 0x20, 0xf2, 0x61, 0x9c, 0xee, 0x0f};
50 static String SOME_BINARY_DATA_BASE64 = {"i3sd7fatzxad", 12};
51 //static String ENUM_DATA_1 = {"hello", 5};
52 //static String ENUM_DATA_2 = {"hi", 2};
53 //static String ENUM_DATA_3 = {"hey", 3};
54 static String ENUM_DATA_4 = {"hej", 3};
55 
56 #define TRY_CATCH_ENCODE(func) TRY_CATCH(func, serialize.closeEXIStream(&testStrm))
57 
58 errorCode encode(EXIPSchema* schemaPtr, FILE *outfile, size_t (*outputStream)(void* buf, size_t size, void* stream))
59 {
60  errorCode tmp_err_code = EXIP_UNEXPECTED_ERROR;
61  EXIStream testStrm;
62  String uri;
63  String ln;
64  QName qname = {&uri, &ln, NULL};
65  String chVal;
66  char buf[OUTPUT_BUFFER_SIZE];
67  BinaryBuffer buffer;
68  EXITypeClass valueType;
69 
70  buffer.buf = buf;
71  buffer.bufLen = OUTPUT_BUFFER_SIZE;
72  buffer.bufContent = 0;
73 
74  // Serialization steps:
75 
76  // I: First initialize the header of the stream
77  serialize.initHeader(&testStrm);
78 
79  // II: Set any options in the header (including schemaID and schemaIDMode), if different from the defaults.
80  testStrm.header.has_cookie = TRUE;
81  testStrm.header.has_options = TRUE;
82  testStrm.header.opts.valueMaxLength = 300;
83  testStrm.header.opts.valuePartitionCapacity = 50;
84  SET_STRICT(testStrm.header.opts.enumOpt);
85 
86  // III: Define an external stream for the output if any, otherwise set to NULL
87  buffer.ioStrm.readWriteToStream = outputStream;
88  buffer.ioStrm.stream = outfile;
89 
90  // IV: Initialize the stream
91  TRY_CATCH_ENCODE(serialize.initStream(&testStrm, buffer, schemaPtr));
92 
93  // V: Start building the stream step by step: header, document, element etc...
95 
97 
98  qname.uri = &NS_STR;
100  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <MultipleXSDsTest>
101 
102  qname.uri = &NS_STR;
103  qname.localName = &ELEM_ENCODE_STR;
104  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <EXIPEncoder>
105 
106  // NOTE: attributes should come lexicographically sorted during serialization
107 
108  qname.uri = &NS_EMPTY_STR;
109  qname.localName = &ATTR_BYTE_STR;
110 
111  if(schemaPtr != NULL)
112  {
113  // schema mode
114  TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // testByte="
115  TRY_CATCH_ENCODE(serialize.intData(&testStrm, 55));
116  }
117  else
118  {
119  // schema-less mode
120  TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // testByte="
121  TRY_CATCH_ENCODE(asciiToString("55", &chVal, &testStrm.memList, FALSE));
122  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
123  }
124 
125  qname.localName = &ATTR_VERSION_STR;
126  TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // version="
127 
128  TRY_CATCH_ENCODE(asciiToString("0.2", &chVal, &testStrm.memList, FALSE));
129  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
130 
131  TRY_CATCH_ENCODE(asciiToString("This is an example of serializing EXI streams using EXIP low level API", &chVal, &testStrm.memList, FALSE));
132  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
133 
134  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </EXIPEncoder>
135 
136  qname.uri = &NS_STR;
137  qname.localName = &ELEM_DESCR_STR;
138  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <description>
139 
140  TRY_CATCH_ENCODE(asciiToString("This is a test of processing XML schemes with multiple XSD files", &chVal, &testStrm.memList, FALSE));
141  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
142 
143  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </description>
144 
145  qname.uri = &NS_NESTED_STR;
147  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <testSetup>
148 
149  qname.uri = &NS_EMPTY_STR;
150  qname.localName = &ATTR_GOAL_STR;
151  TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // goal="
152 
153  TRY_CATCH_ENCODE(asciiToString("Verify that the implementation works!", &chVal, &testStrm.memList, FALSE));
154  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
155 
156  TRY_CATCH_ENCODE(asciiToString("Simple test element with single attribute", &chVal, &testStrm.memList, FALSE));
157  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
158 
159  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </testSetup>
160 
161  qname.uri = &NS_STR;
162  qname.localName = &ELEM_TYPE_TEST_STR;
163  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <type-test>
164 
165  if(schemaPtr != NULL)
166  {
167  // schema mode
168  qname.uri = &NS_EMPTY_STR;
169  qname.localName = &ATTR_ID_STR;
170  TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // id="
171  TRY_CATCH_ENCODE(serialize.intData(&testStrm, 1001));
172  }
173  else
174  {
175  // schema-less mode
176  qname.uri = &NS_EMPTY_STR;
177  qname.localName = &ATTR_ID_STR;
178  TRY_CATCH_ENCODE(serialize.attribute(&testStrm, qname, TRUE, &valueType)); // id="
179  TRY_CATCH_ENCODE(asciiToString("1001", &chVal, &testStrm.memList, FALSE));
180  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
181  }
182 
183  qname.uri = &NS_NESTED_STR;
184  qname.localName = &ELEM_BOOL_STR;
185  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <bool>
186 
187  if(schemaPtr != NULL)
188  {
189  // schema mode
191  }
192  else
193  {
194  // schema-less mode
195  TRY_CATCH_ENCODE(asciiToString("true", &chVal, &testStrm.memList, FALSE));
196  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
197  }
198 
199  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </bool>
200 
201  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </type-test>
202 
203  qname.uri = &NS_STR;
204  qname.localName = &ELEM_EXT_TYPES_STR;
205  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <extendedTypeTest>
206 
207  qname.uri = &NS_EMPTY_STR;
209  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <byteTest>
210 
211  if(schemaPtr != NULL)
212  {
213  // schema mode
214  TRY_CATCH_ENCODE(serialize.intData(&testStrm, 11));
215  }
216  else
217  {
218  // schema-less mode
219  TRY_CATCH_ENCODE(asciiToString("11", &chVal, &testStrm.memList, FALSE));
220  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
221  }
222 
223  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </byteTest>
224 
225  qname.uri = &NS_EMPTY_STR;
227  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <dateTimeTest>
228 
229  if(schemaPtr != NULL)
230  {
231  // schema mode
232  EXIPDateTime dt;
233 
235 
236  dt.dateTime.tm_year = 112; // 2012
237  dt.dateTime.tm_mon = 6; // July
238  dt.dateTime.tm_mday = 31;
239  dt.dateTime.tm_hour = 13;
240  dt.dateTime.tm_min = 33;
241  dt.dateTime.tm_sec = 55;
242  dt.fSecs.value = 839;
243  dt.fSecs.offset = 5;
244 
245  TRY_CATCH_ENCODE(serialize.dateTimeData(&testStrm, dt));
246  }
247  else
248  {
249  // schema-less mode
250  TRY_CATCH_ENCODE(asciiToString("2012 Jul 31 13:33", &chVal, &testStrm.memList, FALSE));
251  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, chVal));
252  }
253 
254  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </dateTimeTest>
255 
256  qname.uri = &NS_EMPTY_STR;
257  qname.localName = &ELEM_BIN_TYPES_STR;
258  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <binaryTest>
259 
260  if(schemaPtr != NULL)
261  {
262  // schema mode
263  TRY_CATCH_ENCODE(serialize.binaryData(&testStrm, SOME_BINARY_DATA, 10));
264  }
265  else
266  {
267  // schema-less mode
268  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, SOME_BINARY_DATA_BASE64));
269  }
270 
271  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </binaryTest>
272 
273  qname.uri = &NS_EMPTY_STR;
275  TRY_CATCH_ENCODE(serialize.startElement(&testStrm, qname, &valueType)); // <enumTest>
276  TRY_CATCH_ENCODE(serialize.stringData(&testStrm, ENUM_DATA_4));
277  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </enumTest>
278 
279 
280  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </extendedTypeTest>
281 
282  TRY_CATCH_ENCODE(serialize.endElement(&testStrm)); // </MultipleXSDsTest>
284 
285  // VI: Free the memory allocated by the EXI stream object
287 
288  return tmp_err_code;
289 }