cec: call Close() when the connection could not be (fully) opened in CUSBCECAdapterCo...
[deb_libcec.git] / src / lib / adapter / USBCECAdapterCommunication.cpp
index fb91d957c2244afb425fb56d3fe30c4aeaf9a3ca..99086ce94f54dbbc4e88cc692437e2e210fca0dd 100644 (file)
@@ -66,7 +66,7 @@ CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processo
     m_bHasData(false),
     m_iLineTimeout(0),
     m_iFirmwareVersion(CEC_FW_VERSION_UNKNOWN),
-    m_lastInitiator(CECDEVICE_UNKNOWN),
+    m_lastDestination(CECDEVICE_UNKNOWN),
     m_bNextIsEscaped(false),
     m_bGotStart(false),
     m_messageProcessor(NULL),
@@ -77,11 +77,6 @@ CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processo
   m_port = new CSerialPort(strPort, iBaudRate);
 }
 
-CUSBCECAdapterCommunication::~CUSBCECAdapterCommunication(void)
-{
-  Close();
-}
-
 bool CUSBCECAdapterCommunication::CheckAdapter(uint32_t iTimeoutMs /* = 10000 */)
 {
   bool bReturn(false);
@@ -205,6 +200,7 @@ bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32
   if (!bSkipChecks && !CheckAdapter())
   {
     CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter failed to pass basic checks");
+    Close();
     return false;
   }
   else
@@ -216,6 +212,7 @@ bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32
     }
     else
     {
+      Close();
       CLibCEC::AddLog(CEC_LOG_ERROR, "could not create a communication thread");
     }
   }
@@ -225,7 +222,7 @@ bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32
 
 void CUSBCECAdapterCommunication::Close(void)
 {
-  StopThread();
+  StopThread(0);
 }
 
 void *CUSBCECAdapterCommunication::Process(void)
@@ -433,24 +430,19 @@ bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
       }
       if (m_currentframe.ack == 0x1)
       {
-        m_lastInitiator    = m_currentframe.initiator;
+        m_lastDestination    = m_currentframe.destination;
         if (!m_bWaitingForAck[m_currentframe.destination])
-        {
-          m_currentframe.eom = 1;
-          bEom = true;
-        }
+          m_processor->HandlePoll(m_currentframe.initiator, m_currentframe.destination);
         else
-        {
           m_bWaitingForAck[m_currentframe.destination] = false;
-        }
       }
     }
     break;
   case MSGCODE_RECEIVE_FAILED:
     {
       m_currentframe.Clear();
-      if (m_lastInitiator != CECDEVICE_UNKNOWN)
-        bIsError = m_processor->HandleReceiveFailed(m_lastInitiator);
+      if (m_lastDestination != CECDEVICE_UNKNOWN)
+        bIsError = m_processor->HandleReceiveFailed(m_lastDestination);
     }
     break;
   case MSGCODE_FRAME_DATA:
@@ -467,7 +459,7 @@ bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
   }
 
   CLibCEC::AddLog(bIsError ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString());
-  return msg.IsEOM() || bEom;
+  return msg.IsEOM();
 }
 
 uint16_t CUSBCECAdapterCommunication::GetFirmwareVersion(void)
@@ -492,15 +484,16 @@ uint16_t CUSBCECAdapterCommunication::GetFirmwareVersion(void)
 
 bool CUSBCECAdapterCommunication::SetLineTimeout(uint8_t iTimeout)
 {
-  m_iLineTimeout = iTimeout;
-  bool bReturn(m_iLineTimeout != iTimeout);
+  bool bReturn(true);
 
-  if (!bReturn)
+  if (m_iLineTimeout != iTimeout)
   {
     CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the line timeout to %d", iTimeout);
     CCECAdapterMessage params;
     params.PushEscaped(iTimeout);
     bReturn = SendCommand(MSGCODE_TRANSMIT_IDLETIME, params);
+    if (bReturn)
+      m_iLineTimeout = iTimeout;
   }
 
   return bReturn;
@@ -825,15 +818,15 @@ bool CUSBCECAdapterCommunication::WaitForAck(CCECAdapterMessage &message)
       else
       {
         m_processor->HandlePoll(msg.Initiator(), msg.Destination());
-        m_lastInitiator = msg.Initiator();
+        m_lastDestination = msg.Initiator();
       }
       iNow = GetTimeMs();
       continue;
     }
 
     if (msg.Message() == MSGCODE_RECEIVE_FAILED &&
-        m_lastInitiator != CECDEVICE_UNKNOWN &&
-        m_processor->HandleReceiveFailed(m_lastInitiator))
+        m_lastDestination != CECDEVICE_UNKNOWN &&
+        m_processor->HandleReceiveFailed(m_lastDestination))
     {
       iNow = GetTimeMs();
       continue;