michael@0: // Windows/Time.h michael@0: michael@0: #ifndef __WINDOWS_TIME_H michael@0: #define __WINDOWS_TIME_H michael@0: michael@0: #include "Common/Types.h" michael@0: #include "Windows/Defs.h" michael@0: michael@0: namespace NWindows { michael@0: namespace NTime { michael@0: michael@0: inline bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime) michael@0: { michael@0: return BOOLToBool(::DosDateTimeToFileTime(UInt16(dosTime >> 16), michael@0: UInt16(dosTime & 0xFFFF), &fileTime)); michael@0: } michael@0: michael@0: const UInt32 kHighDosTime = 0xFF9FBF7D; michael@0: const UInt32 kLowDosTime = 0x210000; michael@0: michael@0: inline bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime) michael@0: { michael@0: WORD datePart, timePart; michael@0: if (!::FileTimeToDosDateTime(&fileTime, &datePart, &timePart)) michael@0: { michael@0: if (fileTime.dwHighDateTime >= 0x01C00000) // 2000 michael@0: dosTime = kHighDosTime; michael@0: else michael@0: dosTime = kLowDosTime; michael@0: return false; michael@0: } michael@0: dosTime = (((UInt32)datePart) << 16) + timePart; michael@0: return true; michael@0: } michael@0: michael@0: const UInt32 kNumTimeQuantumsInSecond = 10000000; michael@0: const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * 60 * 60 * 24 * 134774; michael@0: michael@0: inline void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime) michael@0: { michael@0: UInt64 v = kUnixTimeStartValue + ((UInt64)unixTime) * kNumTimeQuantumsInSecond; michael@0: fileTime.dwLowDateTime = (DWORD)v; michael@0: fileTime.dwHighDateTime = (DWORD)(v >> 32); michael@0: } michael@0: michael@0: inline bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime) michael@0: { michael@0: UInt64 winTime = (((UInt64)fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime; michael@0: if (winTime < kUnixTimeStartValue) michael@0: { michael@0: unixTime = 0; michael@0: return false; michael@0: } michael@0: winTime = (winTime - kUnixTimeStartValue) / kNumTimeQuantumsInSecond; michael@0: if (winTime > 0xFFFFFFFF) michael@0: { michael@0: unixTime = 0xFFFFFFFF; michael@0: return false; michael@0: } michael@0: unixTime = (UInt32)winTime; michael@0: return true; michael@0: } michael@0: michael@0: }} michael@0: michael@0: #endif