aboutsummaryrefslogblamecommitdiff
path: root/tools/lldb-mi/MIDriverMgr.h
blob: 438d184895b13dcec43d088f5290ed1f3228b6a3 (plain) (tree)









































































































































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

//++
// File:		MIDriverMgr.h
//
// Overview:	CMIImplCmn interface.
//
// Environment:	Compilers:	Visual C++ 12.
//							gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
//				Libraries:	See MIReadme.txt. 
//
// Copyright:	None.
//--

#pragma once

// Third party headers:
#include <map>
#include <lldb/API/SBDebugger.h>

// In-house headers:
#include "MICmnBase.h"
#include "MIUtilString.h"
#include "MICmnLog.h"
#include "MIUtilSingletonBase.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 executeable. 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.
// Gotchas:	None.
// Authors:	Illya Rudkin 28/02/2014.
// Changes:	None.
//--
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( void ) = 0;
		virtual bool					DoShutdown( void ) = 0;
		virtual bool					DoMainLoop( void ) = 0;
		virtual void					DoResizeWindow( const uint32_t vWindowSizeWsCol ) = 0;
		virtual lldb::SBError			DoParseArgs( const int argc, const char * argv[], FILE * vpStdOut, bool & vwbExiting ) = 0;
		virtual CMIUtilString 			GetError( void ) const = 0;
		virtual const CMIUtilString &	GetName( void ) const = 0;
		virtual lldb::SBDebugger &		GetTheDebugger( void ) = 0;
		virtual bool					GetDriverIsGDBMICompatibleDriver( void ) const = 0;
		virtual bool					SetId( const CMIUtilString & vId ) = 0;
		virtual const CMIUtilString &	GetId( void ) const = 0;

		// Not part of the interface, ignore
		/* dtor */ virtual ~IDriver( void ) {}
	};
	
// Methods:
public:
	// MI system
	bool			Initialize( void );
	bool			Shutdown( void );
	//
	CMIUtilString	GetAppVersion( void ) 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( void ) 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( void );
	void				DriverResizeWindow( const uint32_t vWindowSizeWsCol );
	bool				DriverParseArgs( const int argc, const char * argv[], FILE * vpStdOut, bool & vwbExiting );
	CMIUtilString 		DriverGetError( void ) const;
	CMIUtilString 		DriverGetName( void ) const;
	lldb::SBDebugger *	DriverGetTheDebugger( void );

// Typedef:
private:
	typedef std::map< CMIUtilString, IDriver * >	MapDriverIdToDriver_t;
	typedef std::pair< CMIUtilString, IDriver * >	MapPairDriverIdToDriver_t;

// Methods:
private:
	/* ctor */	CMIDriverMgr( void );
	/* ctor */	CMIDriverMgr( const CMIDriverMgr & );
	void		operator=( const CMIDriverMgr & );
	//
	bool			HaveDriverAlready( const IDriver & vrMedium ) const;
	bool			UnregisterDriverAll( void ); 
	IDriver *		GetFirstMIDriver( void ) const;
	IDriver *		GetFirstNonMIDriver( void ) const;
	CMIUtilString	GetHelpOnCmdLineArgOptions( void ) const;

// Overridden:
private:
	// From CMICmnBase
	/* dtor */ virtual ~CMIDriverMgr( void );

// 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) 
};