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

// Overview:    CMICmdCmdGdbShow interface.
//
//              To implement new MI commands, derive a new command class from the command base
//              class. To enable the new command for interpretation add the new command class
//              to the command factory. The files of relevance are:
//                  MICmdCommands.cpp
//                  MICmdBase.h / .cpp
//                  MICmdCmd.h / .cpp
//              For an introduction to adding a new command see CMICmdCmdSupportInfoMiCmdQuery
//              command class as an example.

#pragma once

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

//++ ============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "gdb-show".
//          This command does not follow the MI documentation exactly. While *this
//          command is implemented it does not do anything with the gdb-set
//          variable past in.
//          The design of matching the info request to a request action (or
//          command) is very simple. The request function which carries out
//          the task of information gathering and printing to stdout is part of
//          *this class. Should the request function become more complicated then
//          that request should really reside in a command type class. Then this
//          class instantiates a request info command for a matching request. The
//          design/code of *this class then does not then become bloated. Use a
//          lightweight version of the current MI command system.
//--
class CMICmdCmdGdbShow : public CMICmdBase
{
    // Statics:
  public:
    // Required by the CMICmdFactory when registering *this command
    static CMICmdBase *CreateSelf();

    // Methods:
  public:
    /* ctor */ CMICmdCmdGdbShow();

    // Overridden:
  public:
    // From CMICmdInvoker::ICmd
    bool Execute() override;
    bool Acknowledge() override;
    bool ParseArgs() override;
    // From CMICmnBase
    /* dtor */ ~CMICmdCmdGdbShow() override;

    // Typedefs:
  private:
    typedef bool (CMICmdCmdGdbShow::*FnGdbOptionPtr)(const CMIUtilString::VecString_t &vrWords);
    typedef std::map<CMIUtilString, FnGdbOptionPtr> MapGdbOptionNameToFnGdbOptionPtr_t;

    // Methods:
  private:
    bool GetOptionFn(const CMIUtilString &vrGdbOptionName, FnGdbOptionPtr &vrwpFn) const;
    bool OptionFnTargetAsync(const CMIUtilString::VecString_t &vrWords);
    bool OptionFnPrint(const CMIUtilString::VecString_t &vrWords);
    bool OptionFnLanguage(const CMIUtilString::VecString_t &vrWords);
    bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords);

    // Attributes:
  private:
    const static MapGdbOptionNameToFnGdbOptionPtr_t ms_mapGdbOptionNameToFnGdbOptionPtr;

    const CMIUtilString m_constStrArgNamedGdbOption;
    bool m_bGdbOptionRecognised;   // True = This command has a function with a name that matches the Print argument, false = not found
    bool m_bGdbOptionFnSuccessful; // True = The print function completed its task ok, false = function failed for some reason
    bool m_bGbbOptionFnHasError;   // True = The option function has an error condition (not the command!), false = option function ok.
    CMIUtilString m_strGdbOptionName;
    CMIUtilString m_strGdbOptionFnError;
    CMIUtilString m_strValue;
};
