aboutsummaryrefslogtreecommitdiff
path: root/tools/lldb-mi/MIDriverMgr.h
blob: 438d184895b13dcec43d088f5290ed1f3228b6a3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//===-- 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) 
};