浏览代码

removed base kernel and ikernel

LukePulverenti 12 年之前
父节点
当前提交
4f67fc4aef
共有 94 个文件被更改,包括 552 次插入870 次删除
  1. 2 2
      MediaBrowser.Api/EnvironmentService.cs
  2. 1 1
      MediaBrowser.Api/Images/ImageService.cs
  3. 1 1
      MediaBrowser.Api/Javascript/JavascriptApiClientService.cs
  4. 1 3
      MediaBrowser.Api/Library/LibraryService.cs
  5. 2 2
      MediaBrowser.Api/Library/LibraryStructureService.cs
  6. 2 2
      MediaBrowser.Api/LocalizationService.cs
  7. 4 4
      MediaBrowser.Api/MediaBrowser.Api.csproj
  8. 1 1
      MediaBrowser.Api/PackageService.cs
  9. 1 1
      MediaBrowser.Api/Playback/BaseStreamingService.cs
  10. 1 1
      MediaBrowser.Api/PluginService.cs
  11. 4 15
      MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs
  12. 1 1
      MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
  13. 5 5
      MediaBrowser.Api/SystemService.cs
  14. 2 2
      MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
  15. 2 3
      MediaBrowser.Api/UserLibrary/ItemsService.cs
  16. 2 3
      MediaBrowser.Api/UserLibrary/UserLibraryService.cs
  17. 1 1
      MediaBrowser.Api/UserService.cs
  18. 2 2
      MediaBrowser.Api/WeatherService.cs
  19. 1 1
      MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs
  20. 5 6
      MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs
  21. 67 27
      MediaBrowser.Common.Implementations/BaseApplicationHost.cs
  22. 0 1
      MediaBrowser.Common.Implementations/BaseApplicationPaths.cs
  23. 0 2
      MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
  24. 1 105
      MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj
  25. 6 22
      MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
  26. 33 40
      MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs
  27. 1 12
      MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs
  28. 6 17
      MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
  29. 2 8
      MediaBrowser.Common.Implementations/Updates/ApplicationUpdater.cs
  30. 0 10
      MediaBrowser.Common.Implementations/packages.config
  31. 21 0
      MediaBrowser.Common/IApplicationHost.cs
  32. 0 167
      MediaBrowser.Common/Kernel/BaseKernel.cs
  33. 0 74
      MediaBrowser.Common/Kernel/IKernel.cs
  34. 0 18
      MediaBrowser.Common/Kernel/KernelContext.cs
  35. 4 7
      MediaBrowser.Common/MediaBrowser.Common.csproj
  36. 2 3
      MediaBrowser.Common/Net/BasePeriodicWebSocketListener.cs
  37. 1 1
      MediaBrowser.Common/Net/IServerManager.cs
  38. 2 3
      MediaBrowser.Common/Net/IWebSocketListener.cs
  39. 0 19
      MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs
  40. 10 1
      MediaBrowser.Common/ScheduledTasks/ITaskManager.cs
  41. 12 0
      MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs
  42. 0 50
      MediaBrowser.Controller/BaseManager.cs
  43. 7 13
      MediaBrowser.Controller/IO/FileSystemManager.cs
  44. 10 0
      MediaBrowser.Controller/IServerApplicationHost.cs
  45. 0 1
      MediaBrowser.Controller/IServerApplicationPaths.cs
  46. 23 33
      MediaBrowser.Controller/Kernel.cs
  47. 1 1
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  48. 10 5
      MediaBrowser.Controller/Providers/ProviderManager.cs
  49. 0 26
      MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs
  50. 25 0
      MediaBrowser.Model/Configuration/ServerConfiguration.cs
  51. 1 1
      MediaBrowser.Server.Implementations/HttpServer/BaseRestService.cs
  52. 2 2
      MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs
  53. 1 1
      MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs
  54. 2 2
      MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs
  55. 1 1
      MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs
  56. 1 1
      MediaBrowser.Server.Implementations/HttpServer/SwaggerService.cs
  57. 101 0
      MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
  58. 0 0
      MediaBrowser.Server.Implementations/README.txt
  59. 0 0
      MediaBrowser.Server.Implementations/ServerManager/RegisterServer.bat
  60. 21 38
      MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
  61. 1 1
      MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
  62. 0 1
      MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs
  63. 0 1
      MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs
  64. 0 1
      MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs
  65. 0 1
      MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs
  66. 1 1
      MediaBrowser.Server.Implementations/Udp/UdpServer.cs
  67. 4 10
      MediaBrowser.Server.Implementations/Updates/InstallationManager.cs
  68. 1 1
      MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs
  69. 1 1
      MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs
  70. 12 0
      MediaBrowser.Server.Implementations/packages.config
  71. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/css/screen.css
  72. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/images/pet_store_api.png
  73. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/images/wordnik_api.png
  74. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/index.html
  75. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/lib/backbone-min.js
  76. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/lib/handlebars.runtime-1.0.0.beta.6.js
  77. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/lib/jquery.ba-bbq.min.js
  78. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/lib/jquery.min.js
  79. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/lib/jquery.slideto.min.js
  80. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/lib/jquery.wiggle.min.js
  81. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/lib/swagger.js
  82. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/lib/underscore-min.js
  83. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/swagger-ui.js
  84. 0 0
      MediaBrowser.Server.Implementations/swagger-ui/swagger-ui.min.js
  85. 6 7
      MediaBrowser.ServerApplication/App.xaml.cs
  86. 55 34
      MediaBrowser.ServerApplication/ApplicationHost.cs
  87. 3 3
      MediaBrowser.ServerApplication/StartupWizard.cs
  88. 27 9
      MediaBrowser.ServerApplication/WebSocketEvents.cs
  89. 5 9
      MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs
  90. 8 6
      MediaBrowser.WebDashboard/Api/DashboardService.cs
  91. 1 1
      MediaBrowser.WebDashboard/Html/css/site.css
  92. 3 3
      MediaBrowser.WebDashboard/Html/itemList.html
  93. 4 4
      MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
  94. 5 7
      Nuget/MediaBrowser.Common.Internal.nuspec

+ 2 - 2
MediaBrowser.Api/EnvironmentService.cs

@@ -1,8 +1,8 @@
-using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Net;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;

+ 1 - 1
MediaBrowser.Api/Images/ImageService.cs

@@ -1,11 +1,11 @@
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Implementations.HttpServer;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Entities;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using ServiceStack.Text.Controller;
 using System;

+ 1 - 1
MediaBrowser.Api/Javascript/JavascriptApiClientService.cs

@@ -1,6 +1,6 @@
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Implementations.HttpServer;
 using MediaBrowser.Common.Net;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System;
 using System.IO;

+ 1 - 3
MediaBrowser.Api/Library/LibraryService.cs

@@ -1,10 +1,8 @@
 using MediaBrowser.Common;
-using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Controller;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Dto;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;

+ 2 - 2
MediaBrowser.Api/Library/LibraryStructureService.cs

@@ -1,7 +1,7 @@
-using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Controller;
+using MediaBrowser.Controller;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Entities;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;

+ 2 - 2
MediaBrowser.Api/LocalizationService.cs

@@ -1,7 +1,7 @@
-using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Controller.Localization;
+using MediaBrowser.Controller.Localization;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Globalization;
+using MediaBrowser.Server.Implementations.HttpServer;
 using MoreLinq;
 using ServiceStack.ServiceHost;
 using System.Collections.Generic;

+ 4 - 4
MediaBrowser.Api/MediaBrowser.Api.csproj

@@ -121,10 +121,6 @@
     <Compile Include="WebSocket\SystemInfoWebSocketListener.cs" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\MediaBrowser.Common.Implementations\MediaBrowser.Common.Implementations.csproj">
-      <Project>{c4d2573a-3fd3-441f-81af-174ac4cd4e1d}</Project>
-      <Name>MediaBrowser.Common.Implementations</Name>
-    </ProjectReference>
     <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
       <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
       <Name>MediaBrowser.Common</Name>
@@ -137,6 +133,10 @@
       <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
       <Name>MediaBrowser.Model</Name>
     </ProjectReference>
+    <ProjectReference Include="..\MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj">
+      <Project>{2e781478-814d-4a48-9d80-bff206441a65}</Project>
+      <Name>MediaBrowser.Server.Implementations</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />

+ 1 - 1
MediaBrowser.Api/PackageService.cs

@@ -1,8 +1,8 @@
 using MediaBrowser.Common;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Implementations.HttpServer;
 using MediaBrowser.Controller.Updates;
 using MediaBrowser.Model.Updates;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;

+ 1 - 1
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Implementations.HttpServer;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Entities;
@@ -15,6 +14,7 @@ using System.IO;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
+using MediaBrowser.Server.Implementations.HttpServer;
 
 namespace MediaBrowser.Api.Playback
 {

+ 1 - 1
MediaBrowser.Api/PluginService.cs

@@ -1,11 +1,11 @@
 using MediaBrowser.Common;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Implementations.HttpServer;
 using MediaBrowser.Common.Security;
 using MediaBrowser.Controller.Updates;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Plugins;
 using MediaBrowser.Model.Serialization;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using ServiceStack.Text.Controller;
 using System;

+ 4 - 15
MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs

@@ -1,8 +1,8 @@
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Implementations.HttpServer;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Tasks;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using ServiceStack.Text.Controller;
 using System;
@@ -84,30 +84,19 @@ namespace MediaBrowser.Api.ScheduledTasks
         /// <value>The task manager.</value>
         private ITaskManager TaskManager { get; set; }
 
-        /// <summary>
-        /// The _json serializer
-        /// </summary>
-        private readonly IJsonSerializer _jsonSerializer;
-
         /// <summary>
         /// Initializes a new instance of the <see cref="ScheduledTaskService" /> class.
         /// </summary>
         /// <param name="taskManager">The task manager.</param>
-        /// <param name="jsonSerializer">The json serializer.</param>
         /// <exception cref="System.ArgumentNullException">taskManager</exception>
-        public ScheduledTaskService(ITaskManager taskManager, IJsonSerializer jsonSerializer)
+        public ScheduledTaskService(ITaskManager taskManager)
         {
             if (taskManager == null)
             {
                 throw new ArgumentNullException("taskManager");
             }
-            if (jsonSerializer == null)
-            {
-                throw new ArgumentNullException("jsonSerializer");
-            }
 
             TaskManager = taskManager;
-            _jsonSerializer = jsonSerializer;
         }
 
         /// <summary>
@@ -157,7 +146,7 @@ namespace MediaBrowser.Api.ScheduledTasks
                 throw new ResourceNotFoundException("Task not found");
             }
 
-            task.Execute();
+            TaskManager.Execute(task);
         }
 
         /// <summary>
@@ -174,7 +163,7 @@ namespace MediaBrowser.Api.ScheduledTasks
                 throw new ResourceNotFoundException("Task not found");
             }
 
-            task.Cancel();
+            TaskManager.Cancel(task);
         }
 
         /// <summary>

+ 1 - 1
MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs

@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Tasks;

+ 5 - 5
MediaBrowser.Api/SystemService.cs

@@ -1,11 +1,11 @@
 using MediaBrowser.Common;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Implementations.HttpServer;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.System;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System;
 using System.IO;
@@ -66,7 +66,7 @@ namespace MediaBrowser.Api
         /// <summary>
         /// The _app host
         /// </summary>
-        private readonly IApplicationHost _appHost;
+        private readonly IServerApplicationHost _appHost;
 
         /// <summary>
         /// The _configuration manager
@@ -80,7 +80,7 @@ namespace MediaBrowser.Api
         /// <param name="appHost">The app host.</param>
         /// <param name="configurationManager">The configuration manager.</param>
         /// <exception cref="System.ArgumentNullException">jsonSerializer</exception>
-        public SystemService(IJsonSerializer jsonSerializer, IApplicationHost appHost, IServerConfigurationManager configurationManager)
+        public SystemService(IJsonSerializer jsonSerializer, IServerApplicationHost appHost, IServerConfigurationManager configurationManager)
             : base()
         {
             if (jsonSerializer == null)
@@ -104,7 +104,7 @@ namespace MediaBrowser.Api
         /// <returns>System.Object.</returns>
         public object Get(GetSystemInfo request)
         {
-            var result = Kernel.Instance.GetSystemInfo();
+            var result = _appHost.GetSystemInfo();
 
             return ToOptimizedResult(result);
         }
@@ -132,7 +132,7 @@ namespace MediaBrowser.Api
             Task.Run(async () =>
             {
                 await Task.Delay(100);
-                Kernel.Instance.PerformPendingRestart();
+                _appHost.PerformPendingRestart();
             });
         }
 

+ 2 - 2
MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs

@@ -1,8 +1,8 @@
-using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;

+ 2 - 3
MediaBrowser.Api/UserLibrary/ItemsService.cs

@@ -1,10 +1,9 @@
-using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;

+ 2 - 3
MediaBrowser.Api/UserLibrary/UserLibraryService.cs

@@ -1,12 +1,11 @@
-using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Connectivity;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Serialization;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using ServiceStack.Text.Controller;
 using System;

+ 1 - 1
MediaBrowser.Api/UserService.cs

@@ -1,8 +1,8 @@
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Implementations.HttpServer;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Serialization;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using ServiceStack.Text.Controller;
 using System;

+ 2 - 2
MediaBrowser.Api/WeatherService.cs

@@ -1,6 +1,6 @@
-using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Controller;
+using MediaBrowser.Controller;
 using MediaBrowser.Model.Weather;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System.Linq;
 using System.Threading;

+ 1 - 1
MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs

@@ -1,5 +1,5 @@
 using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Model.Logging;
 using System;
 using System.Collections.Generic;

+ 5 - 6
MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs

@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.System;
@@ -23,17 +23,16 @@ namespace MediaBrowser.Api.WebSocket
         /// <summary>
         /// The _kernel
         /// </summary>
-        private readonly IKernel _kernel;
+        private readonly IServerApplicationHost _appHost;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="SystemInfoWebSocketListener" /> class.
         /// </summary>
-        /// <param name="kernel">The kernel.</param>
         /// <param name="logger">The logger.</param>
-        public SystemInfoWebSocketListener(Kernel kernel, ILogger logger)
+        public SystemInfoWebSocketListener(ILogger logger, IServerApplicationHost appHost)
             : base(logger)
         {
-            _kernel = kernel;
+            _appHost = appHost;
         }
 
         /// <summary>
@@ -43,7 +42,7 @@ namespace MediaBrowser.Api.WebSocket
         /// <returns>Task{SystemInfo}.</returns>
         protected override Task<SystemInfo> GetDataToSend(object state)
         {
-            return Task.FromResult(_kernel.GetSystemInfo());
+            return Task.FromResult(_appHost.GetSystemInfo());
         }
     }
 }

