diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-02-24 09:49:17 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-02-24 09:49:17 +0000 |
| commit | 6e669b50862b2b2eab8c9d1256fb7641ae5b632e (patch) | |
| tree | d143d6a955a7fefc72d46b144f6f112968ba98fb /source/QXmppUtils.cpp | |
| parent | be754178af1d2cd4bbcb76935a72e23f9653e0fd (diff) | |
| download | qxmpp-6e669b50862b2b2eab8c9d1256fb7641ae5b632e.tar.gz | |
add support for XEP-0082: XMPP Date and Time Profiles
Diffstat (limited to 'source/QXmppUtils.cpp')
| -rw-r--r-- | source/QXmppUtils.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/source/QXmppUtils.cpp b/source/QXmppUtils.cpp index 8bb5b0ab..9219a74e 100644 --- a/source/QXmppUtils.cpp +++ b/source/QXmppUtils.cpp @@ -33,6 +33,41 @@ #include <QCryptographicHash> #include <QDateTime> +QDateTime datetimeFromString(const QString &str) +{ + QRegExp tzRe("(Z|([+-])([0-9]{2}):([0-9]{2}))"); + int tzPos = tzRe.indexIn(str, 19); + if (str.size() < 20 || tzPos < 0) + return QDateTime(); + + // process date and time + QDateTime dt = QDateTime::fromString(str.left(19), "yyyy-MM-ddThh:mm:ss"); + dt.setTimeSpec(Qt::UTC); + + // process milliseconds + if (tzPos > 20 && str.at(19) == '.') + { + QString millis = (str.mid(20, tzPos - 20) + "000").left(3); + dt = dt.addMSecs(millis.toInt()); + } + + // process time zone + if (tzRe.cap(1) != "Z") + { + int offset = tzRe.cap(3).toInt() * 3600 + tzRe.cap(4).toInt() * 60; + if (tzRe.cap(2) == "+") + dt = dt.addSecs(-offset); + else + dt = dt.addSecs(offset); + } + return dt; +} + +QString datetimeToString(const QDateTime &dt) +{ + return dt.toUTC().toString("yyyy-MM-ddThh:mm:ss.zzzZ"); +} + QString jidToResource(const QString& jid) { const int pos = jid.indexOf(QChar('/')); |
