| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 | 
							- using System;
 
- using System.ComponentModel;
 
- using System.Runtime.InteropServices;
 
- using System.Threading;
 
- using MediaBrowser.Controller.Power;
 
- using MediaBrowser.Model.Logging;
 
- using Microsoft.Win32.SafeHandles;
 
- namespace MediaBrowser.ServerApplication.Native
 
- {
 
-     public class WindowsPowerManagement : IPowerManagement
 
-     {
 
-         [DllImport("kernel32.dll")]
 
-         public static extern SafeWaitHandle CreateWaitableTimer(IntPtr lpTimerAttributes,
 
-                                                                   bool bManualReset,
 
-                                                                 string lpTimerName);
 
-         [DllImport("kernel32.dll", SetLastError = true)]
 
-         [return: MarshalAs(UnmanagedType.Bool)]
 
-         public static extern bool SetWaitableTimer(SafeWaitHandle hTimer,
 
-                                                     [In] ref long pDueTime,
 
-                                                               int lPeriod,
 
-                                                            IntPtr pfnCompletionRoutine,
 
-                                                            IntPtr lpArgToCompletionRoutine,
 
-                                                              bool fResume);
 
-         private BackgroundWorker _bgWorker;
 
-         private readonly ILogger _logger;
 
-         private readonly object _initLock = new object();
 
-         public WindowsPowerManagement(ILogger logger)
 
-         {
 
-             _logger = logger;
 
-         }
 
-         public void ScheduleWake(DateTime utcTime)
 
-         {
 
-             Initialize();
 
-             _bgWorker.RunWorkerAsync(utcTime.ToFileTime());
 
-         }
 
-         private void Initialize()
 
-         {
 
-             lock (_initLock)
 
-             {
 
-                 if (_bgWorker == null)
 
-                 {
 
-                     _bgWorker = new BackgroundWorker();
 
-                     _bgWorker.DoWork += bgWorker_DoWork;
 
-                     _bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted;
 
-                 }
 
-             }
 
-         }
 
-         void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 
-         {
 
-             //if (Woken != null)
 
-             //{
 
-             //    Woken(this, new EventArgs());
 
-             //}
 
-         }
 
-         private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
 
-         {
 
-             try
 
-             {
 
-                 long waketime = (long)e.Argument;
 
-                 using (SafeWaitHandle handle = CreateWaitableTimer(IntPtr.Zero, true, GetType().Assembly.GetName().Name + "Timer"))
 
-                 {
 
-                     if (SetWaitableTimer(handle, ref waketime, 0, IntPtr.Zero, IntPtr.Zero, true))
 
-                     {
 
-                         using (EventWaitHandle wh = new EventWaitHandle(false,
 
-                                                                EventResetMode.AutoReset))
 
-                         {
 
-                             wh.SafeWaitHandle = handle;
 
-                             wh.WaitOne();
 
-                         }
 
-                     }
 
-                     else
 
-                     {
 
-                         throw new Win32Exception(Marshal.GetLastWin32Error());
 
-                     }
 
-                 }
 
-             }
 
-             catch (Exception ex)
 
-             {
 
-                 _logger.ErrorException("Error scheduling wake timer", ex);
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |