diff options
Diffstat (limited to 'MediaBrowser.Dlna/Ssdp/Extensions.cs')
| -rw-r--r-- | MediaBrowser.Dlna/Ssdp/Extensions.cs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/MediaBrowser.Dlna/Ssdp/Extensions.cs b/MediaBrowser.Dlna/Ssdp/Extensions.cs new file mode 100644 index 000000000..12589e80f --- /dev/null +++ b/MediaBrowser.Dlna/Ssdp/Extensions.cs @@ -0,0 +1,58 @@ +using System; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace MediaBrowser.Dlna.Ssdp +{ + public static class Extensions + { + public static Task<int> ReceiveAsync(this Socket socket, byte[] buffer, int offset, int size) + { + var tcs = new TaskCompletionSource<int>(socket); + var remoteip = new IPEndPoint(IPAddress.Any, 0); + var endpoint = (EndPoint)remoteip; + + socket.BeginReceiveFrom(buffer, offset, size, SocketFlags.None, ref endpoint, iar => + { + var result = (TaskCompletionSource<int>)iar.AsyncState; + var iarSocket = (Socket)result.Task.AsyncState; + + try + { + result.TrySetResult(iarSocket.EndReceive(iar)); + } + catch (Exception exc) + { + result.TrySetException(exc); + } + }, tcs); + + return tcs.Task; + } + + public static string GetValue(this XElement container, XName name) + { + var node = container.Element(name); + + return node == null ? null : node.Value; + } + + public static string GetAttributeValue(this XElement container, XName name) + { + var node = container.Attribute(name); + + return node == null ? null : node.Value; + } + + public static string GetDescendantValue(this XElement container, XName name) + { + var node = container.Descendants(name) + .FirstOrDefault(); + + return node == null ? null : node.Value; + } + } +} |
