public static boolean isUpnpControllable(String uuid) {
   // Disable manually for Panasonic TVs since they lie
   if (rendererMap.containsKey(uuid)
       && !getDeviceDetailsString(getDevice(uuid)).contains("VIERA")) {
     return rendererMap.get(uuid, "0").controls != 0;
   }
   return false;
 }
 protected void rendererUpdated(Device d) {
   String uuid = getUUID(d);
   if (rendererMap.containsKey(uuid)) {
     if (rendererMap.get(uuid, "0").needsRenewal()) {
       LOGGER.debug("Renewing subscriptions to ", getFriendlyName(d));
       subscribeAll(d, uuid);
     }
     rendererMap.mark(uuid, ACTIVE, true);
   }
 }
 @Override
 public void eventReceived(GENASubscription subscription) {
   rendererMap.mark(uuid, ACTIVE, true);
   if (subscription.getCurrentValues().containsKey("LastChange")) {
     xml2d(uuid, subscription.getCurrentValues().get("LastChange").toString(), null);
   }
 }
 protected void subscribeAll(Device d, String uuid) {
   String name = getFriendlyName(d);
   int ctrl = 0;
   for (Service s : d.getServices()) {
     String sid = s.getServiceId().getId();
     LOGGER.debug("Subscribing to " + sid + " service on " + name);
     if (sid.contains("AVTransport")) {
       ctrl |= AVT;
     } else if (sid.contains("RenderingControl")) {
       ctrl |= RC;
     }
     upnpService.getControlPoint().execute(new SubscriptionCB(s));
   }
   rendererMap.mark(uuid, RENEW, false);
   rendererMap.mark(uuid, CONTROLS, ctrl);
 }
 public static synchronized void xml2d(String uuid, String xml, Renderer item) {
   try {
     Document doc = db.parse(new ByteArrayInputStream(xml.getBytes()));
     //			doc.getDocumentElement().normalize();
     NodeList ids = doc.getElementsByTagName("InstanceID");
     for (int i = 0; i < ids.getLength(); i++) {
       NodeList c = ids.item(i).getChildNodes();
       String id = ((Element) ids.item(i)).getAttribute("val");
       //				if (DEBUG) LOGGER.debug("InstanceID: " + id);
       if (item == null) {
         item = rendererMap.get(uuid, id);
       }
       item.data.put("InstanceID", id);
       for (int n = 0; n < c.getLength(); n++) {
         if (c.item(n).getNodeType() != Node.ELEMENT_NODE) {
           //						LOGGER.debug("skip this " + c.item(n));
           continue;
         }
         Element e = (Element) c.item(n);
         String name = e.getTagName();
         String val = e.getAttribute("val");
         if (DEBUG) {
           LOGGER.debug(name + ": " + val);
         }
         item.data.put(name, val);
       }
       item.alert();
     }
   } catch (Exception e) {
     LOGGER.debug("Error parsing xml: " + e);
   }
 }
 protected synchronized boolean addRenderer(Device d) {
   if (d != null) {
     String uuid = getUUID(d);
     if (isMediaRenderer(d) && rendererFound(d, uuid) != null) {
       LOGGER.debug("Adding device: {} {}", d.getType(), d.toString());
       rendererMap.mark(uuid, ACTIVE, true);
       subscribeAll(d, uuid);
       rendererReady(uuid);
       return true;
     }
   }
   return false;
 }
 @Override
 public void ended(GENASubscription sub, CancelReason reason, UpnpResponse response) {
   // Reason should be null, or it didn't end regularly
   if (reason != null) {
     LOGGER.debug(
         "Subscription cancelled: "
             + sub.getService().getServiceId().getId()
             + " on "
             + uuid
             + ": "
             + reason);
   }
   rendererMap.mark(uuid, RENEW, true);
 }
 public static Map<String, String> getData(String uuid, String instanceID) {
   return rendererMap.get(uuid, instanceID).data;
 }
 public static void connect(String uuid, String instanceID, ActionListener listener) {
   rendererMap.get(uuid, instanceID).connect(listener);
 }
 public static Renderer getRenderer(String uuid) {
   if (rendererMap.containsKey(uuid)) {
     return rendererMap.get(uuid, "0");
   }
   return null;
 }
 protected Renderer rendererFound(Device d, String uuid) {
   // Create an instance
   return rendererMap.get(uuid, "0");
 }
 public static boolean isActive(String uuid, String id) {
   if (rendererMap.containsKey(uuid, id)) {
     return rendererMap.get(uuid, id).active;
   }
   return false;
 }