//===-- MIDriverMgr.cpp -----------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

// Third Party Headers:
#include "lldb/API/SBError.h"

// In-house headers:
#include "MICmnLog.h"
#include "MICmnLogMediumFile.h"
#include "MICmnResources.h"
#include "MICmnStreamStdout.h"
#include "MIDriver.h"
#include "MIDriverMgr.h"
#include "MIUtilSingletonHelper.h"

//++
//------------------------------------------------------------------------------------
// Details: CMIDriverMgr constructor.
// Type:    Method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMIDriverMgr::CMIDriverMgr() : m_pDriverCurrent(nullptr), m_bInMi2Mode(false) {}

//++
//------------------------------------------------------------------------------------
// Details: CMIDriverMgr destructor.
// Type:    Overridden.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMIDriverMgr::~CMIDriverMgr() { Shutdown(); }

//++
//------------------------------------------------------------------------------------
// Details: Initialize *this manager.
// Type:    Method.
// Args:    None.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMIDriverMgr::Initialize() {
  m_clientUsageRefCnt++;

  ClrErrorDescription();

  if (m_bInitialized)
    return MIstatus::success;

  bool bOk = MIstatus::success;
  CMIUtilString errMsg;

  // Note initialisation order is important here as some resources depend on
  // previous
  MI::ModuleInit<CMICmnLog>(IDS_MI_INIT_ERR_LOG, bOk, errMsg);
  MI::ModuleInit<CMICmnResources>(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg);

  m_bInitialized = bOk;

  if (!bOk) {
    CMIUtilString strInitError(CMIUtilString::Format(
        MIRSRC(IDS_MI_INIT_ERR_DRIVERMGR), errMsg.c_str()));
    SetErrorDescription(strInitError);
    return MIstatus::failure;
  }

  return bOk;
}

//++
//------------------------------------------------------------------------------------
// Details: Unbind detach or release resources used by this server in general
// common
//          functionality shared between versions of any server interfaces
//          implemented.
// Type:    Method.
// Args:    vbAppExitOk - (R) True = No problems, false = App exiting with
// problems (investigate!).
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMIDriverMgr::Shutdown() {
  // Do not want a ref counter because this function needs to be called how ever
  // this
  // application stops running
  // if( --m_clientUsageRefCnt > 0 )
  //  return MIstatus::success;

  ClrErrorDescription();

  if (!m_bInitialized)
    return MIstatus::success;

  m_bInitialized = false;

  bool bOk = MIstatus::success;
  CMIUtilString errMsg;

  // Tidy up
  UnregisterDriverAll();

  // Note shutdown order is important here
  MI::ModuleShutdown<CMICmnResources>(IDE_MI_SHTDWN_ERR_RESOURCES, bOk, errMsg);
  MI::ModuleShutdown<CMICmnLog>(IDS_MI_SHTDWN_ERR_LOG, bOk, errMsg);

  if (!bOk) {
    SetErrorDescriptionn(MIRSRC(IDS_MI_SHTDWN_ERR_DRIVERMGR), errMsg.c_str());
  }

  return bOk;
}
//++
//------------------------------------------------------------------------------------
// Details: Unregister all the Driver registered with *this manager. The manager
// also
//          deletes
// Type:    Method.
// Args:    None.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMIDriverMgr::UnregisterDriverAll() {
  MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin();
  while (it != m_mapDriverIdToDriver.end()) {
    IDriver *pDriver = (*it).second;
    pDriver->DoShutdown();

    // Next
    ++it;
  }

  m_mapDriverIdToDriver.clear();
  m_pDriverCurrent = NULL;

  return MIstatus::success;
}

