Fixed SSDP caching bug
This commit is contained in:
parent
611770fa1f
commit
e2e6a40ce9
1 changed files with 30 additions and 19 deletions
|
|
@ -47,8 +47,9 @@ import java.util.logging.Logger;
|
||||||
*/
|
*/
|
||||||
public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetworkThread{
|
public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetworkThread{
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
// Contains all the received services
|
/** Mapping of search targets and list of associated services **/
|
||||||
private HashMap<String, LinkedList<StandardSSDPInfo>> services_st;
|
private HashMap<String, LinkedList<StandardSSDPInfo>> services_st;
|
||||||
|
/** Map of all unique services received **/
|
||||||
private HashMap<String, StandardSSDPInfo> services_usn;
|
private HashMap<String, StandardSSDPInfo> services_usn;
|
||||||
|
|
||||||
private SSDPServiceListener listener;
|
private SSDPServiceListener listener;
|
||||||
|
|
@ -71,7 +72,7 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
||||||
/**
|
/**
|
||||||
* Sends an request for an service
|
* Sends an request for an service
|
||||||
*
|
*
|
||||||
* @param st is the SearchTarget of the service
|
* @param searchTarget is the SearchTarget of the service
|
||||||
*
|
*
|
||||||
* ***** REQUEST:
|
* ***** REQUEST:
|
||||||
* M-SEARCH * HTTP/1.1
|
* M-SEARCH * HTTP/1.1
|
||||||
|
|
@ -81,20 +82,18 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
||||||
* MX: 3
|
* MX: 3
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void requestService(String st){
|
public void requestService(String searchTarget){
|
||||||
requestService(st, null);
|
requestService(searchTarget, null);
|
||||||
}
|
}
|
||||||
public void requestService(String st, HashMap<String,String> headers){
|
public void requestService(String searchTarget, HashMap<String,String> headers){
|
||||||
try {
|
try {
|
||||||
services_st.put( st, new LinkedList<StandardSSDPInfo>() );
|
|
||||||
|
|
||||||
// Generate an SSDP discover message
|
// Generate an SSDP discover message
|
||||||
StringOutputStream msg = new StringOutputStream();
|
StringOutputStream msg = new StringOutputStream();
|
||||||
HttpPrintStream http = new HttpPrintStream( msg, HttpPrintStream.HttpMessageType.REQUEST );
|
HttpPrintStream http = new HttpPrintStream( msg, HttpPrintStream.HttpMessageType.REQUEST );
|
||||||
http.setRequestType("M-SEARCH");
|
http.setRequestType("M-SEARCH");
|
||||||
http.setRequestURL("*");
|
http.setRequestURL("*");
|
||||||
http.setHeader("Host", SSDPServer.SSDP_MULTICAST_ADDR+":"+SSDPServer.SSDP_PORT );
|
http.setHeader("Host", SSDPServer.SSDP_MULTICAST_ADDR +":"+ SSDPServer.SSDP_PORT );
|
||||||
http.setHeader("ST", st );
|
http.setHeader("ST", searchTarget );
|
||||||
http.setHeader("Man", "\"ssdp:discover\"" );
|
http.setHeader("Man", "\"ssdp:discover\"" );
|
||||||
http.setHeader("MX", "3" );
|
http.setHeader("MX", "3" );
|
||||||
if(headers != null) {
|
if(headers != null) {
|
||||||
|
|
@ -128,22 +127,24 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
||||||
* Returns a list of received services by
|
* Returns a list of received services by
|
||||||
* the given search target.
|
* the given search target.
|
||||||
*
|
*
|
||||||
* @param st is the search target
|
* @param searchTarget is the search target
|
||||||
* @return a list of received services
|
* @return a list of received services
|
||||||
*/
|
*/
|
||||||
public LinkedList<StandardSSDPInfo> getServices(String st){
|
public LinkedList<StandardSSDPInfo> getServices(String searchTarget){
|
||||||
return services_st.get( st );
|
if(services_st.get(searchTarget) == null)
|
||||||
|
return new LinkedList<>();
|
||||||
|
return services_st.get(searchTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the amount of services in the search target
|
* Returns the amount of services in the search target
|
||||||
*
|
*
|
||||||
* @param st is the search target
|
* @param searchTarget is the search target
|
||||||
* @return the amount of services
|
* @return the amount of services cached
|
||||||
*/
|
*/
|
||||||
public int getServicesCount(String st){
|
public int getServicesCount(String searchTarget){
|
||||||
if( services_st.containsKey( st ) ){
|
if(services_st.containsKey(searchTarget)){
|
||||||
return services_st.get( st ).size();
|
return services_st.get(searchTarget).size();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -151,7 +152,7 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
||||||
/**
|
/**
|
||||||
* Returns a service with the given USN.
|
* Returns a service with the given USN.
|
||||||
*
|
*
|
||||||
* @param usn is the unique identifier for the service
|
* @param usn is the unique identifier for a service
|
||||||
* @return an service, null if there is no such service
|
* @return an service, null if there is no such service
|
||||||
*/
|
*/
|
||||||
public StandardSSDPInfo getService(String usn){
|
public StandardSSDPInfo getService(String usn){
|
||||||
|
|
@ -165,6 +166,16 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
||||||
services_usn.clear();
|
services_usn.clear();
|
||||||
services_st.clear();
|
services_st.clear();
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Clears all services matching the search target
|
||||||
|
*/
|
||||||
|
public void clearServices(String st){
|
||||||
|
if(services_st.get(st) != null) {
|
||||||
|
for (StandardSSDPInfo service : services_st.get(st)) {
|
||||||
|
services_usn.remove(service.getUSN());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits for responses
|
* Waits for responses
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue