Fixed SSDP caching bug

This commit is contained in:
Ziver Koc 2015-11-11 13:26:14 +01:00
parent 611770fa1f
commit e2e6a40ce9

View file

@ -47,9 +47,10 @@ 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;
private HashMap<String, StandardSSDPInfo> services_usn; /** Map of all unique services received **/
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