+ 67 - 27
MediaBrowser.Common.Implementations/BaseApplicationHost.cs

@@ -1,13 +1,11 @@
 using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Events;
 using MediaBrowser.Common.Implementations.Logging;
 using MediaBrowser.Common.Implementations.NetworkManagement;
 using MediaBrowser.Common.Implementations.ScheduledTasks;
 using MediaBrowser.Common.Implementations.Security;
 using MediaBrowser.Common.Implementations.Serialization;
-using MediaBrowser.Common.Implementations.Udp;
 using MediaBrowser.Common.Implementations.Updates;
-using MediaBrowser.Common.Implementations.WebSocket;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.ScheduledTasks;
@@ -15,6 +13,7 @@ using MediaBrowser.Common.Security;
 using MediaBrowser.Common.Updates;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
+using MediaBrowser.Model.System;
 using MediaBrowser.Model.Updates;
 using SimpleInjector;
 using System;
@@ -30,6 +29,22 @@ namespace MediaBrowser.Common.Implementations
     public abstract class BaseApplicationHost<TApplicationPathsType> : IApplicationHost
         where TApplicationPathsType : class, IApplicationPaths, new()
     {
+        /// <summary>
+        /// Occurs when [has pending restart changed].
+        /// </summary>
+        public event EventHandler HasPendingRestartChanged;
+
+        /// <summary>
+        /// Occurs when [application updated].
+        /// </summary>
+        public event EventHandler<GenericEventArgs<Version>> ApplicationUpdated;
+
+        /// <summary>
+        /// Gets or sets a value indicating whether this instance has changes that require the entire application to restart.
+        /// </summary>
+        /// <value><c>true</c> if this instance has pending application restart; otherwise, <c>false</c>.</value>
+        public bool HasPendingRestart { get; private set; }
+
         /// <summary>
         /// Gets or sets the logger.
         /// </summary>
@@ -132,11 +147,11 @@ namespace MediaBrowser.Common.Implementations
         /// Gets the kernel.
         /// </summary>
         /// <value>The kernel.</value>
-        protected IKernel Kernel { get; private set; }
         protected ITaskManager TaskManager { get; private set; }
         protected ISecurityManager SecurityManager { get; private set; }
         protected IPackageManager PackageManager { get; private set; }
         protected IHttpClient HttpClient { get; private set; }
+        protected INetworkManager NetworkManager { get; private set; }
 
         protected IConfigurationManager ConfigurationManager { get; private set; }
 
@@ -168,15 +183,11 @@ namespace MediaBrowser.Common.Implementations
 
             Logger.Info("Version {0} initializing", ApplicationVersion);
 
-            Kernel = GetKernel();
-
             await RegisterResources().ConfigureAwait(false);
 
             FindParts();
 
             Task.Run(() => ConfigureAutoRunAtStartup());
-
-            Kernel.Init();
         }
 
         /// <summary>
@@ -191,7 +202,6 @@ namespace MediaBrowser.Common.Implementations
         /// <value>The name of the log file prefix.</value>
         protected abstract string LogFilePrefixName { get; }
 
-        protected abstract IKernel GetKernel();
         protected abstract IConfigurationManager GetConfigurationManager();
 
         /// <summary>
@@ -199,10 +209,6 @@ namespace MediaBrowser.Common.Implementations
         /// </summary>
         protected virtual void FindParts()
         {
-            Resolve<IHttpServer>().Init(GetExports<IRestfulService>(false));
-            Resolve<IServerManager>().AddWebSocketListeners(GetExports<IWebSocketListener>(false));
-
-            Resolve<IServerManager>().Start();
             Resolve<ITaskManager>().AddTasks(GetExports<IScheduledTask>(false));
 
             Plugins = GetExports<IPlugin>();
@@ -239,11 +245,7 @@ namespace MediaBrowser.Common.Implementations
 
                 RegisterSingleInstance<IApplicationPaths>(ApplicationPaths);
 
-                var networkManager = new NetworkManager();
-
-                var serverManager = new ServerManager.ServerManager(this, Kernel, networkManager, JsonSerializer, Logger, ConfigurationManager);
-
-                TaskManager = new TaskManager(ApplicationPaths, JsonSerializer, Logger, serverManager);
+                TaskManager = new TaskManager(ApplicationPaths, JsonSerializer, Logger);
 
                 RegisterSingleInstance(JsonSerializer);
                 RegisterSingleInstance(XmlSerializer);
@@ -251,25 +253,22 @@ namespace MediaBrowser.Common.Implementations
                 RegisterSingleInstance(LogManager);
                 RegisterSingleInstance(Logger);
 
-                RegisterSingleInstance(Kernel);
-
                 RegisterSingleInstance(TaskManager);
-                RegisterSingleInstance<IWebSocketServer>(() => new AlchemyServer(Logger));
                 RegisterSingleInstance(ProtobufSerializer);
-                RegisterSingleInstance<IUdpServer>(new UdpServer(Logger), false);
 
                 HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, Logger);
 
                 RegisterSingleInstance(HttpClient);
 
-                RegisterSingleInstance<INetworkManager>(networkManager);
-                RegisterSingleInstance<IServerManager>(serverManager);
+                NetworkManager = new NetworkManager();
 
-                SecurityManager = new PluginSecurityManager(Kernel, HttpClient, JsonSerializer, ApplicationPaths);
+                RegisterSingleInstance(NetworkManager);
+
+                SecurityManager = new PluginSecurityManager(this, HttpClient, JsonSerializer, ApplicationPaths);
 
                 RegisterSingleInstance(SecurityManager);
 
-                PackageManager = new PackageManager(SecurityManager, networkManager, HttpClient, ApplicationPaths, JsonSerializer, Logger);
+                PackageManager = new PackageManager(SecurityManager, NetworkManager, HttpClient, ApplicationPaths, JsonSerializer, Logger);
 
                 RegisterSingleInstance(PackageManager);
             });
@@ -450,6 +449,34 @@ namespace MediaBrowser.Common.Implementations
             Plugins = list;
         }
 
+        /// <summary>
+        /// Performs the pending restart.
+        /// </summary>
+        /// <returns>Task.</returns>
+        public void PerformPendingRestart()
+        {
+            if (HasPendingRestart)
+            {
+                Logger.Info("Restarting the application");
+
+                Restart();
+            }
+            else
+            {
+                Logger.Info("PerformPendingRestart - not needed");
+            }
+        }
+
+        /// <summary>
+        /// Notifies that the kernel that a change has been made that requires a restart
+        /// </summary>
+        public void NotifyPendingRestart()
+        {
+            HasPendingRestart = true;
+
+            EventHelper.QueueEventIfNotNull(HasPendingRestartChanged, this, EventArgs.Empty, Logger);
+        }
+
         /// <summary>
         /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
         /// </summary>
@@ -488,7 +515,20 @@ namespace MediaBrowser.Common.Implementations
 
         public abstract Task<CheckForUpdateResult> CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress<double> progress);
 
-        public abstract Task UpdateApplication(PackageVersionInfo package, CancellationToken cancellationToken, IProgress<double> progress);
+        /// <summary>
+        /// Updates the application.
+        /// </summary>
+        /// <param name="package">The package that contains the update</param>
+        /// <param name="cancellationToken">The cancellation token.</param>
+        /// <param name="progress">The progress.</param>
+        /// <returns>Task.</returns>
+        public async Task UpdateApplication(PackageVersionInfo package, CancellationToken cancellationToken, IProgress<double> progress)
+        {
+            var pkgManager = Resolve<IPackageManager>();
+            await pkgManager.InstallPackage(progress, package, cancellationToken).ConfigureAwait(false);
+
+            EventHelper.QueueEventIfNotNull(ApplicationUpdated, this, new GenericEventArgs<Version> { Argument = package.version }, Logger);
+        }
 
         public abstract void Shutdown();
     }

+ 0 - 1
MediaBrowser.Common.Implementations/BaseApplicationPaths.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
 using System;
 using System.Configuration;
 using System.IO;

+ 0 - 2
MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs

@@ -1,6 +1,5 @@
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Net;
@@ -9,7 +8,6 @@ using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using System.Net;
 using System.Net.Cache;
 using System.Net.Http;
 using System.Text;

+ 1 - 105
MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj

@@ -35,9 +35,6 @@
     <RunPostBuildEvent>Always</RunPostBuildEvent>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="Alchemy">
-      <HintPath>..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll</HintPath>
-    </Reference>
     <Reference Include="Mediabrowser.PluginSecurity">
       <HintPath>..\ThirdParty\PluginSecurity\Mediabrowser.PluginSecurity.dll</HintPath>
     </Reference>
@@ -47,41 +44,6 @@
     <Reference Include="protobuf-net">
       <HintPath>..\packages\protobuf-net.2.0.0.621\lib\net40\protobuf-net.dll</HintPath>
     </Reference>
-    <Reference Include="ServiceStack, Version=3.9.38.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\ServiceStack.3.9.38\lib\net35\ServiceStack.dll</HintPath>
-    </Reference>
-    <Reference Include="ServiceStack.Api.Swagger, Version=3.9.38.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\ServiceStack.Api.Swagger.3.9.38\lib\net35\ServiceStack.Api.Swagger.dll</HintPath>
-    </Reference>
-    <Reference Include="ServiceStack.Common, Version=3.9.38.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\ServiceStack.Common.3.9.38\lib\net35\ServiceStack.Common.dll</HintPath>
-    </Reference>
-    <Reference Include="ServiceStack.Interfaces, Version=3.9.38.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\ServiceStack.Common.3.9.38\lib\net35\ServiceStack.Interfaces.dll</HintPath>
-    </Reference>
-    <Reference Include="ServiceStack.Logging.NLog">
-      <HintPath>..\packages\ServiceStack.Logging.NLog.1.0.6.0\lib\net35\ServiceStack.Logging.NLog.dll</HintPath>
-    </Reference>
-    <Reference Include="ServiceStack.OrmLite, Version=3.9.39.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.39\lib\ServiceStack.OrmLite.dll</HintPath>
-    </Reference>
-    <Reference Include="ServiceStack.OrmLite.SqlServer, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.39\lib\ServiceStack.OrmLite.SqlServer.dll</HintPath>
-    </Reference>
-    <Reference Include="ServiceStack.Redis, Version=3.9.38.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\ServiceStack.Redis.3.9.38\lib\net35\ServiceStack.Redis.dll</HintPath>
-    </Reference>
-    <Reference Include="ServiceStack.ServiceInterface, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\ServiceStack.3.9.38\lib\net35\ServiceStack.ServiceInterface.dll</HintPath>
-    </Reference>
     <Reference Include="ServiceStack.Text, Version=3.9.38.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\packages\ServiceStack.Text.3.9.38\lib\net35\ServiceStack.Text.dll</HintPath>
@@ -97,16 +59,6 @@
     <Reference Include="System.Net" />
     <Reference Include="System.Net.Http" />
     <Reference Include="System.Net.Http.WebRequest" />
-    <Reference Include="System.Reactive.Core">
-      <HintPath>..\packages\Rx-Core.2.1.30214.0\lib\Net45\System.Reactive.Core.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Reactive.Interfaces">
-      <HintPath>..\packages\Rx-Interfaces.2.1.30214.0\lib\Net45\System.Reactive.Interfaces.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Reactive.Linq">
-      <HintPath>..\packages\Rx-Linq.2.1.30214.0\lib\Net45\System.Reactive.Linq.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Web" />
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
@@ -117,12 +69,6 @@
     <Compile Include="BaseApplicationPaths.cs" />
     <Compile Include="Configuration\BaseConfigurationManager.cs" />
     <Compile Include="HttpClientManager\HttpClientManager.cs" />
-    <Compile Include="HttpServer\BaseRestService.cs" />
-    <Compile Include="HttpServer\HttpServer.cs" />
-    <Compile Include="HttpServer\NativeWebSocket.cs" />
-    <Compile Include="HttpServer\ServerFactory.cs" />
-    <Compile Include="HttpServer\StreamWriter.cs" />
-    <Compile Include="HttpServer\SwaggerService.cs" />
     <Compile Include="Logging\LogHelper.cs" />
     <Compile Include="Logging\NLogger.cs" />
     <Compile Include="Logging\NlogManager.cs" />
@@ -140,12 +86,8 @@
     <Compile Include="Serialization\JsonSerializer.cs" />
     <Compile Include="Serialization\ProtobufSerializer.cs" />
     <Compile Include="Serialization\XmlSerializer.cs" />
-    <Compile Include="ServerManager\ServerManager.cs" />
-    <Compile Include="ServerManager\WebSocketConnection.cs" />
-    <Compile Include="Udp\UdpServer.cs" />
+    <Compile Include="Updates\ApplicationUpdater.cs" />
     <Compile Include="Updates\PackageManager.cs" />
-    <Compile Include="WebSocket\AlchemyServer.cs" />
-    <Compile Include="WebSocket\AlchemyWebSocket.cs" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
@@ -159,52 +101,6 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
-    <EmbeddedResource Include="ServerManager\RegisterServer.bat" />
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="README.txt" />
-    <Content Include="swagger-ui\css\screen.css">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\images\pet_store_api.png">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\images\wordnik_api.png">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\index.html">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\lib\backbone-min.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\lib\handlebars.runtime-1.0.0.beta.6.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\lib\jquery.ba-bbq.min.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\lib\jquery.min.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\lib\jquery.slideto.min.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\lib\jquery.wiggle.min.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\lib\swagger.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\lib\underscore-min.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\swagger-ui.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="swagger-ui\swagger-ui.min.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
   </ItemGroup>
   <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

+ 6 - 22
MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs

@@ -1,6 +1,5 @@
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
@@ -49,12 +48,6 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
         /// <value>The task manager.</value>
         private ITaskManager TaskManager { get; set; }
 
-        /// <summary>
-        /// Gets or sets the server manager.
-        /// </summary>
-        /// <value>The server manager.</value>
-        private IServerManager ServerManager { get; set; }
-
         /// <summary>
         /// Initializes a new instance of the <see cref="ScheduledTaskWorker" /> class.
         /// </summary>
@@ -64,7 +57,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
         /// <param name="jsonSerializer">The json serializer.</param>
         /// <param name="logger">The logger.</param>
         /// <param name="serverManager">The server manager.</param>
