/******************************************************************
*
* CyberUPnP for Java
*
* Copyright (C) Satoshi Konno 2002-2003
*
* File: SSDPSearchResponseSocketList.java
*
* Revision;
*
* 05/08/03
* - first revision.
* 05/28/03
* - Added post() to send a SSDPSearchRequest.
*
******************************************************************/
package org.cybergarage.upnp.ssdp;
import java.net.InetAddress;
import java.util.*;
import org.cybergarage.net.*;
import org.cybergarage.upnp.*;
public class SSDPSearchResponseSocketList extends Vector<SSDPSearchResponseSocket>
{
////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////
private InetAddress[] binds = null;
public SSDPSearchResponseSocketList() {
}
/**
*
* @param binds The host to bind.Use <tt>null</tt> for the default behavior
*/
public SSDPSearchResponseSocketList(InetAddress[] binds) {
this.binds = binds;
}
////////////////////////////////////////////////
// ControlPoint
////////////////////////////////////////////////
// ControlPoint
////////////////////////////////////////////////
public void setControlPoint(ControlPoint ctrlPoint)
{
int nSockets = size();
for (int n=0; n<nSockets; n++) {
SSDPSearchResponseSocket sock = getSSDPSearchResponseSocket(n);
sock.setControlPoint(ctrlPoint);
}
}
////////////////////////////////////////////////
// get
////////////////////////////////////////////////
public SSDPSearchResponseSocket getSSDPSearchResponseSocket(int n)
{
return (SSDPSearchResponseSocket)get(n);
}
////////////////////////////////////////////////
// Methods
////////////////////////////////////////////////
public boolean open(int port){
InetAddress[] binds=this.binds ;
String[] bindAddresses;
if(binds!=null){
bindAddresses = new String[binds.length];
for (int i = 0; i < binds.length; i++) {
bindAddresses[i] = binds[i].getHostAddress();
}
}else{
int nHostAddrs = HostInterface.getNHostAddresses();
bindAddresses = new String[nHostAddrs];
for (int n=0; n<nHostAddrs; n++) {
bindAddresses[n] = HostInterface.getHostAddress(n);
}
}
try {
for (int j = 0; j < bindAddresses.length; j++) {
SSDPSearchResponseSocket socket = new SSDPSearchResponseSocket(bindAddresses[j], port);
add(socket);
}
}catch (Exception e) {
stop();
close();
clear();
return false;
}
return true;
}
public boolean open()
{
return open(SSDP.PORT);
}
public void close()
{
int nSockets = size();
for (int n=0; n<nSockets; n++) {
SSDPSearchResponseSocket sock = getSSDPSearchResponseSocket(n);
sock.close();
}
clear();
}
////////////////////////////////////////////////
// Methods
////////////////////////////////////////////////
public void start()
{
int nSockets = size();
for (int n=0; n<nSockets; n++) {
SSDPSearchResponseSocket sock = getSSDPSearchResponseSocket(n);
sock.start();
}
}
public void stop()
{
int nSockets = size();
for (int n=0; n<nSockets; n++) {
SSDPSearchResponseSocket sock = getSSDPSearchResponseSocket(n);
sock.stop();
}
}
////////////////////////////////////////////////
// Methods
////////////////////////////////////////////////
public boolean post(SSDPSearchRequest req)
{
boolean ret = true;
int nSockets = size();
for (int n=0; n<nSockets; n++) {
SSDPSearchResponseSocket sock = getSSDPSearchResponseSocket(n);
String bindAddr = sock.getLocalAddress();
req.setLocalAddress(bindAddr);
String ssdpAddr = SSDP.ADDRESS;
if (HostInterface.isIPv6Address(bindAddr) == true)
ssdpAddr = SSDP.getIPv6Address();
//sock.joinGroup(ssdpAddr, SSDP.PORT, bindAddr);
if (sock.post(ssdpAddr, SSDP.PORT, req) == false)
ret = false;
//sock.leaveGroup(ssdpAddr, SSDP.PORT, bindAddr);
}
return ret;
}
}