aboutsummaryrefslogtreecommitdiff
path: root/source/QXmppUtils.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-02-24 09:49:17 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-02-24 09:49:17 +0000
commit6e669b50862b2b2eab8c9d1256fb7641ae5b632e (patch)
treed143d6a955a7fefc72d46b144f6f112968ba98fb /source/QXmppUtils.cpp
parentbe754178af1d2cd4bbcb76935a72e23f9653e0fd (diff)
downloadqxmpp-6e669b50862b2b2eab8c9d1256fb7641ae5b632e.tar.gz
add support for XEP-0082: XMPP Date and Time Profiles
Diffstat (limited to 'source/QXmppUtils.cpp')
-rw-r--r--source/QXmppUtils.cpp35
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('/'));