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; }