diff options
Diffstat (limited to 'MediaBrowser.ServerApplication/Networking/NetworkManager.cs')
| -rw-r--r-- | MediaBrowser.ServerApplication/Networking/NetworkManager.cs | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/MediaBrowser.ServerApplication/Networking/NetworkManager.cs b/MediaBrowser.ServerApplication/Networking/NetworkManager.cs new file mode 100644 index 000000000..4799dcc72 --- /dev/null +++ b/MediaBrowser.ServerApplication/Networking/NetworkManager.cs @@ -0,0 +1,136 @@ +using MediaBrowser.Common.Implementations.Networking; +using MediaBrowser.Common.Net; +using MediaBrowser.Model.Net; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; + +namespace MediaBrowser.ServerApplication.Networking +{ + /// <summary> + /// Class NetUtils + /// </summary> + public class NetworkManager : BaseNetworkManager, INetworkManager + { + /// <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> + /// To the network share. + /// </summary> + /// <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> + /// To the type of the network share. + /// </summary> + /// <param name="shareType">Type of the share.</param> + /// <returns>NetworkShareType.</returns> + /// <exception cref="System.ArgumentException">Unknown share type</exception> + private NetworkShareType ToNetworkShareType(ShareType shareType) + { + if (shareType.HasFlag(ShareType.Special)) + { + return NetworkShareType.Special; + } + if (shareType.HasFlag(ShareType.Device)) + { + return NetworkShareType.Device; + } + if (shareType.HasFlag(ShareType.Disk)) + { + return NetworkShareType.Disk; + } + if (shareType.HasFlag(ShareType.IPC)) + { + return NetworkShareType.Ipc; + } + if (shareType.HasFlag(ShareType.Printer)) + { + return NetworkShareType.Printer; + } + throw new ArgumentException("Unknown share type"); + } + + /// <summary> + /// Uses the DllImport : NetServerEnum with all its required parameters + /// (see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netserverenum.asp + /// for full details or method signature) to retrieve a list of domain SV_TYPE_WORKSTATION + /// and SV_TYPE_SERVER PC's + /// </summary> + /// <returns>Arraylist that represents all the SV_TYPE_WORKSTATION and SV_TYPE_SERVER + /// PC's in the Domain</returns> + public IEnumerable<string> GetNetworkDevices() + { + //local fields + const int MAX_PREFERRED_LENGTH = -1; + var SV_TYPE_WORKSTATION = 1; + var SV_TYPE_SERVER = 2; + var buffer = IntPtr.Zero; + var tmpBuffer = IntPtr.Zero; + var entriesRead = 0; + var totalEntries = 0; + var resHandle = 0; + var sizeofINFO = Marshal.SizeOf(typeof(_SERVER_INFO_100)); + + try + { + //call the DllImport : NetServerEnum with all its required parameters + //see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netserverenum.asp + //for full details of method signature + var ret = NativeMethods.NetServerEnum(null, 100, ref buffer, MAX_PREFERRED_LENGTH, out entriesRead, out totalEntries, SV_TYPE_WORKSTATION | SV_TYPE_SERVER, null, out resHandle); + + //if the returned with a NERR_Success (C++ term), =0 for C# + if (ret == 0) + { + //loop through all SV_TYPE_WORKSTATION and SV_TYPE_SERVER PC's + for (var i = 0; i < totalEntries; i++) + { + //get pointer to, Pointer to the buffer that received the data from + //the call to NetServerEnum. Must ensure to use correct size of + //STRUCTURE to ensure correct location in memory is pointed to + tmpBuffer = new IntPtr((int)buffer + (i * sizeofINFO)); + //Have now got a pointer to the list of SV_TYPE_WORKSTATION and + //SV_TYPE_SERVER PC's, which is unmanaged memory + //Needs to Marshal data from an unmanaged block of memory to a + //managed object, again using STRUCTURE to ensure the correct data + //is marshalled + var svrInfo = (_SERVER_INFO_100)Marshal.PtrToStructure(tmpBuffer, typeof(_SERVER_INFO_100)); + + //add the PC names to the ArrayList + if (!string.IsNullOrEmpty(svrInfo.sv100_name)) + { + yield return svrInfo.sv100_name; + } + } + } + } + finally + { + //The NetApiBufferFree function frees + //the memory that the NetApiBufferAllocate function allocates + NativeMethods.NetApiBufferFree(buffer); + } + } + } + +} |
