/razpubs/src/org/cybergarage/upnp/ControlPoint.java

http://razpub.googlecode.com/ · Java · 929 lines · 610 code · 155 blank · 164 comment · 97 complexity · a247a5d75787a56d9ddb944b47a000e6 MD5 · raw file

  1. /******************************************************************
  2. *
  3. * CyberUPnP for Java
  4. *
  5. * Copyright (C) Satoshi Konno 2002-2004
  6. *
  7. * File: ControlPoint.java
  8. *
  9. * Revision:
  10. *
  11. * 11/18/02
  12. * - first revision.
  13. * 05/13/03
  14. * - Changed to create socket threads each local interfaces.
  15. * (HTTP, SSDPNotiry, SSDPSerachResponse)
  16. * 05/28/03
  17. * - Changed to send m-serach packets from SSDPSearchResponseSocket.
  18. * The socket doesn't bind interface address.
  19. * - SSDPSearchResponsSocketList that binds a port and a interface can't
  20. * send m-serch packets of IPv6 on J2SE v 1.4.1_02 and Redhat 9.
  21. * 07/23/03
  22. * - Suzan Foster (suislief)
  23. * - Fixed a bug. HOST field was missing.
  24. * 07/29/03
  25. * - Synchronized when a device is added by the ssdp message.
  26. * 09/08/03
  27. * - Giordano Sassaroli <sassarol@cefriel.it>
  28. * - Problem : when an event notification message is received and the message
  29. * contains updates on more than one variable, only the first variable update
  30. * is notified.
  31. * - Error : the other xml nodes of the message are ignored
  32. * - Fix : add two methods to the NotifyRequest for extracting the property array
  33. * and modify the httpRequestRecieved method in ControlPoint
  34. * 12/12/03
  35. * - Added a static() to initialize UPnP class.
  36. * 01/06/04
  37. * - Added the following methods to remove expired devices automatically
  38. * removeExpiredDevices()
  39. * setExpiredDeviceMonitoringInterval()/getExpiredDeviceMonitoringInterval()
  40. * setDeviceDisposer()/getDeviceDisposer()
  41. * 04/20/04
  42. * - Added the following methods.
  43. * start(String target, int mx) and start(String target).
  44. * 06/23/04
  45. * - Added setNMPRMode() and isNMPRMode().
  46. * 07/08/04
  47. * - Added renewSubscriberService().
  48. * - Changed start() to create renew subscriber thread when the NMPR mode is true.
  49. * 08/17/04
  50. * - Fixed removeExpiredDevices() to remove using the device array.
  51. * 10/16/04
  52. * - Oliver Newell <newell@media-rush.com>
  53. * - Added this class to allow ControlPoint applications to be notified when
  54. * the ControlPoint base class adds/removes a UPnP device
  55. * 03/30/05
  56. * - Changed addDevice() to use Parser::parse(URL).
  57. *
  58. *******************************************************************/
  59. package org.cybergarage.upnp;
  60. import org.cybergarage.net.*;
  61. import org.cybergarage.util.*;
  62. import org.cybergarage.xml.*;
  63. import org.cybergarage.http.*;
  64. import org.cybergarage.upnp.control.*;
  65. import org.cybergarage.upnp.ssdp.*;
  66. import org.cybergarage.upnp.device.*;
  67. import org.cybergarage.upnp.event.*;
  68. import com.razie.pub.base.log.Log;
  69. import java.net.*;
  70. public class ControlPoint implements HTTPRequestListener
  71. {
  72. private final static int DEFAULT_EVENTSUB_PORT = 8058;
  73. private final static int DEFAULT_SSDP_PORT = 8008;
  74. private final static int DEFAULT_EXPIRED_DEVICE_MONITORING_INTERVAL = 60;
  75. private final static String DEFAULT_EVENTSUB_URI = "/evetSub";
  76. ////////////////////////////////////////////////
  77. // Member
  78. ////////////////////////////////////////////////
  79. private SSDPNotifySocketList ssdpNotifySocketList;
  80. private SSDPSearchResponseSocketList ssdpSearchResponseSocketList;
  81. private SSDPNotifySocketList getSSDPNotifySocketList()
  82. {
  83. return ssdpNotifySocketList;
  84. }
  85. private SSDPSearchResponseSocketList getSSDPSearchResponseSocketList()
  86. {
  87. return ssdpSearchResponseSocketList;
  88. }
  89. ////////////////////////////////////////////////
  90. // Initialize
  91. ////////////////////////////////////////////////
  92. static
  93. {
  94. UPnP.initialize();
  95. }
  96. ////////////////////////////////////////////////
  97. // Constructor
  98. ////////////////////////////////////////////////
  99. public ControlPoint(int ssdpPort, int httpPort)
  100. {
  101. ssdpNotifySocketList = new SSDPNotifySocketList();
  102. ssdpSearchResponseSocketList = new SSDPSearchResponseSocketList();
  103. setSSDPPort(ssdpPort);
  104. setHTTPPort(httpPort);
  105. setDeviceDisposer(null);
  106. setExpiredDeviceMonitoringInterval(DEFAULT_EXPIRED_DEVICE_MONITORING_INTERVAL);
  107. setRenewSubscriber(null);
  108. setNMPRMode(false);
  109. setRenewSubscriber(null);
  110. }
  111. public ControlPoint()
  112. {
  113. this(DEFAULT_SSDP_PORT, DEFAULT_EVENTSUB_PORT);
  114. }
  115. public void finalize()
  116. {
  117. stop();
  118. }
  119. ////////////////////////////////////////////////
  120. // Mutex
  121. ////////////////////////////////////////////////
  122. private Mutex mutex = new Mutex();
  123. public void lock()
  124. {
  125. mutex.lock();
  126. }
  127. public void unlock()
  128. {
  129. mutex.unlock();
  130. }
  131. ////////////////////////////////////////////////
  132. // Port (SSDP)
  133. ////////////////////////////////////////////////
  134. private int ssdpPort = 0;
  135. public int getSSDPPort() {
  136. return ssdpPort;
  137. }
  138. public void setSSDPPort(int port) {
  139. ssdpPort = port;
  140. }
  141. ////////////////////////////////////////////////
  142. // Port (EventSub)
  143. ////////////////////////////////////////////////
  144. private int httpPort = 0;
  145. public int getHTTPPort() {
  146. return httpPort;
  147. }
  148. public void setHTTPPort(int port) {
  149. httpPort = port;
  150. }
  151. ////////////////////////////////////////////////
  152. // NMPR
  153. ////////////////////////////////////////////////
  154. private boolean nmprMode;
  155. public void setNMPRMode(boolean flag)
  156. {
  157. nmprMode = flag;
  158. }
  159. public boolean isNMPRMode()
  160. {
  161. return nmprMode;
  162. }
  163. ////////////////////////////////////////////////
  164. // Device List
  165. ////////////////////////////////////////////////
  166. private NodeList devNodeList = new NodeList();
  167. private void addDevice(Node rootNode)
  168. {
  169. devNodeList.add(rootNode);
  170. }
  171. private synchronized void addDevice(SSDPPacket ssdpPacket)
  172. {
  173. if (ssdpPacket.isRootDevice() == false)
  174. return;
  175. String usn = ssdpPacket.getUSN();
  176. String udn = USN.getUDN(usn);
  177. Device dev = getDevice(udn);
  178. if (dev != null) {
  179. dev.setSSDPPacket(ssdpPacket);
  180. return;
  181. }
  182. String location = ssdpPacket.getLocation();
  183. // vvvvv Razie
  184. if (location.contains("http://[")) {
  185. // TODO ipv6 support
  186. Log.alarmOnce("ERROR_UPNP_IPV6NOTSUPPORTED",
  187. "ERROR_UPNP_IPV6NOTSUPPORTED You have IPV6 UPNP notifications - DON't SUPPRT IPV6 yet... " + location);
  188. Log.traceThis("ERROR_UPNP_IPV6NOTSUPPORTED can't reach mutant's descrition at " + location);
  189. } else
  190. // ^^^^^^ Razie
  191. try {
  192. URL locationUrl = new URL(location);
  193. Parser parser = UPnP.getXMLParser();
  194. Node rootNode = parser.parse(locationUrl);
  195. Device rootDev = getDevice(rootNode);
  196. if (rootDev == null)
  197. return;
  198. rootDev.setSSDPPacket(ssdpPacket);
  199. addDevice(rootNode);
  200. // Thanks for Oliver Newell (2004/10/16)
  201. // After node is added, invoke the AddDeviceListener to notify high-level
  202. // control point application that a new device has been added. (The
  203. // control point application must implement the DeviceChangeListener interface
  204. // to receive the notifications)
  205. performAddDeviceListener( rootDev );
  206. }
  207. catch (MalformedURLException me) {
  208. Debug.warning(ssdpPacket.toString());
  209. Debug.warning(me);
  210. }
  211. catch (ParserException pe) {
  212. Debug.warning(ssdpPacket.toString());
  213. Debug.warning(pe);
  214. }
  215. }
  216. private Device getDevice(Node rootNode)
  217. {
  218. if (rootNode == null)
  219. return null;
  220. Node devNode = rootNode.getNode(Device.ELEM_NAME);
  221. if (devNode == null)
  222. return null;
  223. return new Device(rootNode, devNode);
  224. }
  225. public DeviceList getDeviceList()
  226. {
  227. DeviceList devList = new DeviceList();
  228. int nRoots = devNodeList.size();
  229. for (int n=0; n<nRoots; n++) {
  230. Node rootNode = devNodeList.getNode(n);
  231. Device dev = getDevice(rootNode);
  232. if (dev == null)
  233. continue;
  234. devList.add(dev);
  235. }
  236. return devList;
  237. }
  238. public Device getDevice(String name)
  239. {
  240. int nRoots = devNodeList.size();
  241. for (int n=0; n<nRoots; n++) {
  242. Node rootNode = devNodeList.getNode(n);
  243. Device dev = getDevice(rootNode);
  244. if (dev == null)
  245. continue;
  246. if (dev.isDevice(name) == true)
  247. return dev;
  248. Device cdev = dev.getDevice(name);
  249. if (cdev != null)
  250. return cdev;
  251. }
  252. return null;
  253. }
  254. public boolean hasDevice(String name)
  255. {
  256. return (getDevice(name) != null) ? true : false;
  257. }
  258. private void removeDevice(Node rootNode)
  259. {
  260. // Thanks for Oliver Newell (2004/10/16)
  261. // Invoke device removal listener prior to actual removal so Device node
  262. // remains valid for the duration of the listener (application may want
  263. // to access the node)
  264. Device dev = getDevice(rootNode);
  265. if( dev != null && dev.isRootDevice() )
  266. performRemoveDeviceListener( dev );
  267. devNodeList.remove(rootNode);
  268. }
  269. private void removeDevice(Device dev)
  270. {
  271. if (dev == null)
  272. return;
  273. removeDevice(dev.getRootNode());
  274. }
  275. private void removeDevice(String name)
  276. {
  277. Device dev = getDevice(name);
  278. removeDevice(dev);
  279. }
  280. private void removeDevice(SSDPPacket packet)
  281. {
  282. if (packet.isByeBye() == false)
  283. return;
  284. String usn = packet.getUSN();
  285. String udn = USN.getUDN(usn);
  286. removeDevice(udn);
  287. }
  288. ////////////////////////////////////////////////
  289. // Expired Device
  290. ////////////////////////////////////////////////
  291. private Disposer deviceDisposer;
  292. private long expiredDeviceMonitoringInterval;
  293. public void removeExpiredDevices()
  294. {
  295. DeviceList devList = getDeviceList();
  296. int devCnt = devList.size();
  297. Device dev[] = new Device[devCnt];
  298. for (int n=0; n<devCnt; n++)
  299. dev[n] = devList.getDevice(n);
  300. for (int n=0; n<devCnt; n++) {
  301. if (dev[n].isExpired() == true) {
  302. Debug.message("Expired device = " + dev[n].getFriendlyName());
  303. removeDevice(dev[n]);
  304. }
  305. }
  306. }
  307. public void setExpiredDeviceMonitoringInterval(long interval)
  308. {
  309. expiredDeviceMonitoringInterval = interval;
  310. }
  311. public long getExpiredDeviceMonitoringInterval()
  312. {
  313. return expiredDeviceMonitoringInterval;
  314. }
  315. public void setDeviceDisposer(Disposer disposer)
  316. {
  317. deviceDisposer = disposer;
  318. }
  319. public Disposer getDeviceDisposer()
  320. {
  321. return deviceDisposer;
  322. }
  323. ////////////////////////////////////////////////
  324. // Notify
  325. ////////////////////////////////////////////////
  326. private ListenerList deviceNotifyListenerList = new ListenerList();
  327. public void addNotifyListener(NotifyListener listener)
  328. {
  329. deviceNotifyListenerList.add(listener);
  330. }
  331. public void removeNotifyListener(NotifyListener listener)
  332. {
  333. deviceNotifyListenerList.remove(listener);
  334. }
  335. public void performNotifyListener(SSDPPacket ssdpPacket)
  336. {
  337. int listenerSize = deviceNotifyListenerList.size();
  338. for (int n=0; n<listenerSize; n++) {
  339. NotifyListener listener = (NotifyListener)deviceNotifyListenerList.get(n);
  340. listener.deviceNotifyReceived(ssdpPacket);
  341. }
  342. }
  343. ////////////////////////////////////////////////
  344. // SearchResponse
  345. ////////////////////////////////////////////////
  346. private ListenerList deviceSearchResponseListenerList = new ListenerList();
  347. public void addSearchResponseListener(SearchResponseListener listener)
  348. {
  349. deviceSearchResponseListenerList.add(listener);
  350. }
  351. public void removeSearchResponseListener(SearchResponseListener listener)
  352. {
  353. deviceSearchResponseListenerList.remove(listener);
  354. }
  355. public void performSearchResponseListener(SSDPPacket ssdpPacket)
  356. {
  357. int listenerSize = deviceSearchResponseListenerList.size();
  358. for (int n=0; n<listenerSize; n++) {
  359. SearchResponseListener listener = (SearchResponseListener)deviceSearchResponseListenerList.get(n);
  360. listener.deviceSearchResponseReceived(ssdpPacket);
  361. }
  362. }
  363. /////////////////////////////////////////////////////////////////////
  364. // Device status changes (device added or removed)
  365. // Applications that support the DeviceChangeListener interface are
  366. // notified immediately when a device is added to, or removed from,
  367. // the control point.
  368. /////////////////////////////////////////////////////////////////////
  369. ListenerList deviceChangeListenerList = new ListenerList();
  370. public void addDeviceChangeListener(DeviceChangeListener listener)
  371. {
  372. deviceChangeListenerList.add(listener);
  373. }
  374. public void removeDeviceChangeListener(DeviceChangeListener listener)
  375. {
  376. deviceChangeListenerList.remove(listener);
  377. }
  378. public void performAddDeviceListener( Device dev )
  379. {
  380. int listenerSize = deviceChangeListenerList.size();
  381. for (int n=0; n<listenerSize; n++) {
  382. DeviceChangeListener listener = (DeviceChangeListener)deviceChangeListenerList.get(n);
  383. listener.deviceAdded( dev );
  384. }
  385. }
  386. public void performRemoveDeviceListener( Device dev )
  387. {
  388. int listenerSize = deviceChangeListenerList.size();
  389. for (int n=0; n<listenerSize; n++) {
  390. DeviceChangeListener listener = (DeviceChangeListener)deviceChangeListenerList.get(n);
  391. listener.deviceRemoved( dev );
  392. }
  393. }
  394. ////////////////////////////////////////////////
  395. // SSDPPacket
  396. ////////////////////////////////////////////////
  397. public void notifyReceived(SSDPPacket packet)
  398. {
  399. if (packet.isRootDevice() == true) {
  400. if (packet.isAlive() == true)
  401. addDevice(packet);
  402. if (packet.isByeBye() == true)
  403. removeDevice(packet);
  404. }
  405. performNotifyListener(packet);
  406. }
  407. public void searchResponseReceived(SSDPPacket packet)
  408. {
  409. if (packet.isRootDevice() == true)
  410. addDevice(packet);
  411. performSearchResponseListener(packet);
  412. }
  413. ////////////////////////////////////////////////
  414. // M-SEARCH
  415. ////////////////////////////////////////////////
  416. private int searchMx = SSDP.DEFAULT_MSEARCH_MX;
  417. public int getSearchMx()
  418. {
  419. return searchMx;
  420. }
  421. public void setSearchMx(int mx)
  422. {
  423. searchMx = mx;
  424. }
  425. public void search(String target, int mx)
  426. {
  427. SSDPSearchRequest msReq = new SSDPSearchRequest(target, mx);
  428. SSDPSearchResponseSocketList ssdpSearchResponseSocketList = getSSDPSearchResponseSocketList();
  429. ssdpSearchResponseSocketList.post(msReq);
  430. }
  431. public void search(String target)
  432. {
  433. search(target, SSDP.DEFAULT_MSEARCH_MX);
  434. }
  435. public void search()
  436. {
  437. search(ST.ROOT_DEVICE, SSDP.DEFAULT_MSEARCH_MX);
  438. }
  439. ////////////////////////////////////////////////
  440. // EventSub HTTPServer
  441. ////////////////////////////////////////////////
  442. private HTTPServerList httpServerList = new HTTPServerList();
  443. private HTTPServerList getHTTPServerList()
  444. {
  445. return httpServerList;
  446. }
  447. public void httpRequestRecieved(HTTPRequest httpReq)
  448. {
  449. if (Debug.isOn() == true)
  450. httpReq.print();
  451. // Thanks for Giordano Sassaroli <sassarol@cefriel.it> (09/08/03)
  452. if (httpReq.isNotifyRequest() == true) {
  453. NotifyRequest notifyReq = new NotifyRequest(httpReq);
  454. String uuid = notifyReq.getSID();
  455. long seq = notifyReq.getSEQ();
  456. PropertyList props = notifyReq.getPropertyList();
  457. int propCnt = props.size();
  458. for (int n = 0; n < propCnt; n++) {
  459. Property prop = props.getProperty(n);
  460. String varName = prop.getName();
  461. String varValue = prop.getValue();
  462. performEventListener(uuid, seq, varName, varValue);
  463. }
  464. httpReq.returnOK();
  465. return;
  466. }
  467. httpReq.returnBadRequest();
  468. }
  469. ////////////////////////////////////////////////
  470. // Event Listener
  471. ////////////////////////////////////////////////
  472. private ListenerList eventListenerList = new ListenerList();
  473. public void addEventListener(EventListener listener)
  474. {
  475. eventListenerList.add(listener);
  476. }
  477. public void removeEventListener(EventListener listener)
  478. {
  479. eventListenerList.remove(listener);
  480. }
  481. public void performEventListener(String uuid, long seq, String name, String value)
  482. {
  483. int listenerSize = eventListenerList.size();
  484. for (int n=0; n<listenerSize; n++) {
  485. EventListener listener = (EventListener)eventListenerList.get(n);
  486. listener.eventNotifyReceived(uuid, seq, name, value);
  487. }
  488. }
  489. ////////////////////////////////////////////////
  490. // Subscription
  491. ////////////////////////////////////////////////
  492. private String eventSubURI = DEFAULT_EVENTSUB_URI;
  493. public String getEventSubURI()
  494. {
  495. return eventSubURI;
  496. }
  497. public void setEventSubURI(String url)
  498. {
  499. eventSubURI = url;
  500. }
  501. private String getEventSubCallbackURL(String host)
  502. {
  503. return HostInterface.getHostURL(host, getHTTPPort(), getEventSubURI());
  504. }
  505. public boolean subscribe(Service service, long timeout)
  506. {
  507. if (service.isSubscribed() == true) {
  508. String sid = service.getSID();
  509. return subscribe(service, sid, timeout);
  510. }
  511. Device rootDev = service.getRootDevice();
  512. if (rootDev == null)
  513. return false;
  514. String ifAddress = rootDev.getInterfaceAddress();
  515. SubscriptionRequest subReq = new SubscriptionRequest();
  516. subReq.setSubscribeRequest(service, getEventSubCallbackURL(ifAddress), timeout);
  517. SubscriptionResponse subRes = subReq.post();
  518. if (subRes.isSuccessful() == true) {
  519. service.setSID(subRes.getSID());
  520. service.setTimeout(subRes.getTimeout());
  521. return true;
  522. }
  523. service.clearSID();
  524. return false;
  525. }
  526. public boolean subscribe(Service service)
  527. {
  528. return subscribe(service, Subscription.INFINITE_VALUE);
  529. }
  530. public boolean subscribe(Service service, String uuid, long timeout)
  531. {
  532. SubscriptionRequest subReq = new SubscriptionRequest();
  533. subReq.setRenewRequest(service, uuid, timeout);
  534. if (Debug.isOn() == true)
  535. subReq.print();
  536. SubscriptionResponse subRes = subReq.post();
  537. if (Debug.isOn() == true)
  538. subRes.print();
  539. if (subRes.isSuccessful() == true) {
  540. service.setSID(subRes.getSID());
  541. service.setTimeout(subRes.getTimeout());
  542. return true;
  543. }
  544. service.clearSID();
  545. return false;
  546. }
  547. public boolean subscribe(Service service, String uuid)
  548. {
  549. return subscribe(service, uuid, Subscription.INFINITE_VALUE);
  550. }
  551. public boolean isSubscribed(Service service)
  552. {
  553. if (service == null)
  554. return false;
  555. return service.isSubscribed();
  556. }
  557. public boolean unsubscribe(Service service)
  558. {
  559. SubscriptionRequest subReq = new SubscriptionRequest();
  560. subReq.setUnsubscribeRequest(service);
  561. SubscriptionResponse subRes = subReq.post();
  562. if (subRes.isSuccessful() == true) {
  563. service.clearSID();
  564. return true;
  565. }
  566. return false;
  567. }
  568. public void unsubscribe(Device device)
  569. {
  570. ServiceList serviceList = device.getServiceList();
  571. int serviceCnt = serviceList.size();
  572. for (int n=0; n<serviceCnt; n++) {
  573. Service service = serviceList.getService(n);
  574. if (service.hasSID() == true)
  575. unsubscribe(service);
  576. }
  577. DeviceList childDevList = device.getDeviceList();
  578. int childDevCnt = childDevList.size();
  579. for (int n=0; n<childDevCnt; n++) {
  580. Device cdev = childDevList.getDevice(n);
  581. unsubscribe(cdev);
  582. }
  583. }
  584. public void unsubscribe()
  585. {
  586. DeviceList devList = getDeviceList();
  587. int devCnt = devList.size();
  588. for (int n=0; n<devCnt; n++) {
  589. Device dev = devList.getDevice(n);
  590. unsubscribe(dev);
  591. }
  592. }
  593. ////////////////////////////////////////////////
  594. // getSubscriberService
  595. ////////////////////////////////////////////////
  596. public Service getSubscriberService(String uuid)
  597. {
  598. DeviceList devList = getDeviceList();
  599. int devCnt = devList.size();
  600. for (int n=0; n<devCnt; n++) {
  601. Device dev = devList.getDevice(n);
  602. Service service = dev.getSubscriberService(uuid);
  603. if (service != null)
  604. return service;
  605. }
  606. return null;
  607. }
  608. ////////////////////////////////////////////////
  609. // getSubscriberService
  610. ////////////////////////////////////////////////
  611. public void renewSubscriberService(Device dev, long timeout)
  612. {
  613. ServiceList serviceList = dev.getServiceList();
  614. int serviceCnt = serviceList.size();
  615. for (int n=0; n<serviceCnt; n++) {
  616. Service service = serviceList.getService(n);
  617. if (service.isSubscribed() == false)
  618. continue;
  619. String sid = service.getSID();
  620. boolean isRenewed = subscribe(service, sid, timeout);
  621. if (isRenewed == false)
  622. subscribe(service, timeout);
  623. }
  624. DeviceList cdevList = dev.getDeviceList();
  625. int cdevCnt = cdevList.size();
  626. for (int n=0; n<cdevCnt; n++) {
  627. Device cdev = cdevList.getDevice(n);
  628. renewSubscriberService(cdev, timeout);
  629. }
  630. }
  631. public void renewSubscriberService(long timeout)
  632. {
  633. DeviceList devList = getDeviceList();
  634. int devCnt = devList.size();
  635. for (int n=0; n<devCnt; n++) {
  636. Device dev = devList.getDevice(n);
  637. renewSubscriberService(dev, timeout);
  638. }
  639. }
  640. public void renewSubscriberService()
  641. {
  642. renewSubscriberService(Subscription.INFINITE_VALUE);
  643. }
  644. ////////////////////////////////////////////////
  645. // Subscriber
  646. ////////////////////////////////////////////////
  647. private RenewSubscriber renewSubscriber;
  648. public void setRenewSubscriber(RenewSubscriber sub)
  649. {
  650. renewSubscriber = sub;
  651. }
  652. public RenewSubscriber getRenewSubscriber()
  653. {
  654. return renewSubscriber;
  655. }
  656. ////////////////////////////////////////////////
  657. // run
  658. ////////////////////////////////////////////////
  659. public boolean start(String target, int mx)
  660. {
  661. stop();
  662. ////////////////////////////////////////
  663. // HTTP Server
  664. ////////////////////////////////////////
  665. int retryCnt = 0;
  666. int bindPort = getHTTPPort();
  667. HTTPServerList httpServerList = getHTTPServerList();
  668. while (httpServerList.open(bindPort) == false) {
  669. retryCnt++;
  670. if (UPnP.SERVER_RETRY_COUNT < retryCnt)
  671. return false;
  672. setHTTPPort(bindPort + 1);
  673. bindPort = getHTTPPort();
  674. }
  675. httpServerList.addRequestListener(this);
  676. httpServerList.start();
  677. ////////////////////////////////////////
  678. // Notify Socket
  679. ////////////////////////////////////////
  680. SSDPNotifySocketList ssdpNotifySocketList = getSSDPNotifySocketList();
  681. if (ssdpNotifySocketList.open() == false)
  682. return false;
  683. ssdpNotifySocketList.setControlPoint(this);
  684. ssdpNotifySocketList.start();
  685. ////////////////////////////////////////
  686. // SeachResponse Socket
  687. ////////////////////////////////////////
  688. int ssdpPort = getSSDPPort();
  689. retryCnt = 0;
  690. SSDPSearchResponseSocketList ssdpSearchResponseSocketList = getSSDPSearchResponseSocketList();
  691. while (ssdpSearchResponseSocketList.open(ssdpPort) == false) {
  692. retryCnt++;
  693. if (UPnP.SERVER_RETRY_COUNT < retryCnt)
  694. return false;
  695. setSSDPPort(ssdpPort + 1);
  696. ssdpPort = getSSDPPort();
  697. }
  698. ssdpSearchResponseSocketList.setControlPoint(this);
  699. ssdpSearchResponseSocketList.start();
  700. ////////////////////////////////////////
  701. // search root devices
  702. ////////////////////////////////////////
  703. search(target, mx);
  704. ////////////////////////////////////////
  705. // Disposer
  706. ////////////////////////////////////////
  707. Disposer disposer = new Disposer(this);
  708. setDeviceDisposer(disposer);
  709. disposer.start();
  710. ////////////////////////////////////////
  711. // Subscriber
  712. ////////////////////////////////////////
  713. if (isNMPRMode() == true) {
  714. RenewSubscriber renewSub = new RenewSubscriber(this);
  715. setRenewSubscriber(renewSub);
  716. renewSub.start();
  717. }
  718. return true;
  719. }
  720. public boolean start(String target)
  721. {
  722. return start(target, SSDP.DEFAULT_MSEARCH_MX);
  723. }
  724. public boolean start()
  725. {
  726. return start(ST.ROOT_DEVICE, SSDP.DEFAULT_MSEARCH_MX);
  727. }
  728. public boolean stop()
  729. {
  730. unsubscribe();
  731. SSDPNotifySocketList ssdpNotifySocketList = getSSDPNotifySocketList();
  732. ssdpNotifySocketList.stop();
  733. ssdpNotifySocketList.close();
  734. ssdpNotifySocketList.clear();
  735. SSDPSearchResponseSocketList ssdpSearchResponseSocketList = getSSDPSearchResponseSocketList();
  736. ssdpSearchResponseSocketList.stop();
  737. ssdpSearchResponseSocketList.close();
  738. ssdpSearchResponseSocketList.clear();
  739. HTTPServerList httpServerList = getHTTPServerList();
  740. httpServerList.stop();
  741. httpServerList.close();
  742. httpServerList.clear();
  743. ////////////////////////////////////////
  744. // Disposer
  745. ////////////////////////////////////////
  746. Disposer disposer = getDeviceDisposer();
  747. if (disposer != null) {
  748. disposer.stop();
  749. setDeviceDisposer(null);
  750. }
  751. ////////////////////////////////////////
  752. // Subscriber
  753. ////////////////////////////////////////
  754. RenewSubscriber renewSub = getRenewSubscriber();
  755. if (renewSub != null) {
  756. renewSub.stop();
  757. setRenewSubscriber(null);
  758. }
  759. return true;
  760. }
  761. ////////////////////////////////////////////////
  762. // print
  763. ////////////////////////////////////////////////
  764. public void print()
  765. {
  766. DeviceList devList = getDeviceList();
  767. int devCnt = devList.size();
  768. Debug.message("Device Num = " + devCnt);
  769. for (int n=0; n<devCnt; n++) {
  770. Device dev = devList.getDevice(n);
  771. Debug.message("[" + n + "] " + dev.getFriendlyName() + ", " + dev.getLeaseTime() + ", " + dev.getElapsedTime());
  772. }
  773. }
  774. }