aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna/Server/ControlHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Dlna/Server/ControlHandler.cs')
-rw-r--r--MediaBrowser.Dlna/Server/ControlHandler.cs190
1 files changed, 190 insertions, 0 deletions
diff --git a/MediaBrowser.Dlna/Server/ControlHandler.cs b/MediaBrowser.Dlna/Server/ControlHandler.cs
new file mode 100644
index 000000000..ad6248c97
--- /dev/null
+++ b/MediaBrowser.Dlna/Server/ControlHandler.cs
@@ -0,0 +1,190 @@
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace MediaBrowser.Dlna.Server
+{
+ public class ControlHandler
+ {
+ private readonly ILogger _logger;
+
+ private const string NS_DC = "http://purl.org/dc/elements/1.1/";
+ private const string NS_DIDL = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/";
+ private const string NS_DLNA = "urn:schemas-dlna-org:metadata-1-0/";
+ private const string NS_SEC = "http://www.sec.co.kr/";
+ private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
+ private const string NS_UPNP = "urn:schemas-upnp-org:metadata-1-0/upnp/";
+
+ private const int systemID = 0;
+
+ public ControlHandler(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ public ControlResponse ProcessControlRequest(ControlRequest request)
+ {
+ var soap = new XmlDocument();
+ soap.LoadXml(request.InputXml);
+ var sparams = new Headers();
+ var body = soap.GetElementsByTagName("Body", NS_SOAPENV).Item(0);
+
+ var method = body.FirstChild;
+
+ foreach (var p in method.ChildNodes)
+ {
+ var e = p as XmlElement;
+ if (e == null)
+ {
+ continue;
+ }
+ sparams.Add(e.LocalName, e.InnerText.Trim());
+ }
+
+ var env = new XmlDocument();
+ env.AppendChild(env.CreateXmlDeclaration("1.0", "utf-8", "yes"));
+ var envelope = env.CreateElement("SOAP-ENV", "Envelope", NS_SOAPENV);
+ env.AppendChild(envelope);
+ envelope.SetAttribute("encodingStyle", NS_SOAPENV, "http://schemas.xmlsoap.org/soap/encoding/");
+
+ var rbody = env.CreateElement("SOAP-ENV:Body", NS_SOAPENV);
+ env.DocumentElement.AppendChild(rbody);
+
+ IEnumerable<KeyValuePair<string, string>> result;
+ switch (method.LocalName)
+ {
+ case "GetSearchCapabilities":
+ result = HandleGetSearchCapabilities();
+ break;
+ case "GetSortCapabilities":
+ result = HandleGetSortCapabilities();
+ break;
+ case "GetSystemUpdateID":
+ result = HandleGetSystemUpdateID();
+ break;
+ case "Browse":
+ result = HandleBrowse(sparams);
+ break;
+ case "X_GetFeatureList":
+ result = HandleXGetFeatureList();
+ break;
+ case "X_SetBookmark":
+ result = HandleXSetBookmark(sparams);
+ break;
+ default:
+ throw new ResourceNotFoundException();
+ }
+
+ var response = env.CreateElement(String.Format("u:{0}Response", method.LocalName), method.NamespaceURI);
+ rbody.AppendChild(response);
+
+ foreach (var i in result)
+ {
+ var ri = env.CreateElement(i.Key);
+ ri.InnerText = i.Value;
+ response.AppendChild(ri);
+ }
+
+ var controlResponse = new ControlResponse
+ {
+ Xml = env.OuterXml
+ };
+
+ controlResponse.Headers.Add("EXT", string.Empty);
+
+ return controlResponse;
+ }
+
+ private Headers HandleXSetBookmark(Headers sparams)
+ {
+ var id = sparams["ObjectID"];
+ //var item = GetItem(id) as IBookmarkable;
+ //if (item != null)
+ //{
+ // var newbookmark = long.Parse(sparams["PosSecond"]);
+ // if (newbookmark > 30)
+ // {
+ // newbookmark -= 5;
+ // }
+ // if (newbookmark > 30 || !item.Bookmark.HasValue || item.Bookmark.Value < 60)
+ // {
+ // item.Bookmark = newbookmark;
+ // }
+ //}
+ return new Headers();
+ }
+
+ private Headers HandleGetSearchCapabilities()
+ {
+ return new Headers { { "SearchCaps", string.Empty } };
+ }
+
+ private Headers HandleGetSortCapabilities()
+ {
+ return new Headers { { "SortCaps", string.Empty } };
+ }
+
+ private Headers HandleGetSystemUpdateID()
+ {
+ return new Headers { { "Id", systemID.ToString() } };
+ }
+
+ private Headers HandleXGetFeatureList()
+ {
+ return new Headers { { "FeatureList", GetFeatureListXml() } };
+ }
+
+ private string GetFeatureListXml()
+ {
+ var builder = new StringBuilder();
+
+ builder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+ builder.Append("<Features xmlns=\"urn:schemas-upnp-org:av:avs\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:schemas-upnp-org:av:avs http://www.upnp.org/schemas/av/avs.xsd\">");
+
+ builder.Append("<Feature name=\"samsung.com_BASICVIEW\" version=\"1\">");
+ builder.Append("<container id=\"I\" type=\"object.item.imageItem\"/>");
+ builder.Append("<container id=\"A\" type=\"object.item.audioItem\"/>");
+ builder.Append("<container id=\"V\" type=\"object.item.videoItem\"/>");
+ builder.Append("</Feature>");
+
+ builder.Append("</Features>");
+
+ return builder.ToString();
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleBrowse(Headers sparams)
+ {
+ var id = sparams["ObjectID"];
+ var flag = sparams["BrowseFlag"];
+
+ int requested;
+ var provided = 0;
+ int start;
+
+ if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requested) && requested <= 0)
+ {
+ requested = 20;
+ }
+ if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out start) && start <= 0)
+ {
+ start = 0;
+ }
+
+ //var root = GetItem(id) as IMediaFolder;
+ var result = new XmlDocument();
+
+ var didl = result.CreateElement(string.Empty, "DIDL-Lite", NS_DIDL);
+ didl.SetAttribute("xmlns:dc", NS_DC);
+ didl.SetAttribute("xmlns:dlna", NS_DLNA);
+ didl.SetAttribute("xmlns:upnp", NS_UPNP);
+ didl.SetAttribute("xmlns:sec", NS_SEC);
+ result.AppendChild(didl);
+
+ return null;
+ }
+ }
+}