-        public ScheduledTaskWorker(IScheduledTask scheduledTask, IApplicationPaths applicationPaths, ITaskManager taskManager, IJsonSerializer jsonSerializer, ILogger logger, IServerManager serverManager)
+        public ScheduledTaskWorker(IScheduledTask scheduledTask, IApplicationPaths applicationPaths, ITaskManager taskManager, IJsonSerializer jsonSerializer, ILogger logger)
         {
             if (scheduledTask == null)
             {
@@ -86,17 +79,12 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
             {
                 throw new ArgumentNullException("logger");
             }
-            if (serverManager == null)
-            {
-                throw new ArgumentNullException("serverManager");
-            }
 
             ScheduledTask = scheduledTask;
             ApplicationPaths = applicationPaths;
             TaskManager = taskManager;
             JsonSerializer = jsonSerializer;
             Logger = logger;
-            ServerManager = serverManager;
 
             ReloadTriggerEvents(true);
         }
@@ -331,6 +319,8 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
 
             Logger.Info("Executing {0}", Name);
 
+            ((TaskManager)TaskManager).OnTaskExecuting(ScheduledTask);
+            
             var progress = new Progress<double>();
 
             progress.ProgressChanged += progress_ProgressChanged;
@@ -338,8 +328,6 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
             TaskCompletionStatus status;
             CurrentExecutionStartTime = DateTime.UtcNow;
 
-            ServerManager.SendWebSocketMessage("ScheduledTaskBeginExecute", Name);
-
             try
             {
                 await ExecuteTask(CurrentCancellationTokenSource.Token, progress).ConfigureAwait(false);
@@ -517,8 +505,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
         /// <param name="startTime">The start time.</param>
         /// <param name="endTime">The end time.</param>
         /// <param name="status">The status.</param>
-        /// <param name="sendNotification">if set to <c>true</c> [send notification].</param>
-        private void OnTaskCompleted(DateTime startTime, DateTime endTime, TaskCompletionStatus status, bool sendNotification = true)
+        private void OnTaskCompleted(DateTime startTime, DateTime endTime, TaskCompletionStatus status)
         {
             var elapsedTime = endTime - startTime;
 
@@ -537,10 +524,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
 
             LastExecutionResult = result;
 
-            if (sendNotification)
-            {
-                ServerManager.SendWebSocketMessage("ScheduledTaskEndExecute", result);
-            }
+            ((TaskManager) TaskManager).OnTaskCompleted(ScheduledTask, result);
         }
 
         /// <summary>
@@ -564,7 +548,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
 
                 if (State == TaskState.Running)
                 {
-                    OnTaskCompleted(CurrentExecutionStartTime, DateTime.UtcNow, TaskCompletionStatus.Aborted, false);
+                    OnTaskCompleted(CurrentExecutionStartTime, DateTime.UtcNow, TaskCompletionStatus.Aborted);
                 }
 
                 if (CurrentCancellationTokenSource != null)

+ 33 - 40
MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs

@@ -1,5 +1,6 @@
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
+using System.Threading.Tasks;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Events;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
@@ -15,6 +16,9 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
     /// </summary>
     public class TaskManager : ITaskManager
     {
+        public event EventHandler<EventArgs> TaskExecuting;
+        public event EventHandler<GenericEventArgs<TaskResult>> TaskCompleted;
+
         /// <summary>
         /// Gets the list of Scheduled Tasks
         /// </summary>
@@ -44,26 +48,18 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
         /// <value>The logger.</value>
         private ILogger Logger { get; set; }
 
-        /// <summary>
-        /// Gets or sets the server manager.
-        /// </summary>
-        /// <value>The server manager.</value>
-        private IServerManager ServerManager { get; set; }
-
         /// <summary>
         /// Initializes a new instance of the <see cref="TaskManager" /> class.
         /// </summary>
         /// <param name="applicationPaths">The application paths.</param>
         /// <param name="jsonSerializer">The json serializer.</param>
         /// <param name="logger">The logger.</param>
-        /// <param name="serverManager">The server manager.</param>
         /// <exception cref="System.ArgumentException">kernel</exception>
-        public TaskManager(IApplicationPaths applicationPaths, IJsonSerializer jsonSerializer, ILogger logger, IServerManager serverManager)
+        public TaskManager(IApplicationPaths applicationPaths, IJsonSerializer jsonSerializer, ILogger logger)
         {
             ApplicationPaths = applicationPaths;
             JsonSerializer = jsonSerializer;
             Logger = logger;
-            ServerManager = serverManager;
 
             ScheduledTasks = new IScheduledTaskWorker[] { };
         }
@@ -75,7 +71,9 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
         public void CancelIfRunningAndQueue<T>()
                  where T : IScheduledTask
         {
-            ScheduledTasks.First(t => t.ScheduledTask.GetType() == typeof(T)).CancelIfRunning();
+            var task = ScheduledTasks.First(t => t.ScheduledTask.GetType() == typeof(T));
+            ((ScheduledTaskWorker)task).CancelIfRunning();
+
             QueueScheduledTask<T>();
         }
 
@@ -101,7 +99,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
 
             QueueScheduledTask(scheduledTask);
         }
-        
+
         /// <summary>
         /// Queues the scheduled task.
         /// </summary>
@@ -115,7 +113,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
                 // If it's idle just execute immediately
                 if (task.State == TaskState.Idle)
                 {
-                    task.Execute();
+                    ((ScheduledTaskWorker)task).Execute();
                     return;
                 }
 
@@ -131,31 +129,6 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
             }
         }
 
-        /// <summary>
-        /// Called when [task completed].
-        /// </summary>
-        /// <param name="task">The task.</param>
-        public void OnTaskCompleted(IScheduledTask task)
-        {
-            // Execute queued tasks
-            lock (_taskQueue)
-            {
-                var copy = _taskQueue.ToList();
-
-                foreach (var type in copy)
-                {
-                    var scheduledTask = ScheduledTasks.First(t => t.GetType() == type);
-
-                    if (scheduledTask.State == TaskState.Idle)
-                    {
-                        scheduledTask.Execute();
-
-                        _taskQueue.Remove(type);
-                    }
-                }
-            }
-        }
-
         /// <summary>
         /// Adds the tasks.
         /// </summary>
@@ -164,7 +137,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
         {
             var myTasks = ScheduledTasks.ToList();
 
-            myTasks.AddRange(tasks.Select(t => new ScheduledTaskWorker(t, ApplicationPaths, this, JsonSerializer, Logger, ServerManager)));
+            myTasks.AddRange(tasks.Select(t => new ScheduledTaskWorker(t, ApplicationPaths, this, JsonSerializer, Logger)));
 
             ScheduledTasks = myTasks.ToArray();
         }
@@ -189,5 +162,25 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
                 task.Dispose();
             }
         }
+
+        public void Cancel(IScheduledTaskWorker task)
+        {
+            ((ScheduledTaskWorker)task).Cancel();
+        }
+
+        public Task Execute(IScheduledTaskWorker task)
+        {
+            return ((ScheduledTaskWorker)task).Execute();
+        }
+
+        internal void OnTaskExecuting(IScheduledTask task)
+        {
+            EventHelper.QueueEventIfNotNull(TaskExecuting, task, EventArgs.Empty, Logger);
+        }
+
+        internal void OnTaskCompleted(IScheduledTask task, TaskResult result)
+        {
+            EventHelper.QueueEventIfNotNull(TaskExecuting, task, new GenericEventArgs<TaskResult> { Argument = result }, Logger);
+        }
     }
 }

+ 1 - 12
MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Model.Logging;
 using System;
@@ -30,25 +29,17 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
         /// <value>The logger.</value>
         private ILogger Logger { get; set; }
 
-        /// <summary>
-        /// Gets or sets the kernel.
-        /// </summary>
-        /// <value>The kernel.</value>
-        private IKernel Kernel { get; set; }
-
         /// <summary>
         /// Initializes a new instance of the <see cref="SystemUpdateTask" /> class.
         /// </summary>
         /// <param name="appHost">The app host.</param>
         /// <param name="configurationManager">The configuration manager.</param>
         /// <param name="logger">The logger.</param>
-        /// <param name="kernel">The kernel.</param>
-        public SystemUpdateTask(IApplicationHost appHost, IConfigurationManager configurationManager, ILogger logger, IKernel kernel)
+        public SystemUpdateTask(IApplicationHost appHost, IConfigurationManager configurationManager, ILogger logger)
         {
             _appHost = appHost;
             ConfigurationManager = configurationManager;
             Logger = logger;
-            Kernel = kernel;
         }
 
         /// <summary>
@@ -110,8 +101,6 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
 
                 // Release the event handler
                 innerProgress.ProgressChanged -= innerProgressHandler;
-                
-                Kernel.OnApplicationUpdated(updateInfo.AvailableVersion);
             }
             else
             {

+ 6 - 17
MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs

@@ -3,7 +3,6 @@ using MediaBrowser.Common.Security;
 using MediaBrowser.Model.Serialization;
 using Mediabrowser.Model.Entities;
 using Mediabrowser.PluginSecurity;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Common.Net;
 using System;
 using System.Threading;
@@ -44,29 +43,19 @@ namespace MediaBrowser.Common.Implementations.Security
 
         private IHttpClient _httpClient;
         private IJsonSerializer _jsonSerializer;
-
-        /// <summary>
-        /// The _kernel
-        /// </summary>
-        private readonly IKernel _kernel;
+        private IApplicationHost _appHost;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="PluginSecurityManager" /> class.
         /// </summary>
-        /// <param name="kernel">The kernel.</param>
-        public PluginSecurityManager(IKernel kernel, IHttpClient httpClient, IJsonSerializer jsonSerializer, IApplicationPaths appPaths)
+        public PluginSecurityManager(IApplicationHost appHost, IHttpClient httpClient, IJsonSerializer jsonSerializer, IApplicationPaths appPaths)
         {
-            if (kernel == null)
-            {
-                throw new ArgumentNullException("kernel");
-            }
-
             if (httpClient == null)
             {
                 throw new ArgumentNullException("httpClient");
             }
-            
-            _kernel = kernel;
+
+            _appHost = appHost;
             _httpClient = httpClient;
             _jsonSerializer = jsonSerializer;
             MBRegistration.Init(appPaths);
@@ -98,7 +87,7 @@ namespace MediaBrowser.Common.Implementations.Security
                     // Clear this so it will re-evaluate
                     ResetSupporterInfo();
                     // And we'll need to restart to re-evaluate the status of plug-ins
-                    _kernel.NotifyPendingRestart();
+                    _appHost.NotifyPendingRestart();
 
                 }
             }
@@ -115,7 +104,7 @@ namespace MediaBrowser.Common.Implementations.Security
             {
                 MBRegistration.LegacyKey = value;
                 // And we'll need to restart to re-evaluate the status of plug-ins
-                _kernel.NotifyPendingRestart();
+                _appHost.NotifyPendingRestart();
             }
         }
 

+ 2 - 8
MediaBrowser.Common/Updates/ApplicationUpdater.cs → MediaBrowser.Common.Implementations/Updates/ApplicationUpdater.cs

@@ -1,14 +1,8 @@
-using System;
-using System.Collections.Generic;
+using MediaBrowser.Common.Configuration;
 using System.Diagnostics;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using System.IO;
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
 
