|  | //===-- 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 <map> | 
|  |  | 
|  | // 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<CMICmdInvoker> { | 
|  | friend class MI::ISingleton<CMICmdInvoker>; | 
|  |  | 
|  | // 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<MIuint, CMICmdBase *> MapCmdIdToCmd_t; | 
|  | typedef std::pair<MIuint, CMICmdBase *> 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; | 
|  | }; |