diff options
43 files changed, 501 insertions, 175 deletions
diff --git a/BDInfo/BDInfo.csproj b/BDInfo/BDInfo.csproj index 4e57d9e08..234050ed3 100644 --- a/BDInfo/BDInfo.csproj +++ b/BDInfo/BDInfo.csproj @@ -32,13 +32,10 @@ <ItemGroup> <Reference Include="System" /> <Reference Include="System.Core" /> - <Reference Include="System.Xml.Linq" /> - <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> - <Reference Include="System.Data" /> - <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> + <Compile Include="BdInfoExaminer.cs" /> <Compile Include="BDInfoSettings.cs" /> <Compile Include="BDROM.cs" /> <Compile Include="LanguageCodes.cs" /> @@ -63,6 +60,12 @@ <ItemGroup> <Content Include="ReadMe.txt" /> </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj"> + <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project> + <Name>MediaBrowser.Model</Name> + </ProjectReference> + </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. diff --git a/MediaBrowser.ServerApplication/Implementations/BdInfoExaminer.cs b/BDInfo/BdInfoExaminer.cs index dbde630be..cfa9a946b 100644 --- a/MediaBrowser.ServerApplication/Implementations/BdInfoExaminer.cs +++ b/BDInfo/BdInfoExaminer.cs @@ -1,11 +1,10 @@ -using BDInfo; -using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.MediaInfo; using System; using System.Collections.Generic; using System.Linq; -namespace MediaBrowser.ServerApplication.Implementations +namespace BDInfo { /// <summary> /// Class BdInfoExaminer diff --git a/MediaBrowser.Api/EnvironmentService.cs b/MediaBrowser.Api/EnvironmentService.cs index 83678c3f2..618eeae5d 100644 --- a/MediaBrowser.Api/EnvironmentService.cs +++ b/MediaBrowser.Api/EnvironmentService.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Net; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Net; using ServiceStack.ServiceHost; using System; using System.Collections.Generic; @@ -60,6 +61,26 @@ namespace MediaBrowser.Api public class EnvironmentService : BaseRestService { /// <summary> + /// The _network manager + /// </summary> + private readonly INetworkManager _networkManager; + + /// <summary> + /// Initializes a new instance of the <see cref="EnvironmentService" /> class. + /// </summary> + /// <param name="networkManager">The network manager.</param> + /// <exception cref="System.ArgumentNullException">networkManager</exception> + public EnvironmentService(INetworkManager networkManager) + { + if (networkManager == null) + { + throw new ArgumentNullException("networkManager"); + } + + _networkManager = networkManager; + } + + /// <summary> /// Gets the specified request. /// </summary> /// <param name="request">The request.</param> @@ -131,7 +152,7 @@ namespace MediaBrowser.Api /// <returns>IEnumerable{FileSystemEntryInfo}.</returns> private IEnumerable<FileSystemEntryInfo> GetNetworkComputers() { - return NetUtils.GetNetworkComputers().Select(c => new FileSystemEntryInfo + return _networkManager.GetNetworkDevices().Select(c => new FileSystemEntryInfo { Name = c, Path = NetworkPrefix + c, @@ -156,10 +177,10 @@ namespace MediaBrowser.Api /// <returns>IEnumerable{FileSystemEntryInfo}.</returns> private IEnumerable<FileSystemEntryInfo> GetNetworkShares(string path) { - return new ShareCollection(path).OfType<Share>().Where(s => s.ShareType == ShareType.Disk).Select(c => new FileSystemEntryInfo + return _networkManager.GetNetworkShares(path).Where(s => s.ShareType == NetworkShareType.Disk).Select(c => new FileSystemEntryInfo { - Name = c.NetName, - Path = Path.Combine(path, c.NetName), + Name = c.Name, + Path = Path.Combine(path, c.Name), Type = FileSystemEntryType.NetworkShare }); } diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index f6045ddd1..9bdcdb650 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -65,8 +65,6 @@ </Reference> <Reference Include="System" /> <Reference Include="System.Core" /> - <Reference Include="System.Drawing" /> - <Reference Include="System.Runtime.Serialization" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Data" /> <Reference Include="System.XML" /> diff --git a/MediaBrowser.ApiInteraction.Javascript/MediaBrowser.ApiInteraction.Javascript.csproj b/MediaBrowser.ApiInteraction.Javascript/MediaBrowser.ApiInteraction.Javascript.csproj index 3e8ed6c38..68e8c880d 100644 --- a/MediaBrowser.ApiInteraction.Javascript/MediaBrowser.ApiInteraction.Javascript.csproj +++ b/MediaBrowser.ApiInteraction.Javascript/MediaBrowser.ApiInteraction.Javascript.csproj @@ -69,11 +69,7 @@ </Reference> <Reference Include="System" /> <Reference Include="System.Core" /> - <Reference Include="System.Xml.Linq" /> - <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> - <Reference Include="System.Data" /> - <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> <Compile Include="..\SharedVersion.cs"> @@ -87,14 +83,6 @@ <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project> <Name>MediaBrowser.Common</Name> </ProjectReference> - <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj"> - <Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project> - <Name>MediaBrowser.Controller</Name> - </ProjectReference> - <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj"> - <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project> - <Name>MediaBrowser.Model</Name> - </ProjectReference> </ItemGroup> <ItemGroup> <EmbeddedResource Include="ApiClient.js" /> diff --git a/MediaBrowser.ClickOnce/MediaBrowser.ClickOnce.csproj b/MediaBrowser.ClickOnce/MediaBrowser.ClickOnce.csproj index 49c69b0d4..9d8c207dc 100644 --- a/MediaBrowser.ClickOnce/MediaBrowser.ClickOnce.csproj +++ b/MediaBrowser.ClickOnce/MediaBrowser.ClickOnce.csproj @@ -33,11 +33,7 @@ <Reference Include="System" /> <Reference Include="System.Core" /> <Reference Include="System.Deployment" /> - <Reference Include="System.Xml.Linq" /> - <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> - <Reference Include="System.Data" /> - <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> <Compile Include="..\SharedVersion.cs"> diff --git a/MediaBrowser.Common/Extensions/BaseExtensions.cs b/MediaBrowser.Common/Extensions/BaseExtensions.cs index 6abe6d4e0..5342cff4b 100644 --- a/MediaBrowser.Common/Extensions/BaseExtensions.cs +++ b/MediaBrowser.Common/Extensions/BaseExtensions.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Security.Cryptography; using System.Text; -using System.Threading.Tasks; namespace MediaBrowser.Common.Extensions { @@ -46,23 +44,6 @@ namespace MediaBrowser.Common.Extensions } /// <summary> - /// Provides a non-blocking method to start a process and wait asynchronously for it to exit - /// </summary> - /// <param name="process">The process.</param> - /// <returns>Task{System.Boolean}.</returns> - public static Task<bool> RunAsync(this Process process) - { - var tcs = new TaskCompletionSource<bool>(); - - process.EnableRaisingEvents = true; - process.Exited += (sender, args) => tcs.SetResult(true); - - process.Start(); - - return tcs.Task; - } - - /// <summary> /// Shuffles an IEnumerable /// </summary> /// <typeparam name="T"></typeparam> diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 2b9550496..08e8c3e75 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Events; -using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; using MediaBrowser.Common.ScheduledTasks; @@ -396,7 +395,7 @@ namespace MediaBrowser.Common.Kernel await ReloadComposableParts().ConfigureAwait(false); DisposeTcpManager(); - TcpManager = new TcpManager(ApplicationHost, this, Logger); + TcpManager = new TcpManager(ApplicationHost, this, ApplicationHost.Resolve<INetworkManager>(), Logger); } /// <summary> diff --git a/MediaBrowser.Common/Kernel/IApplicationHost.cs b/MediaBrowser.Common/Kernel/IApplicationHost.cs index ae2e71667..dccb65b2a 100644 --- a/MediaBrowser.Common/Kernel/IApplicationHost.cs +++ b/MediaBrowser.Common/Kernel/IApplicationHost.cs @@ -59,6 +59,13 @@ namespace MediaBrowser.Common.Kernel void Register<T>(T obj) where T : class; /// <summary> + /// Registers the specified service type. + /// </summary> + /// <param name="serviceType">Type of the service.</param> + /// <param name="implementation">Type of the implementation.</param> + void Register(Type serviceType, Type implementation); + + /// <summary> /// Resolves this instance. /// </summary> /// <typeparam name="T"></typeparam> diff --git a/MediaBrowser.Common/Kernel/TcpManager.cs b/MediaBrowser.Common/Kernel/TcpManager.cs index 086815cbf..0b171c492 100644 --- a/MediaBrowser.Common/Kernel/TcpManager.cs +++ b/MediaBrowser.Common/Kernel/TcpManager.cs @@ -22,7 +22,7 @@ namespace MediaBrowser.Common.Kernel /// <summary> /// Manages the Http Server, Udp Server and WebSocket connections /// </summary> - public class TcpManager : BaseManager<IKernel> + public class TcpManager : IDisposable { /// <summary> /// This is the udp server used for server discovery by clients @@ -66,6 +66,11 @@ namespace MediaBrowser.Common.Kernel private readonly ILogger _logger; /// <summary> + /// The _network manager + /// </summary> + private readonly INetworkManager _networkManager; + + /// <summary> /// The _application host /// </summary> private readonly IApplicationHost _applicationHost; @@ -76,6 +81,11 @@ namespace MediaBrowser.Common.Kernel private bool? _supportsNativeWebSocket; /// <summary> + /// The _kernel + /// </summary> + private readonly IKernel _kernel; + + /// <summary> /// Gets a value indicating whether [supports web socket]. /// </summary> /// <value><c>true</c> if [supports web socket]; otherwise, <c>false</c>.</value> @@ -107,7 +117,7 @@ namespace MediaBrowser.Common.Kernel /// <value>The web socket port number.</value> public int WebSocketPortNumber { - get { return SupportsNativeWebSocket ? Kernel.Configuration.HttpServerPortNumber : Kernel.Configuration.LegacyWebSocketPortNumber; } + get { return SupportsNativeWebSocket ? _kernel.Configuration.HttpServerPortNumber : _kernel.Configuration.LegacyWebSocketPortNumber; } } /// <summary> @@ -115,12 +125,31 @@ namespace MediaBrowser.Common.Kernel /// </summary> /// <param name="applicationHost">The application host.</param> /// <param name="kernel">The kernel.</param> + /// <param name="networkManager">The network manager.</param> /// <param name="logger">The logger.</param> - public TcpManager(IApplicationHost applicationHost, IKernel kernel, ILogger logger) - : base(kernel) + public TcpManager(IApplicationHost applicationHost, IKernel kernel, INetworkManager networkManager, ILogger logger) { + if (applicationHost == null) + { + throw new ArgumentNullException("applicationHost"); + } + if (kernel == null) + { + throw new ArgumentNullException("kernel"); + } + if (networkManager == null) + { + throw new ArgumentNullException("networkManager"); + } + if (logger == null) + { + throw new ArgumentNullException("logger"); + } + _logger = logger; + _kernel = kernel; _applicationHost = applicationHost; + _networkManager = networkManager; if (kernel.IsFirstRun) { @@ -142,14 +171,14 @@ namespace MediaBrowser.Common.Kernel private void ReloadExternalWebSocketServer() { // Avoid windows firewall prompts in the ui - if (Kernel.KernelContext != KernelContext.Server) + if (_kernel.KernelContext != KernelContext.Server) { return; } DisposeExternalWebSocketServer(); - ExternalWebSocketServer = new WebSocketServer(Kernel.Configuration.LegacyWebSocketPortNumber, IPAddress.Any) + ExternalWebSocketServer = new WebSocketServer(_kernel.Configuration.LegacyWebSocketPortNumber, IPAddress.Any) { OnConnected = OnAlchemyWebSocketClientConnected, TimeOut = TimeSpan.FromMinutes(60) @@ -178,7 +207,7 @@ namespace MediaBrowser.Common.Kernel public void ReloadHttpServer(bool registerServerOnFailure = true) { // Only reload if the port has changed, so that we don't disconnect any active users - if (HttpServer != null && HttpServer.UrlPrefix.Equals(Kernel.HttpServerUrlPrefix, StringComparison.OrdinalIgnoreCase)) + if (HttpServer != null && HttpServer.UrlPrefix.Equals(_kernel.HttpServerUrlPrefix, StringComparison.OrdinalIgnoreCase)) { return; } @@ -189,7 +218,7 @@ namespace MediaBrowser.Common.Kernel try { - HttpServer = new HttpServer(Kernel.HttpServerUrlPrefix, "Media Browser", _applicationHost, Kernel, _logger); + HttpServer = new HttpServer(_kernel.HttpServerUrlPrefix, "Media Browser", _applicationHost, _kernel, _logger); } catch (HttpListenerException ex) { @@ -229,7 +258,7 @@ namespace MediaBrowser.Common.Kernel /// <param name="result">The result.</param> private async void ProcessWebSocketMessageReceived(WebSocketMessageInfo result) { - var tasks = Kernel.WebSocketListeners.Select(i => Task.Run(async () => + var tasks = _kernel.WebSocketListeners.Select(i => Task.Run(async () => { try { @@ -256,7 +285,7 @@ namespace MediaBrowser.Common.Kernel } // Avoid windows firewall prompts in the ui - if (Kernel.KernelContext != KernelContext.Server) + if (_kernel.KernelContext != KernelContext.Server) { return; } @@ -266,7 +295,7 @@ namespace MediaBrowser.Common.Kernel try { // The port number can't be in configuration because we don't want it to ever change - UdpServer = new UdpServer(new IPEndPoint(IPAddress.Any, Kernel.UdpServerPortNumber)); + UdpServer = new UdpServer(new IPEndPoint(IPAddress.Any, _kernel.UdpServerPortNumber)); } catch (SocketException ex) { @@ -276,7 +305,7 @@ namespace MediaBrowser.Common.Kernel UdpListener = UdpServer.Subscribe(async res => { - var expectedMessage = String.Format("who is MediaBrowser{0}?", Kernel.KernelContext); + var expectedMessage = String.Format("who is MediaBrowser{0}?", _kernel.KernelContext); var expectedMessageBytes = Encoding.UTF8.GetBytes(expectedMessage); if (expectedMessageBytes.SequenceEqual(res.Buffer)) @@ -284,7 +313,7 @@ namespace MediaBrowser.Common.Kernel _logger.Info("Received UDP server request from " + res.RemoteEndPoint.ToString()); // Send a response back with our ip address and port - var response = String.Format("MediaBrowser{0}|{1}:{2}", Kernel.KernelContext, NetUtils.GetLocalIpAddress(), Kernel.UdpServerPortNumber); + var response = String.Format("MediaBrowser{0}|{1}:{2}", _kernel.KernelContext, _networkManager.GetLocalIpAddress(), _kernel.UdpServerPortNumber); await UdpServer.SendAsync(response, res.RemoteEndPoint); } @@ -422,7 +451,7 @@ namespace MediaBrowser.Common.Kernel private void RegisterServerWithAdministratorAccess() { // Create a temp file path to extract the bat file to - var tmpFile = Path.Combine(Kernel.ApplicationPaths.TempDirectory, Guid.NewGuid() + ".bat"); + var tmpFile = Path.Combine(_kernel.ApplicationPaths.TempDirectory, Guid.NewGuid() + ".bat"); // Extract the bat file using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MediaBrowser.Common.Kernel.RegisterServer.bat")) @@ -437,10 +466,10 @@ namespace MediaBrowser.Common.Kernel { FileName = tmpFile, - Arguments = string.Format("{0} {1} {2} {3}", Kernel.Configuration.HttpServerPortNumber, - Kernel.HttpServerUrlPrefix, - Kernel.UdpServerPortNumber, - Kernel.Configuration.LegacyWebSocketPortNumber), + Arguments = string.Format("{0} {1} {2} {3}", _kernel.Configuration.HttpServerPortNumber, + _kernel.HttpServerUrlPrefix, + _kernel.UdpServerPortNumber, + _kernel.Configuration.LegacyWebSocketPortNumber), CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, @@ -455,18 +484,25 @@ namespace MediaBrowser.Common.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 override void Dispose(bool dispose) + protected virtual void Dispose(bool dispose) { if (dispose) { DisposeUdpServer(); DisposeHttpServer(); } - - base.Dispose(dispose); } /// <summary> diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 6542ab81d..57b30eedc 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -45,7 +45,6 @@ <HintPath>..\packages\NLog.2.0.0.2000\lib\net40\NLog.dll</HintPath> </Reference> <Reference Include="PresentationCore" /> - <Reference Include="PresentationFramework" /> <Reference Include="protobuf-net, Version=2.0.0.621, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\packages\protobuf-net.2.0.0.621\lib\net40\protobuf-net.dll</HintPath> @@ -91,7 +90,6 @@ <Reference Include="System" /> <Reference Include="System.Configuration" /> <Reference Include="System.Core" /> - <Reference Include="System.Management" /> <Reference Include="System.Net" /> <Reference Include="System.Net.Http" /> <Reference Include="System.Net.Http.WebRequest" /> @@ -107,12 +105,8 @@ <SpecificVersion>False</SpecificVersion> <HintPath>..\packages\Rx-Linq.2.0.21114\lib\Net45\System.Reactive.Linq.dll</HintPath> </Reference> - <Reference Include="System.Runtime.Remoting" /> - <Reference Include="System.Runtime.Serialization" /> <Reference Include="System.Web" /> - <Reference Include="System.Xml.Linq" /> <Reference Include="Microsoft.CSharp" /> - <Reference Include="System.Data" /> <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> @@ -130,7 +124,6 @@ <Compile Include="IO\ProgressStream.cs" /> <Compile Include="IO\StreamDefaults.cs" /> <Compile Include="Kernel\BaseApplicationPaths.cs" /> - <Compile Include="Kernel\BaseManager.cs" /> <Compile Include="Kernel\BasePeriodicWebSocketListener.cs" /> <Compile Include="Kernel\IWebSocketListener.cs" /> <Compile Include="Kernel\IApplicationHost.cs" /> @@ -142,12 +135,12 @@ <Compile Include="Net\Handlers\IHttpServerHandler.cs" /> <Compile Include="Net\Handlers\StaticFileHandler.cs" /> <Compile Include="Net\HttpManager.cs" /> + <Compile Include="Net\INetworkManager.cs" /> <Compile Include="Net\IRestfulService.cs" /> <Compile Include="Net\IUdpServer.cs" /> <Compile Include="Net\IWebSocket.cs" /> <Compile Include="Net\MimeTypes.cs" /> <Compile Include="Net\NativeWebSocket.cs" /> - <Compile Include="Net\NetUtils.cs" /> <Compile Include="Net\UdpServer.cs" /> <Compile Include="Net\WebSocketConnection.cs" /> <Compile Include="Plugins\BaseUiPlugin.cs" /> @@ -184,7 +177,6 @@ <Compile Include="ScheduledTasks\IntervalTrigger.cs" /> <Compile Include="ScheduledTasks\IScheduledTask.cs" /> <Compile Include="ScheduledTasks\WeeklyTrigger.cs" /> - <Compile Include="Win32\NativeMethods.cs" /> </ItemGroup> <ItemGroup> <None Include="app.config" /> diff --git a/MediaBrowser.Common/Net/HttpManager.cs b/MediaBrowser.Common/Net/HttpManager.cs index 1deffba69..180843e0f 100644 --- a/MediaBrowser.Common/Net/HttpManager.cs +++ b/MediaBrowser.Common/Net/HttpManager.cs @@ -19,7 +19,7 @@ namespace MediaBrowser.Common.Net /// <summary> /// Class HttpManager /// </summary> - public class HttpManager : BaseManager<IKernel> + public class HttpManager : IDisposable { /// <summary> /// The _logger @@ -27,14 +27,28 @@ namespace MediaBrowser.Common.Net private readonly ILogger _logger; /// <summary> + /// The _kernel + /// </summary> + private readonly IKernel _kernel; + + /// <summary> /// Initializes a new instance of the <see cref="HttpManager" /> class. /// </summary> /// <param name="kernel">The kernel.</param> /// <param name="logger">The logger.</param> public HttpManager(IKernel kernel, ILogger logger) - : base(kernel) { + if (kernel == null) + { + throw new ArgumentNullException("kernel"); + } + if (logger == null) + { + throw new ArgumentNullException("logger"); + } + _logger = logger; + _kernel = kernel; } /// <summary> @@ -196,7 +210,7 @@ namespace MediaBrowser.Common.Net cancellationToken.ThrowIfCancellationRequested(); - var tempFile = Path.Combine(Kernel.ApplicationPaths.TempDirectory, Guid.NewGuid() + ".tmp"); + var tempFile = Path.Combine(_kernel.ApplicationPaths.TempDirectory, Guid.NewGuid() + ".tmp"); var message = new HttpRequestMessage(HttpMethod.Get, url); @@ -403,10 +417,19 @@ namespace MediaBrowser.Common.Net } /// <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 override void Dispose(bool dispose) + protected virtual void Dispose(bool dispose) { if (dispose) { @@ -417,8 +440,6 @@ namespace MediaBrowser.Common.Net _httpClients.Clear(); } - - base.Dispose(dispose); } /// <summary> diff --git a/MediaBrowser.Common/Net/INetworkManager.cs b/MediaBrowser.Common/Net/INetworkManager.cs new file mode 100644 index 000000000..7f6bfe152 --- /dev/null +++ b/MediaBrowser.Common/Net/INetworkManager.cs @@ -0,0 +1,72 @@ +using System.Collections.Generic; +using MediaBrowser.Model.Net; + +namespace MediaBrowser.Common.Net +{ + public interface INetworkManager + { + /// <summary> + /// Gets the machine's local ip address + /// </summary> + /// <returns>IPAddress.</returns> + string GetLocalIpAddress(); + + /// <summary> + /// Gets a random port number that is currently available + /// </summary> + /// <returns>System.Int32.</returns> + int GetRandomUnusedPort(); + + /// <summary> + /// Creates the netsh URL registration. + /// </summary> + void AuthorizeHttpListening(string url); + + /// <summary> + /// Adds the windows firewall rule. + /// </summary> + /// <param name="port">The port.</param> + /// <param name="protocol">The protocol.</param> + void AddSystemFirewallRule(int port, NetworkProtocol protocol); + + /// <summary> + /// Removes the windows firewall rule. + /// </summary> + /// <param name="port">The port.</param> + /// <param name="protocol">The protocol.</param> + void RemoveSystemFirewallRule(int port, NetworkProtocol protocol); + + /// <summary> + /// Returns MAC Address from first Network Card in Computer + /// </summary> + /// <returns>[string] MAC Address</returns> + string GetMacAddress(); + + /// <summary> + /// Gets available devices within the domain + /// </summary> + /// <returns>PC's in the Domain</returns> + IEnumerable<string> GetNetworkDevices(); + + /// <summary> + /// Gets the network shares. + /// </summary> + /// <param name="path">The path.</param> + /// <returns>IEnumerable{NetworkShare}.</returns> + IEnumerable<NetworkShare> GetNetworkShares(string path); + } + /// <summary> + /// Enum NetworkProtocol + /// </summary> + public enum NetworkProtocol + { + /// <summary> + /// The TCP + /// </summary> + Tcp, + /// <summary> + /// The UDP + /// </summary> + Udp + } +}
\ No newline at end of file diff --git a/MediaBrowser.Common/Kernel/BaseManager.cs b/MediaBrowser.Controller/BaseManager.cs index 3d830caef..99395a50e 100644 --- a/MediaBrowser.Common/Kernel/BaseManager.cs +++ b/MediaBrowser.Controller/BaseManager.cs @@ -1,6 +1,7 @@ -using System; +using MediaBrowser.Common.Kernel; +using System; -namespace MediaBrowser.Common.Kernel +namespace MediaBrowser.Controller { /// <summary> /// Class BaseManager diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 023a79ee9..8535f85c2 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1,6 +1,4 @@ using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Win32; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index bcb0b26be..b2be96b71 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -1,11 +1,10 @@ using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.Win32; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Controller.Sorting; using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Tasks; using System; using System.Collections.Concurrent; using System.Collections.Generic; diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 5b7661dcf..92177f916 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -1,6 +1,4 @@ using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Win32; using MediaBrowser.Controller.IO; using MediaBrowser.Model.Entities; using System; diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index c80c59eaf..09b1cec0f 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -1,7 +1,5 @@ using System.Collections.Generic; using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Win32; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 152dcbac8..8a56e45cd 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -1,5 +1,5 @@ using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.Win32; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; diff --git a/MediaBrowser.Controller/IO/FileData.cs b/MediaBrowser.Controller/IO/FileData.cs index 130f08625..7cefcd71a 100644 --- a/MediaBrowser.Controller/IO/FileData.cs +++ b/MediaBrowser.Controller/IO/FileData.cs @@ -1,6 +1,4 @@ -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Win32; -using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; diff --git a/MediaBrowser.Controller/IO/FileSystem.cs b/MediaBrowser.Controller/IO/FileSystem.cs index c7b7c660b..28deca100 100644 --- a/MediaBrowser.Controller/IO/FileSystem.cs +++ b/MediaBrowser.Controller/IO/FileSystem.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Win32; -using System; +using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; diff --git a/MediaBrowser.Common/Win32/NativeMethods.cs b/MediaBrowser.Controller/IO/NativeMethods.cs index a0462fb46..632ef0216 100644 --- a/MediaBrowser.Common/Win32/NativeMethods.cs +++ b/MediaBrowser.Controller/IO/NativeMethods.cs @@ -4,7 +4,7 @@ using System.Runtime.InteropServices; using System.Security; using System.Text; -namespace MediaBrowser.Common.Win32 +namespace MediaBrowser.Controller.IO { /// <summary> /// Class NativeMethods diff --git a/MediaBrowser.Controller/Library/ItemResolveArgs.cs b/MediaBrowser.Controller/Library/ItemResolveArgs.cs index 4d58af437..0979c6845 100644 --- a/MediaBrowser.Controller/Library/ItemResolveArgs.cs +++ b/MediaBrowser.Controller/Library/ItemResolveArgs.cs @@ -1,6 +1,4 @@ -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Win32; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using System; using System.Collections.Generic; using System.IO; diff --git a/MediaBrowser.Controller/Library/LibraryManager.cs b/MediaBrowser.Controller/Library/LibraryManager.cs index dfaef12cb..c0c1fe1d6 100644 --- a/MediaBrowser.Controller/Library/LibraryManager.cs +++ b/MediaBrowser.Controller/Library/LibraryManager.cs @@ -1,14 +1,10 @@ using MediaBrowser.Common.Events; using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Kernel; -using MediaBrowser.Common.Win32; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Tasks; using MoreLinq; using System; using System.Collections.Concurrent; diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 213c30bac..070120563 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -77,6 +77,7 @@ <Compile Include="..\SharedVersion.cs"> <Link>Properties\SharedVersion.cs</Link> </Compile> + <Compile Include="BaseManager.cs" /> <Compile Include="Drawing\ImageExtensions.cs" /> <Compile Include="Drawing\ImageHeader.cs" /> <Compile Include="Drawing\ImageManager.cs" /> @@ -109,7 +110,7 @@ <Compile Include="Extensions\XmlExtensions.cs" /> <Compile Include="IO\FileSystem.cs" /> <Compile Include="IO\FileSystemManager.cs" /> - <Compile Include="IO\NetworkShares.cs" /> + <Compile Include="IO\NativeMethods.cs" /> <Compile Include="Library\ChildrenChangedEventArgs.cs" /> <Compile Include="Library\DtoBuilder.cs" /> <Compile Include="Library\Profiler.cs" /> diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs index 7ef70ea42..9c9b0e9f2 100644 --- a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs +++ b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs @@ -634,7 +634,7 @@ namespace MediaBrowser.Controller.MediaInfo await AudioImageResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); - await process.RunAsync().ConfigureAwait(false); + await RunAsync(process).ConfigureAwait(false); AudioImageResourcePool.Release(); @@ -713,7 +713,7 @@ namespace MediaBrowser.Controller.MediaInfo await AudioImageResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); - await process.RunAsync().ConfigureAwait(false); + await RunAsync(process).ConfigureAwait(false); AudioImageResourcePool.Release(); @@ -768,7 +768,7 @@ namespace MediaBrowser.Controller.MediaInfo await AudioImageResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); - await process.RunAsync().ConfigureAwait(false); + await RunAsync(process).ConfigureAwait(false); AudioImageResourcePool.Release(); @@ -972,6 +972,23 @@ namespace MediaBrowser.Controller.MediaInfo } /// <summary> + /// Provides a non-blocking method to start a process and wait asynchronously for it to exit + /// </summary> + /// <param name="process">The process.</param> + /// <returns>Task{System.Boolean}.</returns> + private static Task<bool> RunAsync(Process process) + { + var tcs = new TaskCompletionSource<bool>(); + + process.EnableRaisingEvents = true; + process.Exited += (sender, args) => tcs.SetResult(true); + + process.Start(); + + return tcs.Task; + } + + /// <summary> /// Sets the error mode. /// </summary> /// <param name="uMode">The u mode.</param> diff --git a/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs b/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs index 5dbd6cbc6..f559d1fd0 100644 --- a/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs +++ b/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs @@ -1,6 +1,5 @@ using Mediabrowser.Model.Entities; using Mediabrowser.PluginSecurity; -using MediaBrowser.Common.Kernel; using System.Threading; using System.Threading.Tasks; diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs index 4c3250ff4..b992c35d9 100644 --- a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs @@ -1,5 +1,5 @@ -using MediaBrowser.Common.Win32; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; diff --git a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs index fcc31a75e..fa1fb2a9c 100644 --- a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs +++ b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Win32; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using System; using System.Globalization; diff --git a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs index f406cb185..6488d5ef8 100644 --- a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs +++ b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs @@ -1,6 +1,4 @@ -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Win32; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using System; diff --git a/MediaBrowser.Controller/Resolvers/TV/TVUtils.cs b/MediaBrowser.Controller/Resolvers/TV/TVUtils.cs index cfb402456..dddccaff9 100644 --- a/MediaBrowser.Controller/Resolvers/TV/TVUtils.cs +++ b/MediaBrowser.Controller/Resolvers/TV/TVUtils.cs @@ -1,4 +1,4 @@ -using MediaBrowser.Common.Win32; +using MediaBrowser.Controller.IO; using System; using System.Collections.Generic; using System.Linq; diff --git a/MediaBrowser.Controller/Updates/InstallationManager.cs b/MediaBrowser.Controller/Updates/InstallationManager.cs index 71a5f487b..bef5a6472 100644 --- a/MediaBrowser.Controller/Updates/InstallationManager.cs +++ b/MediaBrowser.Controller/Updates/InstallationManager.cs @@ -104,20 +104,35 @@ namespace MediaBrowser.Controller.Updates private readonly ILogger _logger; /// <summary> + /// The _network manager + /// </summary> + private readonly INetworkManager _networkManager; + + /// <summary> /// Initializes a new instance of the <see cref="InstallationManager" /> class. /// </summary> /// <param name="kernel">The kernel.</param> /// <param name="zipClient">The zip client.</param> + /// <param name="networkManager">The network manager.</param> /// <param name="logger">The logger.</param> /// <exception cref="System.ArgumentNullException">zipClient</exception> - public InstallationManager(Kernel kernel, IZipClient zipClient, ILogger logger) + public InstallationManager(Kernel kernel, IZipClient zipClient, INetworkManager networkManager, ILogger logger) : base(kernel) { if (zipClient == null) { throw new ArgumentNullException("zipClient"); } + if (networkManager == null) + { + throw new ArgumentNullException("networkManager"); + } + if (logger == null) + { + throw new ArgumentNullException("logger"); + } + _networkManager = networkManager; _logger = logger; ZipClient = zipClient; } @@ -133,7 +148,7 @@ namespace MediaBrowser.Controller.Updates PackageType? packageType = null, Version applicationVersion = null) { - var data = new Dictionary<string, string> { { "key", Kernel.PluginSecurityManager.SupporterKey }, { "mac", NetUtils.GetMacAddress() } }; + var data = new Dictionary<string, string> { { "key", Kernel.PluginSecurityManager.SupporterKey }, { "mac", _networkManager.GetMacAddress() } }; using (var json = await Kernel.HttpManager.Post(Controller.Kernel.MBAdminUrl + "service/package/retrieveall", data, Kernel.ResourcePools.Mb, cancellationToken).ConfigureAwait(false)) { diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index c4010e1d9..372aefdc6 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -73,6 +73,8 @@ <Compile Include="Logging\LogSeverity.cs" /> <Compile Include="MediaInfo\IBlurayExaminer.cs" /> <Compile Include="Net\HttpException.cs" /> + <Compile Include="Net\NetworkShare.cs" /> + <Compile Include="Net\NetworkShareType.cs" /> <Compile Include="Updates\CheckForUpdateResult.cs" /> <Compile Include="Updates\InstallationInfo.cs" /> <Compile Include="Updates\PackageType.cs" /> diff --git a/MediaBrowser.Model/Net/NetworkShare.cs b/MediaBrowser.Model/Net/NetworkShare.cs new file mode 100644 index 000000000..5ce84eeed --- /dev/null +++ b/MediaBrowser.Model/Net/NetworkShare.cs @@ -0,0 +1,31 @@ + +namespace MediaBrowser.Model.Net +{ + public class NetworkShare + { + /// <summary> + /// The name of the computer that this share belongs to + /// </summary> + public string Server { get; set; } + + /// <summary> + /// Share name + /// </summary> + public string Name { get; set; } + + /// <summary> + /// Local path + /// </summary> + public string Path { get; set; } + + /// <summary> + /// Share type + /// </summary> + public NetworkShareType ShareType { get; set; } + + /// <summary> + /// Comment + /// </summary> + public string Remark { get; set; } + } +} diff --git a/MediaBrowser.Model/Net/NetworkShareType.cs b/MediaBrowser.Model/Net/NetworkShareType.cs new file mode 100644 index 000000000..41dc9003e --- /dev/null +++ b/MediaBrowser.Model/Net/NetworkShareType.cs @@ -0,0 +1,30 @@ + +namespace MediaBrowser.Model.Net +{ + /// <summary> + /// Enum NetworkShareType + /// </summary> + public enum NetworkShareType + { + /// <summary> + /// Disk share + /// </summary> + Disk, + /// <summary> + /// Printer share + /// </summary> + Printer, + /// <summary> + /// Device share + /// </summary> + Device, + /// <summary> + /// IPC share + /// </summary> + Ipc, + /// <summary> + /// Special share + /// </summary> + Special + } +} diff --git a/MediaBrowser.Networking/Management/NativeMethods.cs b/MediaBrowser.Networking/Management/NativeMethods.cs new file mode 100644 index 000000000..9a888fab2 --- /dev/null +++ b/MediaBrowser.Networking/Management/NativeMethods.cs @@ -0,0 +1,72 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace MediaBrowser.Networking.Management +{ + /// <summary> + /// Class NativeMethods + /// </summary> + [SuppressUnmanagedCodeSecurity] + public static class NativeMethods + { + //declare the Netapi32 : NetServerEnum method import + /// <summary> + /// Nets the server enum. + /// </summary> + /// <param name="ServerName">Name of the server.</param> + /// <param name="dwLevel">The dw level.</param> + /// <param name="pBuf">The p buf.</param> + /// <param name="dwPrefMaxLen">The dw pref max len.</param> + /// <param name="dwEntriesRead">The dw entries read.</param> + /// <param name="dwTotalEntries">The dw total entries.</param> + /// <param name="dwServerType">Type of the dw server.</param> + /// <param name="domain">The domain.</param> + /// <param name="dwResumeHandle">The dw resume handle.</param> + /// <returns>System.Int32.</returns> + [DllImport("Netapi32", CharSet = CharSet.Auto, SetLastError = true), + SuppressUnmanagedCodeSecurityAttribute] + + public static extern int NetServerEnum( + string ServerName, // must be null + int dwLevel, + ref IntPtr pBuf, + int dwPrefMaxLen, + out int dwEntriesRead, + out int dwTotalEntries, + int dwServerType, + string domain, // null for login domain + out int dwResumeHandle + ); + + //declare the Netapi32 : NetApiBufferFree method import + /// <summary> + /// Nets the API buffer free. + /// </summary> + /// <param name="pBuf">The p buf.</param> + /// <returns>System.Int32.</returns> + [DllImport("Netapi32", SetLastError = true), + SuppressUnmanagedCodeSecurityAttribute] + + public static extern int NetApiBufferFree( + IntPtr pBuf); + } + + //create a _SERVER_INFO_100 STRUCTURE + /// <summary> + /// Struct _SERVER_INFO_100 + /// </summary> + [StructLayout(LayoutKind.Sequential)] + public struct _SERVER_INFO_100 + { + /// <summary> + /// The sv100_platform_id + /// </summary> + internal int sv100_platform_id; + /// <summary> + /// The sv100_name + /// </summary> + [MarshalAs(UnmanagedType.LPWStr)] + internal string sv100_name; + } +} diff --git a/MediaBrowser.Common/Net/NetUtils.cs b/MediaBrowser.Networking/Management/NetworkManager.cs index eb50a879d..fcead43d3 100644 --- a/MediaBrowser.Common/Net/NetUtils.cs +++ b/MediaBrowser.Networking/Management/NetworkManager.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Win32; +using MediaBrowser.Common.Net; +using MediaBrowser.Model.Net; using System; using System.Collections.Generic; using System.Diagnostics; @@ -8,29 +9,36 @@ using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; -namespace MediaBrowser.Common.Net +namespace MediaBrowser.Networking.Management { /// <summary> /// Class NetUtils /// </summary> - public static class NetUtils + public class NetworkManager : INetworkManager { /// <summary> /// Gets the machine's local ip address /// </summary> /// <returns>IPAddress.</returns> - public static IPAddress GetLocalIpAddress() + public string GetLocalIpAddress() { var host = Dns.GetHostEntry(Dns.GetHostName()); - return host.AddressList.FirstOrDefault(i => i.AddressFamily == AddressFamily.InterNetwork); + var ip = host.AddressList.FirstOrDefault(i => i.AddressFamily == AddressFamily.InterNetwork); + + if (ip == null) + { + return null; + } + + return ip.ToString(); } /// <summary> /// Gets a random port number that is currently available /// </summary> /// <returns>System.Int32.</returns> - public static int GetRandomUnusedPort() + public int GetRandomUnusedPort() { var listener = new TcpListener(IPAddress.Any, 0); listener.Start(); @@ -42,13 +50,12 @@ namespace MediaBrowser.Common.Net /// <summary> /// Creates the netsh URL registration. /// </summary> - /// <param name="urlPrefix">The URL prefix.</param> - public static void CreateNetshUrlRegistration(string urlPrefix) + public void AuthorizeHttpListening(string url) { var startInfo = new ProcessStartInfo { FileName = "netsh", - Arguments = string.Format("http add urlacl url={0} user=\"NT AUTHORITY\\Authenticated Users\"", urlPrefix), + Arguments = string.Format("http add urlacl url={0} user=\"NT AUTHORITY\\Authenticated Users\"", url), CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, Verb = "runas", @@ -66,10 +73,10 @@ namespace MediaBrowser.Common.Net /// </summary> /// <param name="port">The port.</param> /// <param name="protocol">The protocol.</param> - public static void AddWindowsFirewallRule(int port, NetworkProtocol protocol) + public void AddSystemFirewallRule(int port, NetworkProtocol protocol) { // First try to remove it so we don't end up creating duplicates - RemoveWindowsFirewallRule(port, protocol); + RemoveSystemFirewallRule(port, protocol); var args = string.Format("advfirewall firewall add rule name=\"Port {0}\" dir=in action=allow protocol={1} localport={0}", port, protocol); @@ -81,7 +88,7 @@ namespace MediaBrowser.Common.Net /// </summary> /// <param name="port">The port.</param> /// <param name="protocol">The protocol.</param> - public static void RemoveWindowsFirewallRule(int port, NetworkProtocol protocol) + public void RemoveSystemFirewallRule(int port, NetworkProtocol protocol) { var args = string.Format("advfirewall firewall delete rule name=\"Port {0}\" protocol={1} localport={0}", port, protocol); @@ -92,7 +99,7 @@ namespace MediaBrowser.Common.Net /// Runs the netsh. /// </summary> /// <param name="args">The args.</param> - private static void RunNetsh(string args) + private void RunNetsh(string args) { var startInfo = new ProcessStartInfo { @@ -115,7 +122,7 @@ namespace MediaBrowser.Common.Net /// Returns MAC Address from first Network Card in Computer /// </summary> /// <returns>[string] MAC Address</returns> - public static string GetMacAddress() + public string GetMacAddress() { var mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); var moc = mc.GetInstances(); @@ -148,7 +155,7 @@ namespace MediaBrowser.Common.Net /// </summary> /// <returns>Arraylist that represents all the SV_TYPE_WORKSTATION and SV_TYPE_SERVER /// PC's in the Domain</returns> - public static IEnumerable<string> GetNetworkComputers() + public IEnumerable<string> GetNetworkDevices() { //local fields const int MAX_PREFERRED_LENGTH = -1; @@ -200,20 +207,59 @@ namespace MediaBrowser.Common.Net NativeMethods.NetApiBufferFree(buffer); } } - } - /// <summary> - /// Enum NetworkProtocol - /// </summary> - public enum NetworkProtocol - { + + /// <summary> + /// Gets the network shares. + /// </summary> + /// <param name="path">The path.</param> + /// <returns>IEnumerable{NetworkShare}.</returns> + public IEnumerable<NetworkShare> GetNetworkShares(string path) + { + return new ShareCollection(path).OfType<Share>().Select(ToNetworkShare); + } + /// <summary> - /// The TCP + /// To the network share. /// </summary> - Tcp, + /// <param name="share">The share.</param> + /// <returns>NetworkShare.</returns> + private NetworkShare ToNetworkShare(Share share) + { + return new NetworkShare + { + Name = share.NetName, + Path = share.Path, + Remark = share.Remark, + Server = share.Server, + ShareType = ToNetworkShareType(share.ShareType) + }; + } + /// <summary> - /// The UDP + /// To the type of the network share. /// </summary> - Udp + /// <param name="shareType">Type of the share.</param> + /// <returns>NetworkShareType.</returns> + /// <exception cref="System.ArgumentException">Unknown share type</exception> + private NetworkShareType ToNetworkShareType(ShareType shareType) + { + switch (shareType) + { + case ShareType.Device: + return NetworkShareType.Device; + case ShareType.Disk : + return NetworkShareType.Disk; + case ShareType.IPC : + return NetworkShareType.Ipc; + case ShareType.Printer : + return NetworkShareType.Printer; + case ShareType.Special: + return NetworkShareType.Special; + default: + throw new ArgumentException("Unknown share type"); + } + } } + } diff --git a/MediaBrowser.Controller/IO/NetworkShares.cs b/MediaBrowser.Networking/Management/NetworkShares.cs index 93edc6447..0239ddead 100644 --- a/MediaBrowser.Controller/IO/NetworkShares.cs +++ b/MediaBrowser.Networking/Management/NetworkShares.cs @@ -3,7 +3,7 @@ using System.IO; using System.Collections; using System.Runtime.InteropServices; -namespace MediaBrowser.Controller.IO +namespace MediaBrowser.Networking.Management { /// <summary> /// Type of share @@ -123,10 +123,7 @@ namespace MediaBrowser.Controller.IO if (0 == (_shareType & ShareType.Special)) return true; // Special disk share (e.g. C$) - if (ShareType.Special == _shareType && null != _netName && 0 != _netName.Length) - return true; - else - return false; + return ShareType.Special == _shareType && !string.IsNullOrEmpty(_netName); } } @@ -139,16 +136,14 @@ namespace MediaBrowser.Controller.IO { if (IsFileSystem) { - if (null == _server || 0 == _server.Length) - if (null == _path || 0 == _path.Length) + if (string.IsNullOrEmpty(_server)) + if (string.IsNullOrEmpty(_path)) return new DirectoryInfo(ToString()); else return new DirectoryInfo(_path); - else - return new DirectoryInfo(ToString()); + return new DirectoryInfo(ToString()); } - else - return null; + return null; } } @@ -160,12 +155,11 @@ namespace MediaBrowser.Controller.IO /// <returns></returns> public override string ToString() { - if (null == _server || 0 == _server.Length) + if (string.IsNullOrEmpty(_server)) { return string.Format(@"\\{0}\{1}", Environment.MachineName, _netName); } - else - return string.Format(@"\\{0}\{1}", _server, _netName); + return string.Format(@"\\{0}\{1}", _server, _netName); } /// <summary> @@ -176,7 +170,7 @@ namespace MediaBrowser.Controller.IO public bool MatchesPath(string path) { if (!IsFileSystem) return false; - if (null == path || 0 == path.Length) return true; + if (string.IsNullOrEmpty(path)) return true; return path.ToLower().StartsWith(_path.ToLower()); } diff --git a/MediaBrowser.Networking/MediaBrowser.Networking.csproj b/MediaBrowser.Networking/MediaBrowser.Networking.csproj index 40ec81db3..194f9e400 100644 --- a/MediaBrowser.Networking/MediaBrowser.Networking.csproj +++ b/MediaBrowser.Networking/MediaBrowser.Networking.csproj @@ -32,6 +32,7 @@ <ItemGroup> <Reference Include="System" /> <Reference Include="System.Core" /> + <Reference Include="System.Management" /> <Reference Include="System.Xml.Linq" /> <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> @@ -42,8 +43,21 @@ <Compile Include="..\SharedVersion.cs"> <Link>Properties\SharedVersion.cs</Link> </Compile> + <Compile Include="Management\NativeMethods.cs" /> + <Compile Include="Management\NetworkManager.cs" /> + <Compile Include="Management\NetworkShares.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj"> + <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project> + <Name>MediaBrowser.Common</Name> + </ProjectReference> + <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj"> + <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project> + <Name>MediaBrowser.Model</Name> + </ProjectReference> + </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <PropertyGroup> <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</PostBuildEvent> diff --git a/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj b/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj index 22e552f8a..78ea39dd8 100644 --- a/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj +++ b/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj @@ -43,11 +43,8 @@ <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.Xml.Linq" /> - <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Data" /> - <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> <Compile Include="..\SharedVersion.cs"> diff --git a/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj b/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj index 0d47febed..1e97a482e 100644 --- a/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj +++ b/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj @@ -35,11 +35,7 @@ <ItemGroup> <Reference Include="System" /> <Reference Include="System.Core" /> - <Reference Include="System.Xml.Linq" /> - <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> - <Reference Include="System.Data" /> - <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> <Compile Include="..\SharedVersion.cs"> diff --git a/MediaBrowser.ServerApplication/App.xaml.cs b/MediaBrowser.ServerApplication/App.xaml.cs index 492fef242..4aa3cdbb4 100644 --- a/MediaBrowser.ServerApplication/App.xaml.cs +++ b/MediaBrowser.ServerApplication/App.xaml.cs @@ -1,6 +1,8 @@ -using MediaBrowser.ClickOnce; +using BDInfo; +using MediaBrowser.ClickOnce; using MediaBrowser.Common.IO; using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.IsoMounter; using MediaBrowser.Logging.Nlog; @@ -8,6 +10,7 @@ using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Updates; +using MediaBrowser.Networking.Management; using MediaBrowser.Server.Uninstall; using MediaBrowser.ServerApplication.Implementations; using Microsoft.Win32; @@ -513,9 +516,10 @@ namespace MediaBrowser.ServerApplication IsoManager = new PismoIsoManager(Logger); - Register<IIsoManager>(IsoManager); + Register(IsoManager); Register<IBlurayExaminer>(new BdInfoExaminer()); Register<IZipClient>(new DotNetZipClient()); + Register(typeof (INetworkManager), typeof (NetworkManager)); } /// <summary> @@ -573,5 +577,15 @@ namespace MediaBrowser.ServerApplication } return (T)result.GetInstance(); } + + /// <summary> + /// Registers the specified service type. + /// </summary> + /// <param name="serviceType">Type of the service.</param> + /// <param name="implementation">Type of the concrete.</param> + public void Register(Type serviceType, Type implementation) + { + _container.Register(serviceType, implementation); + } } } diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index 9f9b87b05..9b27351a1 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -196,7 +196,6 @@ <Compile Include="Controls\MultiItemUpdateNotification.xaml.cs"> <DependentUpon>MultiItemUpdateNotification.xaml</DependentUpon> </Compile> - <Compile Include="Implementations\BdInfoExaminer.cs" /> <Compile Include="Implementations\DotNetZipClient.cs" /> <Compile Include="LibraryExplorer.xaml.cs"> <DependentUpon>LibraryExplorer.xaml</DependentUpon> @@ -270,6 +269,10 @@ <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project> <Name>MediaBrowser.Model</Name> </ProjectReference> + <ProjectReference Include="..\MediaBrowser.Networking\MediaBrowser.Networking.csproj"> + <Project>{7c11010e-179a-49b7-bfb2-f1656f5e71ad}</Project> + <Name>MediaBrowser.Networking</Name> + </ProjectReference> <ProjectReference Include="..\MediaBrowser.Server.Uninstall\MediaBrowser.Server.Uninstall.csproj"> <Project>{5443422f-9548-417a-90dd-2fc91f2b5999}</Project> <Name>MediaBrowser.Server.Uninstall</Name> |
