aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.ServerApplication
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2016-02-01 14:24:15 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2016-02-01 14:24:15 -0500
commit37352785acef4db99301c1e88624cf48133ec979 (patch)
tree15638d697cc56a0a774bf261de9814c9034f8e42 /MediaBrowser.ServerApplication
parentf14e9b8d3af98f6ffbe243b105f96f46e8cf3b06 (diff)
parentf5ebeddbf5104092ce584486689af6640125054f (diff)
Merge branch 'beta'
Diffstat (limited to 'MediaBrowser.ServerApplication')
-rw-r--r--MediaBrowser.ServerApplication/MainStartup.cs2
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj1
-rw-r--r--MediaBrowser.ServerApplication/Native/WindowsApp.cs10
-rw-r--r--MediaBrowser.ServerApplication/Native/WindowsPowerManagement.cs94
4 files changed, 105 insertions, 2 deletions
diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs
index 62cdbd05f..cf174c2d3 100644
--- a/MediaBrowser.ServerApplication/MainStartup.cs
+++ b/MediaBrowser.ServerApplication/MainStartup.cs
@@ -218,7 +218,7 @@ namespace MediaBrowser.ServerApplication
var fileSystem = new WindowsFileSystem(new PatternsLogger(logManager.GetLogger("FileSystem")));
fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem));
- var nativeApp = new WindowsApp(fileSystem)
+ var nativeApp = new WindowsApp(fileSystem, _logger)
{
IsRunningAsService = runService
};
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index c62983192..80e56d6e1 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -120,6 +120,7 @@
<Compile Include="Native\Standby.cs" />
<Compile Include="Native\ServerAuthorization.cs" />
<Compile Include="Native\WindowsApp.cs" />
+ <Compile Include="Native\WindowsPowerManagement.cs" />
<Compile Include="Networking\CertificateGenerator.cs" />
<Compile Include="Networking\NativeMethods.cs" />
<Compile Include="Networking\NetworkManager.cs" />
diff --git a/MediaBrowser.ServerApplication/Native/WindowsApp.cs b/MediaBrowser.ServerApplication/Native/WindowsApp.cs
index ceab5379d..fe2fe6de6 100644
--- a/MediaBrowser.ServerApplication/Native/WindowsApp.cs
+++ b/MediaBrowser.ServerApplication/Native/WindowsApp.cs
@@ -6,16 +6,19 @@ using MediaBrowser.ServerApplication.Networking;
using System.Collections.Generic;
using System.Reflection;
using CommonIO;
+using MediaBrowser.Controller.Power;
namespace MediaBrowser.ServerApplication.Native
{
public class WindowsApp : INativeApp
{
private readonly IFileSystem _fileSystem;
+ private readonly ILogger _logger;
- public WindowsApp(IFileSystem fileSystem)
+ public WindowsApp(IFileSystem fileSystem, ILogger logger)
{
_fileSystem = fileSystem;
+ _logger = logger;
}
public List<Assembly> GetAssembliesWithParts()
@@ -117,5 +120,10 @@ namespace MediaBrowser.ServerApplication.Native
{
Standby.PreventSystemStandby();
}
+
+ public IPowerManagement GetPowerManagement()
+ {
+ return new WindowsPowerManagement(_logger);
+ }
}
}
diff --git a/MediaBrowser.ServerApplication/Native/WindowsPowerManagement.cs b/MediaBrowser.ServerApplication/Native/WindowsPowerManagement.cs
new file mode 100644
index 000000000..866272639
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Native/WindowsPowerManagement.cs
@@ -0,0 +1,94 @@
+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());
+ throw new NotImplementedException();
+ }
+
+ 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);
+ }
+ }
+ }
+}