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