cec: extra guard so no commands are transmitted without a valid initiator. bugzid...
[deb_libcec.git] / src / lib / implementations / CECCommandHandler.cpp
index 0668ee793bd16e3e6c1b47c58b3f8b76df251302..eb7d58ea9bac3b83c7631578b54621ec5a296186 100644 (file)
@@ -83,6 +83,10 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command)
     if (m_processor->IsInitialised())
       HandleGivePhysicalAddress(command);
     break;
+  case CEC_OPCODE_GET_MENU_LANGUAGE:
+    if (m_processor->IsInitialised())
+      HandleGiveMenuLanguage(command);
+    break;
   case CEC_OPCODE_GIVE_OSD_NAME:
     if (m_processor->IsInitialised())
       HandleGiveOSDName(command);
@@ -341,6 +345,18 @@ bool CCECCommandHandler::HandleGivePhysicalAddress(const cec_command &command)
   return false;
 }
 
+bool CCECCommandHandler::HandleGiveMenuLanguage(const cec_command &command)
+{
+  if (m_processor->IsRunning() && m_busDevice->MyLogicalAddressContains(command.destination))
+  {
+    CCECBusDevice *device = GetDevice(command.destination);
+    if (device)
+      return device->TransmitSetMenuLanguage(command.initiator);
+  }
+
+  return false;
+}
+
 bool CCECCommandHandler::HandleGiveSystemAudioModeStatus(const cec_command &command)
 {
   if (m_processor->IsRunning() && m_busDevice->MyLogicalAddressContains(command.destination))
@@ -875,6 +891,17 @@ bool CCECCommandHandler::TransmitPhysicalAddress(const cec_logical_address iInit
   return Transmit(command, false);
 }
 
+bool CCECCommandHandler::TransmitSetMenuLanguage(const cec_logical_address iInitiator, const char lang[3])
+{
+  cec_command command;
+  command.Format(command, iInitiator, CECDEVICE_BROADCAST, CEC_OPCODE_SET_MENU_LANGUAGE);
+  command.parameters.PushBack((uint8_t) lang[0]);
+  command.parameters.PushBack((uint8_t) lang[1]);
+  command.parameters.PushBack((uint8_t) lang[2]);
+
+  return Transmit(command, false);
+}
+
 bool CCECCommandHandler::TransmitPoll(const cec_logical_address iInitiator, const cec_logical_address iDestination)
 {
   cec_command command;
@@ -972,6 +999,12 @@ bool CCECCommandHandler::Transmit(cec_command &command, bool bExpectResponse /*
   bool bReturn(false);
   command.transmit_timeout = m_iTransmitTimeout;
 
+  if (command.initiator == CECDEVICE_UNKNOWN)
+  {
+    CLibCEC::AddLog(CEC_LOG_ERROR, "not transmitting a command without a valid initiator");
+    return bReturn;
+  }
+
   {
     uint8_t iTries(0), iMaxTries(command.opcode == CEC_OPCODE_NONE ? 1 : m_iTransmitRetries + 1);
     while (!bReturn && ++iTries <= iMaxTries)