using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Model.IO; using ServiceStack.ServiceHost; using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.Globalization; using System.IO; using System.Linq; namespace MediaBrowser.Api { /// /// Class GetDirectoryContents /// [Route("/Environment/DirectoryContents", "GET")] public class GetDirectoryContents : IReturn> { /// /// Gets or sets the path. /// /// The path. public string Path { get; set; } /// /// Gets or sets a value indicating whether [include files]. /// /// true if [include files]; otherwise, false. public bool IncludeFiles { get; set; } /// /// Gets or sets a value indicating whether [include directories]. /// /// true if [include directories]; otherwise, false. public bool IncludeDirectories { get; set; } /// /// Gets or sets a value indicating whether [include hidden]. /// /// true if [include hidden]; otherwise, false. public bool IncludeHidden { get; set; } } /// /// Class GetDrives /// [Route("/Environment/Drives", "GET")] public class GetDrives : IReturn> { } /// /// Class GetNetworkComputers /// [Route("/Environment/NetworkComputers", "GET")] public class GetNetworkComputers : IReturn> { } /// /// Class EnvironmentService /// [Export(typeof(IRestfulService))] public class EnvironmentService : BaseRestService { /// /// Gets the specified request. /// /// The request. /// System.Object. /// Path /// public object Get(GetDirectoryContents request) { var path = request.Path; if (string.IsNullOrEmpty(path)) { throw new ArgumentNullException("Path"); } // Reject invalid input if (!Path.IsPathRooted(path)) { throw new ArgumentException(string.Format("Invalid path: {0}", path)); } if (path.StartsWith(NetworkPrefix, StringComparison.OrdinalIgnoreCase) && path.LastIndexOf('\\') == 1) { return GetNetworkShares(path).ToList(); } return GetFileSystemEntries(request).ToList(); } /// /// Gets the specified request. /// /// The request. /// System.Object. public object Get(GetDrives request) { return GetDrives().ToList(); } /// /// Gets the specified request. /// /// The request. /// System.Object. public object Get(GetNetworkComputers request) { return GetNetworkComputers().ToList(); } /// /// Gets the list that is returned when an empty path is supplied /// /// IEnumerable{FileSystemEntryInfo}. private IEnumerable GetDrives() { // Only include drives in the ready state or this method could end up being very slow, waiting for drives to timeout return DriveInfo.GetDrives().Where(d => d.IsReady).Select(d => new FileSystemEntryInfo { Name = GetName(d), Path = d.RootDirectory.FullName, Type = FileSystemEntryType.Directory }); } /// /// Gets the network computers. /// /// IEnumerable{FileSystemEntryInfo}. private IEnumerable GetNetworkComputers() { return NetUtils.GetNetworkComputers().Select(c => new FileSystemEntryInfo { Name = c, Path = NetworkPrefix + c, Type = FileSystemEntryType.NetworkComputer }); } /// /// Gets the name. /// /// The drive. /// System.String. private string GetName(DriveInfo drive) { return drive.Name; } /// /// Gets the network shares. /// /// The path. /// IEnumerable{FileSystemEntryInfo}. private IEnumerable GetNetworkShares(string path) { return new ShareCollection(path).OfType().Where(s => s.ShareType == ShareType.Disk).Select(c => new FileSystemEntryInfo { Name = c.NetName, Path = Path.Combine(path, c.NetName), Type = FileSystemEntryType.NetworkShare }); } /// /// Gets the file system entries. /// /// The request. /// IEnumerable{FileSystemEntryInfo}. private IEnumerable GetFileSystemEntries(GetDirectoryContents request) { var fileSystemEntries = FileSystem.GetFileSystemEntries(request.Path, "*", request.IncludeFiles, request.IncludeDirectories).Where(f => !f.IsSystemFile); if (!request.IncludeHidden) { fileSystemEntries = fileSystemEntries.Where(f => !f.IsHidden); } return fileSystemEntries.Select(f => new FileSystemEntryInfo { Name = f.cFileName, Path = f.Path, Type = f.IsDirectory ? FileSystemEntryType.Directory : FileSystemEntryType.File }); } /// /// Gets the network prefix. /// /// The network prefix. private string NetworkPrefix { get { return Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture) + Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture); } } } }