+ return !m_busDevices[initiator]->HandleReceiveFailed();
+}
+
+bool CCECProcessor::SetStreamPath(uint16_t iPhysicalAddress)
+{
+ // stream path changes are sent by the TV
+ return m_busDevices[CECDEVICE_TV]->GetHandler()->TransmitSetStreamPath(iPhysicalAddress);
+}
+
+bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration)
+{
+ bool bNeedsReinit(false);
+ CCECBusDevice *primary = IsRunning() ? GetPrimaryDevice() : NULL;
+ m_configuration.clientVersion = configuration->clientVersion;
+
+ // client version 1.5.0
+
+ // device types
+ bNeedsReinit |= IsRunning () && m_configuration.deviceTypes != configuration->deviceTypes;
+ m_configuration.deviceTypes = configuration->deviceTypes;
+
+ // physical address
+ bNeedsReinit |= IsRunning() && m_configuration.iPhysicalAddress != configuration->iPhysicalAddress;
+ m_configuration.iPhysicalAddress = configuration->iPhysicalAddress;
+
+ // base device
+ bNeedsReinit |= IsRunning() && m_configuration.baseDevice != configuration->baseDevice;
+ m_configuration.baseDevice = configuration->baseDevice;
+
+ // hdmi port
+ bNeedsReinit |= IsRunning() && m_configuration.iHDMIPort != configuration->iHDMIPort;
+ m_configuration.iHDMIPort = configuration->iHDMIPort;
+
+ // device name
+ snprintf(m_configuration.strDeviceName, 13, "%s", configuration->strDeviceName);
+ if (primary && !primary->GetOSDName().Equals(m_configuration.strDeviceName))
+ {
+ primary->SetOSDName(m_configuration.strDeviceName);
+ if (!bNeedsReinit && IsRunning())
+ primary->TransmitOSDName(CECDEVICE_TV);
+ }
+
+ // tv vendor id override
+ if (m_configuration.tvVendor != configuration->tvVendor)
+ {
+ m_configuration.tvVendor= configuration->tvVendor;
+ m_busDevices[CECDEVICE_TV]->SetVendorId((uint64_t)m_configuration.tvVendor);
+ }
+
+ // wake CEC devices
+ if (m_configuration.wakeDevices != configuration->wakeDevices)
+ {
+ m_configuration.wakeDevices = configuration->wakeDevices;
+ if (!bNeedsReinit && IsRunning())
+ PowerOnDevices();
+ }
+
+ // just copy these
+ m_configuration.bGetSettingsFromROM = configuration->bGetSettingsFromROM;
+ m_configuration.powerOffDevices = configuration->powerOffDevices;
+ m_configuration.bPowerOffScreensaver = configuration->bPowerOffScreensaver;
+ m_configuration.bPowerOffOnStandby = configuration->bPowerOffOnStandby;
+
+ // ensure that there is at least 1 device type set
+ if (m_configuration.deviceTypes.IsEmpty())
+ m_configuration.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE);
+
+ if (bNeedsReinit)
+ {
+ SetInitialised(false);
+ m_logicalAddresses.Clear();
+ return Initialise();
+ }
+
+ return true;
+}
+
+bool CCECProcessor::GetCurrentConfiguration(libcec_configuration *configuration)
+{
+ // client version 1.5.0
+ configuration->clientVersion = m_configuration.clientVersion;
+ snprintf(configuration->strDeviceName, 13, "%s", m_configuration.strDeviceName);
+ configuration->deviceTypes = m_configuration.deviceTypes;
+ configuration->iPhysicalAddress = m_configuration.iPhysicalAddress;
+ configuration->baseDevice = m_configuration.baseDevice;
+ configuration->iHDMIPort = m_configuration.iHDMIPort;
+ configuration->tvVendor = m_configuration.tvVendor;
+ configuration->wakeDevices = m_configuration.wakeDevices;
+ configuration->bGetSettingsFromROM = m_configuration.bGetSettingsFromROM;
+ configuration->powerOffDevices = m_configuration.powerOffDevices;
+ configuration->bPowerOffScreensaver = m_configuration.bPowerOffScreensaver;
+ configuration->bPowerOffOnStandby = m_configuration.bPowerOffOnStandby;
+
+ return true;
+}
+
+bool CCECProcessor::CanPersistConfiguration(void)
+{
+ return m_communication->GetFirmwareVersion() >= 2;
+}
+
+bool CCECProcessor::PersistConfiguration(libcec_configuration *configuration)
+{
+ return m_communication->PersistConfiguration(configuration);