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