/*---------------------------------------------------------------------- | PLT_MediaBrowser::OnDeviceRemoved +---------------------------------------------------------------------*/ NPT_Result PLT_MediaBrowser::OnDeviceRemoved(PLT_DeviceDataReference& device) { if (!device->GetType().StartsWith("urn:schemas-upnp-org:device:MediaServer")) return NPT_FAILURE; { NPT_AutoLock lock(m_MediaServers); // only release if we have kept it around PLT_DeviceDataReference data; NPT_String uuid = device->GetUUID(); // Have we seen that device? if (NPT_FAILED(NPT_ContainerFind(m_MediaServers, PLT_DeviceDataFinder(uuid), data))) { NPT_LOG_WARNING_1("Device (%s) not found in our list!", (const char*)uuid); return NPT_FAILURE; } NPT_LOG_FINE_1("Device Removed: %s", (const char*)*device); m_MediaServers.Remove(device); } if (m_Delegate) { m_Delegate->OnMSRemoved(device); } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaBrowser::OnDeviceAdded +---------------------------------------------------------------------*/ NPT_Result PLT_MediaBrowser::OnDeviceAdded(PLT_DeviceDataReference& device) { // verify the device implements the function we need PLT_Service* serviceCDS; PLT_Service* serviceCMR; NPT_String type; if (!device->GetType().StartsWith("urn:schemas-upnp-org:device:MediaServer")) return NPT_FAILURE; type = "urn:schemas-upnp-org:service:ContentDirectory:*"; if (NPT_FAILED(device->FindServiceByType(type, serviceCDS))) { NPT_LOG_WARNING_2("Service %s not found in device \"%s\"", type.GetChars(), device->GetFriendlyName().GetChars()); return NPT_FAILURE; } else { // in case it's a newer upnp implementation, force to 1 serviceCDS->ForceVersion(1); } type = "urn:schemas-upnp-org:service:ConnectionManager:*"; if (NPT_FAILED(device->FindServiceByType(type, serviceCMR))) { NPT_LOG_WARNING_2("Service %s not found in device \"%s\"", type.GetChars(), device->GetFriendlyName().GetChars()); return NPT_FAILURE; } else { // in case it's a newer upnp implementation, force to 1 serviceCMR->ForceVersion(1); } { NPT_AutoLock lock(m_MediaServers); PLT_DeviceDataReference data; NPT_String uuid = device->GetUUID(); // is it a new device? if (NPT_SUCCEEDED(NPT_ContainerFind(m_MediaServers, PLT_DeviceDataFinder(uuid), data))) { NPT_LOG_WARNING_1("Device (%s) is already in our list!", (const char*)uuid); return NPT_FAILURE; } NPT_LOG_FINE_1("Device Found: %s", (const char*)*device); m_MediaServers.Add(device); } if (m_Delegate && m_Delegate->OnMSAdded(device)) { m_CtrlPoint->Subscribe(serviceCDS); m_CtrlPoint->Subscribe(serviceCMR); } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnDeviceAdded +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnDeviceAdded(PLT_DeviceDataReference& device) { // verify the device implements the function we need PLT_Service* serviceAVT = NULL; PLT_Service* serviceCMR; PLT_Service* serviceRC; NPT_String type; if (!device->GetType().StartsWith("urn:schemas-upnp-org:device:MediaRenderer")) return NPT_FAILURE; // optional service type = "urn:schemas-upnp-org:service:AVTransport:*"; if (NPT_SUCCEEDED(device->FindServiceByType(type, serviceAVT))) { // in case it's a newer upnp implementation, force to 1 NPT_LOG_FINE_1("Service %s found", (const char*)type); serviceAVT->ForceVersion(1); } // required services type = "urn:schemas-upnp-org:service:ConnectionManager:*"; if (NPT_FAILED(device->FindServiceByType(type, serviceCMR))) { NPT_LOG_FINE_1("Service %s not found", (const char*)type); return NPT_FAILURE; } else { // in case it's a newer upnp implementation, force to 1 serviceCMR->ForceVersion(1); } type = "urn:schemas-upnp-org:service:RenderingControl:*"; if (NPT_FAILED(device->FindServiceByType(type, serviceRC))) { NPT_LOG_FINE_1("Service %s not found", (const char*)type); return NPT_FAILURE; } else { // in case it's a newer upnp implementation, force to 1 serviceRC->ForceVersion(1); } { NPT_AutoLock lock(m_MediaRenderers); PLT_DeviceDataReference data; NPT_String uuid = device->GetUUID(); // is it a new device? if (NPT_SUCCEEDED(NPT_ContainerFind(m_MediaRenderers, PLT_DeviceDataFinder(uuid), data))) { NPT_LOG_WARNING_1("Device (%s) is already in our list!", (const char*)uuid); return NPT_FAILURE; } NPT_LOG_FINE_1("Device Found: %s", (const char*)*device); m_MediaRenderers.Add(device); } if (m_Delegate && m_Delegate->OnMRAdded(device)) { // subscribe to services eventing only if delegate wants it if (serviceAVT) m_CtrlPoint->Subscribe(serviceAVT); // subscribe to required services m_CtrlPoint->Subscribe(serviceCMR); m_CtrlPoint->Subscribe(serviceRC); } return NPT_SUCCESS; }