示例#1
0
Duration *TypeConverter::stringToDuration(const QString &duration)
{

    if (duration.isEmpty()) {
        m_errorMsg = "stringToDuration received an empty string";
        return new Duration();
    }
    m_errorMsg = "-no errors-";

    //Schema duration format: PnYnMnDTnHnMnS

    Duration *d = new Duration();
    int i = 0;
    if (duration[i] == '-') {
        d->setPositive(false);
        i++;
    }

    if (duration[i] != 'P') {
        m_errorMsg = "Invalid duration string: " + duration;
        delete d;
        return new Duration();
    }

    i++;
    bool codeTAppeared = false;
    while (i < duration.length()) {

        QString buf;
        for (; i < duration.length() && duration[i].isDigit(); i++) {
            buf += duration[i];
        }

        if (i < duration.length()) {

            if (codeTAppeared == false) {

                // Before T (PnYnMnD T nHnMnS)
                switch (duration[i].toAscii()) {
                case 'Y':
                    d->setYears(buf.toInt());
                    break;

                case 'M':
                    d->setMonths(buf.toInt());
                    break;

                case 'D':
                    d->setDays(buf.toInt());
                    break;

                case 'T':
                    codeTAppeared = true;
                    break;

                default:
                    m_errorMsg = "Invalid duration string: " + duration;
                    delete d;
                    return new Duration();
                }

            } else {
                // After T (PnYnMnD T nHnMnS)
                switch (duration[i].toAscii()) {
                case 'H':
                    d->setHours(buf.toInt());
                    break;

                case 'M':
                    d->setMinutes(buf.toInt());
                    break;

                case '.':
                    // Decimal point may be present in Seconds value
                    d->setSeconds(buf.toInt());
                    buf="";
                    for (i++; duration[i].isDigit() && i < duration.length(); i++) {
                        buf += duration[i];
                    }

                    if(duration[i] != 'S' || i >= duration.length()) {
                        m_errorMsg = "Error in duration, S not found after decimal point";
                        delete d;
                        return new Duration();
                    }

                    d->setMseconds(buf.toInt());
                    break;

                case 'S':
                    d->setSeconds(buf.toInt());
                    break;

                default:
                    m_errorMsg = "Invalid duration string: " + duration;
                    delete d;
                    return new Duration();
                }

            }
            i++;
        }
    }

    return d;
}