//===-- MIDriverBase.h ------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#pragma once

// Third party headers:
#include "lldb/API/SBBroadcaster.h"
#include "lldb/API/SBDebugger.h"

// In-house headers:
#include "MIUtilString.h"

// Declarations:
namespace lldb {
class SBBroadcaster;
}

//++
//============================================================================
// Details: MI driver base implementation class. This class has been created so
//          not have to edit the lldb::SBBroadcaster class code. Functionality
//          and attributes need to be common to the LLDB Driver class and the
//          MI Driver class (derived from lldb::SBBroadcaster) so they can call
//          upon each other for functionality fall through and allow the
//          CDriverMgr to manage either (any) driver to be operated on.
//          Each driver instance (the CMIDriver, LLDB::Driver) has its own
//          LLDB::SBDebugger object.
//--
class CMIDriverBase {
  // Methods:
public:
  /* ctor */ CMIDriverBase();

  CMIDriverBase *GetDriverToFallThruTo() const;
  CMIDriverBase *GetDriversParent() const;

  // Overrideable:
public:
  /* dtor */ virtual ~CMIDriverBase();

  virtual bool DoFallThruToAnotherDriver(const CMIUtilString &vCmd,
                                         CMIUtilString &vwErrMsg);
  virtual bool SetDriverToFallThruTo(const CMIDriverBase &vrOtherDriver);
  virtual bool SetDriverParent(const CMIDriverBase &vrOtherDriver);
  virtual const CMIUtilString &GetDriverName() const = 0;
  virtual const CMIUtilString &GetDriverId() const = 0;
  virtual void SetExitApplicationFlag(const bool vbForceExit);

  // MI provide information for the pass through (child) assigned driver
  virtual FILE *GetStdin() const;
  virtual FILE *GetStdout() const;
  virtual FILE *GetStderr() const;

  // Attributes:
protected:
  CMIDriverBase *m_pDriverFallThru; // Child driver to use should *this driver
                                    // not be able to handle client input
  CMIDriverBase *m_pDriverParent; // The parent driver who passes work to *this
                                  // driver to do work
  CMIUtilString m_strDriverId;
  bool m_bExitApp; // True = Yes, exit application, false = continue execution
};
