From e494864b08f094d0efe2bb49208ae316f97cbc6d Mon Sep 17 00:00:00 2001
From: Robert Loehning <robert.loehning@nokia.com>
Date: Wed, 2 Dec 2009 14:42:03 +0100
Subject: [PATCH] Trk: Setting correct date and time when closing remote file.

Reviewed-by: Friedemann Kleint
---
 src/shared/trk/launcher.cpp |  2 +-
 src/shared/trk/trkutils.cpp | 15 +++++++++++++++
 src/shared/trk/trkutils.h   |  3 +++
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/shared/trk/launcher.cpp b/src/shared/trk/launcher.cpp
index b9b5f04a159..8a784564772 100644
--- a/src/shared/trk/launcher.cpp
+++ b/src/shared/trk/launcher.cpp
@@ -467,7 +467,7 @@ void Launcher::closeRemoteFile(bool failed)
 {
     QByteArray ba;
     appendInt(&ba, d->m_copyState.copyFileHandle, TargetByteOrder);
-    appendInt(&ba, QDateTime::currentDateTime().toTime_t(), TargetByteOrder);
+    appendDateTime(&ba, QDateTime::currentDateTime(), TargetByteOrder);
     d->m_device->sendTrkMessage(TrkCloseFile,
                                failed ? TrkCallback() : TrkCallback(this, &Launcher::handleFileCopied),
                                ba);
diff --git a/src/shared/trk/trkutils.cpp b/src/shared/trk/trkutils.cpp
index 458390d8893..256d4ad1e19 100644
--- a/src/shared/trk/trkutils.cpp
+++ b/src/shared/trk/trkutils.cpp
@@ -32,6 +32,9 @@
 
 #include <QtCore/QCoreApplication>
 #include <QtCore/QDebug>
+#include <QtCore/QDate>
+#include <QtCore/QDateTime>
+#include <QtCore/QTime>
 
 #define logMessage(s)  do { qDebug() << "TRKCLIENT: " << s; } while (0)
 
@@ -400,6 +403,18 @@ void appendString(QByteArray *ba, const QByteArray &str, Endianness endian, bool
         ba->append('\0');
 }
 
+void appendDateTime(QByteArray *ba, QDateTime dateTime, Endianness endian)
+{
+    // convert the QDateTime to UTC and append its representation to QByteArray
+    // format is the same as in FAT file system
+    dateTime = dateTime.toUTC();
+    const QTime utcTime = dateTime.time();
+    const QDate utcDate = dateTime.date();
+    uint fatDateTime = (utcTime.hour() << 11 | utcTime.minute() << 5 | utcTime.second()/2) << 16;
+    fatDateTime |= (utcDate.year()-1980) << 9 | utcDate.month() << 5 | utcDate.day();
+    appendInt(ba, fatDateTime, endian);
+}
+
 QByteArray errorMessage(byte code)
 {
     switch (code) {
diff --git a/src/shared/trk/trkutils.h b/src/shared/trk/trkutils.h
index aec86a17309..36486193730 100644
--- a/src/shared/trk/trkutils.h
+++ b/src/shared/trk/trkutils.h
@@ -37,6 +37,8 @@
 
 typedef unsigned char byte;
 
+class QDateTime;
+
 namespace trk {
 
 enum Command {
@@ -92,6 +94,7 @@ void appendByte(QByteArray *ba, byte b);
 void appendShort(QByteArray *ba, ushort s, Endianness = TargetByteOrder);
 void appendInt(QByteArray *ba, uint i, Endianness = TargetByteOrder);
 void appendString(QByteArray *ba, const QByteArray &str, Endianness = TargetByteOrder, bool appendNullTerminator = true);
+void appendDateTime(QByteArray *ba, QDateTime dateTime, Endianness = TargetByteOrder);
 
 struct Library
 {
-- 
GitLab