From 9ce90cdf8ce29db737e1494bfe36ee54e748cc93 Mon Sep 17 00:00:00 2001 From: The6P4C Date: Fri, 29 Sep 2017 08:05:15 +1000 Subject: [PATCH] Refactor SystemTimeUtils and add exception to SetSystemTime --- ThunderboltTimeSync/FormMain.cs | 17 ++++---- ThunderboltTimeSync/SystemTimeUtils.cs | 57 +++++++++++++++----------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/ThunderboltTimeSync/FormMain.cs b/ThunderboltTimeSync/FormMain.cs index 36c71d3..9d6b913 100644 --- a/ThunderboltTimeSync/FormMain.cs +++ b/ThunderboltTimeSync/FormMain.cs @@ -1,6 +1,5 @@ using System; using System.Diagnostics; -using System.Security.Principal; using System.Windows.Forms; namespace ThunderboltTimeSync { @@ -19,12 +18,16 @@ namespace ThunderboltTimeSync { InitializeComponent(); - Debug.WriteLine(SystemTimeUtils.GetTime().ToString("yyyy-MM-ddTHH:mm:ssK.ffff")); - SystemTimeUtils.SetTime(new DateTime( - 2000, 1, 1, - 10, 0, 0, 0 - )); - Debug.WriteLine(SystemTimeUtils.GetTime().ToString("yyyy-MM-ddTHH:mm:ssK.ffff")); + Debug.WriteLine(SystemTimeUtils.GetSystemTime().ToString("yyyy-MM-ddTHH:mm:ssK.ffff")); + try { + SystemTimeUtils.SetSystemTime(new DateTime( + 2000, 1, 1, + 10, 0, 0, 0 + )); + } catch (SystemTimeUtils.SystemTimeException stEx) { + Debug.WriteLine(string.Format("Setting system time failed: \"{0}\"", stEx.Message)); + } + Debug.WriteLine(SystemTimeUtils.GetSystemTime().ToString("yyyy-MM-ddTHH:mm:ssK.ffff")); } } } diff --git a/ThunderboltTimeSync/SystemTimeUtils.cs b/ThunderboltTimeSync/SystemTimeUtils.cs index 2578850..4573c11 100644 --- a/ThunderboltTimeSync/SystemTimeUtils.cs +++ b/ThunderboltTimeSync/SystemTimeUtils.cs @@ -1,36 +1,43 @@ using System; -using System.Diagnostics; using System.Runtime.InteropServices; namespace ThunderboltTimeSync { class SystemTimeUtils { - [StructLayout(LayoutKind.Sequential)] - private struct SYSTEMTIME { - public short wYear; - public short wMonth; - public short wDayOfWeek; - public short wDay; - public short wHour; - public short wMinute; - public short wSecond; - public short wMilliseconds; - }; + public class SystemTimeException : Exception { + public SystemTimeException(int hresult) : base(string.Format("The system time could not be set (HRESULT 0x{1:X8}).", hresult)) { + HResult = hresult; + } + } - [DllImport("kernel32.dll")] - private static extern uint GetLastError(); + private class WindowsAPI { + [StructLayout(LayoutKind.Sequential)] + public struct SYSTEMTIME { + public short wYear; + public short wMonth; + public short wDayOfWeek; + public short wDay; + public short wHour; + public short wMinute; + public short wSecond; + public short wMilliseconds; + }; - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool SetSystemTime(ref SYSTEMTIME lpSystemTime); + [DllImport("kernel32.dll")] + public static extern int GetLastError(); - [DllImport("kernel32.dll")] - private static extern void GetSystemTime(ref SYSTEMTIME lpSystemTime); + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool SetSystemTime(ref SYSTEMTIME lpSystemTime); + + [DllImport("kernel32.dll")] + public static extern void GetSystemTime(ref SYSTEMTIME lpSystemTime); + } /// /// Sets the system time. /// /// The date and time to set the system clock to. - public static void SetTime(DateTime dateTime) { - SYSTEMTIME systemTime = new SYSTEMTIME(); + public static void SetSystemTime(DateTime dateTime) { + WindowsAPI.SYSTEMTIME systemTime = new WindowsAPI.SYSTEMTIME(); systemTime.wYear = (short) dateTime.Year; systemTime.wMonth = (short) dateTime.Month; @@ -41,10 +48,10 @@ namespace ThunderboltTimeSync { systemTime.wSecond = (short) dateTime.Second; systemTime.wMilliseconds = (short) dateTime.Millisecond; - bool setSucceeded = SetSystemTime(ref systemTime); + bool setSucceeded = WindowsAPI.SetSystemTime(ref systemTime); if (!setSucceeded) { - Debug.WriteLine(string.Format("Call failed: error = {0}", GetLastError())); + throw new SystemTimeException(WindowsAPI.GetLastError()); } } @@ -52,9 +59,9 @@ namespace ThunderboltTimeSync { /// Retrieves the current system time. /// /// The current system time. - public static DateTime GetTime() { - SYSTEMTIME systemTime = new SYSTEMTIME(); - GetSystemTime(ref systemTime); + public static DateTime GetSystemTime() { + WindowsAPI.SYSTEMTIME systemTime = new WindowsAPI.SYSTEMTIME(); + WindowsAPI.GetSystemTime(ref systemTime); DateTime systemDateTime = new DateTime( systemTime.wYear, systemTime.wMonth, systemTime.wDay,