//===-- MICmdInvoker.h ------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #pragma once // Third party headers #include // In-house headers: #include "MICmdData.h" #include "MICmdMgrSetCmdDeleteCallback.h" #include "MICmnBase.h" #include "MIUtilSingletonBase.h" // Declarations: class CMICmdBase; class CMICmnStreamStdout; //++ //============================================================================ // Details: MI Command Invoker. The Invoker works on the command pattern design. // There two main jobs; action command Execute() function, followed by // the command's Acknowledge() function. When a command has finished // its // execute function it returns to the invoker. The invoker then calls // the // command's Acknowledge() function to do more work, form and give // back a MI result. In the meantime the Command Monitor is monitoring // the each command doing their Execute() function work so they do not // exceed a time limit which if it exceeds informs the command(s) to // stop work. // The work by the Invoker is carried out in the main thread. // The Invoker takes ownership of any commands created which means it // is the only object to delete them when a command is finished // working. // A singleton class. //-- class CMICmdInvoker : public CMICmnBase, public CMICmdMgrSetCmdDeleteCallback::ICallback, public MI::ISingleton { friend class MI::ISingleton; // Class: public: //++ // Description: Invoker's interface for commands to implement. //-- class ICmd { public: virtual bool Acknowledge() = 0; virtual bool Execute() = 0; virtual bool ParseArgs() = 0; virtual void SetCmdData(const SMICmdData &vCmdData) = 0; virtual const SMICmdData &GetCmdData() const = 0; virtual const CMIUtilString &GetErrorDescription() const = 0; virtual void CmdFinishedTellInvoker() const = 0; virtual const CMIUtilString &GetMIResultRecord() const = 0; virtual const CMIUtilString &GetMIResultRecordExtra() const = 0; virtual bool HasMIResultRecordExtra() const = 0; /* dtor */ virtual ~ICmd() {} }; // Methods: public: bool Initialize() override; bool Shutdown() override; bool CmdExecute(CMICmdBase &vCmd); bool CmdExecuteFinished(CMICmdBase &vCmd); // Typedefs: private: typedef std::map MapCmdIdToCmd_t; typedef std::pair MapPairCmdIdToCmd_t; // Methods: private: /* ctor */ CMICmdInvoker(); /* ctor */ CMICmdInvoker(const CMICmdInvoker &); void operator=(const CMICmdInvoker &); void CmdDeleteAll(); bool CmdDelete(const MIuint vCmdId, const bool vbYesDeleteCmd = false); bool CmdAdd(const CMICmdBase &vCmd); bool CmdStdout(const SMICmdData &vCmdData) const; void CmdCauseAppExit(const CMICmdBase &vCmd) const; // Overridden: private: // From CMICmnBase /* dtor */ ~CMICmdInvoker() override; // From CMICmdMgrSetCmdDeleteCallback::ICallback void Delete(SMICmdData &vCmd) override; // Attributes: private: MapCmdIdToCmd_t m_mapCmdIdToCmd; CMICmnStreamStdout &m_rStreamOut; };