ControlHandler.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using MediaBrowser.Common.Extensions;
  2. using MediaBrowser.Controller.Dlna;
  3. using MediaBrowser.Model.Logging;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using System.Xml;
  8. namespace MediaBrowser.Dlna.Server
  9. {
  10. public class ControlHandler
  11. {
  12. private readonly ILogger _logger;
  13. private const string NS_DC = "http://purl.org/dc/elements/1.1/";
  14. private const string NS_DIDL = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/";
  15. private const string NS_DLNA = "urn:schemas-dlna-org:metadata-1-0/";
  16. private const string NS_SEC = "http://www.sec.co.kr/";
  17. private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
  18. private const string NS_UPNP = "urn:schemas-upnp-org:metadata-1-0/upnp/";
  19. private const int systemID = 0;
  20. public ControlHandler(ILogger logger)
  21. {
  22. _logger = logger;
  23. }
  24. public ControlResponse ProcessControlRequest(ControlRequest request)
  25. {
  26. var soap = new XmlDocument();
  27. soap.LoadXml(request.InputXml);
  28. var sparams = new Headers();
  29. var body = soap.GetElementsByTagName("Body", NS_SOAPENV).Item(0);
  30. var method = body.FirstChild;
  31. foreach (var p in method.ChildNodes)
  32. {
  33. var e = p as XmlElement;
  34. if (e == null)
  35. {
  36. continue;
  37. }
  38. sparams.Add(e.LocalName, e.InnerText.Trim());
  39. }
  40. var env = new XmlDocument();
  41. env.AppendChild(env.CreateXmlDeclaration("1.0", "utf-8", "yes"));
  42. var envelope = env.CreateElement("SOAP-ENV", "Envelope", NS_SOAPENV);
  43. env.AppendChild(envelope);
  44. envelope.SetAttribute("encodingStyle", NS_SOAPENV, "http://schemas.xmlsoap.org/soap/encoding/");
  45. var rbody = env.CreateElement("SOAP-ENV:Body", NS_SOAPENV);
  46. env.DocumentElement.AppendChild(rbody);
  47. IEnumerable<KeyValuePair<string, string>> result;
  48. switch (method.LocalName)
  49. {
  50. case "GetSearchCapabilities":
  51. result = HandleGetSearchCapabilities();
  52. break;
  53. case "GetSortCapabilities":
  54. result = HandleGetSortCapabilities();
  55. break;
  56. case "GetSystemUpdateID":
  57. result = HandleGetSystemUpdateID();
  58. break;
  59. case "Browse":
  60. result = HandleBrowse(sparams);
  61. break;
  62. case "X_GetFeatureList":
  63. result = HandleXGetFeatureList();
  64. break;
  65. case "X_SetBookmark":
  66. result = HandleXSetBookmark(sparams);
  67. break;
  68. default:
  69. throw new ResourceNotFoundException();
  70. }
  71. var response = env.CreateElement(String.Format("u:{0}Response", method.LocalName), method.NamespaceURI);
  72. rbody.AppendChild(response);
  73. foreach (var i in result)
  74. {
  75. var ri = env.CreateElement(i.Key);
  76. ri.InnerText = i.Value;
  77. response.AppendChild(ri);
  78. }
  79. var controlResponse = new ControlResponse
  80. {
  81. Xml = env.OuterXml
  82. };
  83. controlResponse.Headers.Add("EXT", string.Empty);
  84. return controlResponse;
  85. }
  86. private Headers HandleXSetBookmark(Headers sparams)
  87. {
  88. var id = sparams["ObjectID"];
  89. //var item = GetItem(id) as IBookmarkable;
  90. //if (item != null)
  91. //{
  92. // var newbookmark = long.Parse(sparams["PosSecond"]);
  93. // if (newbookmark > 30)
  94. // {
  95. // newbookmark -= 5;
  96. // }
  97. // if (newbookmark > 30 || !item.Bookmark.HasValue || item.Bookmark.Value < 60)
  98. // {
  99. // item.Bookmark = newbookmark;
  100. // }
  101. //}
  102. return new Headers();
  103. }
  104. private Headers HandleGetSearchCapabilities()
  105. {
  106. return new Headers { { "SearchCaps", string.Empty } };
  107. }
  108. private Headers HandleGetSortCapabilities()
  109. {
  110. return new Headers { { "SortCaps", string.Empty } };
  111. }
  112. private Headers HandleGetSystemUpdateID()
  113. {
  114. return new Headers { { "Id", systemID.ToString() } };
  115. }
  116. private Headers HandleXGetFeatureList()
  117. {
  118. return new Headers { { "FeatureList", GetFeatureListXml() } };
  119. }
  120. private string GetFeatureListXml()
  121. {
  122. var builder = new StringBuilder();
  123. builder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
  124. 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\">");
  125. builder.Append("<Feature name=\"samsung.com_BASICVIEW\" version=\"1\">");
  126. builder.Append("<container id=\"I\" type=\"object.item.imageItem\"/>");
  127. builder.Append("<container id=\"A\" type=\"object.item.audioItem\"/>");
  128. builder.Append("<container id=\"V\" type=\"object.item.videoItem\"/>");
  129. builder.Append("</Feature>");
  130. builder.Append("</Features>");
  131. return builder.ToString();
  132. }
  133. private IEnumerable<KeyValuePair<string, string>> HandleBrowse(Headers sparams)
  134. {
  135. var id = sparams["ObjectID"];
  136. var flag = sparams["BrowseFlag"];
  137. int requested;
  138. var provided = 0;
  139. int start;
  140. if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requested) && requested <= 0)
  141. {
  142. requested = 20;
  143. }
  144. if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out start) && start <= 0)
  145. {
  146. start = 0;
  147. }
  148. //var root = GetItem(id) as IMediaFolder;
  149. var result = new XmlDocument();
  150. var didl = result.CreateElement(string.Empty, "DIDL-Lite", NS_DIDL);
  151. didl.SetAttribute("xmlns:dc", NS_DC);
  152. didl.SetAttribute("xmlns:dlna", NS_DLNA);
  153. didl.SetAttribute("xmlns:upnp", NS_UPNP);
  154. didl.SetAttribute("xmlns:sec", NS_SEC);
  155. result.AppendChild(didl);
  156. return null;
  157. }
  158. }
  159. }