//++
//------------------------------------------------------------------------------------
// Details: Register a driver with *this Driver Manager. Call
// SetUseThisDriverToDoWork()
//          inform the manager which driver is the one to the work. The manager
//          calls
//          the driver's init function which must be successful in order to
//          complete the
//          registration.
// Type:    Method.
// Args:    vrDriver    - (R) The driver to register.
//          vrDriverID  - (R) The driver's ID to lookup by.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMIDriverMgr::RegisterDriver(const IDriver &vrDriver,
                                  const CMIUtilString &vrDriverID) {
  if (HaveDriverAlready(vrDriver))
    return MIstatus::success;

  IDriver *pDriver = const_cast<IDriver *>(&vrDriver);
  if (!pDriver->SetId(vrDriverID))
    return MIstatus::failure;
  if (!pDriver->DoInitialize()) {
    SetErrorDescriptionn(MIRSRC(IDS_DRIVERMGR_DRIVER_ERR_INIT),
                         pDriver->GetName().c_str(), vrDriverID.c_str(),
                         pDriver->GetError().c_str());
    return MIstatus::failure;
  }

  MapPairDriverIdToDriver_t pr(vrDriverID, pDriver);
  m_mapDriverIdToDriver.insert(pr);

  return MIstatus::success;
}

//++
//------------------------------------------------------------------------------------
// Details: Query the Driver Manager to see if *this manager has the driver
// already
//          registered.
// Type:    Method.
// Args:    vrDriver    - (R) The driver to query.
// Return:  True - registered.
//          False - not registered.
// Throws:  None.
//--
bool CMIDriverMgr::HaveDriverAlready(const IDriver &vrDriver) const {
  MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin();
  while (it != m_mapDriverIdToDriver.end()) {
    const IDriver *pDrvr = (*it).second;
    if (pDrvr == &vrDriver)
      return true;

    // Next
    ++it;
  }

  return false;
}

//++
//------------------------------------------------------------------------------------
// Details: Unregister a driver from the Driver Manager. Call the
// SetUseThisDriverToDoWork()
//          function to define another driver to do work if the one being
//          unregistered did
//          the work previously.
// Type:    Method.
// Args:    vrDriver    - (R) The driver to unregister.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMIDriverMgr::UnregisterDriver(const IDriver &vrDriver) {
  const IDriver *pDrvr = nullptr;
  MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin();
  while (it != m_mapDriverIdToDriver.end()) {
    pDrvr = (*it).second;
    if (pDrvr == &vrDriver)
      break;

    // Next
    ++it;
  }
  m_mapDriverIdToDriver.erase(it);

  if (m_pDriverCurrent == pDrvr)
    m_pDriverCurrent = nullptr;

  return MIstatus::success;
}

//++
//------------------------------------------------------------------------------------
// Details: Specify the driver to do work. The Driver Manager drives this
// driver. Any
//          previous driver doing work is not called anymore (so be sure the
//          previous
//          driver is in a tidy state before stopping it working).
// Type:    Method.
// Args:    vrADriver   - (R) A lldb::SBBroadcaster/IDriver derived object.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMIDriverMgr::SetUseThisDriverToDoWork(const IDriver &vrADriver) {
  m_pDriverCurrent = const_cast<IDriver *>(&vrADriver);

  const CMIUtilString msg(
      CMIUtilString::Format(MIRSRC(IDS_DRIVER_SAY_DRIVER_USING),
                            m_pDriverCurrent->GetName().c_str()));
  m_pLog->Write(msg, CMICmnLog::eLogVerbosity_Log);

  m_bInMi2Mode = m_pDriverCurrent->GetDriverIsGDBMICompatibleDriver();

  return MIstatus::success;
}

//++
//------------------------------------------------------------------------------------
// Details: Ask *this manager which driver is currently doing the work.
// Type:    Method.
// Args:    None.
// Return:  IDriver * - Pointer to a driver, NULL if there is no current working
// driver.
// Throws:  None.
//--
CMIDriverMgr::IDriver *CMIDriverMgr::GetUseThisDriverToDoWork() const {
  return m_pDriverCurrent;
}

//++
//------------------------------------------------------------------------------------
// Details: Call this function puts *this driver to work.
// Type:    Method.
// Args:    None.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMIDriverMgr::DriverMainLoop() {
  if (m_pDriverCurrent != nullptr) {
    if (!m_pDriverCurrent->DoMainLoop()) {
      const CMIUtilString errMsg(
          CMIUtilString::Format(MIRSRC(IDS_DRIVER_ERR_MAINLOOP),
                                m_pDriverCurrent->GetError().c_str()));
      CMICmnStreamStdout::Instance().Write(errMsg, true);
      return MIstatus::failure;
    }
  } else {
    const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET));
    CMICmnStreamStdout::Instance().Write(errMsg, true);
    return MIstatus::failure;
  }

  return MIstatus::success;
}

