/razpubs/src/org/cybergarage/upnp/ssdp/SSDPNotifySocket.java

http://razpub.googlecode.com/ · Java · 135 lines · 70 code · 26 blank · 39 comment · 12 complexity · 9e9eead131c8421174dfdd449d1ee2e1 MD5 · raw file

  1. /******************************************************************
  2. *
  3. * CyberUPnP for Java
  4. *
  5. * Copyright (C) Satoshi Konno 2002-2003
  6. *
  7. * File: SSDPNotifySocket.java
  8. *
  9. * Revision;
  10. *
  11. * 11/20/02
  12. * - first revision.
  13. * 05/13/03
  14. * - Added support for IPv6.
  15. * 02/20/04
  16. * - Inma Marin Lopez <inma@dif.um.es>
  17. * - Added a multicast filter using the SSDP pakcet.
  18. * 04/20/05
  19. * - Mikael Hakman <mhakman@dkab.net>
  20. * - Handle receive() returning null.
  21. * - Added close() in stop().
  22. *
  23. ******************************************************************/
  24. package org.cybergarage.upnp.ssdp;
  25. import java.net.*;
  26. import org.cybergarage.net.*;
  27. import org.cybergarage.util.*;
  28. import org.cybergarage.http.*;
  29. import org.cybergarage.upnp.*;
  30. public class SSDPNotifySocket extends HTTPMUSocket implements Runnable
  31. {
  32. private boolean useIPv6Address;
  33. ////////////////////////////////////////////////
  34. // Constructor
  35. ////////////////////////////////////////////////
  36. public SSDPNotifySocket(String bindAddr)
  37. {
  38. String addr = SSDP.ADDRESS;
  39. useIPv6Address = false;
  40. if (HostInterface.isIPv6Address(bindAddr) == true) {
  41. addr = SSDP.getIPv6Address();
  42. useIPv6Address = true;
  43. }
  44. open(addr, SSDP.PORT, bindAddr);
  45. setControlPoint(null);
  46. }
  47. ////////////////////////////////////////////////
  48. // ControlPoint
  49. ////////////////////////////////////////////////
  50. private ControlPoint controlPoint = null;
  51. public void setControlPoint(ControlPoint ctrlp)
  52. {
  53. this.controlPoint = ctrlp;
  54. }
  55. public ControlPoint getControlPoint()
  56. {
  57. return controlPoint;
  58. }
  59. ////////////////////////////////////////////////
  60. // post (SSDPNotifySocket)
  61. ////////////////////////////////////////////////
  62. public boolean post(SSDPNotifyRequest req)
  63. {
  64. String ssdpAddr = SSDP.ADDRESS;
  65. if (useIPv6Address == true)
  66. ssdpAddr = SSDP.getIPv6Address();
  67. req.setHost(ssdpAddr, SSDP.PORT);
  68. return post((HTTPRequest)req);
  69. }
  70. ////////////////////////////////////////////////
  71. // run
  72. ////////////////////////////////////////////////
  73. private Thread deviceNotifyThread = null;
  74. public void run()
  75. {
  76. Thread thisThread = Thread.currentThread();
  77. ControlPoint ctrlPoint = getControlPoint();
  78. while (deviceNotifyThread == thisThread) {
  79. Thread.yield();
  80. SSDPPacket packet = receive();
  81. // Thanks for Mikael Hakman (04/20/05)
  82. if (packet == null)
  83. continue;
  84. // Thanks for Inma (02/20/04)
  85. InetAddress maddr = getMulticastInetAddress();
  86. InetAddress pmaddr = packet.getHostInetAddress();
  87. if (maddr.equals(pmaddr) == false) {
  88. Debug.message("Invalidate Multicast Recieved : " + maddr + "," + pmaddr);
  89. continue;
  90. }
  91. if (ctrlPoint != null)
  92. ctrlPoint.notifyReceived(packet);
  93. }
  94. }
  95. public void start()
  96. {
  97. deviceNotifyThread = new Thread(this);
  98. /* RazvanCojocaru 2008-03: name the thread for debugging and daemonize it since they don't die easily*/
  99. deviceNotifyThread.setName("CyberSSDPNotify"+deviceNotifyThread.getName());
  100. deviceNotifyThread.setDaemon(true);
  101. deviceNotifyThread.start();
  102. }
  103. public void stop()
  104. {
  105. // Thanks for Mikael Hakman (04/20/05)
  106. close();
  107. deviceNotifyThread = null;
  108. }
  109. }