diff --git a/src/OrcCommand/UtilitiesMain.cpp b/src/OrcCommand/UtilitiesMain.cpp index 5365abb5..de26a46f 100644 --- a/src/OrcCommand/UtilitiesMain.cpp +++ b/src/OrcCommand/UtilitiesMain.cpp @@ -38,8 +38,8 @@ using namespace Orc; using namespace Orc::Command; UtilitiesMain::UtilitiesMain() - : theStartTime({0}) - , theFinishTime({0}) + : theStartTime() + , theFinishTime() { theStartTickCount = 0L; theFinishTickCount = 0L; diff --git a/src/OrcLib/CMakeLists.txt b/src/OrcLib/CMakeLists.txt index 9dc20aae..49bbac7a 100644 --- a/src/OrcLib/CMakeLists.txt +++ b/src/OrcLib/CMakeLists.txt @@ -722,6 +722,8 @@ set(SRC_UTILITIES "Utils/Iconv.h" "Utils/MakeArray.h" "Utils/Result.h" + "Utils/Time.cpp" + "Utils/Time.h" "Utils/TypeTraits.h" ) diff --git a/src/OrcLib/Utils/Time.cpp b/src/OrcLib/Utils/Time.cpp new file mode 100644 index 00000000..1fb59a6f --- /dev/null +++ b/src/OrcLib/Utils/Time.cpp @@ -0,0 +1,98 @@ +// +// SPDX-License-Identifier: LGPL-2.1-or-later +// +// Copyright © 2020 ANSSI. All Rights Reserved. +// +// Author(s): fabienfl (ANSSI) +// + +#include + +#include "Utils/Time.h" + +using namespace Orc::Traits; + +namespace Orc { + +Result FromSystemTime(const Traits::TimeUtc& st) +{ + return FromSystemTime(st.value); +} + +Result FromSystemTime(const SYSTEMTIME& st) +{ + FILETIME ft; + if (!SystemTimeToFileTime(&st, &ft)) + { + return LastWin32Error(); + } + + return FromFileTime(ft); +} + +std::chrono::system_clock::time_point FromFileTime(const FILETIME& ft) +{ + const auto time = ToTime(ft); + return std::chrono::system_clock::from_time_t(time); +} + +FILETIME ToFileTime(const std::chrono::system_clock::time_point& tp) +{ + const auto time = std::chrono::system_clock::to_time_t(tp); + return ToFileTime(time); +} + +time_t ToTime(const FILETIME& ft) +{ + // A FILETIME is the number of 100-nanosecond intervals since January 1, 1601 + // A time_t is the number of 1 - second intervals since January 1, 1970 + ULARGE_INTEGER ull; + ull.LowPart = ft.dwLowDateTime; + ull.HighPart = ft.dwHighDateTime; + return ull.QuadPart / 10000000ULL - 11644473600ULL; +} + +FILETIME ToFileTime(const time_t& time) +{ + ULARGE_INTEGER ll; + ll.QuadPart = UInt32x32To64(time, 10000000) + 116444736000000000; + + FILETIME ft; + ft.dwLowDateTime = ll.LowPart; + ft.dwHighDateTime = ll.HighPart; + return ft; +} + +Result> ToSystemTime(const std::chrono::system_clock::time_point& tp) +{ + const auto time = std::chrono::system_clock::to_time_t(tp); + const auto ft = ToFileTime(time); + + Traits::TimeUtc st; + if (!FileTimeToSystemTime(&ft, &st.value)) + { + return LastWin32Error(); + } + + return st; +} + +std::wstring ToStringIso8601(const Traits::TimeUtc& time) +{ + const auto& st = time.value; + return fmt::format( + L"{}-{:02}-{:02}T{:02}:{:02}:{:02}Z", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); +} + +Result ToStringIso8601(const std::chrono::system_clock::time_point& tp) +{ + const auto time = ToSystemTime(tp); + if (time.has_error()) + { + return time.error(); + } + + return ToStringIso8601(time.value()); +} + +} // namespace Orc diff --git a/src/OrcLib/Utils/Time.h b/src/OrcLib/Utils/Time.h new file mode 100644 index 00000000..6db26af6 --- /dev/null +++ b/src/OrcLib/Utils/Time.h @@ -0,0 +1,33 @@ +// +// SPDX-License-Identifier: LGPL-2.1-or-later +// +// Copyright © 2020 ANSSI. All Rights Reserved. +// +// Author(s): fabienfl (ANSSI) +// +#pragma once + +#include +#include + +#include + +#include "TypeTraits.h" + +namespace Orc { + +Result FromSystemTime(const SYSTEMTIME& st); +Result FromSystemTime(const Traits::TimeUtc& st); +std::chrono::system_clock::time_point FromFileTime(const FILETIME& ft); + +FILETIME ToFileTime(const std::chrono::system_clock::time_point& tp); +FILETIME ToFileTime(const time_t& time); + +Result> ToSystemTime(const std::chrono::system_clock::time_point& tp); + +time_t ToTime(const FILETIME& ft); + +std::wstring ToStringIso8601(const Traits::TimeUtc& time); +Result ToStringIso8601(const std::chrono::system_clock::time_point& tp); + +} // namespace Orc diff --git a/src/OrcLib/Utils/TypeTraits.h b/src/OrcLib/Utils/TypeTraits.h index aee5e72d..b613a2c5 100644 --- a/src/OrcLib/Utils/TypeTraits.h +++ b/src/OrcLib/Utils/TypeTraits.h @@ -394,8 +394,9 @@ struct TimeUtc { using value_type = T; - TimeUtc(T quantity) - : value(quantity) + template + explicit TimeUtc(Args&&... args) + : value(std::forward(args)...) { }