1 /*
2  * Copyright 2010 Vicente J. Botet Escriba
3  * Copyright (c) Microsoft Corporation 2014
4  * Copyright 2015, 2017 Andrey Semashev
5  *
6  * Distributed under the Boost Software License, Version 1.0.
7  * See http://www.boost.org/LICENSE_1_0.txt
8  */
9 
10 #ifndef BOOST_WINAPI_TIME_HPP_INCLUDED_
11 #define BOOST_WINAPI_TIME_HPP_INCLUDED_
12 
13 #include <boost/winapi/basic_types.hpp>
14 
15 #ifdef BOOST_HAS_PRAGMA_ONCE
16 #pragma once
17 #endif
18 
19 #if !defined( BOOST_USE_WINDOWS_H )
20 extern "C" {
21 struct _FILETIME;
22 struct _SYSTEMTIME;
23 
24 BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
25 GetSystemTime(::_SYSTEMTIME* lpSystemTime);
26 
27 #ifdef BOOST_HAS_GETSYSTEMTIMEASFILETIME  // Windows CE does not define GetSystemTimeAsFileTime
28 BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
29 GetSystemTimeAsFileTime(::_FILETIME* lpSystemTimeAsFileTime);
30 #endif
31 
32 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
33 SystemTimeToFileTime(
34     const ::_SYSTEMTIME* lpSystemTime,
35     ::_FILETIME* lpFileTime);
36 
37 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
38 FileTimeToSystemTime(
39     const ::_FILETIME* lpFileTime,
40     ::_SYSTEMTIME* lpSystemTime);
41 
42 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
43 
44 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
45 FileTimeToLocalFileTime(
46     const ::_FILETIME* lpFileTime,
47     ::_FILETIME* lpLocalFileTime);
48 
49 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
50 LocalFileTimeToFileTime(
51     const ::_FILETIME* lpLocalFileTime,
52     ::_FILETIME* lpFileTime);
53 
54 #endif // BOOST_WINAPI_PARTITION_APP_SYSTEM
55 
56 #if BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
57 BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
58 GetTickCount(BOOST_WINAPI_DETAIL_VOID);
59 #endif // BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
60 
61 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
62 BOOST_SYMBOL_IMPORT boost::winapi::ULONGLONG_ BOOST_WINAPI_WINAPI_CC
63 GetTickCount64(BOOST_WINAPI_DETAIL_VOID);
64 #endif
65 
66 } // extern "C"
67 #endif // !defined( BOOST_USE_WINDOWS_H )
68 
69 namespace boost {
70 namespace winapi {
71 
72 typedef struct BOOST_MAY_ALIAS _FILETIME {
73     DWORD_ dwLowDateTime;
74     DWORD_ dwHighDateTime;
75 } FILETIME_, *PFILETIME_, *LPFILETIME_;
76 
77 typedef struct BOOST_MAY_ALIAS _SYSTEMTIME {
78     WORD_ wYear;
79     WORD_ wMonth;
80     WORD_ wDayOfWeek;
81     WORD_ wDay;
82     WORD_ wHour;
83     WORD_ wMinute;
84     WORD_ wSecond;
85     WORD_ wMilliseconds;
86 } SYSTEMTIME_, *PSYSTEMTIME_, *LPSYSTEMTIME_;
87 
88 #if BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
89 using ::GetTickCount;
90 #endif
91 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
92 using ::GetTickCount64;
93 #endif
94 
GetSystemTime(LPSYSTEMTIME_ lpSystemTime)95 BOOST_FORCEINLINE VOID_ GetSystemTime(LPSYSTEMTIME_ lpSystemTime)
96 {
97     ::GetSystemTime(reinterpret_cast< ::_SYSTEMTIME* >(lpSystemTime));
98 }
99 
SystemTimeToFileTime(const SYSTEMTIME_ * lpSystemTime,FILETIME_ * lpFileTime)100 BOOST_FORCEINLINE BOOL_ SystemTimeToFileTime(const SYSTEMTIME_* lpSystemTime, FILETIME_* lpFileTime)
101 {
102     return ::SystemTimeToFileTime(reinterpret_cast< const ::_SYSTEMTIME* >(lpSystemTime), reinterpret_cast< ::_FILETIME* >(lpFileTime));
103 }
104 
FileTimeToSystemTime(const FILETIME_ * lpFileTime,SYSTEMTIME_ * lpSystemTime)105 BOOST_FORCEINLINE BOOL_ FileTimeToSystemTime(const FILETIME_* lpFileTime, SYSTEMTIME_* lpSystemTime)
106 {
107     return ::FileTimeToSystemTime(reinterpret_cast< const ::_FILETIME* >(lpFileTime), reinterpret_cast< ::_SYSTEMTIME* >(lpSystemTime));
108 }
109 
110 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
FileTimeToLocalFileTime(const FILETIME_ * lpFileTime,FILETIME_ * lpLocalFileTime)111 BOOST_FORCEINLINE BOOL_ FileTimeToLocalFileTime(const FILETIME_* lpFileTime, FILETIME_* lpLocalFileTime)
112 {
113     return ::FileTimeToLocalFileTime(reinterpret_cast< const ::_FILETIME* >(lpFileTime), reinterpret_cast< ::_FILETIME* >(lpLocalFileTime));
114 }
115 
LocalFileTimeToFileTime(const FILETIME_ * lpLocalFileTime,FILETIME_ * lpFileTime)116 BOOST_FORCEINLINE BOOL_ LocalFileTimeToFileTime(const FILETIME_* lpLocalFileTime, FILETIME_* lpFileTime)
117 {
118     return ::LocalFileTimeToFileTime(reinterpret_cast< const ::_FILETIME* >(lpLocalFileTime), reinterpret_cast< ::_FILETIME* >(lpFileTime));
119 }
120 #endif // BOOST_WINAPI_PARTITION_APP_SYSTEM
121 
122 #if defined( BOOST_HAS_GETSYSTEMTIMEASFILETIME )
GetSystemTimeAsFileTime(LPFILETIME_ lpSystemTimeAsFileTime)123 BOOST_FORCEINLINE VOID_ GetSystemTimeAsFileTime(LPFILETIME_ lpSystemTimeAsFileTime)
124 {
125     ::GetSystemTimeAsFileTime(reinterpret_cast< ::_FILETIME* >(lpSystemTimeAsFileTime));
126 }
127 #else
128 // Windows CE does not define GetSystemTimeAsFileTime
GetSystemTimeAsFileTime(FILETIME_ * lpFileTime)129 BOOST_FORCEINLINE VOID_ GetSystemTimeAsFileTime(FILETIME_* lpFileTime)
130 {
131     boost::winapi::SYSTEMTIME_ st;
132     boost::winapi::GetSystemTime(&st);
133     boost::winapi::SystemTimeToFileTime(&st, lpFileTime);
134 }
135 #endif
136 
137 }
138 }
139 
140 #endif // BOOST_WINAPI_TIME_HPP_INCLUDED_
141