aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna/Ssdp/Extensions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Dlna/Ssdp/Extensions.cs')
-rw-r--r--MediaBrowser.Dlna/Ssdp/Extensions.cs58
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;
+ }
+ }
+}