| //===-- MIDriverMgr.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 "lldb/API/SBDebugger.h" | 
 | #include <map> | 
 |  | 
 | // In-house headers: | 
 | #include "MICmnBase.h" | 
 | #include "MICmnLog.h" | 
 | #include "MIUtilSingletonBase.h" | 
 | #include "MIUtilString.h" | 
 |  | 
 | //++ | 
 | //============================================================================ | 
 | // Details: MI Driver Manager. Register lldb::SBBroadcaster derived Driver type | 
 | //          objects with *this manager. The manager does not own driver objects | 
 | //          registered with it and so will not delete when this manager is | 
 | //          shutdown. The Driver flagged as "use this one" will be set as | 
 | //          current | 
 | //          driver and will be the one that is used. Other drivers are not | 
 | //          operated. A Driver can call another Driver should it not handle a | 
 | //          command. | 
 | //          It also initializes other resources as part it's setup such as the | 
 | //          Logger and Resources objects (explicit indicate *this object | 
 | //          requires | 
 | //          those objects (modules/components) to support it's own | 
 | //          functionality). | 
 | //          The Driver manager is the first object instantiated as part of the | 
 | //          MI code base. It is also the first thing to interpret the command | 
 | //          line arguments passed to the executable. Bases on options it | 
 | //          understands the manage will set up the appropriate driver or give | 
 | //          help information. Other options are passed on to the driver chosen | 
 | //          to do work. | 
 | //          Each driver instance (the CMIDriver, LLDB::Driver) has its own | 
 | //          LLDB::SBDebugger. | 
 | //          Singleton class. | 
 | //-- | 
 | class CMIDriverMgr : public CMICmnBase, public MI::ISingleton<CMIDriverMgr> { | 
 |   friend MI::ISingleton<CMIDriverMgr>; | 
 |  | 
 |   // Class: | 
 | public: | 
 |   //++ | 
 |   // Description: Driver deriver objects need this interface to work with | 
 |   //              *this manager. | 
 |   //-- | 
 |   class IDriver { | 
 |   public: | 
 |     virtual bool DoInitialize() = 0; | 
 |     virtual bool DoShutdown() = 0; | 
 |     virtual bool DoMainLoop() = 0; | 
 |     virtual lldb::SBError DoParseArgs(const int argc, const char *argv[], | 
 |                                       FILE *vpStdOut, bool &vwbExiting) = 0; | 
 |     virtual CMIUtilString GetError() const = 0; | 
 |     virtual const CMIUtilString &GetName() const = 0; | 
 |     virtual lldb::SBDebugger &GetTheDebugger() = 0; | 
 |     virtual bool GetDriverIsGDBMICompatibleDriver() const = 0; | 
 |     virtual bool SetId(const CMIUtilString &vId) = 0; | 
 |     virtual const CMIUtilString &GetId() const = 0; | 
 |     virtual void DeliverSignal(int signal) = 0; | 
 |  | 
 |     // Not part of the interface, ignore | 
 |     /* dtor */ virtual ~IDriver() {} | 
 |   }; | 
 |  | 
 |   // Methods: | 
 | public: | 
 |   // MI system | 
 |   bool Initialize() override; | 
 |   bool Shutdown() override; | 
 |   // | 
 |   CMIUtilString GetAppVersion() const; | 
 |   bool RegisterDriver(const IDriver &vrADriver, | 
 |                       const CMIUtilString &vrDriverID); | 
 |   bool UnregisterDriver(const IDriver &vrADriver); | 
 |   bool SetUseThisDriverToDoWork( | 
 |       const IDriver &vrADriver); // Specify working main driver | 
 |   IDriver *GetUseThisDriverToDoWork() const; | 
 |   bool ParseArgs(const int argc, const char *argv[], bool &vwbExiting); | 
 |   IDriver *GetDriver(const CMIUtilString &vrDriverId) const; | 
 |   // | 
 |   // MI Proxy fn to current specified working driver | 
 |   bool DriverMainLoop(); | 
 |   bool DriverParseArgs(const int argc, const char *argv[], FILE *vpStdOut, | 
 |                        bool &vwbExiting); | 
 |   CMIUtilString DriverGetError() const; | 
 |   CMIUtilString DriverGetName() const; | 
 |   lldb::SBDebugger *DriverGetTheDebugger(); | 
 |   void DeliverSignal(int signal); | 
 |  | 
 |   // Typedef: | 
 | private: | 
 |   typedef std::map<CMIUtilString, IDriver *> MapDriverIdToDriver_t; | 
 |   typedef std::pair<CMIUtilString, IDriver *> MapPairDriverIdToDriver_t; | 
 |  | 
 |   // Methods: | 
 | private: | 
 |   /* ctor */ CMIDriverMgr(); | 
 |   /* ctor */ CMIDriverMgr(const CMIDriverMgr &); | 
 |   void operator=(const CMIDriverMgr &); | 
 |   // | 
 |   bool HaveDriverAlready(const IDriver &vrMedium) const; | 
 |   bool UnregisterDriverAll(); | 
 |   IDriver *GetFirstMIDriver() const; | 
 |   IDriver *GetFirstNonMIDriver() const; | 
 |   CMIUtilString GetHelpOnCmdLineArgOptions() const; | 
 |  | 
 |   // Overridden: | 
 | private: | 
 |   // From CMICmnBase | 
 |   /* dtor */ ~CMIDriverMgr() override; | 
 |  | 
 |   // Attributes: | 
 | private: | 
 |   MapDriverIdToDriver_t m_mapDriverIdToDriver; | 
 |   IDriver *m_pDriverCurrent; // This driver is used by this manager to do work. | 
 |                              // It is the main driver. | 
 |   bool m_bInMi2Mode; // True = --interpreter entered on the cmd line, false = | 
 |                      // operate LLDB driver (non GDB) | 
 | }; |