Exemplo n.º 1
0
static void
test_value_datetime_basic(void) {

    xmlrpc_value * v;
    xmlrpc_env env;
    xmlrpc_datetime dt;
    xmlrpc_datetime readBackDt;

    xmlrpc_env_init(&env);

    dt.Y = 2001;
    dt.M = 12;
    dt.D = 25;
    dt.h = 1;
    dt.m = 2;
    dt.s = 3;
    dt.u = 4;

    v = xmlrpc_datetime_new(&env, dt);

    xmlrpc_read_datetime(&env, v, &readBackDt);
    TEST_NO_FAULT(&env);
    TEST(readBackDt.Y = dt.Y);
    TEST(readBackDt.M = dt.M);
    TEST(readBackDt.D = dt.D);
    TEST(readBackDt.h = dt.h);
    TEST(readBackDt.m = dt.m);
    TEST(readBackDt.s = dt.s);
    TEST(readBackDt.u = dt.u);

    xmlrpc_env_clean(&env);
}
Exemplo n.º 2
0
xmlrpc_value *
xmlrpc_datetime_new_str(xmlrpc_env *const envP,
                        const char *const datetimeString) {
/*----------------------------------------------------------------------------
   This exists only for backward compatibility.  Originally, this was the
   only way to create a datetime XML-RPC value, because we had a really
   lazy implementation of XML-RPC serialization and parsing (basically, the
   user did it!).

   Do not extend this.  The user should use more normal C representations
   of datetimes.
-----------------------------------------------------------------------------*/
    xmlrpc_value *retval;

    validateFormat(envP, datetimeString);
    if (!envP->fault_occurred) {
        xmlrpc_datetime dt;

        parseDatetimeString(datetimeString, &dt);

        /* Note that parseDatetimeString() can generate an invalid datetime
           value, e.g. Hour 25 or February 30.  Ideally, we would catch that
           here, but due to laziness, we simply accept the possibility of
           invalid xmlrpc_datetime in xmlrpc_value and whoever uses the the
           xmlrpc_value has to deal with it.
        */
        retval = xmlrpc_datetime_new(envP, dt);
    }

    return retval;
}
Exemplo n.º 3
0
xmlrpc_value *
xmlrpc_datetime_new_usec(xmlrpc_env *const envP,
                         time_t const secs,
                         unsigned int const usecs) {

    xmlrpc_value *valueP;

    if (usecs >= 1000000)
        xmlrpc_faultf(envP, "Number of fractional microseconds must be less "
                "than one million.  You specified %u", usecs);
    else {
        struct tm brokenTime;
        xmlrpc_datetime dt;

        xmlrpc_gmtime(secs, &brokenTime);

        dt.s = brokenTime.tm_sec;
        dt.m = brokenTime.tm_min;
        dt.h = brokenTime.tm_hour;
        dt.D = brokenTime.tm_mday;
        dt.M = brokenTime.tm_mon + 1;
        dt.Y = 1900 + brokenTime.tm_year;
        dt.u = usecs;

        valueP = xmlrpc_datetime_new(envP, dt);
    }
    return valueP;
}
Exemplo n.º 4
0
void
xmlrpc_parseDatetime(xmlrpc_env *    const envP,
                     const char *    const datetimeString,
                     xmlrpc_value ** const valuePP) {
    /*----------------------------------------------------------------------------
       Parse the content of a <datetime.iso8601> XML-RPC XML element, e.g.
       "20000301T00:00:00".

       'str' is that content.

       Example of the format we parse: "19980717T14:08:55"
       Note that this is not quite ISO 8601.  It's a bizarre combination of
       two ISO 8601 formats.

       Note that Xmlrpc-c recognizes various extensions of the XML-RPC
       <datetime.iso8601> element type.

       'str' may not be valid XML-RPC (with extensions).  In that case we fail
       with fault code XMLRPC_PARSE_ERROR.
    -----------------------------------------------------------------------------*/
    xmlrpc_datetime dt;

#if HAVE_REGEX
    parseDtRegex(envP, datetimeString, &dt);
#else
    /* Note: validation is not as strong without regex */
    validateFormatNoRegex(envP, datetimeString);
    if (!envP->fault_occurred)
        parseDtNoRegex(envP, datetimeString, &dt);
#endif

    if (!envP->fault_occurred) {
        validateXmlrpcDatetimeSome(envP, dt);

        if (!envP->fault_occurred)
            *valuePP = xmlrpc_datetime_new(envP, dt);
    }
}