-namespace MediaBrowser.Common.Updates
+namespace MediaBrowser.Common.Implementations.Updates
 {
     public enum MBApplication
     {

+ 0 - 10
MediaBrowser.Common.Implementations/packages.config

@@ -1,17 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Alchemy" version="2.2.1" targetFramework="net45" />
   <package id="NLog" version="2.0.0.2000" targetFramework="net45" />
   <package id="protobuf-net" version="2.0.0.621" targetFramework="net45" />
-  <package id="Rx-Core" version="2.1.30214.0" targetFramework="net45" />
-  <package id="Rx-Interfaces" version="2.1.30214.0" targetFramework="net45" />
-  <package id="Rx-Linq" version="2.1.30214.0" targetFramework="net45" />
-  <package id="ServiceStack" version="3.9.38" targetFramework="net45" />
-  <package id="ServiceStack.Api.Swagger" version="3.9.38" targetFramework="net45" />
-  <package id="ServiceStack.Common" version="3.9.38" targetFramework="net45" />
-  <package id="ServiceStack.Logging.NLog" version="1.0.6.0" targetFramework="net45" />
-  <package id="ServiceStack.OrmLite.SqlServer" version="3.9.39" targetFramework="net45" />
-  <package id="ServiceStack.Redis" version="3.9.38" targetFramework="net45" />
   <package id="ServiceStack.Text" version="3.9.38" targetFramework="net45" />
   <package id="SimpleInjector" version="2.0.0-beta5" targetFramework="net45" />
 </packages>

+ 21 - 0
MediaBrowser.Common/IApplicationHost.cs

@@ -12,6 +12,27 @@ namespace MediaBrowser.Common
     /// </summary>
     public interface IApplicationHost
     {
+        /// <summary>
+        /// Performs the pending restart.
+        /// </summary>
+        void PerformPendingRestart();
+        
+        /// <summary>
+        /// Gets or sets a value indicating whether this instance has pending kernel reload.
+        /// </summary>
+        /// <value><c>true</c> if this instance has pending kernel reload; otherwise, <c>false</c>.</value>
+        bool HasPendingRestart { get; }
+
+        /// <summary>
+        /// Occurs when [has pending restart changed].
+        /// </summary>
+        event EventHandler HasPendingRestartChanged;
+
+        /// <summary>
+        /// Notifies the pending restart.
+        /// </summary>
+        void NotifyPendingRestart();
+        
         /// <summary>
         /// Restarts this instance.
         /// </summary>

+ 0 - 167
MediaBrowser.Common/Kernel/BaseKernel.cs

@@ -1,167 +0,0 @@
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Events;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.System;
-using System;
-
-namespace MediaBrowser.Common.Kernel
-{
-    /// <summary>
-    /// Represents a shared base kernel for both the Ui and server apps
-    /// </summary>
-    public abstract class BaseKernel : IKernel
-    {
-        /// <summary>
-        /// Occurs when [has pending restart changed].
-        /// </summary>
-        public event EventHandler HasPendingRestartChanged;
-
-        #region ApplicationUpdated Event
-        /// <summary>
-        /// Occurs when [application updated].
-        /// </summary>
-        public event EventHandler<GenericEventArgs<Version>> ApplicationUpdated;
-        /// <summary>
-        /// Called when [application updated].
-        /// </summary>
-        /// <param name="newVersion">The new version.</param>
-        public void OnApplicationUpdated(Version newVersion)
-        {
-            EventHelper.QueueEventIfNotNull(ApplicationUpdated, this, new GenericEventArgs<Version> { Argument = newVersion }, Logger);
-
-            NotifyPendingRestart();
-        }
-        #endregion
-
-        /// <summary>
-        /// Gets or sets a value indicating whether this instance has changes that require the entire application to restart.
-        /// </summary>
-        /// <value><c>true</c> if this instance has pending application restart; otherwise, <c>false</c>.</value>
-        public bool HasPendingRestart { get; private set; }
-
-        /// <summary>
-        /// Gets the UDP server port number.
-        /// This can't be configurable because then the user would have to configure their client to discover the server.
-        /// </summary>
-        /// <value>The UDP server port number.</value>
-        public abstract int UdpServerPortNumber { get; }
-
-        /// <summary>
-        /// Gets the name of the web application that can be used for url building.
-        /// All api urls will be of the form {protocol}://{host}:{port}/{appname}/...
-        /// </summary>
-        /// <value>The name of the web application.</value>
-        public string WebApplicationName
-        {
-            get { return "mediabrowser"; }
-        }
-
-        /// <summary>
-        /// Gets the HTTP server URL prefix.
-        /// </summary>
-        /// <value>The HTTP server URL prefix.</value>
-        public virtual string HttpServerUrlPrefix
-        {
-            get
-            {
-                return "http://+:" + _configurationManager.CommonConfiguration.HttpServerPortNumber + "/" + WebApplicationName + "/";
-            }
-        }
-
-        /// <summary>
-        /// Gets the kernel context. Subclasses will have to override.
-        /// </summary>
-        /// <value>The kernel context.</value>
-        public abstract KernelContext KernelContext { get; }
-
-        /// <summary>
-        /// Gets the logger.
-        /// </summary>
-        /// <value>The logger.</value>
-        protected ILogger Logger { get; private set; }
-
-        /// <summary>
-        /// Gets or sets the application host.
-        /// </summary>
-        /// <value>The application host.</value>
-        protected IApplicationHost ApplicationHost { get; private set; }
-
-        private readonly IConfigurationManager _configurationManager;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="BaseKernel" /> class.
-        /// </summary>
-        /// <param name="appHost">The app host.</param>
-        /// <param name="logManager">The log manager.</param>
-        protected BaseKernel(IApplicationHost appHost, ILogManager logManager, IConfigurationManager configurationManager)
-        {
-            ApplicationHost = appHost;
-            _configurationManager = configurationManager;
-            Logger = logManager.GetLogger("Kernel");
-        }
-
-        /// <summary>
-        /// Initializes the Kernel
-        /// </summary>
-        /// <returns>Task.</returns>
-        public void Init()
-        {
-            ReloadInternal();
-
-            Logger.Info("Kernel.Init Complete");
-        }
-
-        /// <summary>
-        /// Performs initializations that can be reloaded at anytime
-        /// </summary>
-        /// <returns>Task.</returns>
-        protected virtual void ReloadInternal()
-        {
-        }
-
-        /// <summary>
-        /// Notifies that the kernel that a change has been made that requires a restart
-        /// </summary>
-        public void NotifyPendingRestart()
-        {
-            HasPendingRestart = true;
-
-            EventHelper.QueueEventIfNotNull(HasPendingRestartChanged, this, EventArgs.Empty, Logger);
-        }
-
-        /// <summary>
-        /// Performs the pending restart.
-        /// </summary>
-        /// <returns>Task.</returns>
-        public void PerformPendingRestart()
-        {
-            if (HasPendingRestart)
-            {
-                Logger.Info("Restarting the application");
-
-                ApplicationHost.Restart();
-            }
-            else
-            {
-                Logger.Info("PerformPendingRestart - not needed");
-            }
-        }
-
-        /// <summary>
-        /// Gets the system status.
-        /// </summary>
-        /// <returns>SystemInfo.</returns>
-        public virtual SystemInfo GetSystemInfo()
-        {
-            return new SystemInfo
-            {
-                HasPendingRestart = HasPendingRestart,
-                Version = ApplicationHost.ApplicationVersion.ToString(),
-                IsNetworkDeployed = ApplicationHost.CanSelfUpdate,
-                WebSocketPortNumber = ApplicationHost.Resolve<IServerManager>().WebSocketPortNumber,
-                SupportsNativeWebSocket = ApplicationHost.Resolve<IServerManager>().SupportsNativeWebSocket,
-                FailedPluginAssemblies = ApplicationHost.FailedAssemblies.ToArray()
-            };
-        }
-    }
-}

+ 0 - 74
MediaBrowser.Common/Kernel/IKernel.cs

@@ -1,74 +0,0 @@
-using MediaBrowser.Model.System;
-using System;
-
-namespace MediaBrowser.Common.Kernel
-{
-    /// <summary>
-    /// Interface IKernel
-    /// </summary>
-    public interface IKernel
-    {
-        /// <summary>
-        /// Occurs when [has pending restart changed].
-        /// </summary>
-        event EventHandler HasPendingRestartChanged;
-
-        /// <summary>
-        /// Gets the kernel context.
-        /// </summary>
-        /// <value>The kernel context.</value>
-        KernelContext KernelContext { get; }
-
-        /// <summary>
-        /// Inits this instance.
-        /// </summary>
-        /// <returns>Task.</returns>
-        void Init();
-
-        /// <summary>
-        /// Gets or sets a value indicating whether this instance has pending kernel reload.
-        /// </summary>
-        /// <value><c>true</c> if this instance has pending kernel reload; otherwise, <c>false</c>.</value>
-        bool HasPendingRestart { get; }
-
-        /// <summary>
-        /// Gets the system status.
-        /// </summary>
-        /// <returns>SystemInfo.</returns>
-        SystemInfo GetSystemInfo();
-
-        /// <summary>
-        /// Called when [application updated].
-        /// </summary>
-        /// <param name="newVersion">The new version.</param>
-        void OnApplicationUpdated(Version newVersion);
-
-        /// <summary>
-        /// Gets the name of the web application.
-        /// </summary>
-        /// <value>The name of the web application.</value>
-        string WebApplicationName { get; }
-
-        /// <summary>
-        /// Performs the pending restart.
-        /// </summary>
-        void PerformPendingRestart();
-
-        /// <summary>
-        /// Gets the UDP server port number.
-        /// </summary>
-        /// <value>The UDP server port number.</value>
-        int UdpServerPortNumber { get; }
-
-        /// <summary>
-        /// Gets the HTTP server URL prefix.
-        /// </summary>
-        /// <value>The HTTP server URL prefix.</value>
-        string HttpServerUrlPrefix { get; }
-
-        /// <summary>
-        /// Notifies the pending restart.
-        /// </summary>
-        void NotifyPendingRestart();
-    }
-}

+ 0 - 18
MediaBrowser.Common/Kernel/KernelContext.cs

@@ -1,18 +0,0 @@
-
-namespace MediaBrowser.Common.Kernel
-{
-    /// <summary>
-    /// Enum KernelContext
-    /// </summary>
-    public enum KernelContext
-    {
-        /// <summary>
-        /// The server
-        /// </summary>
-        Server,
-        /// <summary>
-        /// The UI
-        /// </summary>
-        Ui
-    }
-}

+ 4 - 7
MediaBrowser.Common/MediaBrowser.Common.csproj

@@ -59,12 +59,11 @@
     <Compile Include="IO\IIsoMount.cs" />
     <Compile Include="IO\ProgressStream.cs" />
     <Compile Include="IO\StreamDefaults.cs" />
-    <Compile Include="Kernel\BasePeriodicWebSocketListener.cs" />
+    <Compile Include="Net\BasePeriodicWebSocketListener.cs" />
     <Compile Include="Configuration\IApplicationPaths.cs" />
-    <Compile Include="Kernel\IServerManager.cs" />
-    <Compile Include="Kernel\IWebSocketListener.cs" />
+    <Compile Include="Net\IServerManager.cs" />
+    <Compile Include="Net\IWebSocketListener.cs" />
     <Compile Include="IApplicationHost.cs" />
-    <Compile Include="Kernel\IKernel.cs" />
     <Compile Include="Net\IHttpClient.cs" />
     <Compile Include="Net\IHttpServer.cs" />
     <Compile Include="Net\INetworkManager.cs" />
@@ -94,15 +93,13 @@
     <Compile Include="ScheduledTasks\ScheduledTaskHelpers.cs" />
     <Compile Include="ScheduledTasks\StartupTrigger.cs" />
     <Compile Include="ScheduledTasks\SystemEventTrigger.cs" />
-    <Compile Include="Kernel\BaseKernel.cs" />
-    <Compile Include="Kernel\KernelContext.cs" />
     <Compile Include="Plugins\BasePlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="ScheduledTasks\DailyTrigger.cs" />
     <Compile Include="ScheduledTasks\IntervalTrigger.cs" />
+    <Compile Include="ScheduledTasks\TaskCompletionEventArgs.cs" />
     <Compile Include="ScheduledTasks\WeeklyTrigger.cs" />
     <Compile Include="Security\ISecurityManager.cs" />
-    <Compile Include="Updates\ApplicationUpdater.cs" />
     <Compile Include="Updates\IPackageManager.cs" />
   </ItemGroup>
   <ItemGroup>

+ 2 - 3
MediaBrowser.Common/Kernel/BasePeriodicWebSocketListener.cs → MediaBrowser.Common/Net/BasePeriodicWebSocketListener.cs

@@ -1,12 +1,11 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Logging;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 
-namespace MediaBrowser.Common.Kernel
+namespace MediaBrowser.Common.Net
 {
     /// <summary>
     /// Starts sending data over a web socket periodically when a message is received, and then stops when a corresponding stop message is received

+ 1 - 1
MediaBrowser.Common/Kernel/IServerManager.cs → MediaBrowser.Common/Net/IServerManager.cs

@@ -3,7 +3,7 @@ using System.Collections.Generic;
 using System.Threading;
 using System.Threading.Tasks;
 
-namespace MediaBrowser.Common.Kernel
+namespace MediaBrowser.Common.Net
 {
     public interface IServerManager : IDisposable
     {

+ 2 - 3
MediaBrowser.Common/Kernel/IWebSocketListener.cs → MediaBrowser.Common/Net/IWebSocketListener.cs

@@ -1,7 +1,6 @@
-using MediaBrowser.Common.Net;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
 
-namespace MediaBrowser.Common.Kernel
+namespace MediaBrowser.Common.Net
 {
     /// <summary>
     ///This is an interface for listening to messages coming through a web socket connection

+ 0 - 19
MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs

@@ -1,7 +1,6 @@
 using MediaBrowser.Model.Tasks;
 using System;
 using System.Collections.Generic;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Common.ScheduledTasks
 {
@@ -64,23 +63,5 @@ namespace MediaBrowser.Common.ScheduledTasks
         /// </summary>
         /// <value>The unique id.</value>
         Guid Id { get; }
-
-        /// <summary>
-        /// Executes the task
-        /// </summary>
-        /// <returns>Task.</returns>
-        /// <exception cref="System.InvalidOperationException">Cannot execute a Task that is already running</exception>
-        Task Execute();
-
-        /// <summary>
-        /// Stops the task if it is currently executing
-        /// </summary>
-        /// <exception cref="System.InvalidOperationException">Cannot cancel a Task unless it is in the Running state.</exception>
-        void Cancel();
-
-        /// <summary>
-        /// Cancels if running.
-        /// </summary>
-        void CancelIfRunning();
     }
 }

+ 10 - 1
MediaBrowser.Common/ScheduledTasks/ITaskManager.cs

@@ -1,5 +1,8 @@
-using System;
+using MediaBrowser.Common.Events;
+using MediaBrowser.Model.Tasks;
+using System;
 using System.Collections.Generic;
+using System.Threading.Tasks;
 
 namespace MediaBrowser.Common.ScheduledTasks
 {
@@ -36,5 +39,11 @@ namespace MediaBrowser.Common.ScheduledTasks
         /// </summary>
         /// <param name="tasks">The tasks.</param>
         void AddTasks(IEnumerable<IScheduledTask> tasks);
+
+        void Cancel(IScheduledTaskWorker task);
+        Task Execute(IScheduledTaskWorker task);
+
+        event EventHandler<EventArgs> TaskExecuting;
+        event EventHandler<GenericEventArgs<TaskResult>> TaskCompleted;
     }
 }

+ 12 - 0
MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs

@@ -0,0 +1,12 @@
+using MediaBrowser.Model.Tasks;
+using System;
+
+namespace MediaBrowser.Common.ScheduledTasks
+{
+    public class TaskCompletionEventArgs : EventArgs
+    {
+        public IScheduledTask Task { get; set; }
+
+        public TaskResult Result { get; set; }
+    }
+}

+ 0 - 50
MediaBrowser.Controller/BaseManager.cs

@@ -1,50 +0,0 @@
-using MediaBrowser.Common.Kernel;
-using System;
-
-namespace MediaBrowser.Controller
-{
-    /// <summary>
-    /// Class BaseManager
-    /// </summary>
-    /// <typeparam name="TKernelType">The type of the T kernel type.</typeparam>
-    public abstract class BaseManager<TKernelType> : IDisposable
-        where TKernelType : class, IKernel
-    {
-        /// <summary>
-        /// The _kernel
-        /// </summary>
-        protected readonly TKernelType Kernel;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="BaseManager" /> class.
-        /// </summary>
-        /// <param name="kernel">The kernel.</param>
-        /// <exception cref="System.ArgumentNullException">kernel</exception>
-        protected BaseManager(TKernelType kernel)
-        {
-            if (kernel == null)
-            {
-                throw new ArgumentNullException("kernel");
-            }
-   
-            Kernel = kernel;
-        }
-
-        /// <summary>
-        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-        /// </summary>
-        public void Dispose()
-        {
-            Dispose(true);
-            GC.SuppressFinalize(this);
-        }
-
-        /// <summary>
-        /// Releases unmanaged and - optionally - managed resources.
-        /// </summary>
-        /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
-        protected virtual void Dispose(bool dispose)
-        {
-        }
-    }
-}

+ 7 - 13
MediaBrowser.Controller/IO/FileSystemManager.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
@@ -17,7 +16,7 @@ namespace MediaBrowser.Controller.IO
     /// modify the directories that the system is watching for changes should use the methods of
     /// this class to do so.  This way we can have the watchers correctly respond to only external changes.
     /// </summary>
-    public class FileSystemManager : BaseManager<Kernel>
+    public class FileSystemManager : IDisposable
     {
         /// <summary>
         /// Gets or sets the directory watchers.
@@ -25,23 +24,15 @@ namespace MediaBrowser.Controller.IO
         /// <value>The directory watchers.</value>
         private DirectoryWatchers DirectoryWatchers { get; set; }
 
-        /// <summary>
-        /// The _logger
-        /// </summary>
-        private readonly ILogger _logger;
-
         /// <summary>
         /// Initializes a new instance of the <see cref="FileSystemManager" /> class.
         /// </summary>
-        /// <param name="kernel">The kernel.</param>
         /// <param name="logManager">The log manager.</param>
         /// <param name="taskManager">The task manager.</param>
         /// <param name="libraryManager">The library manager.</param>
         /// <param name="configurationManager">The configuration manager.</param>
-        public FileSystemManager(Kernel kernel, ILogManager logManager, ITaskManager taskManager, ILibraryManager libraryManager, IServerConfigurationManager configurationManager)
-            : base(kernel)
+        public FileSystemManager(ILogManager logManager, ITaskManager taskManager, ILibraryManager libraryManager, IServerConfigurationManager configurationManager)
         {
-            _logger = logManager.GetLogger("FileSystemManager");
             DirectoryWatchers = new DirectoryWatchers(logManager, taskManager, libraryManager, configurationManager);
         }
 
@@ -113,14 +104,17 @@ namespace MediaBrowser.Controller.IO
         /// Releases unmanaged and - optionally - managed resources.
         /// </summary>
         /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
-        protected override void Dispose(bool dispose)
+        protected virtual void Dispose(bool dispose)
         {
             if (dispose)
             {
                 DirectoryWatchers.Dispose();
             }
+        }
 
-            base.Dispose(dispose);
+        public void Dispose()
+        {
+            Dispose(true);
         }
     }
 }

+ 10 - 0
MediaBrowser.Controller/IServerApplicationHost.cs

@@ -0,0 +1,10 @@
+using MediaBrowser.Common;
+using MediaBrowser.Model.System;
+
+namespace MediaBrowser.Controller
+{
+    public interface IServerApplicationHost : IApplicationHost
+    {
+        SystemInfo GetSystemInfo();
+    }
+}

+ 0 - 1
MediaBrowser.Controller/IServerApplicationPaths.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
 
 namespace MediaBrowser.Controller
 {

+ 23 - 33
MediaBrowser.Controller/Kernel.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Drawing;
@@ -11,11 +10,9 @@ using MediaBrowser.Controller.MediaInfo;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Providers;
-using MediaBrowser.Controller.Updates;
 using MediaBrowser.Controller.Weather;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
-using MediaBrowser.Model.System;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -27,7 +24,7 @@ namespace MediaBrowser.Controller
     /// <summary>
     /// Class Kernel
     /// </summary>
-    public class Kernel : BaseKernel, IDisposable
+    public class Kernel : IDisposable
     {
         /// <summary>
         /// Gets the instance.
@@ -60,12 +57,25 @@ namespace MediaBrowser.Controller
         public ProviderManager ProviderManager { get; private set; }
 
         /// <summary>
-        /// Gets the kernel context.
+        /// Gets the name of the web application that can be used for url building.
+        /// All api urls will be of the form {protocol}://{host}:{port}/{appname}/...
         /// </summary>
-        /// <value>The kernel context.</value>
-        public override KernelContext KernelContext
+        /// <value>The name of the web application.</value>
+        public string WebApplicationName
         {
-            get { return KernelContext.Server; }
+            get { return "mediabrowser"; }
+        }
+
+        /// <summary>
+        /// Gets the HTTP server URL prefix.
+        /// </summary>
+        /// <value>The HTTP server URL prefix.</value>
+        public virtual string HttpServerUrlPrefix
+        {
+            get
+            {
+                return "http://+:" + _configurationManager.Configuration.HttpServerPortNumber + "/" + WebApplicationName + "/";
+            }
         }
 
         /// <summary>
@@ -145,7 +155,7 @@ namespace MediaBrowser.Controller
         /// Gets the UDP server port number.
         /// </summary>
         /// <value>The UDP server port number.</value>
-        public override int UdpServerPortNumber
+        public int UdpServerPortNumber
         {
             get { return 7359; }
         }
@@ -154,6 +164,7 @@ namespace MediaBrowser.Controller
 
         private readonly IServerConfigurationManager _configurationManager;
         private readonly ILogManager _logManager;
+        private IApplicationHost ApplicationHost { get; set; }
 
         /// <summary>
         /// Creates a kernel based on a Data path, which is akin to our current programdata path
@@ -164,10 +175,10 @@ namespace MediaBrowser.Controller
         /// <param name="configurationManager">The configuration manager.</param>
         /// <exception cref="System.ArgumentNullException">isoManager</exception>
         public Kernel(IApplicationHost appHost, IXmlSerializer xmlSerializer, ILogManager logManager, IServerConfigurationManager configurationManager)
-            : base(appHost, logManager, configurationManager)
         {
             Instance = this;
 
+            ApplicationHost = appHost;
             _configurationManager = configurationManager;
             _xmlSerializer = xmlSerializer;
             _logManager = logManager;
@@ -207,10 +218,8 @@ namespace MediaBrowser.Controller
         /// Performs initializations that can be reloaded at anytime
         /// </summary>
         /// <returns>Task.</returns>
-        protected override async void ReloadInternal()
+        public async Task Init()
         {
-            base.ReloadInternal();
-
             FindParts();
 
             await LoadRepositories().ConfigureAwait(false);
@@ -306,27 +315,8 @@ namespace MediaBrowser.Controller
         {
             DisposeFileSystemManager();
 
-            FileSystemManager = new FileSystemManager(this, _logManager, ApplicationHost.Resolve<ITaskManager>(), ApplicationHost.Resolve<ILibraryManager>(), _configurationManager);
+            FileSystemManager = new FileSystemManager(_logManager, ApplicationHost.Resolve<ITaskManager>(), ApplicationHost.Resolve<ILibraryManager>(), _configurationManager);
             FileSystemManager.StartWatchers();
         }
-
-        /// <summary>
-        /// Gets the system info.
-        /// </summary>
-        /// <returns>SystemInfo.</returns>
-        public override SystemInfo GetSystemInfo()
-        {
-            var info = base.GetSystemInfo();
-
-            var installationManager = ApplicationHost.Resolve<IInstallationManager>();
-
-            if (installationManager != null)
-            {
-                info.InProgressInstallations = installationManager.CurrentInstallations.Select(i => i.Item1).ToArray();
-                info.CompletedInstallations = installationManager.CompletedInstallations.ToArray();
-            }
-
-            return info;
-        }
     }
 }

+ 1 - 1
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -70,7 +70,6 @@
     <Compile Include="..\SharedVersion.cs">
       <Link>Properties\SharedVersion.cs</Link>
     </Compile>
-    <Compile Include="BaseManager.cs" />
     <Compile Include="Configuration\IServerConfigurationManager.cs" />
     <Compile Include="Drawing\ImageExtensions.cs" />
     <Compile Include="Drawing\ImageHeader.cs" />
@@ -105,6 +104,7 @@
     <Compile Include="IO\FileSystem.cs" />
     <Compile Include="IO\FileSystemManager.cs" />
     <Compile Include="IO\NativeMethods.cs" />
+    <Compile Include="IServerApplicationHost.cs" />
     <Compile Include="IServerApplicationPaths.cs" />
     <Compile Include="Library\ChildrenChangedEventArgs.cs" />
     <Compile Include="Library\DtoBuilder.cs" />

+ 10 - 5
MediaBrowser.Controller/Providers/ProviderManager.cs

@@ -18,7 +18,7 @@ namespace MediaBrowser.Controller.Providers
     /// <summary>
     /// Class ProviderManager
     /// </summary>
-    public class ProviderManager : BaseManager<Kernel>
+    public class ProviderManager : IDisposable
     {
         /// <summary>
         /// The remote image cache
@@ -42,7 +42,9 @@ namespace MediaBrowser.Controller.Providers
         private readonly IHttpClient _httpClient;
 
         private IServerConfigurationManager ConfigurationManager { get; set; }
-        
+
+        private Kernel Kernel { get; set; }
+
         /// <summary>
         /// Initializes a new instance of the <see cref="ProviderManager" /> class.
         /// </summary>
@@ -50,9 +52,9 @@ namespace MediaBrowser.Controller.Providers
         /// <param name="httpClient">The HTTP client.</param>
         /// <param name="logger">The logger.</param>
         public ProviderManager(Kernel kernel, IHttpClient httpClient, ILogger logger, IServerConfigurationManager configurationManager)
-            : base(kernel)
         {
             _logger = logger;
+            Kernel = kernel;
             _httpClient = httpClient;
             ConfigurationManager = configurationManager;
             _remoteImageCache = new FileSystemRepository(ImagesDataPath);
@@ -354,14 +356,17 @@ namespace MediaBrowser.Controller.Providers
         /// Releases unmanaged and - optionally - managed resources.
         /// </summary>
         /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
-        protected override void Dispose(bool dispose)
+        protected virtual void Dispose(bool dispose)
         {
             if (dispose)
             {
                 _remoteImageCache.Dispose();
             }
+        }
 
-            base.Dispose(dispose);
+        public void Dispose()
+        {
+            Dispose(true);
         }
     }
 }

+ 0 - 26
MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs

@@ -18,20 +18,6 @@ namespace MediaBrowser.Model.Configuration
         [ProtoMember(1)]
         public bool EnableDebugLevelLogging { get; set; }
 
-        /// <summary>
-        /// Gets or sets a value indicating whether [enable HTTP level logging].
-        /// </summary>
-        /// <value><c>true</c> if [enable HTTP level logging]; otherwise, <c>false</c>.</value>
-        [ProtoMember(56)]
-        public bool EnableHttpLevelLogging { get; set; }
-
-        /// <summary>
-        /// Gets or sets the HTTP server port number.
-        /// </summary>
-        /// <value>The HTTP server port number.</value>
-        [ProtoMember(2)]
-        public int HttpServerPortNumber { get; set; }
-
         /// <summary>
         /// Enable automatically and silently updating of the application
         /// </summary>
@@ -59,13 +45,6 @@ namespace MediaBrowser.Model.Configuration
         [ProtoMember(58)]
         public bool RunAtStartup { get; set; }
 
-        /// <summary>
-        /// Gets or sets the legacy web socket port number.
-        /// </summary>
-        /// <value>The legacy web socket port number.</value>
-        [ProtoMember(59)]
-        public int LegacyWebSocketPortNumber { get; set; }
-
         /// <summary>
         /// Gets or sets a value indicating whether this instance is first run.
         /// </summary>
@@ -78,14 +57,9 @@ namespace MediaBrowser.Model.Configuration
         /// </summary>
         public BaseApplicationConfiguration()
         {
-            HttpServerPortNumber = 8096;
-            LegacyWebSocketPortNumber = 8945;
-
             EnableAutoUpdate = true;
             LogFileRetentionDays = 14;
 
-            EnableHttpLevelLogging = true;
-
 #if (DEBUG)
             EnableDebugLevelLogging = true;
 #endif

+ 25 - 0
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -12,6 +12,27 @@ namespace MediaBrowser.Model.Configuration
     [ProtoContract]
     public class ServerConfiguration : BaseApplicationConfiguration
     {
+        /// <summary>
+        /// Gets or sets a value indicating whether [enable HTTP level logging].
+        /// </summary>
+        /// <value><c>true</c> if [enable HTTP level logging]; otherwise, <c>false</c>.</value>
+        [ProtoMember(56)]
+        public bool EnableHttpLevelLogging { get; set; }
+
+        /// <summary>
+        /// Gets or sets the HTTP server port number.
+        /// </summary>
+        /// <value>The HTTP server port number.</value>
+        [ProtoMember(2)]
+        public int HttpServerPortNumber { get; set; }
+
+        /// <summary>
+        /// Gets or sets the legacy web socket port number.
+        /// </summary>
+        /// <value>The legacy web socket port number.</value>
+        [ProtoMember(59)]
+        public int LegacyWebSocketPortNumber { get; set; }
+
         /// <summary>
         /// Gets or sets a value indicating whether [enable internet providers].
         /// </summary>
@@ -255,6 +276,10 @@ namespace MediaBrowser.Model.Configuration
         public ServerConfiguration()
             : base()
         {
+            HttpServerPortNumber = 8096;
+            LegacyWebSocketPortNumber = 8945;
+            EnableHttpLevelLogging = true;
+
 #if (DEBUG)
             EnableDeveloperTools = true;
 #endif

+ 1 - 1
MediaBrowser.Common.Implementations/HttpServer/BaseRestService.cs → MediaBrowser.Server.Implementations/HttpServer/BaseRestService.cs

@@ -14,7 +14,7 @@ using System.Linq;
 using System.Threading.Tasks;
 using MimeTypes = MediaBrowser.Common.Net.MimeTypes;
 
-namespace MediaBrowser.Common.Implementations.HttpServer
+namespace MediaBrowser.Server.Implementations.HttpServer
 {
     /// <summary>
     /// Class BaseRestService

+ 2 - 2
MediaBrowser.Common.Implementations/HttpServer/HttpServer.cs → MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs

@@ -1,6 +1,6 @@
 using Funq;
+using MediaBrowser.Common;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
@@ -26,7 +26,7 @@ using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace MediaBrowser.Common.Implementations.HttpServer
+namespace MediaBrowser.Server.Implementations.HttpServer
 {
     /// <summary>
     /// Class HttpServer

+ 1 - 1
MediaBrowser.Common.Implementations/HttpServer/NativeWebSocket.cs → MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
 using WebSocketMessageType = MediaBrowser.Common.Net.WebSocketMessageType;
 using WebSocketState = MediaBrowser.Common.Net.WebSocketState;
 
-namespace MediaBrowser.Common.Implementations.HttpServer
+namespace MediaBrowser.Server.Implementations.HttpServer
 {
     /// <summary>
     /// Class NativeWebSocket

+ 2 - 2
MediaBrowser.Common.Implementations/HttpServer/ServerFactory.cs → MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs

@@ -1,9 +1,9 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 
-namespace MediaBrowser.Common.Implementations.HttpServer
+namespace MediaBrowser.Server.Implementations.HttpServer
 {
     /// <summary>
     /// Class ServerFactory

+ 1 - 1
MediaBrowser.Common.Implementations/HttpServer/StreamWriter.cs → MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs

@@ -2,7 +2,7 @@
 using System.IO;
 using System.Threading.Tasks;
 
-namespace MediaBrowser.Common.Implementations.HttpServer
+namespace MediaBrowser.Server.Implementations.HttpServer
 {
     /// <summary>
     /// Class StreamWriter

+ 1 - 1
MediaBrowser.Common.Implementations/HttpServer/SwaggerService.cs → MediaBrowser.Server.Implementations/HttpServer/SwaggerService.cs

@@ -2,7 +2,7 @@
 using System.Diagnostics;
 using System.IO;
 
-namespace MediaBrowser.Common.Implementations.HttpServer
+namespace MediaBrowser.Server.Implementations.HttpServer
 {
     /// <summary>
     /// Class GetDashboardResource

+ 101 - 0
MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

@@ -32,6 +32,9 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Alchemy">
+      <HintPath>..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll</HintPath>
+    </Reference>
     <Reference Include="BdInfo, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\packages\MediaBrowser.BdInfo.1.0.0.2\lib\net45\BdInfo.dll</HintPath>
@@ -39,6 +42,39 @@
     <Reference Include="MoreLinq">
       <HintPath>..\packages\morelinq.1.0.15631-beta\lib\net35\MoreLinq.dll</HintPath>
     </Reference>
+    <Reference Include="NLog">
+      <HintPath>..\packages\NLog.2.0.0.2000\lib\net40\NLog.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack">
+      <HintPath>..\packages\ServiceStack.3.9.38\lib\net35\ServiceStack.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Api.Swagger">
+      <HintPath>..\packages\ServiceStack.Api.Swagger.3.9.38\lib\net35\ServiceStack.Api.Swagger.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Common">
+      <HintPath>..\packages\ServiceStack.Common.3.9.38\lib\net35\ServiceStack.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Interfaces">
+      <HintPath>..\packages\ServiceStack.Common.3.9.38\lib\net35\ServiceStack.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Logging.NLog">
+      <HintPath>..\packages\ServiceStack.Logging.NLog.1.0.6.0\lib\net35\ServiceStack.Logging.NLog.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.OrmLite">
+      <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.39\lib\ServiceStack.OrmLite.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.OrmLite.SqlServer">
+      <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.39\lib\ServiceStack.OrmLite.SqlServer.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Redis">
+      <HintPath>..\packages\ServiceStack.Redis.3.9.38\lib\net35\ServiceStack.Redis.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.ServiceInterface">
+      <HintPath>..\packages\ServiceStack.3.9.38\lib\net35\ServiceStack.ServiceInterface.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Text">
+      <HintPath>..\packages\ServiceStack.Text.3.9.38\lib\net35\ServiceStack.Text.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Data.SQLite">
@@ -47,6 +83,16 @@
     <Reference Include="System.Data.SQLite.Linq">
       <HintPath>..\packages\System.Data.SQLite.1.0.84.0\lib\net45\System.Data.SQLite.Linq.dll</HintPath>
     </Reference>
+    <Reference Include="System.Reactive.Core">
+      <HintPath>..\packages\Rx-Core.2.1.30214.0\lib\Net45\System.Reactive.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Interfaces">
+      <HintPath>..\packages\Rx-Interfaces.2.1.30214.0\lib\Net45\System.Reactive.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Linq">
+      <HintPath>..\packages\Rx-Linq.2.1.30214.0\lib\Net45\System.Reactive.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />
@@ -59,6 +105,12 @@
     </Compile>
     <Compile Include="BdInfo\BdInfoExaminer.cs" />
     <Compile Include="Configuration\ServerConfigurationManager.cs" />
+    <Compile Include="HttpServer\BaseRestService.cs" />
+    <Compile Include="HttpServer\HttpServer.cs" />
+    <Compile Include="HttpServer\NativeWebSocket.cs" />
+    <Compile Include="HttpServer\ServerFactory.cs" />
+    <Compile Include="HttpServer\StreamWriter.cs" />
+    <Compile Include="HttpServer\SwaggerService.cs" />
     <Compile Include="Library\CoreResolutionIgnoreRule.cs" />
     <Compile Include="Library\LibraryManager.cs" />
     <Compile Include="Library\ResolverHelper.cs" />
@@ -82,13 +134,18 @@
     <Compile Include="ScheduledTasks\ImageCleanupTask.cs" />
     <Compile Include="ScheduledTasks\PluginUpdateTask.cs" />
     <Compile Include="ServerApplicationPaths.cs" />
+    <Compile Include="ServerManager\ServerManager.cs" />
+    <Compile Include="ServerManager\WebSocketConnection.cs" />
     <Compile Include="Sqlite\SQLiteDisplayPreferencesRepository.cs" />
     <Compile Include="Sqlite\SQLiteExtensions.cs" />
     <Compile Include="Sqlite\SQLiteItemRepository.cs" />
     <Compile Include="Sqlite\SQLiteRepository.cs" />
     <Compile Include="Sqlite\SQLiteUserDataRepository.cs" />
     <Compile Include="Sqlite\SQLiteUserRepository.cs" />
+    <Compile Include="Udp\UdpServer.cs" />
     <Compile Include="Updates\InstallationManager.cs" />
+    <Compile Include="WebSocket\AlchemyServer.cs" />
+    <Compile Include="WebSocket\AlchemyWebSocket.cs" />
     <Compile Include="WorldWeatherOnline\WeatherProvider.cs" />
   </ItemGroup>
   <ItemGroup>
@@ -110,6 +167,49 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
+    <Content Include="README.txt" />
+    <Content Include="swagger-ui\css\screen.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\images\pet_store_api.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\images\wordnik_api.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\index.html">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\lib\backbone-min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\lib\handlebars.runtime-1.0.0.beta.6.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\lib\jquery.ba-bbq.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\lib\jquery.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\lib\jquery.slideto.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\lib\jquery.wiggle.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\lib\swagger.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\lib\underscore-min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\swagger-ui.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="swagger-ui\swagger-ui.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="x64\SQLite.Interop.dll">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
@@ -119,6 +219,7 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
+    <EmbeddedResource Include="ServerManager\RegisterServer.bat" />
   </ItemGroup>
   <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

+ 0 - 0
MediaBrowser.Common.Implementations/README.txt → MediaBrowser.Server.Implementations/README.txt


+ 0 - 0
MediaBrowser.Common.Implementations/ServerManager/RegisterServer.bat → MediaBrowser.Server.Implementations/ServerManager/RegisterServer.bat


+ 21 - 38
MediaBrowser.Common.Implementations/ServerManager/ServerManager.cs → MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs

@@ -1,6 +1,7 @@
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common;
 using MediaBrowser.Common.Net;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 using System;
@@ -15,7 +16,7 @@ using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
 
-namespace MediaBrowser.Common.Implementations.ServerManager
+namespace MediaBrowser.Server.Implementations.ServerManager
 {
     /// <summary>
     /// Manages the Http Server, Udp Server and WebSocket connections
@@ -73,16 +74,11 @@ namespace MediaBrowser.Common.Implementations.ServerManager
         /// </summary>
         private readonly IApplicationHost _applicationHost;
 
-        /// <summary>
-        /// The _kernel
-        /// </summary>
-        private readonly IKernel _kernel;
-
         /// <summary>
         /// Gets or sets the configuration manager.
         /// </summary>
         /// <value>The configuration manager.</value>
-        private IConfigurationManager ConfigurationManager { get; set; }
+        private IServerConfigurationManager ConfigurationManager { get; set; }
 
         /// <summary>
         /// Gets a value indicating whether [supports web socket].
@@ -99,7 +95,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
         /// <value>The web socket port number.</value>
         public int WebSocketPortNumber
         {
-            get { return SupportsNativeWebSocket ? ConfigurationManager.CommonConfiguration.HttpServerPortNumber : ConfigurationManager.CommonConfiguration.LegacyWebSocketPortNumber; }
+            get { return SupportsNativeWebSocket ? ConfigurationManager.Configuration.HttpServerPortNumber : ConfigurationManager.Configuration.LegacyWebSocketPortNumber; }
         }
 
         /// <summary>
@@ -108,26 +104,23 @@ namespace MediaBrowser.Common.Implementations.ServerManager
         /// <value>The web socket listeners.</value>
         private readonly List<IWebSocketListener> _webSocketListeners = new List<IWebSocketListener>();
 
+        private Kernel _kernel;
+
         /// <summary>
         /// Initializes a new instance of the <see cref="ServerManager" /> class.
         /// </summary>
         /// <param name="applicationHost">The application host.</param>
-        /// <param name="kernel">The kernel.</param>
         /// <param name="networkManager">The network manager.</param>
         /// <param name="jsonSerializer">The json serializer.</param>
         /// <param name="logger">The logger.</param>
         /// <param name="configurationManager">The configuration manager.</param>
         /// <exception cref="System.ArgumentNullException">applicationHost</exception>
-        public ServerManager(IApplicationHost applicationHost, IKernel kernel, INetworkManager networkManager, IJsonSerializer jsonSerializer, ILogger logger, IConfigurationManager configurationManager)
+        public ServerManager(IApplicationHost applicationHost, INetworkManager networkManager, IJsonSerializer jsonSerializer, ILogger logger, IServerConfigurationManager configurationManager, Kernel kernel)
         {
             if (applicationHost == null)
             {
                 throw new ArgumentNullException("applicationHost");
             }
-            if (kernel == null)
-            {
-                throw new ArgumentNullException("kernel");
-            }
             if (networkManager == null)
             {
                 throw new ArgumentNullException("networkManager");
@@ -143,10 +136,10 @@ namespace MediaBrowser.Common.Implementations.ServerManager
 
             _logger = logger;
             _jsonSerializer = jsonSerializer;
-            _kernel = kernel;
             _applicationHost = applicationHost;
             _networkManager = networkManager;
             ConfigurationManager = configurationManager;
+            _kernel = kernel;
         }
 
         /// <summary>
@@ -175,17 +168,11 @@ namespace MediaBrowser.Common.Implementations.ServerManager
         /// </summary>
         private void ReloadExternalWebSocketServer()
         {
-            // Avoid windows firewall prompts in the ui
-            if (_kernel.KernelContext != KernelContext.Server)
-            {
-                return;
-            }
-
             DisposeExternalWebSocketServer();
 
             ExternalWebSocketServer = _applicationHost.Resolve<IWebSocketServer>();
 
-            ExternalWebSocketServer.Start(ConfigurationManager.CommonConfiguration.LegacyWebSocketPortNumber);
+            ExternalWebSocketServer.Start(ConfigurationManager.Configuration.LegacyWebSocketPortNumber);
             ExternalWebSocketServer.WebSocketConnected += HttpServer_WebSocketConnected;
         }
 
@@ -208,7 +195,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
             try
             {
                 HttpServer = _applicationHost.Resolve<IHttpServer>();
-                HttpServer.EnableHttpRequestLogging = ConfigurationManager.CommonConfiguration.EnableHttpLevelLogging;
+                HttpServer.EnableHttpRequestLogging = ConfigurationManager.Configuration.EnableHttpLevelLogging;
                 HttpServer.Start(_kernel.HttpServerUrlPrefix);
             }
             catch (HttpListenerException ex)
@@ -275,12 +262,6 @@ namespace MediaBrowser.Common.Implementations.ServerManager
                 return;
             }
 
-            // Avoid windows firewall prompts in the ui
-            if (_kernel.KernelContext != KernelContext.Server)
-            {
-                return;
-            }
-
             DisposeUdpServer();
 
             try
@@ -305,7 +286,9 @@ namespace MediaBrowser.Common.Implementations.ServerManager
         /// <param name="e">The <see cref="UdpMessageReceivedEventArgs" /> instance containing the event data.</param>
         async void UdpServer_MessageReceived(object sender, UdpMessageReceivedEventArgs e)
         {
-            var expectedMessage = String.Format("who is MediaBrowser{0}?", _kernel.KernelContext);
+            var context = "Server";
+
+            var expectedMessage = String.Format("who is MediaBrowser{0}?", context);
             var expectedMessageBytes = Encoding.UTF8.GetBytes(expectedMessage);
 
             if (expectedMessageBytes.SequenceEqual(e.Bytes))
@@ -313,7 +296,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
                 _logger.Info("Received UDP server request from " + e.RemoteEndPoint);
 
                 // Send a response back with our ip address and port
-                var response = String.Format("MediaBrowser{0}|{1}:{2}", _kernel.KernelContext, _networkManager.GetLocalIpAddress(), _kernel.UdpServerPortNumber);
+                var response = String.Format("MediaBrowser{0}|{1}:{2}", context, _networkManager.GetLocalIpAddress(), _kernel.UdpServerPortNumber);
 
                 await UdpServer.SendAsync(Encoding.UTF8.GetBytes(response), e.RemoteEndPoint);
             }
@@ -447,7 +430,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
             var tmpFile = Path.Combine(ConfigurationManager.CommonApplicationPaths.TempDirectory, Guid.NewGuid() + ".bat");
 
             // Extract the bat file
-            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MediaBrowser.Common.Implementations.ServerManager.RegisterServer.bat"))
+            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MediaBrowser.Server.Implementations.ServerManager.RegisterServer.bat"))
             {
                 using (var fileStream = File.Create(tmpFile))
                 {
@@ -459,10 +442,10 @@ namespace MediaBrowser.Common.Implementations.ServerManager
             {
                 FileName = tmpFile,
 
-                Arguments = string.Format("{0} {1} {2} {3}", ConfigurationManager.CommonConfiguration.HttpServerPortNumber,
+                Arguments = string.Format("{0} {1} {2} {3}", ConfigurationManager.Configuration.HttpServerPortNumber,
                 _kernel.HttpServerUrlPrefix,
                 _kernel.UdpServerPortNumber,
-                ConfigurationManager.CommonConfiguration.LegacyWebSocketPortNumber),
+                ConfigurationManager.Configuration.LegacyWebSocketPortNumber),
 
                 CreateNoWindow = true,
                 WindowStyle = ProcessWindowStyle.Hidden,
@@ -517,14 +500,14 @@ namespace MediaBrowser.Common.Implementations.ServerManager
         /// <exception cref="System.NotImplementedException"></exception>
         void _kernel_ConfigurationUpdated(object sender, EventArgs e)
         {
-            HttpServer.EnableHttpRequestLogging = ConfigurationManager.CommonConfiguration.EnableHttpLevelLogging;
+            HttpServer.EnableHttpRequestLogging = ConfigurationManager.Configuration.EnableHttpLevelLogging;
 
             if (!string.Equals(HttpServer.UrlPrefix, _kernel.HttpServerUrlPrefix, StringComparison.OrdinalIgnoreCase))
             {
                 ReloadHttpServer();
             }
 
-            if (!SupportsNativeWebSocket && ExternalWebSocketServer != null && ExternalWebSocketServer.Port != ConfigurationManager.CommonConfiguration.LegacyWebSocketPortNumber)
+            if (!SupportsNativeWebSocket && ExternalWebSocketServer != null && ExternalWebSocketServer.Port != ConfigurationManager.Configuration.LegacyWebSocketPortNumber)
             {
                 ReloadExternalWebSocketServer();
             }

+ 1 - 1
MediaBrowser.Common.Implementations/ServerManager/WebSocketConnection.cs → MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs

@@ -6,7 +6,7 @@ using System.IO;
 using System.Threading;
 using System.Threading.Tasks;
 
-namespace MediaBrowser.Common.Implementations.ServerManager
+namespace MediaBrowser.Server.Implementations.ServerManager
 {
     /// <summary>
     /// Class WebSocketConnection

+ 0 - 1
MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Entities;

+ 0 - 1
MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Logging;

+ 0 - 1
MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Logging;

+ 0 - 1
MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Logging;

+ 1 - 1
MediaBrowser.Common.Implementations/Udp/UdpServer.cs → MediaBrowser.Server.Implementations/Udp/UdpServer.cs

@@ -8,7 +8,7 @@ using System.Reactive.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace MediaBrowser.Common.Implementations.Udp
+namespace MediaBrowser.Server.Implementations.Udp
 {
     /// <summary>
     /// Provides a Udp Server

+ 4 - 10
MediaBrowser.Server.Implementations/Updates/InstallationManager.cs

@@ -1,11 +1,9 @@
 using MediaBrowser.Common;
 using MediaBrowser.Common.Events;
-using MediaBrowser.Common.Kernel;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.Progress;
 using MediaBrowser.Common.Updates;
-using MediaBrowser.Controller;
 using MediaBrowser.Controller.Updates;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
@@ -72,7 +70,7 @@ namespace MediaBrowser.Server.Implementations.Updates
 
             EventHelper.QueueEventIfNotNull(PluginUpdated, this, new GenericEventArgs<Tuple<IPlugin, PackageVersionInfo>> { Argument = new Tuple<IPlugin, PackageVersionInfo>(plugin, newVersion) }, _logger);
 
-            Kernel.NotifyPendingRestart();
+            ApplicationHost.NotifyPendingRestart();
         }
         #endregion
 
@@ -91,7 +89,7 @@ namespace MediaBrowser.Server.Implementations.Updates
 
             EventHelper.QueueEventIfNotNull(PluginInstalled, this, new GenericEventArgs<PackageVersionInfo> { Argument = package }, _logger);
 
-            Kernel.NotifyPendingRestart();
+            ApplicationHost.NotifyPendingRestart();
         }
         #endregion
 
@@ -123,19 +121,16 @@ namespace MediaBrowser.Server.Implementations.Updates
         /// <value>The application host.</value>
         protected IApplicationHost ApplicationHost { get; private set; }
 
-        private IKernel Kernel { get; set; }
-
         /// <summary>
         /// Initializes a new instance of the <see cref="InstallationManager" /> class.
         /// </summary>
-        /// <param name="kernel">The kernel.</param>
         /// <param name="httpClient">The HTTP client.</param>
         /// <param name="packageManager">The package manager.</param>
         /// <param name="jsonSerializer">The json serializer.</param>
         /// <param name="logger">The logger.</param>
         /// <param name="appHost">The app host.</param>
         /// <exception cref="System.ArgumentNullException">zipClient</exception>
-        public InstallationManager(IKernel kernel, IHttpClient httpClient, IPackageManager packageManager, IJsonSerializer jsonSerializer, ILogger logger, IApplicationHost appHost)
+        public InstallationManager(IHttpClient httpClient, IPackageManager packageManager, IJsonSerializer jsonSerializer, ILogger logger, IApplicationHost appHost)
         {
             if (packageManager == null)
             {
@@ -161,7 +156,6 @@ namespace MediaBrowser.Server.Implementations.Updates
             ApplicationHost = appHost;
             _packageManager = packageManager;
             _logger = logger;
-            Kernel = kernel;
         }
 
         /// <summary>
@@ -454,7 +448,7 @@ namespace MediaBrowser.Server.Implementations.Updates
 
             OnPluginUninstalled(plugin);
 
-            Kernel.NotifyPendingRestart();
+            ApplicationHost.NotifyPendingRestart();
         }
 
         /// <summary>

+ 1 - 1
MediaBrowser.Common.Implementations/WebSocket/AlchemyServer.cs → MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs

@@ -5,7 +5,7 @@ using MediaBrowser.Model.Logging;
 using System;
 using System.Net;
 
-namespace MediaBrowser.Common.Implementations.WebSocket
+namespace MediaBrowser.Server.Implementations.WebSocket
 {
     /// <summary>
     /// Class AlchemyServer

+ 1 - 1
MediaBrowser.Common.Implementations/WebSocket/AlchemyWebSocket.cs → MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs

@@ -6,7 +6,7 @@ using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
 
-namespace MediaBrowser.Common.Implementations.WebSocket
+namespace MediaBrowser.Server.Implementations.WebSocket
 {
     /// <summary>
     /// Class AlchemyWebSocket

+ 12 - 0
MediaBrowser.Server.Implementations/packages.config

@@ -1,6 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
+  <package id="Alchemy" version="2.2.1" targetFramework="net45" />
   <package id="MediaBrowser.BdInfo" version="1.0.0.2" targetFramework="net45" />
   <package id="morelinq" version="1.0.15631-beta" targetFramework="net45" />
+  <package id="NLog" version="2.0.0.2000" targetFramework="net45" />
+  <package id="Rx-Core" version="2.1.30214.0" targetFramework="net45" />
+  <package id="Rx-Interfaces" version="2.1.30214.0" targetFramework="net45" />
+  <package id="Rx-Linq" version="2.1.30214.0" targetFramework="net45" />
+  <package id="ServiceStack" version="3.9.38" targetFramework="net45" />
+  <package id="ServiceStack.Api.Swagger" version="3.9.38" targetFramework="net45" />
+  <package id="ServiceStack.Common" version="3.9.38" targetFramework="net45" />
+  <package id="ServiceStack.Logging.NLog" version="1.0.6.0" targetFramework="net45" />
+  <package id="ServiceStack.OrmLite.SqlServer" version="3.9.39" targetFramework="net45" />
+  <package id="ServiceStack.Redis" version="3.9.38" targetFramework="net45" />
+  <package id="ServiceStack.Text" version="3.9.38" targetFramework="net45" />
   <package id="System.Data.SQLite" version="1.0.84.0" targetFramework="net45" />
 </packages>

+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/css/screen.css → MediaBrowser.Server.Implementations/swagger-ui/css/screen.css


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/images/pet_store_api.png → MediaBrowser.Server.Implementations/swagger-ui/images/pet_store_api.png


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/images/wordnik_api.png → MediaBrowser.Server.Implementations/swagger-ui/images/wordnik_api.png


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/index.html → MediaBrowser.Server.Implementations/swagger-ui/index.html


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/lib/backbone-min.js → MediaBrowser.Server.Implementations/swagger-ui/lib/backbone-min.js


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/lib/handlebars.runtime-1.0.0.beta.6.js → MediaBrowser.Server.Implementations/swagger-ui/lib/handlebars.runtime-1.0.0.beta.6.js


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/lib/jquery.ba-bbq.min.js → MediaBrowser.Server.Implementations/swagger-ui/lib/jquery.ba-bbq.min.js


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/lib/jquery.min.js → MediaBrowser.Server.Implementations/swagger-ui/lib/jquery.min.js


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/lib/jquery.slideto.min.js → MediaBrowser.Server.Implementations/swagger-ui/lib/jquery.slideto.min.js


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/lib/jquery.wiggle.min.js → MediaBrowser.Server.Implementations/swagger-ui/lib/jquery.wiggle.min.js


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/lib/swagger.js → MediaBrowser.Server.Implementations/swagger-ui/lib/swagger.js


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/lib/underscore-min.js → MediaBrowser.Server.Implementations/swagger-ui/lib/underscore-min.js


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/swagger-ui.js → MediaBrowser.Server.Implementations/swagger-ui/swagger-ui.js


+ 0 - 0
MediaBrowser.Common.Implementations/swagger-ui/swagger-ui.min.js → MediaBrowser.Server.Implementations/swagger-ui/swagger-ui.min.js


+ 6 - 7
MediaBrowser.ServerApplication/App.xaml.cs

@@ -1,18 +1,17 @@
-using System.IO;
-using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Constants;
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Common.Updates;
+using MediaBrowser.Common.Implementations.Updates;
 using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Server.Implementations;
 using Microsoft.Win32;
 using System;
 using System.Diagnostics;
+using System.IO;
 using System.Net.Cache;
 using System.Threading;
-using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Media;
@@ -209,9 +208,9 @@ namespace MediaBrowser.ServerApplication
         /// Opens the dashboard page.
         /// </summary>
         /// <param name="page">The page.</param>
-        public static void OpenDashboardPage(string page, User loggedInUser, IConfigurationManager configurationManager)
+        public static void OpenDashboardPage(string page, User loggedInUser, IServerConfigurationManager configurationManager)
         {
-            var url = "http://localhost:" + configurationManager.CommonConfiguration.HttpServerPortNumber + "/" +
+            var url = "http://localhost:" + configurationManager.Configuration.HttpServerPortNumber + "/" +
                       Kernel.Instance.WebApplicationName + "/dashboard/" + page;
 
             if (loggedInUser != null)

+ 55 - 34
MediaBrowser.ServerApplication/ApplicationHost.cs

@@ -2,12 +2,11 @@
 using MediaBrowser.Common;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Constants;
+using MediaBrowser.Common.Events;
 using MediaBrowser.Common.Implementations;
-using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Common.Implementations.Logging;
 using MediaBrowser.Common.Implementations.ScheduledTasks;
 using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Updates;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
@@ -17,15 +16,18 @@ using MediaBrowser.Controller.Resolvers;
 using MediaBrowser.Controller.Updates;
 using MediaBrowser.IsoMounter;
 using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.MediaInfo;
 using MediaBrowser.Model.System;
 using MediaBrowser.Model.Updates;
 using MediaBrowser.Server.Implementations;
 using MediaBrowser.Server.Implementations.BdInfo;
 using MediaBrowser.Server.Implementations.Configuration;
+using MediaBrowser.Server.Implementations.HttpServer;
 using MediaBrowser.Server.Implementations.Library;
+using MediaBrowser.Server.Implementations.ServerManager;
+using MediaBrowser.Server.Implementations.Udp;
 using MediaBrowser.Server.Implementations.Updates;
+using MediaBrowser.Server.Implementations.WebSocket;
 using MediaBrowser.ServerApplication.Implementations;
 using MediaBrowser.WebDashboard.Api;
 using System;
@@ -41,16 +43,13 @@ namespace MediaBrowser.ServerApplication
     /// <summary>
     /// Class CompositionRoot
     /// </summary>
-    public class ApplicationHost : BaseApplicationHost<ServerApplicationPaths>
+    public class ApplicationHost : BaseApplicationHost<ServerApplicationPaths>, IServerApplicationHost
     {
         /// <summary>
         /// Gets the server kernel.
         /// </summary>
         /// <value>The server kernel.</value>
-        protected Kernel ServerKernel
-        {
-            get { return (Kernel)Kernel; }
-        }
+        protected Kernel ServerKernel { get; set; }
 
         /// <summary>
         /// Gets the server configuration manager.
@@ -61,15 +60,6 @@ namespace MediaBrowser.ServerApplication
             get { return (IServerConfigurationManager)ConfigurationManager; }
         }
 
-        /// <summary>
-        /// Gets the kernel.
-        /// </summary>
-        /// <returns>IKernel.</returns>
-        protected override IKernel GetKernel()
-        {
-            return new Kernel(this, XmlSerializer, LogManager, ServerConfigurationManager);
-        }
-
         /// <summary>
         /// Gets the name of the log file prefix.
         /// </summary>
@@ -88,30 +78,50 @@ namespace MediaBrowser.ServerApplication
             return new ServerConfigurationManager(ApplicationPaths, LogManager, XmlSerializer);
         }
 
+        private IInstallationManager InstallationManager { get; set; }
+        private IServerManager ServerManager { get; set; }
+
+        public override async Task Init()
+        {
+            await base.Init().ConfigureAwait(false);
+
+            await ServerKernel.Init().ConfigureAwait(false);
+        }
+
         /// <summary>
         /// Registers resources that classes will depend on
         /// </summary>
         protected override async Task RegisterResources()
         {
+            ServerKernel = new Kernel(this, XmlSerializer, LogManager, ServerConfigurationManager);
+            
             await base.RegisterResources().ConfigureAwait(false);
 
+            RegisterSingleInstance<IServerApplicationHost>(this);
             RegisterSingleInstance<IServerApplicationPaths>(ApplicationPaths);
-            
+
             RegisterSingleInstance(ServerKernel);
             RegisterSingleInstance(ServerConfigurationManager);
 
+            RegisterSingleInstance<IWebSocketServer>(() => new AlchemyServer(Logger));
+            RegisterSingleInstance<IUdpServer>(new UdpServer(Logger), false);
+
             RegisterSingleInstance<IIsoManager>(new PismoIsoManager(Logger));
             RegisterSingleInstance<IBlurayExaminer>(new BdInfoExaminer());
             RegisterSingleInstance<IZipClient>(new DotNetZipClient());
             RegisterSingleInstance(ServerFactory.CreateServer(this, ProtobufSerializer, Logger, "Media Browser", "index.html"), false);
 
+            ServerManager = new ServerManager(this, NetworkManager, JsonSerializer, Logger, ServerConfigurationManager, ServerKernel);
+            RegisterSingleInstance(ServerManager);
+
             var userManager = new UserManager(ServerKernel, Logger, ServerConfigurationManager);
 
             RegisterSingleInstance<IUserManager>(userManager);
 
             RegisterSingleInstance<ILibraryManager>(new LibraryManager(ServerKernel, Logger, TaskManager, userManager, ServerConfigurationManager));
 
-            RegisterSingleInstance<IInstallationManager>(new InstallationManager(Kernel, HttpClient, PackageManager, JsonSerializer, Logger, this));
+            InstallationManager = new InstallationManager(HttpClient, PackageManager, JsonSerializer, Logger, this);
+            RegisterSingleInstance(InstallationManager);
         }
 
         /// <summary>
@@ -121,6 +131,11 @@ namespace MediaBrowser.ServerApplication
         {
             base.FindParts();
 
+            Resolve<IHttpServer>().Init(GetExports<IRestfulService>(false));
+            Resolve<IServerManager>().AddWebSocketListeners(GetExports<IWebSocketListener>(false));
+
+            Resolve<IServerManager>().Start();
+
             Resolve<ILibraryManager>().AddParts(GetExports<IResolverIgnoreRule>(), GetExports<IVirtualFolderCreator>(), GetExports<IItemResolver>(), GetExports<IIntroProvider>());
         }
 
@@ -157,19 +172,6 @@ namespace MediaBrowser.ServerApplication
                        new CheckForUpdateResult { AvailableVersion = ApplicationVersion, IsUpdateAvailable = false };
         }
 
-        /// <summary>
-        /// Updates the application.
-        /// </summary>
-        /// <param name="package">The package that contains the update</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <param name="progress">The progress.</param>
-        /// <returns>Task.</returns>
-        public override Task UpdateApplication(PackageVersionInfo package, CancellationToken cancellationToken, IProgress<double> progress)
-        {
-            var pkgManager = Resolve<IPackageManager>();
-            return pkgManager.InstallPackage(progress, package, cancellationToken);
-        }
-
         /// <summary>
         /// Gets the composable part assemblies.
         /// </summary>
@@ -195,7 +197,7 @@ namespace MediaBrowser.ServerApplication
             yield return typeof(SystemInfo).Assembly;
 
             // Include composable parts in the Common assembly 
-            yield return typeof(IKernel).Assembly;
+            yield return typeof(IApplicationHost).Assembly;
 
             // Include composable parts in the Controller assembly 
             yield return typeof(Kernel).Assembly;
@@ -210,6 +212,25 @@ namespace MediaBrowser.ServerApplication
             yield return GetType().Assembly;
         }
 
+        /// <summary>
+        /// Gets the system status.
+        /// </summary>
+        /// <returns>SystemInfo.</returns>
+        public virtual SystemInfo GetSystemInfo()
+        {
+            return new SystemInfo
+            {
+                HasPendingRestart = HasPendingRestart,
+                Version = ApplicationVersion.ToString(),
+                IsNetworkDeployed = CanSelfUpdate,
+                WebSocketPortNumber = ServerManager.WebSocketPortNumber,
+                SupportsNativeWebSocket = ServerManager.SupportsNativeWebSocket,
+                FailedPluginAssemblies = FailedAssemblies.ToArray(),
+                InProgressInstallations = InstallationManager.CurrentInstallations.Select(i => i.Item1).ToArray(),
+                CompletedInstallations = InstallationManager.CompletedInstallations.ToArray()
+            };
+        }
+
         /// <summary>
         /// Shuts down.
         /// </summary>

+ 3 - 3
MediaBrowser.ServerApplication/StartupWizard.cs

@@ -1,5 +1,5 @@
 using MediaBrowser.Common;
-using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Plugins;
 using System.Linq;
@@ -20,14 +20,14 @@ namespace MediaBrowser.ServerApplication
         /// </summary>
         private readonly IUserManager _userManager;
 
-        private readonly IConfigurationManager _configurationManager;
+        private readonly IServerConfigurationManager _configurationManager;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="StartupWizard" /> class.
         /// </summary>
         /// <param name="appHost">The app host.</param>
         /// <param name="userManager">The user manager.</param>
-        public StartupWizard(IApplicationHost appHost, IUserManager userManager, IConfigurationManager configurationManager)
+        public StartupWizard(IApplicationHost appHost, IUserManager userManager, IServerConfigurationManager configurationManager)
         {
             _appHost = appHost;
             _userManager = userManager;

+ 27 - 9
MediaBrowser.ServerApplication/WebSocketEvents.cs

@@ -1,11 +1,14 @@
 using MediaBrowser.Common.Events;
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Plugins;
+using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Controller;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Updates;
 using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Tasks;
 using MediaBrowser.Model.Updates;
 using System;
 
@@ -43,7 +46,9 @@ namespace MediaBrowser.ServerApplication
         /// <summary>
         /// The _kernel
         /// </summary>
-        private readonly IKernel _kernel;
+        private readonly IServerApplicationHost _appHost;
+
+        private readonly ITaskManager _taskManager;
         
         /// <summary>
         /// Initializes a new instance of the <see cref="WebSocketEvents" /> class.
@@ -51,14 +56,15 @@ namespace MediaBrowser.ServerApplication
         /// <param name="serverManager">The server manager.</param>
         /// <param name="logger">The logger.</param>
         /// <param name="userManager">The user manager.</param>
-        public WebSocketEvents(IServerManager serverManager, IKernel kernel, ILogger logger, IUserManager userManager, ILibraryManager libraryManager, IInstallationManager installationManager)
+        public WebSocketEvents(IServerManager serverManager, IServerApplicationHost appHost, ILogger logger, IUserManager userManager, ILibraryManager libraryManager, IInstallationManager installationManager, ITaskManager taskManager)
         {
             _serverManager = serverManager;
             _logger = logger;
             _userManager = userManager;
             _libraryManager = libraryManager;
             _installationManager = installationManager;
-            _kernel = kernel;
+            _appHost = appHost;
+            _taskManager = taskManager;
         }
 
         public void Run()
@@ -68,13 +74,27 @@ namespace MediaBrowser.ServerApplication
 
             _libraryManager.LibraryChanged += libraryManager_LibraryChanged;
 
-            _kernel.HasPendingRestartChanged += kernel_HasPendingRestartChanged;
+            _appHost.HasPendingRestartChanged += kernel_HasPendingRestartChanged;
 
             _installationManager.PluginUninstalled += InstallationManager_PluginUninstalled;
             _installationManager.PackageInstalling += installationManager_PackageInstalling;
             _installationManager.PackageInstallationCancelled += installationManager_PackageInstallationCancelled;
             _installationManager.PackageInstallationCompleted += installationManager_PackageInstallationCompleted;
             _installationManager.PackageInstallationFailed += installationManager_PackageInstallationFailed;
+
+            _taskManager.TaskExecuting += _taskManager_TaskExecuting;
+            _taskManager.TaskCompleted += _taskManager_TaskCompleted;
+        }
+
+        void _taskManager_TaskCompleted(object sender, GenericEventArgs<TaskResult> e)
+        {
+            _serverManager.SendWebSocketMessage("ScheduledTaskEndExecute", e.Argument);
+        }
+
+        void _taskManager_TaskExecuting(object sender, EventArgs e)
+        {
+            var task = (IScheduledTask) sender;
+            _serverManager.SendWebSocketMessage("ScheduledTaskBeginExecute", task.Name);
         }
 
         /// <summary>
@@ -144,9 +164,7 @@ namespace MediaBrowser.ServerApplication
         /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
         void kernel_HasPendingRestartChanged(object sender, EventArgs e)
         {
-            var kernel = (IKernel)sender;
-
-            _serverManager.SendWebSocketMessage("HasPendingRestartChanged", kernel.GetSystemInfo());
+            _serverManager.SendWebSocketMessage("HasPendingRestartChanged", _appHost.GetSystemInfo());
         }
 
         /// <summary>
@@ -196,7 +214,7 @@ namespace MediaBrowser.ServerApplication
                 _installationManager.PackageInstallationCompleted -= installationManager_PackageInstallationCompleted;
                 _installationManager.PackageInstallationFailed -= installationManager_PackageInstallationFailed;
 
-                _kernel.HasPendingRestartChanged -= kernel_HasPendingRestartChanged;
+                _appHost.HasPendingRestartChanged -= kernel_HasPendingRestartChanged;
             }
         }
     }

+ 5 - 9
MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs

@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Library;
@@ -23,10 +23,7 @@ namespace MediaBrowser.WebDashboard.Api
             get { return "DashboardInfo"; }
         }
 
-        /// <summary>
-        /// The _kernel
-        /// </summary>
-        private readonly Kernel _kernel;
+        private readonly IServerApplicationHost _appHost;
 
         /// <summary>
         /// Gets or sets the task manager.
@@ -42,14 +39,13 @@ namespace MediaBrowser.WebDashboard.Api
         /// <summary>
         /// Initializes a new instance of the <see cref="DashboardInfoWebSocketListener" /> class.
         /// </summary>
-        /// <param name="kernel">The kernel.</param>
         /// <param name="logger">The logger.</param>
         /// <param name="taskManager">The task manager.</param>
         /// <param name="userManager">The user manager.</param>
-        public DashboardInfoWebSocketListener(Kernel kernel, ILogger logger, ITaskManager taskManager, IUserManager userManager)
+        public DashboardInfoWebSocketListener(IServerApplicationHost appHost, ILogger logger, ITaskManager taskManager, IUserManager userManager)
             : base(logger)
         {
-            _kernel = kernel;
+            _appHost = appHost;
             _taskManager = taskManager;
             _userManager = userManager;
         }
@@ -61,7 +57,7 @@ namespace MediaBrowser.WebDashboard.Api
         /// <returns>Task{IEnumerable{TaskInfo}}.</returns>
         protected override Task<DashboardInfo> GetDataToSend(object state)
         {
-            return Task.FromResult(DashboardService.GetDashboardInfo(_kernel, Logger, _taskManager, _userManager));
+            return Task.FromResult(DashboardService.GetDashboardInfo(_appHost, Logger, _taskManager, _userManager));
         }
     }
 }

+ 8 - 6
MediaBrowser.WebDashboard/Api/DashboardService.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Implementations.HttpServer;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Controller;
@@ -7,6 +6,7 @@ using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Tasks;
+using MediaBrowser.Server.Implementations.HttpServer;
 using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;
@@ -89,15 +89,18 @@ namespace MediaBrowser.WebDashboard.Api
         /// </summary>
         private readonly IUserManager _userManager;
 
+        private readonly IServerApplicationHost _appHost;
+
         /// <summary>
         /// Initializes a new instance of the <see cref="DashboardService" /> class.
         /// </summary>
         /// <param name="taskManager">The task manager.</param>
         /// <param name="userManager">The user manager.</param>
-        public DashboardService(ITaskManager taskManager, IUserManager userManager)
+        public DashboardService(ITaskManager taskManager, IUserManager userManager, IServerApplicationHost appHost)
         {
             _taskManager = taskManager;
             _userManager = userManager;
+            _appHost = appHost;
         }
 
         /// <summary>
@@ -107,18 +110,17 @@ namespace MediaBrowser.WebDashboard.Api
         /// <returns>System.Object.</returns>
         public object Get(GetDashboardInfo request)
         {
-            return GetDashboardInfo(Kernel.Instance, Logger, _taskManager, _userManager);
+            return GetDashboardInfo(_appHost, Logger, _taskManager, _userManager);
         }
 
         /// <summary>
         /// Gets the dashboard info.
         /// </summary>
-        /// <param name="kernel">The kernel.</param>
         /// <param name="logger">The logger.</param>
         /// <param name="taskManager">The task manager.</param>
         /// <param name="userManager">The user manager.</param>
         /// <returns>DashboardInfo.</returns>
-        public static DashboardInfo GetDashboardInfo(Kernel kernel, ILogger logger, ITaskManager taskManager, IUserManager userManager)
+        public static DashboardInfo GetDashboardInfo(IServerApplicationHost appHost, ILogger logger, ITaskManager taskManager, IUserManager userManager)
         {
             var connections = userManager.ConnectedUsers.ToArray();
 
@@ -126,7 +128,7 @@ namespace MediaBrowser.WebDashboard.Api
 
             return new DashboardInfo
             {
-                SystemInfo = kernel.GetSystemInfo(),
+                SystemInfo = appHost.GetSystemInfo(),
 
                 RunningTasks = taskManager.ScheduledTasks.Where(i => i.State == TaskState.Running || i.State == TaskState.Cancelling)
                                      .Select(ScheduledTaskHelpers.GetTaskInfo)

+ 1 - 1
MediaBrowser.WebDashboard/Html/css/site.css

@@ -82,7 +82,7 @@ pre, textarea.pre {
     background-attachment: fixed;
 }
 
-.libraryPage, .libraryPage .ui-content {
+.libraryPage, .itemListContent {
     background: #262626!important;
     background-attachment: fixed!important;
 }

+ 3 - 3
MediaBrowser.WebDashboard/Html/itemList.html

@@ -5,10 +5,10 @@
 </head>
 <body>
     <div id="itemListPage" data-role="page" class="page libraryPage" data-theme="a">
-        <div data-role="content">
-<!--            <div style="text-align: right;">
+        <div data-role="content" class="itemListContent">
+            <div style="text-align: right;">
                 <button type="button" onclick="$( '#optionsPanel', $.mobile.activePage ).panel( 'open' );" data-mini="true" data-inline="true">Options</button>
-            </div>-->
+            </div>
             <h1 id="itemName" class="listHeader"></h1>
 
 

+ 4 - 4
MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

@@ -88,10 +88,6 @@
     <Compile Include="ServerEntryPoint.cs" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\MediaBrowser.Common.Implementations\MediaBrowser.Common.Implementations.csproj">
-      <Project>{c4d2573a-3fd3-441f-81af-174ac4cd4e1d}</Project>
-      <Name>MediaBrowser.Common.Implementations</Name>
-    </ProjectReference>
     <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
       <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
       <Name>MediaBrowser.Common</Name>
@@ -104,6 +100,10 @@
       <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
       <Name>MediaBrowser.Model</Name>
     </ProjectReference>
+    <ProjectReference Include="..\MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj">
+      <Project>{2e781478-814d-4a48-9d80-bff206441a65}</Project>
+      <Name>MediaBrowser.Server.Implementations</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="Html\index.html" />

+ 5 - 7
Nuget/MediaBrowser.Common.Internal.nuspec

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common.Internal</id>
         <version>3.0.33</version>
@@ -7,23 +7,21 @@
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
         <projectUrl>https://github.com/MediaBrowser/MediaBrowser</projectUrl>
-		<iconUrl>http://www.mb3admin.com/images/mb3icons1-1.png</iconUrl>
+        <iconUrl>http://www.mb3admin.com/images/mb3icons1-1.png</iconUrl>
         <requireLicenseAcceptance>false</requireLicenseAcceptance>
         <description>Contains common components shared by Media Browser Theatre and Media Browser Server. Not intended for plugin developer consumption.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
             <dependency id="MediaBrowser.Common" version="3.0.33" />
             <dependency id="NLog" version="2.0.0.2000" />
-            <dependency id="ServiceStack" version="3.9.38" />
-            <dependency id="ServiceStack.Api.Swagger" version="3.9.38" />
-            <dependency id="ServiceStack.Logging.NLog" version="1.0.6.0" />
-            <dependency id="Rx-Main" version="2.1.30214.0" />
+            <dependency id="ServiceStack.Text" version="3.9.38" />
+            <dependency id="protobuf-net" version="2.0.0.621" />
         </dependencies>
     </metadata>
     <files>
         <file src="dlls\MediaBrowser.Common.Implementations.dll" target="lib\net45\MediaBrowser.Common.Implementations.dll" />
         <file src="dlls\MediaBrowser.IsoMounter.dll" target="lib\net45\MediaBrowser.IsoMounter.dll" />
-        <file src="dlls\pfmclrapi.dll" target="lib\net45\pfmclrapi.dll" />
         <file src="dlls\Mediabrowser.PluginSecurity.dll" target="lib\net45\Mediabrowser.PluginSecurity.dll" />
+        <file src="dlls\pfmclrapi.dll" target="lib\net45\pfmclrapi.dll" />
     </files>
 </package>