1 /***************************************************************************
2                      wbxmlfunc.cpp  -  test suite for wbxml-rpc
3                              -------------------
4     begin                : Fri Jan 09 2004
5     copyright            : (C) 2002-2007 by Ewald Arnold
6     email                : ulxmlrpcpp@ewald-arnold.de
7 
8     $Id: wbxmlfunc.cpp 990 2007-07-14 15:00:39Z ewald-arnold $
9 
10 ***************************************************************************/
11 
12 /**************************************************************************
13  *
14  * This program is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU Lesser General Public License as
16  * published by the Free Software Foundation; either version 2 of the License,
17  * or (at your option) any later version.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public License
25  * along with this program; if not, write to the Free Software
26  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27  *
28  ***************************************************************************/
29 
30 //#define ULXR_DEBUG_OUTPUT
31 
32 #include <ulxmlrpcpp/ulxmlrpcpp.h>  // always first header
33 
34 #include <iostream>
35 #include <map>
36 #include <cstdlib>
37 #include <string.h>
38 #include <cstdio>
39 
40 #include <ulxmlrpcpp/ulxr_except.h>
41 
42 #include <ulxmlrpcpp/ulxr_htmlform_handler.h>
43 #include <ulxmlrpcpp/ulxr_value.h>
44 #include <ulxmlrpcpp/ulxr_call.h>
45 #include <ulxmlrpcpp/ulxr_response.h>
46 
47 #include <ulxmlrpcpp/ulxr_valueparse_wb.h>
48 #include <ulxmlrpcpp/ulxr_callparse_wb.h>
49 #include <ulxmlrpcpp/ulxr_responseparse_wb.h>
50 
51 #define MIB_Enum_UTF8      (char) 106
52 #define MIB_Enum_LATIN1    (char) 4
53 
54 #ifdef ULXR_UNICODE
55 #define WB_PROLOG              0x01,  \
56                                0x01,  \
57                                MIB_Enum_UTF8, \
58                                0x00
59 #else
60 #define WB_PROLOG              0x01, \
61                                0x01, \
62                                MIB_Enum_LATIN1, \
63                                0x00
64 #endif
65 
66 const char emptyRespPattern[]    = { WB_PROLOG,
67                                      ulxr::MethodResponseParserWb::wbToken_MethodResponse,
68                                       ulxr::MethodResponseParserWb::wbToken_Params,
69                                       ulxr::WbXmlParser::wbxml_END,
70                                      ulxr::WbXmlParser::wbxml_END
71                                    };
72 
73 const char emptyArrayPattern[]   = { WB_PROLOG,
74                                      ulxr::MethodResponseParserWb::wbToken_MethodResponse,
75                                       ulxr::MethodResponseParserWb::wbToken_Params,
76                                        ulxr::MethodResponseParserWb::wbToken_Param,
77                                         ulxr::MethodResponseParserWb::wbToken_Value,
78                                          ulxr::MethodResponseParserWb::wbToken_Array,
79                                           ulxr::MethodResponseParserWb::wbToken_Data,
80                                           ulxr::WbXmlParser::wbxml_END,
81                                          ulxr::WbXmlParser::wbxml_END,
82                                         ulxr::WbXmlParser::wbxml_END,
83                                        ulxr::WbXmlParser::wbxml_END,
84                                       ulxr::WbXmlParser::wbxml_END,
85                                      ulxr::WbXmlParser::wbxml_END
86                                    };
87 
88 const char emptyStructPattern[]  = { WB_PROLOG,
89                                      ulxr::MethodResponseParserWb::wbToken_MethodResponse,
90                                       ulxr::MethodResponseParserWb::wbToken_Params,
91                                        ulxr::MethodResponseParserWb::wbToken_Param,
92                                         ulxr::MethodResponseParserWb::wbToken_Value,
93                                          ulxr::MethodResponseParserWb::wbToken_Struct,
94                                          ulxr::WbXmlParser::wbxml_END,
95                                         ulxr::WbXmlParser::wbxml_END,
96                                        ulxr::WbXmlParser::wbxml_END,
97                                       ulxr::WbXmlParser::wbxml_END,
98                                      ulxr::WbXmlParser::wbxml_END
99                                    };
100 
101 const char int1Pattern[]   = { WB_PROLOG,
102                                ulxr::ValueParserWb::wbToken_Value,
103                                 ulxr::ValueParserWb::wbToken_Int,
104                                  ulxr::WbXmlParser::wbxml_STR_I, '1', '2', '3', 0,
105                                 ulxr::WbXmlParser::wbxml_END,
106                                ulxr::WbXmlParser::wbxml_END
107                              };
108 
109 const char int2Pattern[]   = { WB_PROLOG,
110                                ulxr::ValueParserWb::wbToken_Value,
111                                 ulxr::ValueParserWb::wbToken_I4,
112                                  ulxr::WbXmlParser::wbxml_STR_I, '1', '2', '3', 0,
113                                 ulxr::WbXmlParser::wbxml_END,
114                                ulxr::WbXmlParser::wbxml_END
115                              };
116 
117 const char boolPattern[]   = { WB_PROLOG,
118                                ulxr::ValueParserWb::wbToken_Value,
119                                 ulxr::ValueParserWb::wbToken_Boolean,
120                                  ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'l', 's', 'e', 0,
121                                 ulxr::WbXmlParser::wbxml_END,
122                                ulxr::WbXmlParser::wbxml_END
123                              };
124 
125 const char doublePattern[] = { WB_PROLOG,
126                                ulxr::ValueParserWb::wbToken_Value,
127                                 ulxr::ValueParserWb::wbToken_Double,
128                                  ulxr::WbXmlParser::wbxml_STR_I, '1', '2', '3', '.', '4', '5', '6', '0', '0', '0', 0,
129                                 ulxr::WbXmlParser::wbxml_END,
130                                ulxr::WbXmlParser::wbxml_END
131                              };
132 
133 const char stringPattern[] = { WB_PROLOG,
134                                ulxr::ValueParserWb::wbToken_Value,
135                                 ulxr::ValueParserWb::wbToken_String,
136                                  ulxr::WbXmlParser::wbxml_STR_I, '&', 'a', 'm', 'p', ';', '\"', '\'',
137                                  's', 't', 'r', 'i', 'n', 'g', '&', 'l', 't', ';',
138                                  '>', '&', 'a', 'm', 'p', ';', '\"', '\'', 0,
139                                 ulxr::WbXmlParser::wbxml_END,
140                                ulxr::WbXmlParser::wbxml_END
141                              };
142 
143 const char implPattern[]   = { WB_PROLOG,
144                                ulxr::ValueParserWb::wbToken_Value,
145                                 ulxr::WbXmlParser::wbxml_STR_I, 'i', 'm', 'p', 'l', 'i', 'z', 'i', 't',
146                                 ' ', 's', 't', 'r', 'i', 'n', 'g', 0,
147                                ulxr::WbXmlParser::wbxml_END
148                              };
149 
150 const char datePattern[]   = { WB_PROLOG,
151                                ulxr::ValueParserWb::wbToken_Value,
152                                 ulxr::ValueParserWb::wbToken_Date,
153                                  ulxr::WbXmlParser::wbxml_STR_I, '2', '0', '0', '2', '0', '3', '1', '0',
154                                  'T', '1', '0', ':', '2', '3', ':', '4', '5', 0,
155                                 ulxr::WbXmlParser::wbxml_END,
156                                ulxr::WbXmlParser::wbxml_END
157                              };
158 
159 
160 const char base64Pattern[] = { WB_PROLOG,
161                                ulxr::ValueParserWb::wbToken_Value,
162                                 ulxr::ValueParserWb::wbToken_Base64,
163                                  ulxr::WbXmlParser::wbxml_STR_I, 'A', 'B', 'A', 'S', 'r', 't',
164                                  '4', '6', '6', 'a', '9', '0', 0,
165                                 ulxr::WbXmlParser::wbxml_END,
166                                ulxr::WbXmlParser::wbxml_END
167                              };
168 
169 const char struct1Pattern[]= { WB_PROLOG,
170                                ulxr::ValueParserWb::wbToken_Value,
171                                 ulxr::ValueParserWb::wbToken_Struct,
172 
173                                  ulxr::ValueParserWb::wbToken_Member,
174                                   ulxr::ValueParserWb::wbToken_Name,
175                                    ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'u', 'l', 't',
176                                    'S', 't', 'r', 'i', 'n', 'g', 0,
177                                   ulxr::WbXmlParser::wbxml_END,
178                                   ulxr::ValueParserWb::wbToken_Value,
179                                    ulxr::ValueParserWb::wbToken_String,
180                                     ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'u', 'l', 't', 's', 't', 'r', '1', 0,
181                                    ulxr::WbXmlParser::wbxml_END,
182                                   ulxr::WbXmlParser::wbxml_END,
183                                  ulxr::WbXmlParser::wbxml_END,
184 
185                                  ulxr::ValueParserWb::wbToken_Member,
186                                   ulxr::ValueParserWb::wbToken_Name,
187                                    ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'u', 'l', 't', 'c', 'o', 'd', 'e', 0,
188                                   ulxr::WbXmlParser::wbxml_END,
189                                   ulxr::ValueParserWb::wbToken_Value,
190                                    ulxr::ValueParserWb::wbToken_I4,
191                                     ulxr::WbXmlParser::wbxml_STR_I, '1', '2', '3', 0,
192                                    ulxr::WbXmlParser::wbxml_END,
193                                   ulxr::WbXmlParser::wbxml_END,
194                                  ulxr::WbXmlParser::wbxml_END,
195 
196                                 ulxr::WbXmlParser::wbxml_END,
197                                ulxr::WbXmlParser::wbxml_END
198                              };
199 
200 
201 const char struct2Pattern[]= { WB_PROLOG,
202                                ulxr::ValueParserWb::wbToken_Value,
203                                 ulxr::ValueParserWb::wbToken_Struct,
204 
205                                  ulxr::ValueParserWb::wbToken_Member,
206                                   ulxr::ValueParserWb::wbToken_Value,
207                                    ulxr::ValueParserWb::wbToken_String,
208                                     ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'u', 'l', 't', 's', 't', 'r', '2', 0,
209                                    ulxr::WbXmlParser::wbxml_END,
210                                   ulxr::WbXmlParser::wbxml_END,
211                                   ulxr::ValueParserWb::wbToken_Name,
212                                    ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'u', 'l', 't',
213                                    'S', 't', 'r', 'i', 'n', 'g', 0,
214                                   ulxr::WbXmlParser::wbxml_END,
215                                  ulxr::WbXmlParser::wbxml_END,
216 
217                                  ulxr::ValueParserWb::wbToken_Member,
218                                   ulxr::ValueParserWb::wbToken_Value,
219                                    ulxr::ValueParserWb::wbToken_I4,
220                                     ulxr::WbXmlParser::wbxml_STR_I, '4', '5', '6', 0,
221                                    ulxr::WbXmlParser::wbxml_END,
222                                   ulxr::WbXmlParser::wbxml_END,
223                                   ulxr::ValueParserWb::wbToken_Name,
224                                    ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'u', 'l', 't', 'c', 'o', 'd', 'e', 0,
225                                   ulxr::WbXmlParser::wbxml_END,
226                                  ulxr::WbXmlParser::wbxml_END,
227 
228                                 ulxr::WbXmlParser::wbxml_END,
229                                ulxr::WbXmlParser::wbxml_END
230                              };
231 
232 const char arrayPattern[]  = { WB_PROLOG,
233                                ulxr::ValueParserWb::wbToken_Value,
234                                 ulxr::ValueParserWb::wbToken_Array,
235                                  ulxr::ValueParserWb::wbToken_Data,
236 
237                                   ulxr::ValueParserWb::wbToken_Value,
238                                    ulxr::ValueParserWb::wbToken_Boolean,
239                                     ulxr::WbXmlParser::wbxml_STR_I, 't', 'r', 'u', 'e', 0,
240                                    ulxr::WbXmlParser::wbxml_END,
241                                   ulxr::WbXmlParser::wbxml_END,
242 
243                                   ulxr::ValueParserWb::wbToken_Value,
244                                    ulxr::ValueParserWb::wbToken_I4,
245                                     ulxr::WbXmlParser::wbxml_STR_I, '1', '2', '3', 0,
246                                    ulxr::WbXmlParser::wbxml_END,
247                                   ulxr::WbXmlParser::wbxml_END,
248 
249                                  ulxr::WbXmlParser::wbxml_END,
250                                 ulxr::WbXmlParser::wbxml_END,
251                                ulxr::WbXmlParser::wbxml_END
252                              };
253 
254 const char respPattern[]   = { WB_PROLOG,
255                                ulxr::MethodResponseParserWb::wbToken_MethodResponse,
256                                 ulxr::MethodResponseParserWb::wbToken_Fault,
257                                  ulxr::ValueParserWb::wbToken_Value,
258                                   ulxr::ValueParserWb::wbToken_Struct,
259 
260                                    ulxr::ValueParserWb::wbToken_Member,
261                                     ulxr::ValueParserWb::wbToken_Name,
262                                      ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'u', 'l', 't', 'C', 'o', 'd', 'e', 0,
263                                     ulxr::WbXmlParser::wbxml_END,
264                                     ulxr::ValueParserWb::wbToken_Value,
265                                      ulxr::ValueParserWb::wbToken_I4,
266                                       ulxr::WbXmlParser::wbxml_STR_I, '1', '2', '3', 0,
267                                      ulxr::WbXmlParser::wbxml_END,
268                                     ulxr::WbXmlParser::wbxml_END,
269                                    ulxr::WbXmlParser::wbxml_END,
270 
271                                    ulxr::ValueParserWb::wbToken_Member,
272                                     ulxr::ValueParserWb::wbToken_Name,
273                                      ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'u', 'l', 't',
274                                      'S', 't', 'r', 'i', 'n', 'g', 0,
275                                     ulxr::WbXmlParser::wbxml_END,
276                                     ulxr::ValueParserWb::wbToken_Value,
277                                      ulxr::ValueParserWb::wbToken_String,
278                                       ulxr::WbXmlParser::wbxml_STR_I, 'f', 'a', 'u', 'l', 't', 's',
279                                       't', 'r', '_', 'r', 0,
280                                     ulxr::WbXmlParser::wbxml_END,
281                                    ulxr::WbXmlParser::wbxml_END,
282 
283                                   ulxr::WbXmlParser::wbxml_END,
284                                  ulxr::WbXmlParser::wbxml_END,
285                                 ulxr::WbXmlParser::wbxml_END,
286                                ulxr::WbXmlParser::wbxml_END
287                              };
288 
289 
290 const char callPattern[]   = { WB_PROLOG,
291                                ulxr::MethodCallParserWb::wbToken_MethodCall,
292                                 ulxr::MethodCallParserWb::wbToken_MethodName,
293                                  ulxr::WbXmlParser::wbxml_STR_I, 's', 'h', 'e', 'l', 'l', '.', 'c', 'a', 'l', 'l', 0,
294                                 ulxr::WbXmlParser::wbxml_END,
295 
296                                 ulxr::MethodCallParserWb::wbToken_Params,
297 
298                                  ulxr::MethodCallParserWb::wbToken_Param,
299                                   ulxr::ValueParserWb::wbToken_Value,
300                                    ulxr::ValueParserWb::wbToken_String,
301                                     ulxr::WbXmlParser::wbxml_STR_I, 's', 't', 'r', 'i', 'n', 'g', 0,
302                                    ulxr::WbXmlParser::wbxml_END,
303                                   ulxr::WbXmlParser::wbxml_END,
304                                  ulxr::WbXmlParser::wbxml_END,
305 
306                                  ulxr::MethodCallParserWb::wbToken_Param,
307                                   ulxr::ValueParserWb::wbToken_Value,
308                                    ulxr::ValueParserWb::wbToken_I4,
309                                     ulxr::WbXmlParser::wbxml_STR_I, '1', '2', '3', 0,
310                                    ulxr::WbXmlParser::wbxml_END,
311                                   ulxr::WbXmlParser::wbxml_END,
312                                  ulxr::WbXmlParser::wbxml_END,
313 
314                                  ulxr::MethodCallParserWb::wbToken_Param,
315                                   ulxr::ValueParserWb::wbToken_Value,
316                                    ulxr::ValueParserWb::wbToken_Boolean,
317                                     ulxr::WbXmlParser::wbxml_STR_I, 't', 'r', 'u', 'e', 0,
318                                    ulxr::WbXmlParser::wbxml_END,
319                                   ulxr::WbXmlParser::wbxml_END,
320                                  ulxr::WbXmlParser::wbxml_END,
321 
322                                 ulxr::WbXmlParser::wbxml_END,
323                                ulxr::WbXmlParser::wbxml_END
324                              };
325 
326 const char emptyCallPattern[]
327                            = { WB_PROLOG,
328                                ulxr::MethodCallParserWb::wbToken_MethodCall,
329                                 ulxr::MethodCallParserWb::wbToken_MethodName,
330                                  ulxr::WbXmlParser::wbxml_STR_I, 's', 'h', 'e', 'l', 'l', '.', 'c', 'a', 'l', 'l', 0,
331                                 ulxr::WbXmlParser::wbxml_END,
332 
333                                 ulxr::MethodCallParserWb::wbToken_Params,
334 
335                                 ulxr::WbXmlParser::wbxml_END,
336                                ulxr::WbXmlParser::wbxml_END
337                              };
338 
339 void testPattern(const char *pattern, unsigned len)
340 {
341   ULXR_COUT << ULXR_PCHAR("====================================================\n");
342   unsigned cnt = 0;
343   for (unsigned i = 0; i < len; ++i)
344   {
345     ULXR_COUT << ulxr::HtmlFormHandler::makeHexNumber(pattern[i]) << ULXR_PCHAR(" ");
346     if (++cnt > 16)
347     {
348       ULXR_COUT << std::endl;
349       cnt = 0;
350     }
351   }
352   ULXR_COUT << std::endl
353             << ULXR_PCHAR("-----------------------------------------------------\n");
354   ulxr::ValueParserWb parser;
355   bool done = false;
356   ULXR_COUT << ULXR_PCHAR("Parser start\n");
357   if (!parser.parse(pattern, len, done))
358   {
359     ULXR_COUT << ULXR_PCHAR("Parser error\n");
360     std::cerr << ulxr::getLatin1(parser.getErrorString(parser.getErrorCode())).c_str()
361               << " at line "
362               << parser.getCurrentLineNumber()
363               << std::endl;
364   }
365   ULXR_COUT << ULXR_PCHAR("Parser finish\n");
366 
367   ulxr::Value val = parser.getValue();
368   ULXR_COUT << val.getSignature(true) << std::endl;
369   ULXR_COUT << val.getXml(0) << std::endl;
370   if (val.isString() )
371   {
372     ulxr::RpcString str= val;
373     ULXR_COUT << ULXR_PCHAR("EinRpcString: ") << str.getString() << std::endl;
374     return;
375   }
376   ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
377   ULXR_COUT << ulxr::binaryDebugOutput(val.getWbXml());
378   ULXR_COUT << ULXR_PCHAR("====================================================\n");
379 }
380 
381 
382 void testCallPattern(const char *pattern, unsigned len)
383 {
384   ULXR_COUT << ULXR_PCHAR("====================================================\n");
385   unsigned cnt = 0;
386   for (unsigned i2 = 0; i2 < len; ++i2)
387   {
388     ULXR_COUT << ulxr::HtmlFormHandler::makeHexNumber(pattern[i2]) << ULXR_PCHAR(" ");
389     if (++cnt > 16)
390     {
391       ULXR_COUT << std::endl;
392       cnt = 0;
393     }
394   }
395   ULXR_COUT << std::endl
396             << ULXR_PCHAR("-----------------------------------------------------\n");
397 
398   ulxr::MethodCallParserWb parser;
399   bool done= false;
400   if (!parser.parse(pattern, len, done))
401   {
402     ULXR_COUT << ULXR_PCHAR("Parser error\n");
403     std::cerr << ulxr::getLatin1(parser.getErrorString(parser.getErrorCode())).c_str()
404               << " at line "
405               << parser.getCurrentLineNumber()
406               << std::endl;
407   }
408 
409   ULXR_COUT << parser.getMethodCall().getSignature(true) << std::endl;
410   ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
411   ULXR_COUT << parser.getMethodCall().getXml(0) << std::endl;
412   ULXR_COUT << parser.getMethodName() << std::endl;
413   ULXR_COUT << parser.numParams() << std::endl;
414   for (unsigned i1 = 0; i1 < parser.numParams(); ++i1)
415     ULXR_COUT << parser.getParam(i1).getSignature(true) << std::endl;
416 
417   ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
418   ULXR_COUT << ulxr::binaryDebugOutput(parser.getMethodCall().getWbXml());
419   ULXR_COUT << ULXR_PCHAR("====================================================\n");
420 }
421 
422 
423 void testRespPattern(const char *pattern, unsigned len)
424 {
425   ULXR_COUT << ULXR_PCHAR("====================================================\n");
426   unsigned cnt = 0;
427   for (unsigned i = 0; i < len; ++i)
428   {
429     ULXR_COUT << ulxr::HtmlFormHandler::makeHexNumber(pattern[i]) << ULXR_PCHAR(" ");
430     if (++cnt > 16)
431     {
432       ULXR_COUT << std::endl;
433       cnt = 0;
434     }
435   }
436   ULXR_COUT << std::endl
437             << ULXR_PCHAR("-----------------------------------------------------\n");
438 
439   ulxr::MethodResponseParserWb parser;
440   bool done= false;
441   if (!parser.parse(pattern, len, done))
442   {
443     ULXR_COUT << ULXR_PCHAR("Parser error\n");
444     std::cerr << ulxr::getLatin1(parser.getErrorString(parser.getErrorCode())).c_str()
445               << " at line "
446               << parser.getCurrentLineNumber()
447               << std::endl;
448   }
449 
450   ulxr::Value val= parser.getValue();
451   ULXR_COUT << ULXR_PCHAR("!Value...\n");
452   ULXR_COUT << val.getSignature(true) << std::endl;
453   ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
454   ULXR_COUT << val.getXml(0) << std::endl;
455   ULXR_COUT << ULXR_PCHAR("Response...\n");
456   ULXR_COUT << parser.getMethodResponse().getSignature(true) << std::endl;
457   ULXR_COUT << parser.getMethodResponse().getXml(0) << std::endl;
458 
459   ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
460   ULXR_COUT << ulxr::binaryDebugOutput(parser.getMethodResponse().getWbXml());
461   ULXR_COUT << ULXR_PCHAR("====================================================\n");
462 }
463 
464 // #define STRESS_IT
465 
466 int main(int argc, char * argv [])
467 {
468   ulxr::intializeLog4J(argv[0]);
469 
470   int success = 0;
471 
472 #ifdef STRESS_IT
473   for (int i= 0; i < 1000; ++i)
474   {
475 #endif
476     try
477     {
478       ULXR_COUT << ULXR_PCHAR("Testing patterns\n");
479 
480       ULXR_COUT << ULXR_PCHAR("boolPattern\n") << std::flush;
481       testPattern(boolPattern, sizeof(boolPattern));
482 
483       ULXR_COUT << ULXR_PCHAR("int1Pattern\n");
484       testPattern(int1Pattern, sizeof(int1Pattern));
485 
486       ULXR_COUT << ULXR_PCHAR("int2Pattern\n");
487       testPattern(int2Pattern, sizeof(int2Pattern));
488 
489       ULXR_COUT << ULXR_PCHAR("doublePattern\n");
490       testPattern(doublePattern, sizeof(doublePattern));
491 
492       ULXR_COUT << ULXR_PCHAR("stringPattern\n");
493       testPattern(stringPattern, sizeof(stringPattern));
494 
495       ULXR_COUT << ULXR_PCHAR("base64Pattern\n");
496       testPattern(base64Pattern, sizeof(base64Pattern));
497 
498       ULXR_COUT << ULXR_PCHAR("datePattern\n");
499       testPattern(datePattern, sizeof(datePattern));
500 
501       ULXR_COUT << ULXR_PCHAR("struct1Pattern\n");
502       testPattern(struct1Pattern, sizeof(struct1Pattern));
503 
504       ULXR_COUT << ULXR_PCHAR("struct2Pattern\n");
505       testPattern(struct2Pattern, sizeof(struct2Pattern));
506 
507       ULXR_COUT << ULXR_PCHAR("arrayPattern\n");
508       testPattern(arrayPattern, sizeof(arrayPattern));
509 
510       ULXR_COUT << ULXR_PCHAR("callPattern\n");
511       testCallPattern(callPattern, sizeof(callPattern));
512 
513       ULXR_COUT << ULXR_PCHAR("emptyCallPattern\n");
514       testCallPattern(emptyCallPattern, sizeof(emptyCallPattern));
515 
516       ULXR_COUT << ULXR_PCHAR("respPattern\n");
517       testRespPattern(respPattern, sizeof(respPattern));
518 
519       ULXR_COUT << ULXR_PCHAR("implPattern\n");
520       testPattern(implPattern, sizeof(implPattern));
521 
522       ULXR_COUT << ULXR_PCHAR("emptyArrayPattern\n");
523       testRespPattern(emptyArrayPattern, sizeof(emptyArrayPattern));
524 
525       ULXR_COUT << ULXR_PCHAR("emptyRespPattern\n");
526       testRespPattern(emptyRespPattern, sizeof(emptyRespPattern));
527 
528       ULXR_COUT << ULXR_PCHAR("emptyStructPattern\n");
529       testRespPattern(emptyStructPattern, sizeof(emptyStructPattern));
530 
531       ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
532 
533       ULXR_COUT << ULXR_PCHAR("MethodResponse abc\n");
534 
535       ulxr::MethodResponse mr1(123, ULXR_PCHAR("faultstr_m"));
536       ULXR_COUT << ulxr::binaryDebugOutput(mr1.getWbXml());
537       ULXR_COUT << std::endl << mr1.getXml(0) << std::endl;
538 
539       ulxr::MethodResponse mr2(ulxr::Integer(1));
540       ULXR_COUT << ulxr::binaryDebugOutput(mr2.getWbXml());
541       ULXR_COUT << std::endl << mr2.getXml(0) << std::endl;
542 
543       ulxr::MethodResponse mr3;
544       ULXR_COUT << ulxr::binaryDebugOutput(mr3.getWbXml());
545       ULXR_COUT << std::endl << mr3.getXml(0) << std::endl;
546 
547       ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
548 
549       ulxr::MethodCall mc (ULXR_PCHAR("test.call"));
550       ULXR_COUT << ulxr::binaryDebugOutput(mc.getWbXml());
551 
552       ULXR_COUT << std::endl << mc.getXml(0) << std::endl;
553 
554       ULXR_COUT << ULXR_PCHAR("====================================================\n");
555 
556       ulxr::Boolean b(true);
557       ulxr::Integer i(123);
558       ulxr::Double d(123.456);
559       ulxr::RpcString s("<>&\"\'string<>&\"\'");
560       ulxr::DateTime dt(ULXR_PCHAR("20020310T10:23:45"));
561       ulxr::Base64 b64(ULXR_PCHAR("ABASrt466a90"));
562       ulxr::Struct st;
563       ulxr::Array ar;
564 
565       ULXR_COUT << ulxr::binaryDebugOutput(b.getWbXml()) << std::endl;
566       ULXR_COUT << b.getXml(0) << std::endl;
567 
568       ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
569       ULXR_COUT << ulxr::binaryDebugOutput(i.getWbXml()) << std::endl;
570       ULXR_COUT << i.getXml(0) << std::endl;
571 
572       ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
573       ULXR_COUT << ulxr::binaryDebugOutput(d.getWbXml()) << std::endl;
574       ULXR_COUT << d.getXml(0) << std::endl;
575 
576       ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
577       ULXR_COUT << ulxr::binaryDebugOutput(s.getWbXml()) << std::endl;
578       ULXR_COUT << s.getXml(0) << std::endl;
579 
580       ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
581       ULXR_COUT << ulxr::binaryDebugOutput(dt.getWbXml()) << std::endl;
582       ULXR_COUT << dt.getXml(0) << std::endl;
583 
584       ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
585       ULXR_COUT << ulxr::binaryDebugOutput(b64.getWbXml()) << std::endl;
586       ULXR_COUT << b64.getXml(0) << std::endl;
587 
588       ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
589       ULXR_COUT << ulxr::binaryDebugOutput(st.getWbXml()) << std::endl;
590       ULXR_COUT << st.getXml(0) << std::endl;
591 
592       ULXR_COUT << ULXR_PCHAR("----------------------------------------------------\n");
593       ULXR_COUT << ulxr::binaryDebugOutput(ar.getWbXml()) << std::endl;
594       ULXR_COUT << ar.getXml(0) << std::endl;
595 
596       ULXR_COUT << ULXR_PCHAR("====================================================\n");
597 
598       ULXR_COUT << "wbToken_Value   " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Value) << std::endl;
599       ULXR_COUT << "wbToken_Array   " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Array) << std::endl;
600       ULXR_COUT << "wbToken_Data    " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Data) << std::endl;
601       ULXR_COUT << "wbToken_Struct  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Struct) << std::endl;
602       ULXR_COUT << "wbToken_Member  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Member) << std::endl;
603       ULXR_COUT << "wbToken_Name    " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Name) << std::endl;
604       ULXR_COUT << "wbToken_Boolean " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Boolean) << std::endl;
605       ULXR_COUT << "wbToken_Int     " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Int) << std::endl;
606       ULXR_COUT << "wbToken_I4      " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_I4) << std::endl;
607       ULXR_COUT << "wbToken_Double  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Double) << std::endl;
608       ULXR_COUT << "wbToken_String  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_String) << std::endl;
609       ULXR_COUT << "wbToken_Base64  " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Base64) << std::endl;
610       ULXR_COUT << "wbToken_Date    " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_Date) << std::endl;
611       ULXR_COUT << std::endl;
612 
613       ULXR_COUT << "wbToken_MethodCall " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_MethodCall) << std::endl;
614       ULXR_COUT << "wbToken_MethodName " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_MethodName) << std::endl;
615       ULXR_COUT << "wbToken_Params     " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_Params) << std::endl;
616       ULXR_COUT << "wbToken_Param      " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_Param) << std::endl;
617       ULXR_COUT << std::endl;
618 
619       ULXR_COUT << "wbToken_MethodResponse " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_MethodResponse) << std::endl;
620       ULXR_COUT << "wbToken_Fault          " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_Fault) << std::endl;
621       ULXR_COUT << "wbToken_Params         " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_Params) << std::endl;
622       ULXR_COUT << "wbToken_Param          " << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_Param) << std::endl;
623       ULXR_COUT << std::endl;
624 
625       ULXR_COUT << "wbToken_ValueParserLast "
626                 << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::ValueParserWb::wbToken_ValueParserLast) << std::endl;
627 
628       ULXR_COUT << "wbToken_CallParserLast "
629                 << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodCallParserWb::wbToken_CallParserLast) << std::endl;
630 
631       ULXR_COUT << "wbToken_ResponseParserLast "
632                 << ulxr::HtmlFormHandler::makeHexNumber((unsigned char)ulxr::MethodResponseParserWb::wbToken_ResponseParserLast) << std::endl;
633 
634 
635     }
636 
637     catch(ulxr::Exception &ex)
638     {
639        ULXR_COUT << ULXR_PCHAR("Error occured: ")
640                  << ULXR_GET_STRING(ex.why()) << std::endl;
641        success= 1;
642     }
643 #ifdef STRESS_IT
644   }
645 #endif
646 
647   return success;
648 }
649 
650