summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qfsfileengine_win.cpp
diff options
context:
space:
mode:
authorNikita Krupenko <krnekit@gmail.com>2015-08-11 17:12:56 -0300
committerNikita Krupenko <krnekit@gmail.com>2017-04-27 18:44:15 +0000
commit7ef398e8fa7e283bf42eacfa9f0a514f6490aad2 (patch)
tree44463fc8a0abd6798f88bfe1d978c91dfe13cd2a /src/corelib/io/qfsfileengine_win.cpp
parent8d3220459223e0cb2cfd06031c70359ecb2d39cd (diff)
QFileDevice/QFileInfo: Add fileTime() and setFileTime()
[ChangeLog][QtCore][QFileDevice] Added fileTime() and setFileTime(). [ChangeLog][QtCore][QFileInfo] Added fileTime(). Task-number: QTBUG-984 Change-Id: I84dfb05b9454a54e26b57b78edee5773dc4c5c3c Initial-patch-by: Raphael Gozzo <raphael.rg91@gmail.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/io/qfsfileengine_win.cpp')
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp
index 4a477b8429..5c6098c3b0 100644
--- a/src/corelib/io/qfsfileengine_win.cpp
+++ b/src/corelib/io/qfsfileengine_win.cpp
@@ -80,6 +80,39 @@ static inline bool isUncPath(const QString &path)
&& path.size() > 2 && path.at(2) != QLatin1Char('.'));
}
+static inline void QDateTimeToSystemTime(const QDateTime &date, SYSTEMTIME *systemTime)
+{
+ const QDate d = date.date();
+ const QTime t = date.time();
+
+ systemTime->wYear = d.year();
+ systemTime->wMonth = d.month();
+ systemTime->wDay = d.day();
+ systemTime->wHour = t.hour();
+ systemTime->wMinute = t.minute();
+ systemTime->wSecond = t.second();
+ systemTime->wMilliseconds = t.msec();
+ systemTime->wDayOfWeek = d.dayOfWeek() % 7;
+}
+
+static inline bool QDateTimeToFileTime(const QDateTime &date, FILETIME *fileTime)
+{
+ SYSTEMTIME sTime;
+
+#if defined(Q_OS_WINCE)
+ QDateTimeToSystemTime(date, &sTime);
+#else
+ SYSTEMTIME lTime;
+
+ QDateTimeToSystemTime(date, &lTime);
+
+ if (!::TzSpecificLocalTimeToSystemTime(0, &lTime, &sTime))
+ return false;
+#endif
+
+ return ::SystemTimeToFileTime(&sTime, fileTime);
+}
+
/*!
\internal
*/
@@ -850,6 +883,69 @@ bool QFSFileEngine::setSize(qint64 size)
return false;
}
+bool QFSFileEngine::setFileTime(const QDateTime &newDate, FileTime time)
+{
+ Q_D(QFSFileEngine);
+
+ if (d->openMode == QFile::NotOpen) {
+ setError(QFile::PermissionsError, qt_error_string(ERROR_ACCESS_DENIED));
+ return false;
+ }
+
+ if (!newDate.isValid()) {
+ setError(QFile::UnspecifiedError, qt_error_string(ERROR_INVALID_PARAMETER));
+ return false;
+ }
+
+ HANDLE handle = d->fileHandle;
+
+#ifndef Q_OS_WINCE
+ if (handle == INVALID_HANDLE_VALUE) {
+ if (d->fh)
+ handle = reinterpret_cast<HANDLE>(::_get_osfhandle(QT_FILENO(d->fh)));
+ else if (d->fd != -1)
+ handle = reinterpret_cast<HANDLE>(::_get_osfhandle(d->fd));
+ }
+#endif
+
+ if (handle == INVALID_HANDLE_VALUE) {
+ setError(QFile::PermissionsError, qt_error_string(ERROR_ACCESS_DENIED));
+ return false;
+ }
+
+ FILETIME fTime;
+ FILETIME *pLastWrite = NULL;
+ FILETIME *pLastAccess = NULL;
+ FILETIME *pCreationTime = NULL;
+
+ switch (time) {
+ case QAbstractFileEngine::ModificationTime:
+ pLastWrite = &fTime;
+ break;
+
+ case QAbstractFileEngine::AccessTime:
+ pLastAccess = &fTime;
+ break;
+
+ case QAbstractFileEngine::CreationTime:
+ pCreationTime = &fTime;
+ break;
+ }
+
+ if (!QDateTimeToFileTime(newDate, &fTime)) {
+ setError(QFile::UnspecifiedError, qt_error_string());
+ return false;
+ }
+
+ if (!::SetFileTime(handle, pCreationTime, pLastAccess, pLastWrite)) {
+ setError(QFile::PermissionsError, qt_error_string());
+ return false;
+ }
+
+ d->metaData.clearFlags(QFileSystemMetaData::Times);
+
+ return true;
+}
QDateTime QFSFileEngine::fileTime(FileTime time) const
{