//++
//------------------------------------------------------------------------------------
// Details: Get the current driver to validate executable command line
// arguments.
// Type:    Method.
// Args:    argc        - (R)   An integer that contains the count of arguments
// that follow in
//                              argv. The argc parameter is always greater than
//                              or equal to 1.
//          argv        - (R)   An array of null-terminated strings representing
//          command-line
//                              arguments entered by the user of the program. By
//                              convention,
//                              argv[0] is the command with which the program is
//                              invoked.
//          vpStdOut    - (R)   Point to a standard output stream.
//          vwbExiting  - (W)   True = *this want to exit, false = continue to
//          work.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMIDriverMgr::DriverParseArgs(const int argc, const char *argv[],
                                   FILE *vpStdOut, bool &vwbExiting) {
  if (m_pDriverCurrent == nullptr) {
    const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET));
    CMICmnStreamStdout::Instance().Write(errMsg, true);
    return MIstatus::failure;
  }

  const lldb::SBError error(
      m_pDriverCurrent->DoParseArgs(argc, argv, vpStdOut, vwbExiting));
  bool bOk = !error.Fail();
  if (!bOk) {
    CMIUtilString errMsg;
    const char *pErrorCstr = error.GetCString();
    if (pErrorCstr != nullptr)
      errMsg = CMIUtilString::Format(MIRSRC(IDS_DRIVER_ERR_PARSE_ARGS),
                                     m_pDriverCurrent->GetName().c_str(),
                                     pErrorCstr);
    else
      errMsg = CMIUtilString::Format(MIRSRC(IDS_DRIVER_ERR_PARSE_ARGS_UNKNOWN),
                                     m_pDriverCurrent->GetName().c_str());

    bOk = CMICmnStreamStdout::Instance().Write(errMsg, true);
  }

  return bOk;
}

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the current driver's last error condition.
// Type:    Method.
// Args:    None.
// Return:  CMIUtilString - Text description.
// Throws:  None.
//--
CMIUtilString CMIDriverMgr::DriverGetError() const {
  if (m_pDriverCurrent != nullptr)
    return m_pDriverCurrent->GetError();
  else {
    const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET));
    CMICmnStreamStdout::Instance().Write(errMsg, true);
  }

  return CMIUtilString();
}

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the current driver's name.
// Type:    Method.
// Args:    None.
// Return:  CMIUtilString - Driver name.
//                          Empty string = no current working driver specified.
// Throws:  None.
//--
CMIUtilString CMIDriverMgr::DriverGetName() const {
  if (m_pDriverCurrent != nullptr)
    return m_pDriverCurrent->GetName();
  else {
    const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET));
    CMICmnStreamStdout::Instance().Write(errMsg, true);
  }

  return CMIUtilString();
}

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the current driver's debugger object.
// Type:    Method.
// Args:    None.
// Return:  lldb::SBDebugger * - Ptr to driver's debugger object.
//                             - NULL = no current working driver specified.
// Throws:  None.
//--
lldb::SBDebugger *CMIDriverMgr::DriverGetTheDebugger() {
  lldb::SBDebugger *pDebugger = nullptr;
  if (m_pDriverCurrent != nullptr)
    pDebugger = &m_pDriverCurrent->GetTheDebugger();
  else {
    const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET));
    CMICmnStreamStdout::Instance().Write(errMsg, true);
  }

  return pDebugger;
}

