📄 xmlrpc.c
字号:
* Assign time value to XMLRPC_VALUE * INPUTS * value The target XMLRPC_VALUE * time The desired new unix time value (time_t) * RESULT * void * SEE ALSO * XMLRPC_GetValueDateTime () * XMLRPC_SetValueDateTime_ISO8601 () * XMLRPC_CreateValueDateTime () * XMLRPC_VALUE * SOURCE */void XMLRPC_SetValueDateTime(XMLRPC_VALUE value, time_t time) { if(value) { char timeBuf[30]; value->type = xmlrpc_datetime; value->i = time; timeBuf[0] = 0; date_to_ISO8601(time, timeBuf, sizeof(timeBuf)); if(timeBuf[0]) { simplestring_clear(&value->str); simplestring_add(&value->str, timeBuf); } }}/*******//****f* VALUE/XMLRPC_CopyValue * NAME * XMLRPC_CopyValue * SYNOPSIS * XMLRPC_VALUE XMLRPC_CopyValue(XMLRPC_VALUE value) * FUNCTION * Make a copy (reference) of an XMLRPC_VALUE * INPUTS * value The target XMLRPC_VALUE * RESULT * XMLRPC_VALUE -- address of the copy * SEE ALSO * XMLRPC_CleanupValue () * XMLRPC_DupValueNew () * NOTES * This function is implemented via reference counting, so the * returned value is going to be the same as the passed in value. * The value must be freed the same number of times it is copied * or there will be a memory leak. * SOURCE */XMLRPC_VALUE XMLRPC_CopyValue(XMLRPC_VALUE value) { if(value) { value->iRefCount ++;#ifdef XMLRPC_DEBUG_REFCOUNT if(value->id.str) { printf ("incremented refcount of %s, now %i\n", value->id.str, value->iRefCount); } else { printf ("incremented refcount of 0x%x, now %i\n", value, value->iRefCount); }#endif } return value;}/*******//****f* VALUE/XMLRPC_DupValueNew * NAME * XMLRPC_DupValueNew * SYNOPSIS * XMLRPC_VALUE XMLRPC_DupValueNew(XMLRPC_VALUE value) * FUNCTION * Make a duplicate (non reference) of an XMLRPC_VALUE with newly allocated mem. * INPUTS * value The source XMLRPC_VALUE to duplicate * RESULT * XMLRPC_VALUE -- address of the duplicate value * SEE ALSO * XMLRPC_CleanupValue () * XMLRPC_CopyValue () * NOTES * Use this when function when you need to modify the contents of * the copied value seperately from the original. * * this function is recursive, thus the value and all of its children * (if any) will be duplicated. * SOURCE */XMLRPC_VALUE XMLRPC_DupValueNew (XMLRPC_VALUE xSource) { XMLRPC_VALUE xReturn = NULL; if (xSource) { xReturn = XMLRPC_CreateValueEmpty (); if (xSource->id.len) { XMLRPC_SetValueID (xReturn, xSource->id.str, xSource->id.len); } switch (xSource->type) { case xmlrpc_int: case xmlrpc_boolean: XMLRPC_SetValueInt (xReturn, xSource->i); break; case xmlrpc_string: case xmlrpc_base64: XMLRPC_SetValueString (xReturn, xSource->str.str, xSource->str.len); break; case xmlrpc_datetime: XMLRPC_SetValueDateTime (xReturn, xSource->i); break; case xmlrpc_double: XMLRPC_SetValueDouble (xReturn, xSource->d); break; case xmlrpc_vector: { q_iter qi = Q_Iter_Head_F (xSource->v->q); XMLRPC_SetIsVector (xReturn, xSource->v->type); while (qi) { XMLRPC_VALUE xIter = Q_Iter_Get_F (qi); XMLRPC_AddValueToVector (xReturn, XMLRPC_DupValueNew (xIter)); qi = Q_Iter_Next_F (qi); } } break; default: break; } } return xReturn;}/*******//****f* VALUE/XMLRPC_CreateValueDateTime * NAME * XMLRPC_CreateValueDateTime * SYNOPSIS * XMLRPC_VALUE XMLRPC_CreateValueDateTime(const char* id, time_t time) * FUNCTION * Create new datetime value from time_t * INPUTS * id id of the new value, or NULL * time The desired unix time value (time_t) * RESULT * void * SEE ALSO * XMLRPC_GetValueDateTime () * XMLRPC_SetValueDateTime () * XMLRPC_CreateValueDateTime_ISO8601 () * XMLRPC_VALUE * SOURCE */XMLRPC_VALUE XMLRPC_CreateValueDateTime(const char* id, time_t time) { XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); if(val) { XMLRPC_SetValueDateTime(val, time); if(id) { XMLRPC_SetValueID(val, id, 0); } } return val;}/*******//****f* VALUE/XMLRPC_SetValueDateTime_ISO8601 * NAME * XMLRPC_SetValueDateTime_ISO8601 * SYNOPSIS * void XMLRPC_SetValueDateTime_ISO8601(XMLRPC_VALUE value, const char* s) * FUNCTION * Set datetime value from IS08601 encoded string * INPUTS * value The target XMLRPC_VALUE * s The desired new time value * RESULT * void * BUGS * This function currently attempts to convert the time string to a valid unix time * value before passing it. Behavior when the string is invalid or out of range * is not well defined, but will probably result in Jan 1, 1970 (0) being passed. * SEE ALSO * XMLRPC_GetValueDateTime_ISO8601 () * XMLRPC_CreateValueDateTime_ISO8601 () * XMLRPC_CreateValueDateTime () * XMLRPC_VALUE * SOURCE */void XMLRPC_SetValueDateTime_ISO8601(XMLRPC_VALUE value, const char* s) { if(value) { time_t time_val = 0; if(s) { date_from_ISO8601(s, &time_val); XMLRPC_SetValueDateTime(value, time_val); } }}/*******//****f* VALUE/XMLRPC_CreateValueDateTime_ISO8601 * NAME * XMLRPC_CreateValueDateTime_ISO8601 * SYNOPSIS * XMLRPC_VALUE XMLRPC_CreateValueDateTime_ISO8601(const char* id, const char *s) * FUNCTION * Create datetime value from IS08601 encoded string * INPUTS * id The id of the new value, or NULL * s The desired new time value * RESULT * newly allocated XMLRPC_VALUE, or NULL if no value created. * BUGS * See XMLRPC_SetValueDateTime_ISO8601 () * SEE ALSO * XMLRPC_GetValueDateTime_ISO8601 () * XMLRPC_SetValueDateTime_ISO8601 () * XMLRPC_CreateValueDateTime () * XMLRPC_VALUE * SOURCE */XMLRPC_VALUE XMLRPC_CreateValueDateTime_ISO8601(const char* id, const char *s) { XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); if(val) { XMLRPC_SetValueDateTime_ISO8601(val, s); if(id) { XMLRPC_SetValueID(val, id, 0); } } return val;}/*******//****f* VALUE/XMLRPC_SetValueBase64 * NAME * XMLRPC_SetValueBase64 * SYNOPSIS * void XMLRPC_SetValueBase64(XMLRPC_VALUE value, const char* s, int len) * FUNCTION * Set base64 value. Base64 is useful for transferring binary data, such as an image. * INPUTS * value The target XMLRPC_VALUE * s The desired new binary value * len The length of s, or NULL. If buffer is not null terminated, len *must* be passed. * RESULT * void * NOTES * Data is set/stored/retrieved as passed in, but is base64 encoded for XML transfer, and * decoded on the other side. This is transparent to the caller. * SEE ALSO * XMLRPC_GetValueBase64 () * XMLRPC_CreateValueBase64 () * XMLRPC_VALUE * SOURCE */void XMLRPC_SetValueBase64(XMLRPC_VALUE value, const char* s, int len) { if(value && s) { simplestring_clear(&value->str); (len > 0) ? simplestring_addn(&value->str, s, len) : simplestring_add(&value->str, s); value->type = xmlrpc_base64; }}/*******//****f* VALUE/XMLRPC_CreateValueBase64 * NAME * XMLRPC_CreateValueBase64 * SYNOPSIS * XMLRPC_VALUE XMLRPC_CreateValueBase64(const char* id, const char* s, int len) * FUNCTION * Create base64 value. Base64 is useful for transferring binary data, such as an image. * INPUTS * id id of the new value, or NULL * s The desired new binary value * len The length of s, or NULL. If buffer is not null terminated, len *must* be passed. * RESULT * newly allocated XMLRPC_VALUE, or NULL if error * NOTES * See XMLRPC_SetValueBase64 () * SEE ALSO * XMLRPC_GetValueBase64 () * XMLRPC_SetValueBase64 () * XMLRPC_VALUE * SOURCE */XMLRPC_VALUE XMLRPC_CreateValueBase64(const char* id, const char* s, int len) { XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); if(val) { XMLRPC_SetValueBase64(val, s, len); if(id) { XMLRPC_SetValueID(val, id, 0); } } return val;}/*******//****f* VALUE/XMLRPC_SetValueDouble * NAME * XMLRPC_SetValueDouble * SYNOPSIS * void XMLRPC_SetValueDouble(XMLRPC_VALUE value, double val) * FUNCTION * Set double (floating point) value. * INPUTS * value The target XMLRPC_VALUE * val The desired new double value * RESULT * void * SEE ALSO * XMLRPC_GetValueDouble () * XMLRPC_CreateValueDouble () * XMLRPC_VALUE * SOURCE */void XMLRPC_SetValueDouble(XMLRPC_VALUE value, double val) { if(value) { value->type = xmlrpc_double; value->d = val; }}/*******//****f* VALUE/XMLRPC_CreateValueDouble * NAME * XMLRPC_CreateValueDouble * SYNOPSIS * XMLRPC_VALUE XMLRPC_CreateValueDouble(const char* id, double d) * FUNCTION * Create double (floating point) value. * INPUTS * id id of the newly created value, or NULL * d The desired new double value * RESULT * void * SEE ALSO * XMLRPC_GetValueDouble () * XMLRPC_CreateValueDouble () * XMLRPC_VALUE * SOURCE */XMLRPC_VALUE XMLRPC_CreateValueDouble(const char* id, double d) { XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); if(val) { XMLRPC_SetValueDouble(val, d); if(id) { XMLRPC_SetValueID(val, id, 0); } } return val;}/*******//****f* VALUE/XMLRPC_GetValueString * NAME * XMLRPC_GetValueString * SYNOPSIS * const char* XMLRPC_GetValueString(XMLRPC_VALUE value) * FUNCTION * retrieve string value * INPUTS * value source XMLRPC_VALUE of type xmlrpc_string * RESULT * void * SEE ALSO * XMLRPC_SetValueString () * XMLRPC_GetValueType () * XMLRPC_VALUE * SOURCE */const char* XMLRPC_GetValueString(XMLRPC_VALUE value) { return ((value && value->type == xmlrpc_string) ? value->str.str : 0);}/*******//****f* VALUE/XMLRPC_GetValueStringLen * NAME * XMLRPC_GetValueStringLen * SYNOPSIS * int XMLRPC_GetValueStringLen(XMLRPC_VALUE value) * FUNCTION * determine length of string value * INPUTS * value XMLRPC_VALUE of type xmlrpc_string * RESULT * length of string, or 0 * NOTES * SEE ALSO * XMLRPC_SetValueString () * XMLRPC_GetValueString () * SOURCE */int XMLRPC_GetValueStringLen(XMLRPC_VALUE value) { return ((value) ? value->str.len : 0);}/*******//****f* VALUE/XMLRPC_GetValueInt * NAME * XMLRPC_GetValueInt * SYNOPSIS * int XMLRPC_GetValueInt(XMLRPC_VALUE value) * FUNCTION * retrieve integer value. * INPUTS * value XMLRPC_VALUE of type xmlrpc_int * RESULT * integer value or 0 if value is not valid int * NOTES * use XMLRPC_GetValueType () to be sure if 0 is real return value or not * SEE ALSO * XMLRPC_SetValueInt () * XMLRPC_CreateValueInt () * SOURCE */int XMLRPC_GetValueInt(XMLRPC_VALUE value) { return ((value && value->type == xmlrpc_int) ? value->i : 0);}/*******//****f* VALUE/XMLRPC_GetValueBoolean * NAME * XMLRPC_GetValueBoolean * SYNOPSIS * int XMLRPC_GetValueBoolean(XMLRPC_VALUE value) * FUNCTION * retrieve boolean value. * INPUTS * XMLRPC_VALUE of type xmlrpc_boolean * RESULT * boolean value or 0 if value is not valid boolean * NOTES * use XMLRPC_GetValueType() to be sure if 0 is real value or not * SEE ALSO * XMLRPC_SetValueBoolean () * XMLRPC_CreateValueBoolean () * SOURCE */int XMLRPC_GetValueBoolean(XMLRPC_VALUE value) { return ((value && value->type == xmlrpc_boolean) ? value->i : 0);}/*******//****f* VALUE/XMLRPC_GetValueDouble * NAME * XMLRPC_GetValueDouble * SYNOPSIS * double XMLRPC_GetValueDouble(XMLRPC_VALUE value) * FUNCTION * retrieve double value * INPUTS * XMLRPC_VALUE of type xmlrpc_double * RESULT * double value or 0 if value is not valid double. * NOTES * use XMLRPC_GetValueType() to be sure if 0 is real value or not * SEE ALSO * XMLRPC_SetValueDouble () * XMLRPC_CreateValueDouble () * SOURCE */double XMLRPC_GetValueDouble(XMLRPC_VALUE value) { return ((value && value->type == xmlrpc_double) ? value->d : 0);}/*******//****f* VALUE/XMLRPC_GetValueBase64 * NAME * XMLRPC_GetValueBase64 * SYNOPSIS * const char* XMLRPC_GetValueBase64(XMLRPC_VALUE value)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -