added HandleLogicalAddressLost() callback to IAdapterCommunication
[deb_libcec.git] / src / lib / CECProcessor.cpp
index 6461ca9b2bd1da66f2e134f3d465ed868aa609af..b4445f42f921881edb6361d57f45a7498c62136f 100644 (file)
@@ -62,7 +62,8 @@ CCECProcessor::CCECProcessor(CLibCEC *libcec) :
     m_libcec(libcec),
     m_iStandardLineTimeout(3),
     m_iRetryLineTimeout(3),
-    m_iLastTransmission(0)
+    m_iLastTransmission(0),
+    m_bMonitor(true)
 {
   m_busDevices = new CCECDeviceMap(this);
 }
@@ -603,6 +604,7 @@ bool CCECProcessor::GetDeviceInformation(const char *strPort, libcec_configurati
   config->iFirmwareVersion   = m_communication->GetFirmwareVersion();
   config->iPhysicalAddress   = m_communication->GetPhysicalAddress();
   config->iFirmwareBuildDate = m_communication->GetFirmwareBuildDate();
+  config->adapterType        = m_communication->GetAdapterType();
 
   return true;
 }
@@ -730,6 +732,7 @@ bool CCECProcessor::RegisterClient(CCECClient *client)
   configuration.serverVersion      = LIBCEC_VERSION_CURRENT;
   configuration.iFirmwareVersion   = m_communication->GetFirmwareVersion();
   configuration.iFirmwareBuildDate = m_communication->GetFirmwareBuildDate();
+  configuration.adapterType        = m_communication->GetAdapterType();
 
   // mark the client as registered
   client->SetRegistered(true);
@@ -800,7 +803,7 @@ bool CCECProcessor::UnregisterClient(CCECClient *client)
   if (SetLogicalAddresses(addresses))
   {
     // no more clients left, disable controlled mode
-    if (addresses.IsEmpty())
+    if (addresses.IsEmpty() && !m_bMonitor)
       m_communication->SetControlledMode(false);
 
     return true;
@@ -873,3 +876,21 @@ bool CCECProcessor::IsRunningLatestFirmware(void)
       m_communication->IsRunningLatestFirmware() :
       true;
 }
+
+void CCECProcessor::SwitchMonitoring(bool bSwitchTo)
+{
+  {
+    CLockObject lock(m_mutex);
+    m_bMonitor = bSwitchTo;
+  }
+  if (bSwitchTo)
+    UnregisterClients();
+}
+
+void CCECProcessor::HandleLogicalAddressLost(cec_logical_address address)
+{
+  m_libcec->AddLog(CEC_LOG_NOTICE, "logical address %x was taken by another device, re-registering the client");
+  CCECClient* client = GetClient(address);
+  if (client)
+    RegisterClient(client);
+}