//++
//------------------------------------------------------------------------------------
// Details: Check the arguments given on the command line. The main purpose of
// this
//          function is to check for the presence of the --interpreter option.
//          Having
//          this option present tells *this manager to set the CMIDriver to do
//          work. If
//          not use the LLDB driver. The following are options that are only
//          handled by
//          the CMIDriverMgr are:
//              --help or -h
//              --interpreter
//              --version
//              --versionLong
//              --log
//              --executable
//              --log-dir
//          The above arguments are not handled by any driver object except for
//          --executable.
//          The options --interpreter and --executable in code act very similar.
//          The
//          --executable is necessary to differentiate whither the MI Driver is
//          being using
//          by a client i.e. Eclipse or from the command line. Eclipse issues
//          the option
//          --interpreter and also passes additional arguments which can be
//          interpreted as an
//          executable if called from the command line. Using --executable tells
//          the MI
//          Driver is being called the command line and that the executable
//          argument is indeed
//          a specified executable an so actions commands to set up the
//          executable for a
//          debug session. Using --interpreter on the command line does not
//          action additional
//          commands to initialise a debug session and so be able to launch the
//          process. The directory
//          where the log file is created is specified using --log-dir.
// Type:    Method.
// Args:    argc        - (R)   An integer that contains the count of arguments
// that follow in
//                              argv. The argc parameter is always greater than
//                              or equal to 1.
//          argv        - (R)   An array of null-terminated strings representing
//          command-line
//                              arguments entered by the user of the program. By
//                              convention,
//                              argv[0] is the command with which the program is
//                              invoked.
//          vwbExiting  - (W)   True = *this want to exit, Reasons: help,
//          invalid arg(s),
//                              version information only.
//                              False = Continue to work, start debugger i.e.
//                              Command
//                              interpreter.
// Return:  lldb::SBError - LLDB current error status.
// Throws:  None.
//--
bool CMIDriverMgr::ParseArgs(const int argc, const char *argv[],
                             bool &vwbExiting) {
  bool bOk = MIstatus::success;

  vwbExiting = false;

  // Print MI application path to the Log file
  const CMIUtilString appPath(
      CMIUtilString::Format(MIRSRC(IDS_MI_APP_FILEPATHNAME), argv[0]));
  bOk = m_pLog->Write(appPath, CMICmnLog::eLogVerbosity_Log);

  // Print application arguments to the Log file
  const bool bHaveArgs(argc >= 2);
  CMIUtilString strArgs(MIRSRC(IDS_MI_APP_ARGS));
  if (!bHaveArgs) {
    strArgs += MIRSRC(IDS_WORD_NONE);
    bOk = bOk && m_pLog->Write(strArgs, CMICmnLog::eLogVerbosity_Log);
  } else {
    for (MIint i = 1; i < argc; i++) {
      strArgs += CMIUtilString::Format("%d:'%s' ", i, argv[i]);
    }
    bOk = bOk && m_pLog->Write(strArgs, CMICmnLog::eLogVerbosity_Log);
  }

  // Look for the command line options
  bool bHaveArgInterpret = false;
  bool bHaveArgVersion = false;
  bool bHaveArgVersionLong = false;
  bool bHaveArgLog = false;
  bool bHaveArgLogDir = false;
  bool bHaveArgHelp = false;
  CMIUtilString strLogDir;

  bHaveArgInterpret = true;
  if (bHaveArgs) {
    // CODETAG_MIDRIVE_CMD_LINE_ARG_HANDLING
    for (MIint i = 1; i < argc; i++) {
      // *** Add args to help in GetHelpOnCmdLineArgOptions() ***
      const CMIUtilString strArg(argv[i]);

      // Argument "--executable" is also check for in CMIDriver::ParseArgs()
      if ((0 ==
           strArg.compare(
               "--interpreter")) || // Given by the client such as Eclipse
          (0 == strArg.compare("--executable"))) // Used to specify that there
                                                 // is executable argument also
                                                 // on the command line
      {                                          // See fn description.
        bHaveArgInterpret = true;
      }
      if (0 == strArg.compare("--version")) {
        bHaveArgVersion = true;
      }
      if (0 == strArg.compare("--versionLong")) {
        bHaveArgVersionLong = true;
      }
      if (0 == strArg.compare("--log")) {
        bHaveArgLog = true;
      }
      if (0 == strArg.compare(0, 10, "--log-dir=")) {
        strLogDir = strArg.substr(10, CMIUtilString::npos);
        bHaveArgLogDir = true;
      }
      if ((0 == strArg.compare("--help")) || (0 == strArg.compare("-h"))) {
        bHaveArgHelp = true;
      }
    }
  }

  if (bHaveArgLog) {
    CMICmnLog::Instance().SetEnabled(true);
  }

  if (bHaveArgLogDir) {
    bOk = bOk && CMICmnLogMediumFile::Instance().SetDirectory(strLogDir);
  }

  // Todo: Remove this output when MI is finished. It is temporary to persuade
  // Eclipse plugin to work.
  //       Eclipse reads this literally and will not work unless it gets this
  //       exact version text.
  // Handle --version option (ignore the --interpreter option if present)
  if (bHaveArgVersion) {
    vwbExiting = true;
    bOk = bOk &&
          CMICmnStreamStdout::Instance().WriteMIResponse(
              MIRSRC(IDE_MI_VERSION_GDB));
    return bOk;
  }

  // Todo: Make this the --version when the above --version version is removed
  // Handle --versionlong option (ignore the --interpreter option if present)
  if (bHaveArgVersionLong) {
    vwbExiting = true;
    bOk =
        bOk && CMICmnStreamStdout::Instance().WriteMIResponse(GetAppVersion());
    return bOk;
  }

  // Both '--help' and '--interpreter' means give help for MI only. Without
  // '--interpreter' help the LLDB driver is working and so help is for that.
  if (bHaveArgHelp && bHaveArgInterpret) {
    vwbExiting = true;
    bOk = bOk &&
          CMICmnStreamStdout::Instance().WriteMIResponse(
              GetHelpOnCmdLineArgOptions());
    return bOk;
  }

  // This makes the assumption that there is at least one MI compatible
  // driver registered and one LLDB driver registered and the CMIDriver
  // is the first one found.
  // ToDo: Implement a better solution that handle any order, any number
  // of drivers. Or this 'feature' may be removed if deemed not required.
  IDriver *pLldbDriver = GetFirstNonMIDriver();
  IDriver *pMi2Driver = GetFirstMIDriver();
  if (bHaveArgInterpret && (pMi2Driver != nullptr))
    bOk = bOk && SetUseThisDriverToDoWork(*pMi2Driver);
  else if (pLldbDriver != nullptr)
    bOk = bOk && SetUseThisDriverToDoWork(*pLldbDriver);
  else {
    if (bOk) {
      vwbExiting = true;
      const CMIUtilString msg(MIRSRC(IDS_DRIVER_ERR_NON_REGISTERED));
      bOk = bOk && CMICmnStreamStdout::Instance().WriteMIResponse(msg);
    }
  }

  return bOk;
}

