|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|