xref: /PHP-7.3/ext/xmlrpc/libxmlrpc/xmlrpc.h (revision 1c850bfc)
1 /*
2   This file is part of libXMLRPC - a C library for xml-encoded function calls.
3 
4   Author: Dan Libby (dan@libby.com)
5   Epinions.com may be contacted at feedback@epinions-inc.com
6 */
7 
8 /*
9   Copyright 2000 Epinions, Inc.
10 
11   Subject to the following 3 conditions, Epinions, Inc.  permits you, free
12   of charge, to (a) use, copy, distribute, modify, perform and display this
13   software and associated documentation files (the "Software"), and (b)
14   permit others to whom the Software is furnished to do so as well.
15 
16   1) The above copyright notice and this permission notice shall be included
17   without modification in all copies or substantial portions of the
18   Software.
19 
20   2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF
21   ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY
22   IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR
23   PURPOSE OR NONINFRINGEMENT.
24 
25   3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,
26   SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
27   OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING
28   NEGLIGENCE), EVEN IF EPINIONS, INC.  IS AWARE OF THE POSSIBILITY OF SUCH
29   DAMAGES.
30 
31 */
32 
33 #ifndef XMLRPC_ALREADY_INCLUDED
34 #define XMLRPC_ALREADY_INCLUDED 1
35 
36 /* includes */
37 #include "xml_element.h"
38 #include <time.h> /* for time_t */
39 #include <php.h>
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44 
45 /* allow version to be specified via compile line define */
46 #ifndef XMLRPC_LIB_VERSION
47  #define XMLRPC_LIB_VERSION "0.51"
48 #endif
49 
50 /* this number, representing the date, must be increased each time the API changes */
51 #define XMLRPC_API_NO 20020623
52 
53 /* this string should be changed with each packaged release */
54 #define XMLRPC_VERSION_STR "xmlrpc-epi v. " XMLRPC_LIB_VERSION
55 
56 /* where to find more info. shouldn't need to change much */
57 #define XMLRPC_HOME_PAGE_STR "http://xmlprc-epi.sourceforge.net/"
58 
59 
60 /****d* VALUE/XMLRPC_VALUE_TYPE
61  * NAME
62  *   XMLRPC_VALUE_TYPE
63  * NOTES
64  *   Defines data types for XMLRPC_VALUE
65  *   Deprecated for public use.  See XMLRPC_VALUE_TYPE_EASY
66  * SEE ALSO
67  *   XMLRPC_VECTOR_TYPE
68  *   XMLRPC_REQUEST_TYPE
69  * SOURCE
70  */
71 typedef enum _XMLRPC_VALUE_TYPE {
72    xmlrpc_none,                   /* not a value                    */
73    xmlrpc_empty,                  /* empty value, eg NULL           */
74    xmlrpc_base64,                 /* base64 value, eg binary data   */
75    xmlrpc_boolean,                /* boolean  [0 | 1]               */
76    xmlrpc_datetime,               /* datetime [ISO8601 | time_t]    */
77    xmlrpc_double,                 /* double / floating point        */
78    xmlrpc_int,                    /* integer                        */
79    xmlrpc_string,                 /* string                         */
80    xmlrpc_vector                  /* vector, aka list, array        */
81 } XMLRPC_VALUE_TYPE;
82 /*******/
83 
84 /****d* VALUE/XMLRPC_VECTOR_TYPE
85  * NAME
86  *   XMLRPC_VECTOR_TYPE
87  * NOTES
88  *   Defines data types for XMLRPC_VECTOR.
89  *   Deprecated for public use.  See XMLRPC_VALUE_TYPE_EASY
90  * SEE ALSO
91  *   XMLRPC_VALUE_TYPE
92  *   XMLRPC_REQUEST_TYPE
93  * SOURCE
94  */
95 typedef enum _XMLRPC_VECTOR_TYPE {
96    xmlrpc_vector_none,            /* not an array                   */
97    xmlrpc_vector_array,           /* no values may have key names   */
98    xmlrpc_vector_mixed,           /* some values may have key names */
99    xmlrpc_vector_struct           /* all values must have key names */
100 } XMLRPC_VECTOR_TYPE;
101 /*******/
102 
103 /****d* VALUE/XMLRPC_VALUE_TYPE_EASY
104  * NAME
105  *   XMLRPC_VALUE_TYPE_EASY
106  * NOTES
107  *   Defines data types for XMLRPC_VALUE, including vector types.
108  * SEE ALSO
109  *   XMLRPC_VECTOR_TYPE
110  *   XMLRPC_REQUEST_TYPE
111  * SOURCE
112  */
113 typedef enum _XMLRPC_VALUE_TYPE_EASY {
114    xmlrpc_type_none,               /* not a value                    */
115    xmlrpc_type_empty,              /* empty value, eg NULL           */
116    xmlrpc_type_base64,             /* base64 value, eg binary data   */
117    xmlrpc_type_boolean,            /* boolean  [0 | 1]               */
118    xmlrpc_type_datetime,           /* datetime [ISO8601 | time_t]    */
119    xmlrpc_type_double,             /* double / floating point        */
120    xmlrpc_type_int,                /* integer                        */
121    xmlrpc_type_string,             /* string                         */
122 /* -- IMPORTANT: identical to XMLRPC_VALUE_TYPE to this point. --   */
123 	xmlrpc_type_array,              /* vector array                   */
124 	xmlrpc_type_mixed,              /* vector mixed                   */
125 	xmlrpc_type_struct              /* vector struct                  */
126 } XMLRPC_VALUE_TYPE_EASY;
127 /*******/
128 
129 
130 /****d* VALUE/XMLRPC_REQUEST_TYPE
131  * NAME
132  *   XMLRPC_REQUEST_TYPE
133  * NOTES
134  *   Defines data types for XMLRPC_REQUEST
135  * SEE ALSO
136  *   XMLRPC_VALUE_TYPE
137  *   XMLRPC_VECTOR_TYPE
138  * SOURCE
139  */
140 typedef enum _xmlrpc_request_type {
141    xmlrpc_request_none,          /* not a valid request            */
142    xmlrpc_request_call,          /* calling/invoking a method      */
143    xmlrpc_request_response,      /* responding to a method call    */
144 } XMLRPC_REQUEST_TYPE;
145 /*******/
146 
147 /****d* VALUE/XMLRPC_ERROR_CODE
148  * NAME
149  *   XMLRPC_ERROR_CODE
150  * NOTES
151  *   All existing error codes
152  * SEE ALSO
153  *   XMLRPC_REQUEST_ERROR
154  * SOURCE
155  */
156 typedef enum _xmlrpc_error_code {
157    xmlrpc_error_none                      = 0,              /* not an error                                      */
158    xmlrpc_error_parse_xml_syntax          = -32700,
159    xmlrpc_error_parse_unknown_encoding    = -32701,
160    xmlrpc_error_parse_bad_encoding        = -32702,
161    xmlrpc_error_invalid_xmlrpc            = -32600,
162    xmlrpc_error_unknown_method            = -32601,
163    xmlrpc_error_invalid_params            = -32602,
164    xmlrpc_error_internal_server           = -32603,
165    xmlrpc_error_application               = -32500,
166    xmlrpc_error_system                    = -32400,
167    xmlrpc_error_transport                 = -32300
168 } XMLRPC_ERROR_CODE;
169 /******/
170 
171 #define xmlrpc_error_parse_xml_syntax_str       "parse error. not well formed."
172 #define xmlrpc_error_parse_unknown_encoding_str "parse error. unknown encoding"
173 #define xmlrpc_error_parse_bad_encoding_str     "parse error. invalid character for encoding"
174 #define xmlrpc_error_invalid_xmlrpc_str         "server error. xml-rpc not conforming to spec"
175 #define xmlrpc_error_unknown_method_str         "server error. method not found."
176 #define xmlrpc_error_invalid_params_str         "server error. invalid method parameters"
177 #define xmlrpc_error_internal_server_str        "server error. internal xmlrpc library error"
178 #define xmlrpc_error_application_str            "application error."
179 #define xmlrpc_error_system_str                 "system error."
180 #define xmlrpc_error_transport_str              "transport error."
181 
182 
183 
184 /****d* VALUE/XMLRPC_VERSION
185  * NAME
186  *   XMLRPC_VERSION
187  * NOTES
188  *   Defines xml vocabulary used for generated xml
189  * SEE ALSO
190  *   XMLRPC_REQUEST_OUTPUT_OPTIONS
191  *   XMLRPC_REQUEST_To_XML ()
192  * SOURCE
193  */
194 typedef enum _xmlrpc_version {
195    xmlrpc_version_none = 0,      /* not a recognized vocabulary    */
196    xmlrpc_version_1_0 = 1,       /* xmlrpc 1.0 standard vocab      */
197    xmlrpc_version_simple = 2,    /* alt more readable vocab        */
198    xmlrpc_version_danda = 2,     /* same as simple. legacy         */
199 	xmlrpc_version_soap_1_1 = 3	/* SOAP. version 1.1              */
200 } XMLRPC_VERSION;
201 /******/
202 
203 /****s* VALUE/XMLRPC_REQUEST_OUTPUT_OPTIONS
204  * NAME
205  *   XMLRPC_REQUEST_OUTPUT_OPTIONS
206  * NOTES
207  *   Defines output options for generated xml
208  * SEE ALSO
209  *   XMLRPC_VERSION
210  *   XML_ELEM_OUTPUT_OPTIONS
211  *   XMLRPC_REQUEST_To_XML ()
212  * SOURCE
213  */
214 typedef struct _xmlrpc_request_output_options {
215    STRUCT_XML_ELEM_OUTPUT_OPTIONS xml_elem_opts;  /* xml_element specific output options */
216    XMLRPC_VERSION                 version;        /* xml vocabulary to use               */
217 } STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS, *XMLRPC_REQUEST_OUTPUT_OPTIONS;
218 /******/
219 
220 /****s* VALUE/XMLRPC_REQUEST_INPUT_OPTIONS
221  * NAME
222  *   XMLRPC_REQUEST_INPUT_OPTIONS
223  * NOTES
224  *   Defines options for reading in xml data
225  * SEE ALSO
226  *   XMLRPC_VERSION
227  *   XML_ELEM_INPUT_OPTIONS
228  *   XMLRPC_REQUEST_From_XML ()
229  * SOURCE
230  */
231 typedef struct _xmlrpc_request_input_options {
232    STRUCT_XML_ELEM_INPUT_OPTIONS  xml_elem_opts;  /* xml_element specific output options */
233 } STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS, *XMLRPC_REQUEST_INPUT_OPTIONS;
234 /******/
235 
236 /****s* VALUE/XMLRPC_ERROR
237  * NAME
238  *   XMLRPC_ERROR
239  * NOTES
240  *   For the reporting and handling of errors
241  * SOURCE
242  */
243 typedef struct _xmlrpc_error {
244    XMLRPC_ERROR_CODE      code;
245    STRUCT_XML_ELEM_ERROR  xml_elem_error;  /* xml_element errors (parser errors) */
246 } STRUCT_XMLRPC_ERROR, *XMLRPC_ERROR;
247 /******/
248 
249 
250 /****d* VALUE/XMLRPC_CASE_COMPARISON
251  * NAME
252  *   XMLRPC_CASE_COMPARISON
253  * NOTES
254  *   Defines case comparison options for XMLRPC_VALUE/VECTOR API's
255  * SEE ALSO
256  *   XMLRPC_CASE
257  *   XMLRPC_VALUE
258  * SOURCE
259  */
260 typedef enum _xmlrpc_case_comparison {
261    xmlrpc_case_insensitive,      /* use case-insensitive compare */
262    xmlrpc_case_sensitive         /* use case-sensitive compare   */
263 } XMLRPC_CASE_COMPARISON;
264 /******/
265 
266 /****d* VALUE/XMLRPC_CASE
267  * NAME
268  *   XMLRPC_CASE
269  * NOTES
270  *   Defines case behavior when setting IDs in XMLRPC_VALUE API's
271  * SEE ALSO
272  *   XMLRPC_CASE_COMPARISON
273  *   XMLRPC_VALUE
274  * SOURCE
275  */
276 typedef enum _xmlrpc_case {
277    xmlrpc_case_exact,            /* leave case alone             */
278    xmlrpc_case_lower,            /* lower-case id                */
279    xmlrpc_case_upper             /* upper-case id                */
280 } XMLRPC_CASE;
281 /******/
282 
283 /* if you don't like these defaults, you can set them with XMLRPC_SetDefaultIdCase*() */
284 #define XMLRPC_DEFAULT_ID_CASE              XMLRPC_GetDefaultIdCase()
285 #define XMLRPC_DEFAULT_ID_CASE_SENSITIVITY  XMLRPC_GetDefaultIdCaseComparison()
286 
287 /* opaque (non-public) types. defined locally in xmlrpc.c */
288 typedef struct _xmlrpc_request* XMLRPC_REQUEST;
289 typedef struct _xmlrpc_server* XMLRPC_SERVER;
290 typedef struct _xmlrpc_value* XMLRPC_VALUE;
291 
292 /****d* VALUE/XMLRPC_Callback
293  * NAME
294  *   XMLRPC_Callback
295  * NOTES
296  *   Function prototype for user defined method handlers (callbacks).
297  * SEE ALSO
298  *   XMLRPC_ServerRegisterMethod ()
299  *   XMLRPC_ServerCallMethod ()
300  *   XMLRPC_REQUEST
301  *   XMLRPC_VALUE
302  * SOURCE
303  */
304 typedef XMLRPC_VALUE (*XMLRPC_Callback)(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData);
305 /******/
306 
307 /* ID Case Defaults */
308 XMLRPC_CASE XMLRPC_GetDefaultIdCase(void);
309 XMLRPC_CASE XMLRPC_SetDefaultIdCase(XMLRPC_CASE id_case);
310 XMLRPC_CASE_COMPARISON XMLRPC_GetDefaultIdCaseComparison(void);
311 XMLRPC_CASE_COMPARISON XMLRPC_SetDefaultIdCaseComparison(XMLRPC_CASE_COMPARISON id_case);
312 
313 /* Vector manipulation */
314 int XMLRPC_VectorSize(XMLRPC_VALUE value);
315 XMLRPC_VALUE XMLRPC_VectorRewind(XMLRPC_VALUE value);
316 XMLRPC_VALUE XMLRPC_VectorNext(XMLRPC_VALUE value);
317 int XMLRPC_SetIsVector(XMLRPC_VALUE value, XMLRPC_VECTOR_TYPE type);
318 int XMLRPC_AddValueToVector(XMLRPC_VALUE target, XMLRPC_VALUE source);
319 int XMLRPC_AddValuesToVector(XMLRPC_VALUE target, ...);
320 int XMLRPC_VectorRemoveValue(XMLRPC_VALUE vector, XMLRPC_VALUE value);
321 XMLRPC_VALUE XMLRPC_VectorGetValueWithID_Case(XMLRPC_VALUE vector, const char* id, XMLRPC_CASE_COMPARISON id_case);
322 
323 
324 /* Create values */
325 XMLRPC_VALUE XMLRPC_CreateValueBoolean(const char* id, int truth);
326 XMLRPC_VALUE XMLRPC_CreateValueBase64(const char* id, const char* s, int len);
327 XMLRPC_VALUE XMLRPC_CreateValueDateTime(const char* id, time_t time);
328 XMLRPC_VALUE XMLRPC_CreateValueDateTime_ISO8601(const char* id, const char *s);
329 XMLRPC_VALUE XMLRPC_CreateValueDouble(const char* id, double f);
330 XMLRPC_VALUE XMLRPC_CreateValueInt(const char* id, int i);
331 XMLRPC_VALUE XMLRPC_CreateValueString(const char* id, const char* s, int len);
332 XMLRPC_VALUE XMLRPC_CreateValueEmpty(void);
333 XMLRPC_VALUE XMLRPC_CreateVector(const char* id, XMLRPC_VECTOR_TYPE type);
334 
335 /* Cleanup values */
336 void XMLRPC_CleanupValue(XMLRPC_VALUE value);
337 
338 /* Request error */
339 XMLRPC_VALUE XMLRPC_RequestSetError (XMLRPC_REQUEST request, XMLRPC_VALUE error);
340 XMLRPC_VALUE XMLRPC_RequestGetError (XMLRPC_REQUEST request);
341 
342 /* Copy values */
343 XMLRPC_VALUE XMLRPC_CopyValue(XMLRPC_VALUE value);
344 XMLRPC_VALUE XMLRPC_DupValueNew(XMLRPC_VALUE xSource);
345 
346 /* Set Values */
347 void XMLRPC_SetValueDateTime(XMLRPC_VALUE value, time_t time);
348 void XMLRPC_SetValueDateTime_ISO8601(XMLRPC_VALUE value, const char* s);
349 void XMLRPC_SetValueDouble(XMLRPC_VALUE value, double val);
350 void XMLRPC_SetValueInt(XMLRPC_VALUE value, int val);
351 void XMLRPC_SetValueBoolean(XMLRPC_VALUE value, int val);
352 const char *XMLRPC_SetValueString(XMLRPC_VALUE value, const char* s, int len);
353 void XMLRPC_SetValueBase64(XMLRPC_VALUE value, const char* s, int len);
354 const char *XMLRPC_SetValueID_Case(XMLRPC_VALUE value, const char* id, int len, XMLRPC_CASE id_case);
355 #define XMLRPC_SetValueID(value, id, len) XMLRPC_SetValueID_Case(value, id, len, XMLRPC_DEFAULT_ID_CASE)
356 
357 /* Get Values */
358 const char* XMLRPC_GetValueString(XMLRPC_VALUE value);
359 int XMLRPC_GetValueStringLen(XMLRPC_VALUE value);
360 int XMLRPC_GetValueInt(XMLRPC_VALUE value);
361 int XMLRPC_GetValueBoolean(XMLRPC_VALUE value);
362 double XMLRPC_GetValueDouble(XMLRPC_VALUE value);
363 const char* XMLRPC_GetValueBase64(XMLRPC_VALUE value);
364 time_t XMLRPC_GetValueDateTime(XMLRPC_VALUE value);
365 const char* XMLRPC_GetValueDateTime_ISO8601(XMLRPC_VALUE value);
366 const char* XMLRPC_GetValueID(XMLRPC_VALUE value);
367 
368 /* Type introspection */
369 XMLRPC_VALUE_TYPE XMLRPC_GetValueType(XMLRPC_VALUE v);
370 XMLRPC_VALUE_TYPE_EASY XMLRPC_GetValueTypeEasy(XMLRPC_VALUE v);
371 XMLRPC_VECTOR_TYPE XMLRPC_GetVectorType(XMLRPC_VALUE v);
372 
373 /* Parsing and Creating XML */
374 XMLRPC_REQUEST XMLRPC_REQUEST_FromXML(const char* in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options);
375 XMLRPC_VALUE XMLRPC_VALUE_FromXML(const char* in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options);
376 char* XMLRPC_REQUEST_ToXML(XMLRPC_REQUEST request, int *buf_len);
377 char* XMLRPC_VALUE_ToXML(XMLRPC_VALUE val, int* buf_len);
378 
379 /* Request manipulation funcs */
380 const char* XMLRPC_RequestSetMethodName(XMLRPC_REQUEST request, const char* methodName);
381 const char* XMLRPC_RequestGetMethodName(XMLRPC_REQUEST request);
382 XMLRPC_REQUEST XMLRPC_RequestNew(void);
383 void XMLRPC_RequestFree(XMLRPC_REQUEST request, int bFreeIO);
384 XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestSetOutputOptions(XMLRPC_REQUEST request, XMLRPC_REQUEST_OUTPUT_OPTIONS output);
385 XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestGetOutputOptions(XMLRPC_REQUEST request);
386 XMLRPC_VALUE XMLRPC_RequestSetData(XMLRPC_REQUEST request, XMLRPC_VALUE data);
387 XMLRPC_VALUE XMLRPC_RequestGetData(XMLRPC_REQUEST request);
388 XMLRPC_REQUEST_TYPE XMLRPC_RequestSetRequestType(XMLRPC_REQUEST request, XMLRPC_REQUEST_TYPE type);
389 XMLRPC_REQUEST_TYPE XMLRPC_RequestGetRequestType(XMLRPC_REQUEST request);
390 
391 /* Server Creation/Destruction; Method Registration and Invocation */
392 XMLRPC_SERVER XMLRPC_ServerCreate(void);
393 XMLRPC_SERVER XMLRPC_GetGlobalServer(void);   /* better to use XMLRPC_ServerCreate if you can */
394 void XMLRPC_ServerDestroy(XMLRPC_SERVER server);
395 int XMLRPC_ServerRegisterMethod(XMLRPC_SERVER server, const char *name, XMLRPC_Callback cb);
396 XMLRPC_Callback XMLRPC_ServerFindMethod(XMLRPC_SERVER server, const char* callName);
397 XMLRPC_VALUE XMLRPC_ServerCallMethod(XMLRPC_SERVER server, XMLRPC_REQUEST request, void* userData);
398 
399 #include "xmlrpc_introspection.h"
400 
401 /* Fault interrogation funcs */
402 int XMLRPC_ValueIsFault (XMLRPC_VALUE value);
403 int XMLRPC_ResponseIsFault(XMLRPC_REQUEST response);
404 int XMLRPC_GetValueFaultCode (XMLRPC_VALUE value);
405 int XMLRPC_GetResponseFaultCode(XMLRPC_REQUEST response);
406 const char* XMLRPC_GetValueFaultString (XMLRPC_VALUE value);
407 const char* XMLRPC_GetResponseFaultString (XMLRPC_REQUEST response);
408 
409 
410 /* Public Utility funcs */
411 XMLRPC_VALUE XMLRPC_UtilityCreateFault(int fault_code, const char* fault_string);
412 void XMLRPC_Free(void* mem);
413 const char*  XMLRPC_GetVersionString(void);
414 
415 /****d* VALUE/XMLRPC_MACROS
416  * NAME
417  *   Some Helpful Macros
418  * NOTES
419  *   Some macros for making life easier.  Should be self-explanatory.
420  * SEE ALSO
421  *   XMLRPC_AddValueToVector ()
422  *   XMLRPC_VectorGetValueWithID_Case ()
423  *   XMLRPC_VALUE
424  * SOURCE
425  */
426 
427 /* Append values to vector */
428 #define XMLRPC_VectorAppendString(vector, id, s, len) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueString(id, s, len))
429 #define XMLRPC_VectorAppendBase64(vector, id, s, len) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueBase64(id, s, len))
430 #define XMLRPC_VectorAppendDateTime(vector, id, time) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueDateTime(id, time))
431 #define XMLRPC_VectorAppendDateTime_ISO8601(vector, id, s) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueDateTime_ISO8601(id, s))
432 #define XMLRPC_VectorAppendDouble(vector, id, f) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueDouble(id, f))
433 #define XMLRPC_VectorAppendInt(vector, id, i) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueInt(id, i))
434 #define XMLRPC_VectorAppendBoolean(vector, id, i) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueBoolean(id, i))
435 
436 /* Get named values from vector */
437 #define XMLRPC_VectorGetValueWithID(vector, id) XMLRPC_VectorGetValueWithID_Case(vector, id, XMLRPC_DEFAULT_ID_CASE_SENSITIVITY)
438 #define XMLRPC_VectorGetStringWithID(vector, id) XMLRPC_GetValueString(XMLRPC_VectorGetValueWithID(vector, id))
439 #define XMLRPC_VectorGetBase64WithID(vector, id) XMLRPC_GetValueBase64(XMLRPC_VectorGetValueWithID(vector, id))
440 #define XMLRPC_VectorGetDateTimeWithID(vector, id) XMLRPC_GetValueDateTime(XMLRPC_VectorGetValueWithID(vector, id))
441 #define XMLRPC_VectorGetDoubleWithID(vector, id) XMLRPC_GetValueDouble(XMLRPC_VectorGetValueWithID(vector, id))
442 #define XMLRPC_VectorGetIntWithID(vector, id) XMLRPC_GetValueInt(XMLRPC_VectorGetValueWithID(vector, id))
443 #define XMLRPC_VectorGetBooleanWithID(vector, id) XMLRPC_GetValueBoolean(XMLRPC_VectorGetValueWithID(vector, id))
444 
445 /******/
446 
447 
448 #ifdef __cplusplus
449 }
450 #endif
451 
452 #endif /* not XMLRPC_ALREADY_INCLUDED */
453