//++
//------------------------------------------------------------------------------------
// Details: Return formatted application version and name information.
// Type:    Method.
// Args:    None.
// Return:  CMIUtilString - Text data.
// Throws:  None.
//--
CMIUtilString CMIDriverMgr::GetAppVersion() const {
  const CMIUtilString strProj(MIRSRC(IDS_PROJNAME));
  const CMIUtilString strVsn(CMIDriver::Instance().GetVersionDescription());
  const CMIUtilString strGdb(MIRSRC(IDE_MI_VERSION_GDB));
  const CMIUtilString strVrsnInfo(CMIUtilString::Format(
      "%s\n%s\n%s", strProj.c_str(), strVsn.c_str(), strGdb.c_str()));

  return strVrsnInfo;
}

//++
//------------------------------------------------------------------------------------
// Details: Return formatted help information on all the MI command line
// options.
// Type:    Method.
// Args:    None.
// Return:  CMIUtilString - Text data.
// Throws:  None.
//--
CMIUtilString CMIDriverMgr::GetHelpOnCmdLineArgOptions() const {
  const CMIUtilString pHelp[] = {
      MIRSRC(IDE_MI_APP_DESCRIPTION), MIRSRC(IDE_MI_APP_INFORMATION),
      MIRSRC(IDE_MI_APP_ARG_USAGE), MIRSRC(IDE_MI_APP_ARG_HELP),
      MIRSRC(IDE_MI_APP_ARG_VERSION), MIRSRC(IDE_MI_APP_ARG_VERSION_LONG),
      MIRSRC(IDE_MI_APP_ARG_INTERPRETER), MIRSRC(IDE_MI_APP_ARG_SOURCE),
      MIRSRC(IDE_MI_APP_ARG_EXECUTEABLE),
      MIRSRC(IDE_MI_APP_ARG_SYNCHRONOUS),
      CMIUtilString::Format(
          MIRSRC(IDE_MI_APP_ARG_APP_LOG),
          CMICmnLogMediumFile::Instance().GetFileName().c_str()),
      MIRSRC(IDE_MI_APP_ARG_APP_LOG_DIR), MIRSRC(IDE_MI_APP_ARG_EXECUTABLE),
      MIRSRC(IDS_CMD_QUIT_HELP), MIRSRC(IDE_MI_APP_ARG_EXAMPLE)};
  const MIuint nHelpItems = sizeof pHelp / sizeof pHelp[0];
  CMIUtilString strHelp;
  for (MIuint i = 0; i < nHelpItems; i++) {
    strHelp += pHelp[i];
    strHelp += "\n\n";
  }

  return strHelp;
}

