PageRenderTime 27ms CodeModel.GetById 0ms RepoModel.GetById 1ms app.codeStats 0ms

/AirLib/Slideshow.cs

http://AirLib.codeplex.com
C# | 185 lines | 104 code | 43 blank | 38 comment | 1 complexity | 8ef1b0b64dcc1b4b6afb5b881975a618 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. using System.IO;
  8. using System.Diagnostics;
  9. namespace AirLib
  10. {
  11. public class Slideshow
  12. {
  13. #region Fields
  14. private Guid _sessionGuid = Guid.NewGuid();
  15. private List<string> _photoList = new List<string>();
  16. private string _appleTvIpAddress;
  17. private int _currentPhoto = 0;
  18. #endregion Fields
  19. #region Properties
  20. /// <summary>
  21. /// Gets the photo list.
  22. /// </summary>
  23. /// <value>
  24. /// The photo list.
  25. /// </value>
  26. public List<string> PhotoList
  27. {
  28. get { return _photoList; }
  29. }
  30. #endregion Properties
  31. #region Constructor
  32. /// <summary>
  33. /// Initializes a new instance of the <see cref="Slideshow"/> class.
  34. /// </summary>
  35. public Slideshow(string ipAddress, int streamHostPort)
  36. {
  37. _appleTvIpAddress = ipAddress;
  38. ReverseConnectionHandler eventHandler = new ReverseConnectionHandler(ipAddress, "event", _sessionGuid);
  39. eventHandler.EventRaised += new ReverseConnectionHandler.EventFiredDelegate(EventHandler_EventRaised);
  40. ReverseConnectionHandler photoEventHandler = new ReverseConnectionHandler(ipAddress, "photo", _sessionGuid);
  41. eventHandler.EventRaised += new ReverseConnectionHandler.EventFiredDelegate(PhotoEventHandler_EventRaised);
  42. ReverseConnectionHandler photoConnectionHandler = new ReverseConnectionHandler(_appleTvIpAddress, "slideshow", _sessionGuid);
  43. photoConnectionHandler.EventRaised += new ReverseConnectionHandler.EventFiredDelegate(ReverseConnectionHandler_EventRaised);
  44. }
  45. /// <summary>
  46. /// Event raised.
  47. /// </summary>
  48. /// <param name="eventMessage">The event message.</param>
  49. /// <returns></returns>
  50. byte[] EventHandler_EventRaised(string eventMessage)
  51. {
  52. Debug.WriteLine(eventMessage);
  53. return null;
  54. }
  55. /// <summary>
  56. /// Event raised.
  57. /// </summary>
  58. /// <param name="eventMessage">The event message.</param>
  59. /// <returns></returns>
  60. byte[] PhotoEventHandler_EventRaised(string eventMessage)
  61. {
  62. Debug.WriteLine(eventMessage);
  63. return null;
  64. }
  65. /// <summary>
  66. /// Reverses the connection handler_ event raised.
  67. /// </summary>
  68. /// <param name="eventMessage">The event message.</param>
  69. /// <returns>Response</returns>
  70. byte[] ReverseConnectionHandler_EventRaised(string eventMessage)
  71. {
  72. if(eventMessage.Contains("GET /slideshows/1/assets/1"))
  73. {
  74. string body = Properties.Resources.SlideshowResponsePlist;
  75. string image = Convert.ToBase64String(File.ReadAllBytes(_photoList[_currentPhoto]));
  76. int photoNumber = _currentPhoto + 1;
  77. body = body.Replace("{1}", photoNumber.ToString());
  78. body = body.Replace("{0}", image);
  79. byte[] bodyData = System.Text.Encoding.ASCII.GetBytes(body);
  80. string response = "HTTP/1.1 200 OK\n" +
  81. "Content-Type: application/x-apple-binary-plist\n" +
  82. "Content-Length: " + bodyData.Length + "\n\n";
  83. byte[] byData = System.Text.Encoding.ASCII.GetBytes(response + body);
  84. _currentPhoto++;
  85. return byData;
  86. }
  87. else
  88. {
  89. return null;
  90. }
  91. }
  92. #endregion Constructor
  93. #region Methods
  94. public void Start()
  95. {
  96. int length = Encoding.ASCII.GetBytes(Properties.Resources.SlideshowPutPlist).Length;
  97. string request = "PUT /slideshows/1 HTTP/1.1\n" +
  98. "Content-Type: text/x-apple-plist+xml\n" +
  99. "Content-Length: " + length + "\n" +
  100. "User-Agent: MediaControl/1.0\n" +
  101. "X-Apple-Session-ID: " + _sessionGuid.ToString() + "\n\n";
  102. request += Properties.Resources.SlideshowPutPlist + "\n\n";
  103. using (TcpClient tcpClient = new TcpClient(_appleTvIpAddress, AppleTv.AppleTvPort))
  104. {
  105. byte[] byData = System.Text.Encoding.ASCII.GetBytes(request);
  106. //get the client stream to read data from.
  107. NetworkStream clientStream = tcpClient.GetStream();
  108. SendMessage(clientStream, request);
  109. byte[] buffer = new byte[10000];
  110. int recieved = clientStream.Read(buffer, 0, buffer.Length);
  111. string str = Encoding.ASCII.GetString(buffer, 0, recieved);
  112. //Now start doing a "keepalive"
  113. //while (true)
  114. //{
  115. // //Simply send the characters "ok" every two seconds
  116. // //Todo: Determine what the actual message that apple products send
  117. // //SendMessage(clientStream, "ok");
  118. // Thread.Sleep(1000);
  119. //}
  120. }
  121. }
  122. /// <summary>
  123. /// Sends a message across the NetworkStream
  124. /// </summary>
  125. /// <param name="clientStream">The stream to send the message down</param>
  126. /// <param name="message">The message to send</param>
  127. public void SendMessage(NetworkStream clientStream, string message)
  128. {
  129. byte[] buffer = new ASCIIEncoding().GetBytes(message);
  130. try
  131. {
  132. clientStream.Write(buffer, 0, buffer.Length);
  133. clientStream.Flush();
  134. }
  135. catch (System.IO.IOException e)
  136. {
  137. Debug.WriteLine("IOException: " + e.Message);
  138. }
  139. }
  140. #endregion Methods
  141. }
  142. }