//++
//------------------------------------------------------------------------------------
// Details: Search the registered drivers and return the first driver which says
// it is
//          GDB/MI compatible i.e. the CMIDriver class.
// Type:    Method.
// Args:    None.
// Return:  IDriver * - Ptr to driver, NULL = no driver found.
// Throws:  None.
//--
CMIDriverMgr::IDriver *CMIDriverMgr::GetFirstMIDriver() const {
  IDriver *pDriver = nullptr;
  MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin();
  while (it != m_mapDriverIdToDriver.end()) {
    const CMIUtilString &rDrvId = (*it).first;
    MIunused(rDrvId);
    IDriver *pDvr = (*it).second;
    if (pDvr->GetDriverIsGDBMICompatibleDriver()) {
      pDriver = pDvr;
      break;
    }

    // Next
    ++it;
  }

  return pDriver;
}

//++
//------------------------------------------------------------------------------------
// Details: Search the registered drivers and return the first driver which says
// it is
//          not GDB/MI compatible i.e. the LLDB Driver class.
// Type:    Method.
// Args:    None.
// Return:  IDriver * - Ptr to driver, NULL = no driver found.
// Throws:  None.
//--
CMIDriverMgr::IDriver *CMIDriverMgr::GetFirstNonMIDriver() const {
  IDriver *pDriver = nullptr;
  MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin();
  while (it != m_mapDriverIdToDriver.end()) {
    const CMIUtilString &rDrvId = (*it).first;
    MIunused(rDrvId);
    IDriver *pDvr = (*it).second;
    if (!pDvr->GetDriverIsGDBMICompatibleDriver()) {
      pDriver = pDvr;
      break;
    }

    // Next
    ++it;
  }

  return pDriver;
}

//++
//------------------------------------------------------------------------------------
// Details: Search the registered drivers and return driver with the specified
// ID.
// Type:    Method.
// Args:    vrDriverId  - (R) ID of a driver.
// Return:  IDriver * - Ptr to driver, NULL = no driver found.
// Throws:  None.
//--
CMIDriverMgr::IDriver *
CMIDriverMgr::GetDriver(const CMIUtilString &vrDriverId) const {
  MapDriverIdToDriver_t::const_iterator it =
      m_mapDriverIdToDriver.find(vrDriverId);
  if (it == m_mapDriverIdToDriver.end())
    return nullptr;

  IDriver *pDriver = (*it).second;

  return pDriver;
}

//++
//------------------------------------------------------------------------------------
// Details: Gets called when lldb-mi gets a signal. Passed signal to current
// driver.
//
// Type:    Method.
// Args:    signal that was delivered
// Return:  None.
// Throws:  None.
//--
void CMIDriverMgr::DeliverSignal(int signal) {
  if (m_pDriverCurrent != nullptr)
    m_pDriverCurrent->DeliverSignal(signal);
}
