diff options
| author | Ed Maste <emaste@FreeBSD.org> | 2015-02-06 21:38:51 +0000 | 
|---|---|---|
| committer | Ed Maste <emaste@FreeBSD.org> | 2015-02-06 21:38:51 +0000 | 
| commit | 205afe679855a4ce8149cdaa94d3f0868ce796dc (patch) | |
| tree | 09bc83f73246ee3c7a779605cd0122093d2a8a19 /tools/lldb-mi/MIDriver.cpp | |
| parent | 0cac4ca3916ac24ab6139d03cbfd18db9e715bfe (diff) | |
Notes
Diffstat (limited to 'tools/lldb-mi/MIDriver.cpp')
| -rw-r--r-- | tools/lldb-mi/MIDriver.cpp | 1923 | 
1 files changed, 988 insertions, 935 deletions
diff --git a/tools/lldb-mi/MIDriver.cpp b/tools/lldb-mi/MIDriver.cpp index 759d54a5364da..accde1c7cde72 100644 --- a/tools/lldb-mi/MIDriver.cpp +++ b/tools/lldb-mi/MIDriver.cpp @@ -8,19 +8,19 @@  //===----------------------------------------------------------------------===//  //++ -// File:		MIDriver.cpp +// File:        MIDriver.cpp  // -// Overview:	CMIDriver implementation. +// Overview:    CMIDriver implementation.  // -// Environment:	Compilers:	Visual C++ 12. -//							gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 -//				Libraries:	See MIReadmetxt.  +// Environment: Compilers:  Visual C++ 12. +//                          gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 +//              Libraries:  See MIReadmetxt.  // -// Copyright:	None. +// Copyright:   None.  //--  // Third party headers: -#include <stdarg.h>		// va_list, va_start, var_end +#include <stdarg.h> // va_list, va_start, var_end  #include <iostream>  #include <lldb/API/SBError.h> @@ -44,1233 +44,1286 @@  // Instantiations:  #if _DEBUG -	const CMIUtilString	CMIDriver::ms_constMIVersion = MIRSRC( IDS_MI_VERSION_DESCRIPTION_DEBUG );	 +const CMIUtilString CMIDriver::ms_constMIVersion = MIRSRC(IDS_MI_VERSION_DESCRIPTION_DEBUG);  #else -	const CMIUtilString	CMIDriver::ms_constMIVersion = MIRSRC( IDS_MI_VERSION_DESCRIPTION );	// Matches version in resources file +const CMIUtilString CMIDriver::ms_constMIVersion = MIRSRC(IDS_MI_VERSION_DESCRIPTION); // Matches version in resources file  #endif // _DEBUG -const CMIUtilString	CMIDriver::ms_constAppNameShort( MIRSRC( IDS_MI_APPNAME_SHORT ) ); -const CMIUtilString	CMIDriver::ms_constAppNameLong( MIRSRC( IDS_MI_APPNAME_LONG ) ); +const CMIUtilString CMIDriver::ms_constAppNameShort(MIRSRC(IDS_MI_APPNAME_SHORT)); +const CMIUtilString CMIDriver::ms_constAppNameLong(MIRSRC(IDS_MI_APPNAME_LONG));  //++ ------------------------------------------------------------------------------------ -// Details:	CMIDriver constructor. -// Type:	Method. -// Args:	None. -// Return:	None. -// Throws:	None. +// Details: CMIDriver constructor. +// Type:    Method. +// Args:    None. +// Return:  None. +// Throws:  None.  //-- -CMIDriver::CMIDriver( void ) -:	m_bFallThruToOtherDriverEnabled( false ) -,	m_bDriverIsExiting( false ) -,	m_handleMainThread( 0 ) -,	m_rStdin( CMICmnStreamStdin::Instance() ) -,	m_rLldbDebugger( CMICmnLLDBDebugger::Instance() ) -,	m_rStdOut( CMICmnStreamStdout::Instance() ) -,	m_eCurrentDriverState( eDriverState_NotRunning ) -,	m_bHaveExecutableFileNamePathOnCmdLine( false ) -,	m_bDriverDebuggingArgExecutable( false ) +CMIDriver::CMIDriver(void) +    : m_bFallThruToOtherDriverEnabled(false) +    , m_bDriverIsExiting(false) +    , m_handleMainThread(0) +    , m_rStdin(CMICmnStreamStdin::Instance()) +    , m_rLldbDebugger(CMICmnLLDBDebugger::Instance()) +    , m_rStdOut(CMICmnStreamStdout::Instance()) +    , m_eCurrentDriverState(eDriverState_NotRunning) +    , m_bHaveExecutableFileNamePathOnCmdLine(false) +    , m_bDriverDebuggingArgExecutable(false)  {  }  //++ ------------------------------------------------------------------------------------ -// Details:	CMIDriver destructor. -// Type:	Overridden. -// Args:	None. -// Return:	None. -// Throws:	None. +// Details: CMIDriver destructor. +// Type:    Overridden. +// Args:    None. +// Return:  None. +// Throws:  None.  //-- -CMIDriver::~CMIDriver( void ) +CMIDriver::~CMIDriver(void)  {  }  //++ ------------------------------------------------------------------------------------ -// Details:	Set whether *this driver (the parent) is enabled to pass a command to its  -//			fall through (child) driver to interpret the command and do work instead -//			(if *this driver decides it can't hanled the command). -// Type:	Method. -// Args:	vbYes	- (R) True = yes fall through, false = do not pass on command. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Set whether *this driver (the parent) is enabled to pass a command to its +//          fall through (child) driver to interpret the command and do work instead +//          (if *this driver decides it can't hanled the command). +// Type:    Method. +// Args:    vbYes   - (R) True = yes fall through, false = do not pass on command. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::SetEnableFallThru( const bool vbYes ) +bool +CMIDriver::SetEnableFallThru(const bool vbYes)  { -	m_bFallThruToOtherDriverEnabled = vbYes; -	return MIstatus::success; +    m_bFallThruToOtherDriverEnabled = vbYes; +    return MIstatus::success;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Get whether *this driver (the parent) is enabled to pass a command to its  -//			fall through (child) driver to interpret the command and do work instead -//			(if *this driver decides it can't hanled the command). -// Type:	Method. -// Args:	None. -// Return:	bool - True = yes fall through, false = do not pass on command. -// Throws:	None. +// Details: Get whether *this driver (the parent) is enabled to pass a command to its +//          fall through (child) driver to interpret the command and do work instead +//          (if *this driver decides it can't hanled the command). +// Type:    Method. +// Args:    None. +// Return:  bool - True = yes fall through, false = do not pass on command. +// Throws:  None.  //-- -bool CMIDriver::GetEnableFallThru( void ) const +bool +CMIDriver::GetEnableFallThru(void) const  { -	return m_bFallThruToOtherDriverEnabled; +    return m_bFallThruToOtherDriverEnabled;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Retrieve MI's application name of itself. -// Type:	Method. -// Args:	None. -// Return:	CMIUtilString & - Text description. -// Throws:	None. +// Details: Retrieve MI's application name of itself. +// Type:    Method. +// Args:    None. +// Return:  CMIUtilString & - Text description. +// Throws:  None.  //-- -const CMIUtilString & CMIDriver::GetAppNameShort( void ) const +const CMIUtilString & +CMIDriver::GetAppNameShort(void) const  { -	return ms_constAppNameShort; +    return ms_constAppNameShort;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Retrieve MI's application name of itself. -// Type:	Method. -// Args:	None. -// Return:	CMIUtilString & - Text description. -// Throws:	None. +// Details: Retrieve MI's application name of itself. +// Type:    Method. +// Args:    None. +// Return:  CMIUtilString & - Text description. +// Throws:  None.  //-- -const CMIUtilString & CMIDriver::GetAppNameLong( void ) const +const CMIUtilString & +CMIDriver::GetAppNameLong(void) const  { -	return ms_constAppNameLong; +    return ms_constAppNameLong;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Retrieve MI's version description of itself. -// Type:	Method. -// Args:	None. -// Return:	CMIUtilString & - Text description. -// Throws:	None. +// Details: Retrieve MI's version description of itself. +// Type:    Method. +// Args:    None. +// Return:  CMIUtilString & - Text description. +// Throws:  None.  //-- -const CMIUtilString & CMIDriver::GetVersionDescription( void ) const +const CMIUtilString & +CMIDriver::GetVersionDescription(void) const  { -	return ms_constMIVersion; +    return ms_constMIVersion;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Initialize setup *this driver ready for use. -// Type:	Method. -// Args:	None. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Initialize setup *this driver ready for use. +// Type:    Method. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::Initialize( void ) +bool +CMIDriver::Initialize(void)  { -	m_eCurrentDriverState = eDriverState_Initialising; -	m_clientUsageRefCnt++; +    m_eCurrentDriverState = eDriverState_Initialising; +    m_clientUsageRefCnt++; -	ClrErrorDescription(); +    ClrErrorDescription(); -	if( m_bInitialized ) -		return MIstatus::success; +    if (m_bInitialized) +        return MIstatus::success; -	bool bOk = MIstatus::success; -	CMIUtilString errMsg; +    bool bOk = MIstatus::success; +    CMIUtilString errMsg; -	// Initialize all of the modules we depend on -	MI::ModuleInit< CMICmnLog >         ( IDS_MI_INIT_ERR_LOG          , bOk, errMsg ); -	MI::ModuleInit< CMICmnStreamStdout >( IDS_MI_INIT_ERR_STREAMSTDOUT , bOk, errMsg ); -	MI::ModuleInit< CMICmnStreamStderr >( IDS_MI_INIT_ERR_STREAMSTDERR , bOk, errMsg ); -	MI::ModuleInit< CMICmnResources >   ( IDS_MI_INIT_ERR_RESOURCES    , bOk, errMsg ); -	MI::ModuleInit< CMICmnThreadMgrStd >( IDS_MI_INIT_ERR_THREADMANAGER, bOk, errMsg ); -	MI::ModuleInit< CMICmnStreamStdin > ( IDS_MI_INIT_ERR_STREAMSTDIN  , bOk, errMsg ); -	MI::ModuleInit< CMICmdMgr >         ( IDS_MI_INIT_ERR_CMDMGR       , bOk, errMsg ); -	bOk &= m_rLldbDebugger.SetDriver( *this ); -	MI::ModuleInit< CMICmnLLDBDebugger >( IDS_MI_INIT_ERR_LLDBDEBUGGER , bOk, errMsg ); +    // Initialize all of the modules we depend on +    MI::ModuleInit<CMICmnLog>(IDS_MI_INIT_ERR_LOG, bOk, errMsg); +    MI::ModuleInit<CMICmnStreamStdout>(IDS_MI_INIT_ERR_STREAMSTDOUT, bOk, errMsg); +    MI::ModuleInit<CMICmnStreamStderr>(IDS_MI_INIT_ERR_STREAMSTDERR, bOk, errMsg); +    MI::ModuleInit<CMICmnResources>(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); +    MI::ModuleInit<CMICmnThreadMgrStd>(IDS_MI_INIT_ERR_THREADMANAGER, bOk, errMsg); +    MI::ModuleInit<CMICmnStreamStdin>(IDS_MI_INIT_ERR_STREAMSTDIN, bOk, errMsg); +    MI::ModuleInit<CMICmdMgr>(IDS_MI_INIT_ERR_CMDMGR, bOk, errMsg); +    bOk &= m_rLldbDebugger.SetDriver(*this); +    MI::ModuleInit<CMICmnLLDBDebugger>(IDS_MI_INIT_ERR_LLDBDEBUGGER, bOk, errMsg);  #if MICONFIG_COMPILE_MIDRIVER_WITH_LLDBDRIVER -	CMIDriverMgr & rDrvMgr = CMIDriverMgr::Instance(); -	bOk = bOk && rDrvMgr.RegisterDriver( *g_driver, "LLDB driver" );	// Will be pass thru driver -	if( bOk ) -	{ -		bOk = SetEnableFallThru( false ); // This is intentional at this time - yet to be fully implemented -		bOk = bOk && SetDriverToFallThruTo( *g_driver ); -		CMIUtilString strOtherDrvErrMsg; -		if( bOk && GetEnableFallThru() && !g_driver->MISetup( strOtherDrvErrMsg ) ) -		{ -			bOk = false; -			errMsg = CMIUtilString::Format( MIRSRC( IDS_MI_INIT_ERR_FALLTHRUDRIVER ), strOtherDrvErrMsg.c_str()  ); -		} -	} +    CMIDriverMgr &rDrvMgr = CMIDriverMgr::Instance(); +    bOk = bOk && rDrvMgr.RegisterDriver(*g_driver, "LLDB driver"); // Will be pass thru driver +    if (bOk) +    { +        bOk = SetEnableFallThru(false); // This is intentional at this time - yet to be fully implemented +        bOk = bOk && SetDriverToFallThruTo(*g_driver); +        CMIUtilString strOtherDrvErrMsg; +        if (bOk && GetEnableFallThru() && !g_driver->MISetup(strOtherDrvErrMsg)) +        { +            bOk = false; +            errMsg = CMIUtilString::Format(MIRSRC(IDS_MI_INIT_ERR_FALLTHRUDRIVER), strOtherDrvErrMsg.c_str()); +        } +    }  #endif // MICONFIG_COMPILE_MIDRIVER_WITH_LLDBDRIVER -	m_bExitApp = false; -		 -	m_bInitialized = bOk; +    m_bExitApp = false; -	if( !bOk ) -	{ -		const CMIUtilString msg = CMIUtilString::Format( MIRSRC( IDS_MI_INIT_ERR_DRIVER ), errMsg.c_str() ); -		SetErrorDescription( msg ); -		return MIstatus::failure; -	} +    m_bInitialized = bOk; -	m_eCurrentDriverState = eDriverState_RunningNotDebugging; -	 -	return bOk; +    if (!bOk) +    { +        const CMIUtilString msg = CMIUtilString::Format(MIRSRC(IDS_MI_INIT_ERR_DRIVER), errMsg.c_str()); +        SetErrorDescription(msg); +        return MIstatus::failure; +    } + +    m_eCurrentDriverState = eDriverState_RunningNotDebugging; + +    return bOk;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Unbind detach or release resources used by *this driver. -// Type:	Method. -// Args:	None. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Unbind detach or release resources used by *this driver. +// Type:    Method. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::Shutdown( void ) +bool +CMIDriver::Shutdown(void)  { -	if( --m_clientUsageRefCnt > 0 ) -		return MIstatus::success; -	 -	if( !m_bInitialized ) -		return MIstatus::success; - -	m_eCurrentDriverState = eDriverState_ShuttingDown; - -	ClrErrorDescription(); - -	bool bOk = MIstatus::success; -	CMIUtilString errMsg; - -	// Shutdown all of the modules we depend on -	MI::ModuleShutdown< CMICmnLLDBDebugger >( IDS_MI_INIT_ERR_LLDBDEBUGGER , bOk, errMsg ); -	MI::ModuleShutdown< CMICmdMgr >         ( IDS_MI_INIT_ERR_CMDMGR       , bOk, errMsg ); -	MI::ModuleShutdown< CMICmnStreamStdin > ( IDS_MI_INIT_ERR_STREAMSTDIN  , bOk, errMsg ); -	MI::ModuleShutdown< CMICmnThreadMgrStd >( IDS_MI_INIT_ERR_THREADMANAGER, bOk, errMsg ); -	MI::ModuleShutdown< CMICmnResources >   ( IDS_MI_INIT_ERR_RESOURCES    , bOk, errMsg ); -	MI::ModuleShutdown< CMICmnStreamStderr >( IDS_MI_INIT_ERR_STREAMSTDERR , bOk, errMsg ); -	MI::ModuleShutdown< CMICmnStreamStdout >( IDS_MI_INIT_ERR_STREAMSTDOUT , bOk, errMsg ); -	MI::ModuleShutdown< CMICmnLog >         ( IDS_MI_INIT_ERR_LOG          , bOk, errMsg ); -																					  -	if( !bOk ) -	{ -		SetErrorDescriptionn( MIRSRC( IDS_MI_SHUTDOWN_ERR ), errMsg.c_str() ); -	} - -	m_eCurrentDriverState = eDriverState_NotRunning; - -	return bOk; +    if (--m_clientUsageRefCnt > 0) +        return MIstatus::success; + +    if (!m_bInitialized) +        return MIstatus::success; + +    m_eCurrentDriverState = eDriverState_ShuttingDown; + +    ClrErrorDescription(); + +    bool bOk = MIstatus::success; +    CMIUtilString errMsg; + +    // Shutdown all of the modules we depend on +    MI::ModuleShutdown<CMICmnLLDBDebugger>(IDS_MI_INIT_ERR_LLDBDEBUGGER, bOk, errMsg); +    MI::ModuleShutdown<CMICmdMgr>(IDS_MI_INIT_ERR_CMDMGR, bOk, errMsg); +    MI::ModuleShutdown<CMICmnStreamStdin>(IDS_MI_INIT_ERR_STREAMSTDIN, bOk, errMsg); +    MI::ModuleShutdown<CMICmnThreadMgrStd>(IDS_MI_INIT_ERR_THREADMANAGER, bOk, errMsg); +    MI::ModuleShutdown<CMICmnResources>(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); +    MI::ModuleShutdown<CMICmnStreamStderr>(IDS_MI_INIT_ERR_STREAMSTDERR, bOk, errMsg); +    MI::ModuleShutdown<CMICmnStreamStdout>(IDS_MI_INIT_ERR_STREAMSTDOUT, bOk, errMsg); +    MI::ModuleShutdown<CMICmnLog>(IDS_MI_INIT_ERR_LOG, bOk, errMsg); + +    if (!bOk) +    { +        SetErrorDescriptionn(MIRSRC(IDS_MI_SHUTDOWN_ERR), errMsg.c_str()); +    } + +    m_eCurrentDriverState = eDriverState_NotRunning; + +    return bOk;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Work function. Client (the driver's user) is able to append their own message  -//			in to the MI's Log trace file. -// Type:	Method. -// Args:	vMessage		- (R) Client's text message. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Work function. Client (the driver's user) is able to append their own message +//          in to the MI's Log trace file. +// Type:    Method. +// Args:    vMessage          - (R) Client's text message. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::WriteMessageToLog( const CMIUtilString & vMessage ) +bool +CMIDriver::WriteMessageToLog(const CMIUtilString &vMessage)  { -	CMIUtilString msg; -	msg = CMIUtilString::Format( MIRSRC( IDS_MI_CLIENT_MSG ), vMessage.c_str() ); -	return m_pLog->Write( msg, CMICmnLog::eLogVerbosity_ClientMsg ); +    CMIUtilString msg; +    msg = CMIUtilString::Format(MIRSRC(IDS_MI_CLIENT_MSG), vMessage.c_str()); +    return m_pLog->Write(msg, CMICmnLog::eLogVerbosity_ClientMsg);  }  //++ ------------------------------------------------------------------------------------  // Details: CDriverMgr calls *this driver initialize setup ready for use. -// Type:	Overridden. -// Args:	None. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Type:    Overridden. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::DoInitialize( void ) +bool +CMIDriver::DoInitialize(void)  { -	return CMIDriver::Instance().Initialize(); +    return CMIDriver::Instance().Initialize();  }  //++ ------------------------------------------------------------------------------------ -// Details:	CDriverMgr calls *this driver to unbind detach or release resources used by  -//			*this driver. -// Type:	Overridden. -// Args:	None. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: CDriverMgr calls *this driver to unbind detach or release resources used by +//          *this driver. +// Type:    Overridden. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::DoShutdown( void ) +bool +CMIDriver::DoShutdown(void)  { -	return CMIDriver::Instance().Shutdown(); +    return CMIDriver::Instance().Shutdown();  }  //++ ------------------------------------------------------------------------------------ -// Details:	Retrieve the name for *this driver. -// Type:	Overridden. -// Args:	None. -// Return:	CMIUtilString & - Driver name. -// Throws:	None. +// Details: Retrieve the name for *this driver. +// Type:    Overridden. +// Args:    None. +// Return:  CMIUtilString & - Driver name. +// Throws:  None.  //-- -const CMIUtilString & CMIDriver::GetName( void ) const +const CMIUtilString & +CMIDriver::GetName(void) const  { -	const CMIUtilString & rName = GetAppNameLong(); -	const CMIUtilString & rVsn = GetVersionDescription(); -	static CMIUtilString strName = CMIUtilString::Format( "%s %s", rName.c_str(), rVsn.c_str() ); -	 -	return strName; +    const CMIUtilString &rName = GetAppNameLong(); +    const CMIUtilString &rVsn = GetVersionDescription(); +    static CMIUtilString strName = CMIUtilString::Format("%s %s", rName.c_str(), rVsn.c_str()); + +    return strName;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Retrieve *this driver's last error condition. -// Type:	Overridden. -// Args:	None. -// Return:	CMIUtilString - Text description. -// Throws:	None. +// Details: Retrieve *this driver's last error condition. +// Type:    Overridden. +// Args:    None. +// Return:  CMIUtilString - Text description. +// Throws:  None.  //-- -CMIUtilString CMIDriver::GetError( void ) const +CMIUtilString +CMIDriver::GetError(void) const  { -	return GetErrorDescription(); +    return GetErrorDescription();  }  //++ ------------------------------------------------------------------------------------ -// Details:	Call *this driver to resize the console window. -// Type:	Overridden. -// Args:	vTermWidth	- (R) New window column size. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Call *this driver to resize the console window. +// Type:    Overridden. +// Args:    vTermWidth - (R) New window column size. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -void CMIDriver::DoResizeWindow( const uint32_t vTermWidth ) +void +CMIDriver::DoResizeWindow(const uint32_t vTermWidth)  { -	GetTheDebugger().SetTerminalWidth( vTermWidth ); +    GetTheDebugger().SetTerminalWidth(vTermWidth);  }  //++ ------------------------------------------------------------------------------------ -// Details:	Call *this driver to return it's debugger. -// Type:	Overridden. -// Args:	None. -// Return:	lldb::SBDebugger & - LLDB debugger object reference. -// Throws:	None. +// Details: Call *this driver to return it's debugger. +// Type:    Overridden. +// Args:    None. +// Return:  lldb::SBDebugger & - LLDB debugger object reference. +// Throws:  None.  //-- -lldb::SBDebugger & CMIDriver::GetTheDebugger( void ) +lldb::SBDebugger & +CMIDriver::GetTheDebugger(void)  { -	return m_rLldbDebugger.GetTheDebugger(); +    return m_rLldbDebugger.GetTheDebugger();  }  //++ ------------------------------------------------------------------------------------ -// Details:	Specify another driver *this driver can call should this driver not be able  -//			to handle the client data input. DoFallThruToAnotherDriver() makes the call. -// Type:	Overridden. -// Args:	vrOtherDriver	- (R) Reference to another driver object. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Specify another driver *this driver can call should this driver not be able +//          to handle the client data input. DoFallThruToAnotherDriver() makes the call. +// Type:    Overridden. +// Args:    vrOtherDriver     - (R) Reference to another driver object. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::SetDriverToFallThruTo( const CMIDriverBase & vrOtherDriver ) +bool +CMIDriver::SetDriverToFallThruTo(const CMIDriverBase &vrOtherDriver)  { -	m_pDriverFallThru = const_cast< CMIDriverBase * >( &vrOtherDriver ); +    m_pDriverFallThru = const_cast<CMIDriverBase *>(&vrOtherDriver); -	return m_pDriverFallThru->SetDriverParent( *this ); +    return m_pDriverFallThru->SetDriverParent(*this);  }  //++ ------------------------------------------------------------------------------------ -// Details:	Proxy function CMIDriverMgr IDriver interface implementation. *this driver's -//			implementation called from here to match the existing function name of the  -//			original LLDb driver class (the extra indirection is not necessarily required). -//			Check the arguments that were passed to this program to make sure they are  -//			valid and to get their argument values (if any). -// Type:	Overridden. -// Args:	argc		- (R)	An integer that contains the count of arguments that follow in  -//								argv. The argc parameter is always greater than or equal to 1. -//			argv		- (R)	An array of null-terminated strings representing command-line  -//								arguments entered by the user of the program. By convention,  -//								argv[0] is the command with which the program is invoked. -//			vpStdOut	- (R)	Pointer to a standard output stream.  -//			vwbExiting	- (W)	True = *this want to exit, Reasons: help, invalid arg(s), -//								version information only. -//								False = Continue to work, start debugger i.e. Command  -//								interpreter.  -// Return:	lldb::SBError - LLDB current error status. -// Throws:	None. +// Details: Proxy function CMIDriverMgr IDriver interface implementation. *this driver's +//          implementation called from here to match the existing function name of the +//          original LLDb driver class (the extra indirection is not necessarily required). +//          Check the arguments that were passed to this program to make sure they are +//          valid and to get their argument values (if any). +// Type:    Overridden. +// Args:    argc        - (R)   An integer that contains the count of arguments that follow in +//                              argv. The argc parameter is always greater than or equal to 1. +//          argv        - (R)   An array of null-terminated strings representing command-line +//                              arguments entered by the user of the program. By convention, +//                              argv[0] is the command with which the program is invoked. +//          vpStdOut    - (R)   Pointer to a standard output stream. +//          vwbExiting  - (W)   True = *this want to exit, Reasons: help, invalid arg(s), +//                              version information only. +//                              False = Continue to work, start debugger i.e. Command +//                              interpreter. +// Return:  lldb::SBError - LLDB current error status. +// Throws:  None.  //-- -lldb::SBError CMIDriver::DoParseArgs( const int argc, const char * argv[], FILE * vpStdOut, bool & vwbExiting ) +lldb::SBError +CMIDriver::DoParseArgs(const int argc, const char *argv[], FILE *vpStdOut, bool &vwbExiting)  { -	return ParseArgs( argc, argv, vpStdOut, vwbExiting ); +    return ParseArgs(argc, argv, vpStdOut, vwbExiting);  }  //++ ------------------------------------------------------------------------------------ -// Details:	Check the arguments that were passed to this program to make sure they are  -//			valid and to get their argument values (if any). The following are options  -//			that are only handled by *this driver:  -//				--executable  -//			The application's options --interpreter and --executable in code act very similar. -//			The --executable is necessary to differentiate whither the MI Driver is being -//			using by a client i.e. Eclipse or from the command line. Eclipse issues the option -//			--interpreter and also passes additional arguments which can be interpreted as an -//			executable if called from the command line. Using --executable tells the MI  -//			Driver is being called the command line and that the executable argument is indeed -//			a specified executable an so actions commands to set up the executable for a  -//			debug session. Using --interpreter on the commnd line does not action additional -//			commands to initialise a debug session and so be able to launch the process. -// Type:	Overridden. -// Args:	argc		- (R)	An integer that contains the count of arguments that follow in  -//								argv. The argc parameter is always greater than or equal to 1. -//			argv		- (R)	An array of null-terminated strings representing command-line  -//								arguments entered by the user of the program. By convention,  -//								argv[0] is the command with which the program is invoked. -//			vpStdOut	- (R)	Pointer to a standard output stream.  -//			vwbExiting	- (W)	True = *this want to exit, Reasons: help, invalid arg(s), -//								version information only. -//								False = Continue to work, start debugger i.e. Command  -//								interpreter.  -// Return:	lldb::SBError - LLDB current error status. -// Throws:	None. +// Details: Check the arguments that were passed to this program to make sure they are +//          valid and to get their argument values (if any). The following are options +//          that are only handled by *this driver: +//              --executable +//          The application's options --interpreter and --executable in code act very similar. +//          The --executable is necessary to differentiate whither the MI Driver is being +//          using by a client i.e. Eclipse or from the command line. Eclipse issues the option +//          --interpreter and also passes additional arguments which can be interpreted as an +//          executable if called from the command line. Using --executable tells the MI +//          Driver is being called the command line and that the executable argument is indeed +//          a specified executable an so actions commands to set up the executable for a +//          debug session. Using --interpreter on the commnd line does not action additional +//          commands to initialise a debug session and so be able to launch the process. +// Type:    Overridden. +// Args:    argc        - (R)   An integer that contains the count of arguments that follow in +//                              argv. The argc parameter is always greater than or equal to 1. +//          argv        - (R)   An array of null-terminated strings representing command-line +//                              arguments entered by the user of the program. By convention, +//                              argv[0] is the command with which the program is invoked. +//          vpStdOut    - (R)   Pointer to a standard output stream. +//          vwbExiting  - (W)   True = *this want to exit, Reasons: help, invalid arg(s), +//                              version information only. +//                              False = Continue to work, start debugger i.e. Command +//                              interpreter. +// Return:  lldb::SBError - LLDB current error status. +// Throws:  None.  //-- -lldb::SBError CMIDriver::ParseArgs( const int argc, const char * argv[], FILE * vpStdOut, bool & vwbExiting ) +lldb::SBError +CMIDriver::ParseArgs(const int argc, const char *argv[], FILE *vpStdOut, bool &vwbExiting)  { -	lldb::SBError errStatus; -	const bool bHaveArgs( argc >= 2 ); -	 -	// *** Add any args handled here to GetHelpOnCmdLineArgOptions() *** -	 -	// CODETAG_MIDRIVE_CMD_LINE_ARG_HANDLING -	// Look for the command line options		 -	bool bHaveExecutableFileNamePath = false; -	bool bHaveExecutableLongOption = false; -	 -	if( bHaveArgs ) -	{ -		// Search right to left to look for the executable -		for( MIint i = argc - 1; i > 0; i-- )  -		{  -			const CMIUtilString strArg( argv[ i ] ); -			const CMICmdArgValFile argFile; -			if( argFile.IsFilePath( strArg  ) ||  -				CMICmdArgValString( true, false, true ).IsStringArg( strArg )) -			{ -				bHaveExecutableFileNamePath = true; -				m_strCmdLineArgExecuteableFileNamePath = argFile.GetFileNamePath( strArg ); -				m_bHaveExecutableFileNamePathOnCmdLine = true; -			} -			// This argument is also check for in CMIDriverMgr::ParseArgs() -			if( 0 == strArg.compare( "--executable" ) )	// Used to specify that there is executable argument also on the command line  -			{											// See fn description. -				   bHaveExecutableLongOption = true; -			} -		} -	} - -	if( bHaveExecutableFileNamePath && bHaveExecutableLongOption ) -	{ -		// CODETAG_CMDLINE_ARG_EXECUTABLE_DEBUG_SESSION +    lldb::SBError errStatus; +    const bool bHaveArgs(argc >= 2); + +    // *** Add any args handled here to GetHelpOnCmdLineArgOptions() *** + +    // CODETAG_MIDRIVE_CMD_LINE_ARG_HANDLING +    // Look for the command line options +    bool bHaveExecutableFileNamePath = false; +    bool bHaveExecutableLongOption = false; + +    if (bHaveArgs) +    { +        // Search right to left to look for the executable +        for (MIint i = argc - 1; i > 0; i--) +        { +            const CMIUtilString strArg(argv[i]); +            const CMICmdArgValFile argFile; +            if (argFile.IsFilePath(strArg) || CMICmdArgValString(true, false, true).IsStringArg(strArg)) +            { +                bHaveExecutableFileNamePath = true; +                m_strCmdLineArgExecuteableFileNamePath = argFile.GetFileNamePath(strArg); +                m_bHaveExecutableFileNamePathOnCmdLine = true; +            } +            // This argument is also check for in CMIDriverMgr::ParseArgs() +            if (0 == strArg.compare("--executable")) // Used to specify that there is executable argument also on the command line +            {                                        // See fn description. +                bHaveExecutableLongOption = true; +            } +        } +    } + +    if (bHaveExecutableFileNamePath && bHaveExecutableLongOption) +    { +// CODETAG_CMDLINE_ARG_EXECUTABLE_DEBUG_SESSION  #if MICONFIG_ENABLE_MI_DRIVER_MI_MODE_CMDLINE_ARG_EXECUTABLE_DEBUG_SESSION -		SetDriverDebuggingArgExecutable(); +        SetDriverDebuggingArgExecutable();  #else -		vwbExiting = true; -		errStatus.SetErrorString( MIRSRC( IDS_DRIVER_ERR_LOCAL_DEBUG_NOT_IMPL ) ); +        vwbExiting = true; +        errStatus.SetErrorString(MIRSRC(IDS_DRIVER_ERR_LOCAL_DEBUG_NOT_IMPL));  #endif // MICONFIG_ENABLE_MI_DRIVER_MI_MODE_CMDLINE_ARG_EXECUTABLE_DEBUG_SESSION -	} +    } -	return errStatus; +    return errStatus;  }  //++ ------------------------------------------------------------------------------------ -// Details:	A client can ask if *this driver is GDB/MI compatible. -// Type:	Overridden. -// Args:	None. -// Return:	True - GBD/MI compatible LLDB front end. -//			False - Not GBD/MI compatible LLDB front end. -// Throws:	None. +// Details: A client can ask if *this driver is GDB/MI compatible. +// Type:    Overridden. +// Args:    None. +// Return:  True - GBD/MI compatible LLDB front end. +//          False - Not GBD/MI compatible LLDB front end. +// Throws:  None.  //-- -bool CMIDriver::GetDriverIsGDBMICompatibleDriver( void ) const +bool +CMIDriver::GetDriverIsGDBMICompatibleDriver(void) const  { -	return true; +    return true;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Callback function for monitoring stream stdin object. Part of the visitor  -//			pattern.  -//			This function is called by the CMICmnStreamStdin::CThreadStdin -//			"stdin monitor" thread (ID). -// Type:	Overridden. -// Args:	vStdInBuffer	- (R) Copy of the current stdin line data. -//			vrbYesExit		- (RW) True = yes exit stdin monitoring, false = continue monitor. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Callback function for monitoring stream stdin object. Part of the visitor +//          pattern. +//          This function is called by the CMICmnStreamStdin::CThreadStdin +//          "stdin monitor" thread (ID). +// Type:    Overridden. +// Args:    vStdInBuffer    - (R) Copy of the current stdin line data. +//          vrbYesExit      - (RW) True = yes exit stdin monitoring, false = continue monitor. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::ReadLine( const CMIUtilString & vStdInBuffer, bool & vrwbYesExit ) +bool +CMIDriver::ReadLine(const CMIUtilString &vStdInBuffer, bool &vrwbYesExit)  { -	// For debugging. Update prompt show stdin is working -	//printf( "%s\n", vStdInBuffer.c_str() ); -	//fflush( stdout ); +    // For debugging. Update prompt show stdin is working +    // printf( "%s\n", vStdInBuffer.c_str() ); +    // fflush( stdout ); -	// Special case look for the quit command here so stop monitoring stdin stream -	// So we do not go back to fgetc() and wait and hang thread on exit -	if( vStdInBuffer == "quit" ) -		vrwbYesExit = true; +    // Special case look for the quit command here so stop monitoring stdin stream +    // So we do not go back to fgetc() and wait and hang thread on exit +    if (vStdInBuffer == "quit") +        vrwbYesExit = true; -	// 1. Put new line in the queue container by stdin monitor thread -	// 2. Then *this driver calls ReadStdinLineQueue() when ready to read the queue in its -	// own thread -	const bool bOk = QueueMICommand( vStdInBuffer ); +    // 1. Put new line in the queue container by stdin monitor thread +    // 2. Then *this driver calls ReadStdinLineQueue() when ready to read the queue in its +    // own thread +    const bool bOk = QueueMICommand(vStdInBuffer); -	// Check to see if the *this driver is shutting down (exit application) -	if( !vrwbYesExit ) -		vrwbYesExit = m_bDriverIsExiting; +    // Check to see if the *this driver is shutting down (exit application) +    if (!vrwbYesExit) +        vrwbYesExit = m_bDriverIsExiting; -	return bOk; +    return bOk;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Start worker threads for the driver. -// Type:	Method. -// Args:	None. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Start worker threads for the driver. +// Type:    Method. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::StartWorkerThreads( void ) +bool +CMIDriver::StartWorkerThreads(void)  { -	bool bOk = MIstatus::success; -	 -	// Grab the thread manager -	CMICmnThreadMgrStd & rThreadMgr = CMICmnThreadMgrStd::Instance(); - -	// Start the stdin thread -	bOk &= m_rStdin.SetVisitor( *this ); -	if( bOk && !rThreadMgr.ThreadStart< CMICmnStreamStdin >( m_rStdin )) -	{ -		const CMIUtilString errMsg = CMIUtilString::Format( MIRSRC( IDS_THREADMGR_ERR_THREAD_FAIL_CREATE ), CMICmnThreadMgrStd::Instance().GetErrorDescription().c_str() ); -		SetErrorDescriptionn( errMsg ); -		return MIstatus::failure; -	} - -	// Start the event polling thread -	if( bOk && !rThreadMgr.ThreadStart< CMICmnLLDBDebugger >( m_rLldbDebugger ) ) -	{ -		const CMIUtilString errMsg = CMIUtilString::Format( MIRSRC( IDS_THREADMGR_ERR_THREAD_FAIL_CREATE ), CMICmnThreadMgrStd::Instance().GetErrorDescription().c_str() ); -		SetErrorDescriptionn( errMsg ); -		return MIstatus::failure; -	} - -	return bOk; +    bool bOk = MIstatus::success; + +    // Grab the thread manager +    CMICmnThreadMgrStd &rThreadMgr = CMICmnThreadMgrStd::Instance(); + +    // Start the stdin thread +    bOk &= m_rStdin.SetVisitor(*this); +    if (bOk && !rThreadMgr.ThreadStart<CMICmnStreamStdin>(m_rStdin)) +    { +        const CMIUtilString errMsg = CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), +                                                           CMICmnThreadMgrStd::Instance().GetErrorDescription().c_str()); +        SetErrorDescriptionn(errMsg); +        return MIstatus::failure; +    } + +    // Start the event polling thread +    if (bOk && !rThreadMgr.ThreadStart<CMICmnLLDBDebugger>(m_rLldbDebugger)) +    { +        const CMIUtilString errMsg = CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), +                                                           CMICmnThreadMgrStd::Instance().GetErrorDescription().c_str()); +        SetErrorDescriptionn(errMsg); +        return MIstatus::failure; +    } + +    return bOk;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Stop worker threads for the driver. -// Type:	Method. -// Args:	None. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Stop worker threads for the driver. +// Type:    Method. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::StopWorkerThreads( void ) +bool +CMIDriver::StopWorkerThreads(void)  { -	CMICmnThreadMgrStd & rThreadMgr = CMICmnThreadMgrStd::Instance(); -	return rThreadMgr.ThreadAllTerminate(); +    CMICmnThreadMgrStd &rThreadMgr = CMICmnThreadMgrStd::Instance(); +    return rThreadMgr.ThreadAllTerminate();  }  //++ ------------------------------------------------------------------------------------ -// Details:	Call this function puts *this driver to work. -//			This function is used by the application's main thread. -// Type:	Overridden. -// Args:	None. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Call this function puts *this driver to work. +//          This function is used by the application's main thread. +// Type:    Overridden. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::DoMainLoop( void ) +bool +CMIDriver::DoMainLoop(void)  { -	if( !InitClientIDEToMIDriver() ) // Init Eclipse IDE -	{ -		SetErrorDescriptionn( MIRSRC( IDS_MI_INIT_ERR_CLIENT_USING_DRIVER ) ); -		return MIstatus::failure; -	} - -	if( !StartWorkerThreads() ) -		return MIstatus::failure; -	 -	// App is not quitting currently -	m_bExitApp = false; - -	// CODETAG_CMDLINE_ARG_EXECUTABLE_DEBUG_SESSION +    if (!InitClientIDEToMIDriver()) // Init Eclipse IDE +    { +        SetErrorDescriptionn(MIRSRC(IDS_MI_INIT_ERR_CLIENT_USING_DRIVER)); +        return MIstatus::failure; +    } + +    if (!StartWorkerThreads()) +        return MIstatus::failure; + +    // App is not quitting currently +    m_bExitApp = false; + +// CODETAG_CMDLINE_ARG_EXECUTABLE_DEBUG_SESSION  #if MICONFIG_ENABLE_MI_DRIVER_MI_MODE_CMDLINE_ARG_EXECUTABLE_DEBUG_SESSION -	if( HaveExecutableFileNamePathOnCmdLine() ) -	{ -		if( !LocalDebugSessionStartupInjectCommands() ) -		{ -			SetErrorDescription( MIRSRC( IDS_MI_INIT_ERR_LOCAL_DEBUG_SESSION ) ); -			return MIstatus::failure; -		} -	} +    if (HaveExecutableFileNamePathOnCmdLine()) +    { +        if (!LocalDebugSessionStartupInjectCommands()) +        { +            SetErrorDescription(MIRSRC(IDS_MI_INIT_ERR_LOCAL_DEBUG_SESSION)); +            return MIstatus::failure; +        } +    }  #endif // MICONFIG_ENABLE_MI_DRIVER_MI_MODE_CMDLINE_ARG_EXECUTABLE_DEBUG_SESSION -	// While the app is active -	while( !m_bExitApp ) -	{ -		// Poll stdin queue and dispatch -		if( !ReadStdinLineQueue() ) -		{ -			// Something went wrong -			break; -		} -	} +    // While the app is active +    while (!m_bExitApp) +    { +        // Poll stdin queue and dispatch +        if (!ReadStdinLineQueue()) +        { +            // Something went wrong +            break; +        } +    } -	// Signal that the application is shutting down -	DoAppQuit(); +    // Signal that the application is shutting down +    DoAppQuit(); -	// Close and wait for the workers to stop -	StopWorkerThreads(); +    // Close and wait for the workers to stop +    StopWorkerThreads(); -	// Ensure that a new line is sent as the last act of the dying driver -	m_rStdOut.WriteMIResponse( "\n", false ); +    // Ensure that a new line is sent as the last act of the dying driver +    m_rStdOut.WriteMIResponse("\n", false); -	return MIstatus::success; +    return MIstatus::success;  }  //++ ------------------------------------------------------------------------------------ -// Details:	*this driver sits and waits for input to the stdin line queue shared by *this -//			driver and the stdin monitor thread, it queues, *this reads, interprets and -//			reacts. -//			This function is used by the application's main thread. -// Type:	Method. -// Args:	None. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: *this driver sits and waits for input to the stdin line queue shared by *this +//          driver and the stdin monitor thread, it queues, *this reads, interprets and +//          reacts. +//          This function is used by the application's main thread. +// Type:    Method. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::ReadStdinLineQueue( void ) +bool +CMIDriver::ReadStdinLineQueue(void)  { -	// True when queue contains input -	bool bHaveInput = false; - -	// Stores the current input line -	CMIUtilString lineText; -	{ -		// Lock while we access the queue -		CMIUtilThreadLock lock( m_threadMutex ); -		if( !m_queueStdinLine.empty() ) -		{ -			lineText = m_queueStdinLine.front(); -			m_queueStdinLine.pop(); -			bHaveInput = !lineText.empty(); -		} -	} - -	// Process while we have input -	if( bHaveInput ) -	{ -		if( lineText == "quit" ) -		{ -			// We want to be exiting when receiving a quit command -			m_bExitApp = true; -			return MIstatus::success; -		} - -		// Process the command -		const bool bOk = InterpretCommand( lineText ); - -		// Draw prompt if desired -		if( bOk && m_rStdin.GetEnablePrompt() ) -			m_rStdOut.WriteMIResponse( m_rStdin.GetPrompt() ); - -		// Input has been processed -		bHaveInput = false; -	} -	else -	{ -		// Give resources back to the OS -		const std::chrono::milliseconds time( 1 ); -		std::this_thread::sleep_for( time ); -	} -	 -	return MIstatus::success; +    // True when queue contains input +    bool bHaveInput = false; + +    // Stores the current input line +    CMIUtilString lineText; +    { +        // Lock while we access the queue +        CMIUtilThreadLock lock(m_threadMutex); +        if (!m_queueStdinLine.empty()) +        { +            lineText = m_queueStdinLine.front(); +            m_queueStdinLine.pop(); +            bHaveInput = !lineText.empty(); +        } +    } + +    // Process while we have input +    if (bHaveInput) +    { +        if (lineText == "quit") +        { +            // We want to be exiting when receiving a quit command +            m_bExitApp = true; +            return MIstatus::success; +        } + +        // Process the command +        const bool bOk = InterpretCommand(lineText); + +        // Draw prompt if desired +        if (bOk && m_rStdin.GetEnablePrompt()) +            m_rStdOut.WriteMIResponse(m_rStdin.GetPrompt()); + +        // Input has been processed +        bHaveInput = false; +    } +    else +    { +        // Give resources back to the OS +        const std::chrono::milliseconds time(1); +        std::this_thread::sleep_for(time); +    } + +    return MIstatus::success;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Set things in motion, set state etc that brings *this driver (and the  -//			application) to a tidy shutdown. -//			This function is used by the application's main thread. -// Type:	Method. -// Args:	None. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Set things in motion, set state etc that brings *this driver (and the +//          application) to a tidy shutdown. +//          This function is used by the application's main thread. +// Type:    Method. +// Args:    None. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::DoAppQuit( void ) +bool +CMIDriver::DoAppQuit(void)  { -	bool bYesQuit = true; +    bool bYesQuit = true; -	// Shutdown stuff, ready app for exit -	{ -		CMIUtilThreadLock lock( m_threadMutex ); -		m_bDriverIsExiting = true; -	} +    // Shutdown stuff, ready app for exit +    { +        CMIUtilThreadLock lock(m_threadMutex); +        m_bDriverIsExiting = true; +    } -	return bYesQuit; +    return bYesQuit;  }  //++ ------------------------------------------------------------------------------------ -// Details:	*this driver passes text commands to a fall through driver is it does not -//			understand them (the LLDB driver). -//			This function is used by the application's main thread. -// Type:	Method. -// Args:	vTextLine			- (R) Text data representing a possible command. -//			vwbCmdYesValid		- (W) True = Command valid, false = command not handled. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: *this driver passes text commands to a fall through driver is it does not +//          understand them (the LLDB driver). +//          This function is used by the application's main thread. +// Type:    Method. +// Args:    vTextLine           - (R) Text data representing a possible command. +//          vwbCmdYesValid      - (W) True = Command valid, false = command not handled. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::InterpretCommandFallThruDriver( const CMIUtilString & vTextLine, bool & vwbCmdYesValid ) +bool +CMIDriver::InterpretCommandFallThruDriver(const CMIUtilString &vTextLine, bool &vwbCmdYesValid)  { -	MIunused( vTextLine ); -	MIunused( vwbCmdYesValid ); - -	// ToDo: Implement when less urgent work to be done or decide remove as not required -	//bool bOk = MIstatus::success; -	//bool bCmdNotUnderstood = true; -	//if( bCmdNotUnderstood && GetEnableFallThru() ) -	//{ -	//	CMIUtilString errMsg; -	//	bOk = DoFallThruToAnotherDriver( vStdInBuffer, errMsg ); -	//	if( !bOk ) -	//	{ -	//		errMsg = errMsg.StripCREndOfLine(); -	//		errMsg = errMsg.StripCRAll(); -	//		const CMIDriverBase * pOtherDriver = GetDriverToFallThruTo(); -	//		const MIchar * pName = pOtherDriver->GetDriverName().c_str(); -	//		const MIchar * pId = pOtherDriver->GetDriverId().c_str(); -	//		const CMIUtilString msg( CMIUtilString::Format( MIRSRC( IDS_DRIVER_ERR_FALLTHRU_DRIVER_ERR ), pName, pId, errMsg.c_str() ) ); -	//		m_pLog->WriteMsg( msg ); -	//	} -	//} -	// -	//vwbCmdYesValid = bOk; -	//CMIUtilString strNot; -	//if( vwbCmdYesValid) -	//	strNot = CMIUtilString::Format( "%s ", MIRSRC( IDS_WORD_NOT ) ); -	//const CMIUtilString msg( CMIUtilString::Format( MIRSRC( IDS_FALLTHRU_DRIVER_CMD_RECEIVED ), vTextLine.c_str(), strNot.c_str() ) ); -	//m_pLog->WriteLog( msg ); -	 -	return MIstatus::success; +    MIunused(vTextLine); +    MIunused(vwbCmdYesValid); + +    // ToDo: Implement when less urgent work to be done or decide remove as not required +    // bool bOk = MIstatus::success; +    // bool bCmdNotUnderstood = true; +    // if( bCmdNotUnderstood && GetEnableFallThru() ) +    //{ +    //  CMIUtilString errMsg; +    //  bOk = DoFallThruToAnotherDriver( vStdInBuffer, errMsg ); +    //  if( !bOk ) +    //  { +    //      errMsg = errMsg.StripCREndOfLine(); +    //      errMsg = errMsg.StripCRAll(); +    //      const CMIDriverBase * pOtherDriver = GetDriverToFallThruTo(); +    //      const MIchar * pName = pOtherDriver->GetDriverName().c_str(); +    //      const MIchar * pId = pOtherDriver->GetDriverId().c_str(); +    //      const CMIUtilString msg( CMIUtilString::Format( MIRSRC( IDS_DRIVER_ERR_FALLTHRU_DRIVER_ERR ), pName, pId, errMsg.c_str() ) +    //); +    //      m_pLog->WriteMsg( msg ); +    //  } +    //} +    // +    // vwbCmdYesValid = bOk; +    // CMIUtilString strNot; +    // if( vwbCmdYesValid) +    //  strNot = CMIUtilString::Format( "%s ", MIRSRC( IDS_WORD_NOT ) ); +    // const CMIUtilString msg( CMIUtilString::Format( MIRSRC( IDS_FALLTHRU_DRIVER_CMD_RECEIVED ), vTextLine.c_str(), strNot.c_str() ) ); +    // m_pLog->WriteLog( msg ); + +    return MIstatus::success;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Retrieve the name for *this driver. -// Type:	Overridden. -// Args:	None. -// Return:	CMIUtilString & - Driver name. -// Throws:	None. +// Details: Retrieve the name for *this driver. +// Type:    Overridden. +// Args:    None. +// Return:  CMIUtilString & - Driver name. +// Throws:  None.  //-- -const CMIUtilString & CMIDriver::GetDriverName( void ) const +const CMIUtilString & +CMIDriver::GetDriverName(void) const  { -	return GetName(); +    return GetName();  }  //++ ------------------------------------------------------------------------------------ -// Details:	Get the unique ID for *this driver. -// Type:	Overridden. -// Args:	None. -// Return:	CMIUtilString & - Text description. -// Throws:	None. +// Details: Get the unique ID for *this driver. +// Type:    Overridden. +// Args:    None. +// Return:  CMIUtilString & - Text description. +// Throws:  None.  //-- -const CMIUtilString & CMIDriver::GetDriverId( void ) const +const CMIUtilString & +CMIDriver::GetDriverId(void) const  { -	return GetId(); +    return GetId();  }  //++ ------------------------------------------------------------------------------------ -// Details:	This function allows *this driver to call on another driver to perform work -//			should this driver not be able to handle the client data input. -//			SetDriverToFallThruTo() specifies the fall through to driver. -//			Check the error message if the function returns a failure. -// Type:	Overridden. -// Args:	vCmd		- (R) Command instruction to interpret. -//			vwErrMsg	- (W) Error description on command failing. -// Return:	MIstatus::success - Command succeeded. -//			MIstatus::failure - Command failed. -// Throws:	None. +// Details: This function allows *this driver to call on another driver to perform work +//          should this driver not be able to handle the client data input. +//          SetDriverToFallThruTo() specifies the fall through to driver. +//          Check the error message if the function returns a failure. +// Type:    Overridden. +// Args:    vCmd        - (R) Command instruction to interpret. +//          vwErrMsg    - (W) Error description on command failing. +// Return:  MIstatus::success - Command succeeded. +//          MIstatus::failure - Command failed. +// Throws:  None.  //-- -bool CMIDriver::DoFallThruToAnotherDriver( const CMIUtilString & vCmd, CMIUtilString & vwErrMsg ) +bool +CMIDriver::DoFallThruToAnotherDriver(const CMIUtilString &vCmd, CMIUtilString &vwErrMsg)  { -	bool bOk = MIstatus::success; +    bool bOk = MIstatus::success; -	CMIDriverBase * pOtherDriver = GetDriverToFallThruTo(); -	if( pOtherDriver == nullptr ) -		return bOk; +    CMIDriverBase *pOtherDriver = GetDriverToFallThruTo(); +    if (pOtherDriver == nullptr) +        return bOk; -	return pOtherDriver->DoFallThruToAnotherDriver( vCmd, vwErrMsg ); +    return pOtherDriver->DoFallThruToAnotherDriver(vCmd, vwErrMsg);  }  //++ ------------------------------------------------------------------------------------ -// Details:	*this driver provides a file stream to other drivers on which *this driver -//			write's out to and they read as expected input. *this driver is passing -//			through commands to the (child) pass through assigned driver. -// Type:	Overrdidden. -// Args:	None. -// Return:	FILE * - Pointer to stream. -// Throws:	None. +// Details: *this driver provides a file stream to other drivers on which *this driver +//          write's out to and they read as expected input. *this driver is passing +//          through commands to the (child) pass through assigned driver. +// Type:    Overrdidden. +// Args:    None. +// Return:  FILE * - Pointer to stream. +// Throws:  None.  //-- -FILE * CMIDriver::GetStdin( void ) const +FILE * +CMIDriver::GetStdin(void) const  { -	// Note this fn is called on CMIDriverMgr register driver so stream has to be -	// available before *this driver has been initialized! Flaw? +    // Note this fn is called on CMIDriverMgr register driver so stream has to be +    // available before *this driver has been initialized! Flaw? -	// This very likely to change later to a stream that the pass thru driver -	// will read and we write to give it 'input' -	return stdin; +    // This very likely to change later to a stream that the pass thru driver +    // will read and we write to give it 'input' +    return stdin;  }  //++ ------------------------------------------------------------------------------------ -// Details:	*this driver provides a file stream to other pass through assigned drivers  -//			so they know what to write to. -// Type:	Overidden. -// Args:	None. -// Return:	FILE * - Pointer to stream. -// Throws:	None. +// Details: *this driver provides a file stream to other pass through assigned drivers +//          so they know what to write to. +// Type:    Overidden. +// Args:    None. +// Return:  FILE * - Pointer to stream. +// Throws:  None.  //-- -FILE * CMIDriver::GetStdout( void ) const +FILE * +CMIDriver::GetStdout(void) const  { -	// Note this fn is called on CMIDriverMgr register driver so stream has to be -	// available before *this driver has been initialized! Flaw? +    // Note this fn is called on CMIDriverMgr register driver so stream has to be +    // available before *this driver has been initialized! Flaw? -	// Do not want to pass through driver to write to stdout -	return NULL; +    // Do not want to pass through driver to write to stdout +    return NULL;  }  //++ ------------------------------------------------------------------------------------ -// Details:	*this driver provides a error file stream to other pass through assigned drivers  -//			so they know what to write to. -// Type:	Overidden. -// Args:	None. -// Return:	FILE * - Pointer to stream. -// Throws:	None. +// Details: *this driver provides a error file stream to other pass through assigned drivers +//          so they know what to write to. +// Type:    Overidden. +// Args:    None. +// Return:  FILE * - Pointer to stream. +// Throws:  None.  //-- -FILE * CMIDriver::GetStderr( void ) const +FILE * +CMIDriver::GetStderr(void) const  { -	// Note this fn is called on CMIDriverMgr register driver so stream has to be -	// available before *this driver has been initialized! Flaw? +    // Note this fn is called on CMIDriverMgr register driver so stream has to be +    // available before *this driver has been initialized! Flaw? -	// This very likely to change later to a stream that the pass thru driver -	// will write to and *this driver reads from to pass on the CMICmnLog object -	return stderr; +    // This very likely to change later to a stream that the pass thru driver +    // will write to and *this driver reads from to pass on the CMICmnLog object +    return stderr;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Set a unique ID for *this driver. It cannot be empty. -// Type:	Overridden. -// Args:	vId	- (R) Text description. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Set a unique ID for *this driver. It cannot be empty. +// Type:    Overridden. +// Args:    vId - (R) Text description. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::SetId( const CMIUtilString & vId ) +bool +CMIDriver::SetId(const CMIUtilString &vId)  { -	if( vId.empty() ) -	{ -		SetErrorDescriptionn( MIRSRC( IDS_DRIVER_ERR_ID_INVALID ), GetName().c_str(), vId.c_str() ); -		return MIstatus::failure; -	} - -	m_strDriverId = vId; -	return MIstatus::success; +    if (vId.empty()) +    { +        SetErrorDescriptionn(MIRSRC(IDS_DRIVER_ERR_ID_INVALID), GetName().c_str(), vId.c_str()); +        return MIstatus::failure; +    } + +    m_strDriverId = vId; +    return MIstatus::success;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Get the unique ID for *this driver. -// Type:	Overridden. -// Args:	None. -// Return:	CMIUtilString & - Text description. -// Throws:	None. +// Details: Get the unique ID for *this driver. +// Type:    Overridden. +// Args:    None. +// Return:  CMIUtilString & - Text description. +// Throws:  None.  //-- -const CMIUtilString & CMIDriver::GetId( void ) const +const CMIUtilString & +CMIDriver::GetId(void) const  { -	return m_strDriverId; +    return m_strDriverId;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Inject a command into the command processing system to be interpreted as a -//			command read from stdin. The text representing the command is also written -//			out to stdout as the command did not come from via stdin. -// Type:	Method. -// Args:	vMICmd	- (R) Text data representing a possible command. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Inject a command into the command processing system to be interpreted as a +//          command read from stdin. The text representing the command is also written +//          out to stdout as the command did not come from via stdin. +// Type:    Method. +// Args:    vMICmd  - (R) Text data representing a possible command. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::InjectMICommand( const CMIUtilString & vMICmd ) +bool +CMIDriver::InjectMICommand(const CMIUtilString &vMICmd)  { -	const bool bOk = m_rStdOut.WriteMIResponse( vMICmd ); +    const bool bOk = m_rStdOut.WriteMIResponse(vMICmd); -	return bOk && QueueMICommand( vMICmd ); +    return bOk && QueueMICommand(vMICmd);  }  //++ ------------------------------------------------------------------------------------ -// Details:	Add a new command candidate to the command queue to be processed by the  -//			command system. -// Type:	Method. -// Args:	vMICmd	- (R) Text data representing a possible command. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Add a new command candidate to the command queue to be processed by the +//          command system. +// Type:    Method. +// Args:    vMICmd  - (R) Text data representing a possible command. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::QueueMICommand( const CMIUtilString & vMICmd ) +bool +CMIDriver::QueueMICommand(const CMIUtilString &vMICmd)  { -	CMIUtilThreadLock lock( m_threadMutex ); -	m_queueStdinLine.push( vMICmd ); -	 -	return MIstatus::success; +    CMIUtilThreadLock lock(m_threadMutex); +    m_queueStdinLine.push(vMICmd); + +    return MIstatus::success;  } -	 +  //++ ------------------------------------------------------------------------------------ -// Details:	Interpret the text data and match against current commands to see if there  -//			is a match. If a match then the command is issued and actioned on. The  -//			text data if not understood by *this driver is past on to the Fall Thru -//			driver. -//			This function is used by the application's main thread. -// Type:	Method. -// Args:	vTextLine	- (R) Text data representing a possible command. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Interpret the text data and match against current commands to see if there +//          is a match. If a match then the command is issued and actioned on. The +//          text data if not understood by *this driver is past on to the Fall Thru +//          driver. +//          This function is used by the application's main thread. +// Type:    Method. +// Args:    vTextLine   - (R) Text data representing a possible command. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::InterpretCommand( const CMIUtilString & vTextLine ) +bool +CMIDriver::InterpretCommand(const CMIUtilString &vTextLine)  { -	bool bCmdYesValid = false; -	bool bOk = InterpretCommandThisDriver( vTextLine, bCmdYesValid ); -	if( bOk && !bCmdYesValid ) -		bOk = InterpretCommandFallThruDriver( vTextLine, bCmdYesValid ); +    bool bCmdYesValid = false; +    bool bOk = InterpretCommandThisDriver(vTextLine, bCmdYesValid); +    if (bOk && !bCmdYesValid) +        bOk = InterpretCommandFallThruDriver(vTextLine, bCmdYesValid); -	return bOk; +    return bOk;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Interpret the text data and match against current commands to see if there  -//			is a match. If a match then the command is issued and actioned on. If a -//			command cannot be found to match then vwbCmdYesValid is set to false and -//			nothing else is done here. -//			This function is used by the application's main thread. -// Type:	Method. -// Args:	vTextLine			- (R) Text data representing a possible command. -//			vwbCmdYesValid		- (W) True = Command invalid, false = command acted on. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Interpret the text data and match against current commands to see if there +//          is a match. If a match then the command is issued and actioned on. If a +//          command cannot be found to match then vwbCmdYesValid is set to false and +//          nothing else is done here. +//          This function is used by the application's main thread. +// Type:    Method. +// Args:    vTextLine           - (R) Text data representing a possible command. +//          vwbCmdYesValid      - (W) True = Command invalid, false = command acted on. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::InterpretCommandThisDriver( const CMIUtilString & vTextLine, bool & vwbCmdYesValid ) +bool +CMIDriver::InterpretCommandThisDriver(const CMIUtilString &vTextLine, bool &vwbCmdYesValid)  { -	vwbCmdYesValid = false; - -	bool bCmdNotInCmdFactor = false; -	SMICmdData cmdData; -	CMICmdMgr & rCmdMgr = CMICmdMgr::Instance(); -	if( !rCmdMgr.CmdInterpret( vTextLine, vwbCmdYesValid, bCmdNotInCmdFactor, cmdData ) ) -		return MIstatus::failure; -	 -	if( vwbCmdYesValid ) -	{ -		// For debugging only -		//m_pLog->WriteLog( cmdData.strMiCmdAll.c_str() ); -		 -		return ExecuteCommand( cmdData ); -	} - -	// Check for escape character, may be cursor control characters -	// This code is not necessary for application operation, just want to keep tabs on what  -	// is been given to the driver to try and intepret. -	if( vTextLine.at( 0 ) == 27 ) -	{ -		CMIUtilString logInput( MIRSRC( IDS_STDIN_INPUT_CTRL_CHARS ) ); -		for( MIuint i = 0; i < vTextLine.length(); i++ ) -		{ -			logInput += CMIUtilString::Format( "%d ", vTextLine.at( i ) ); -		} -		m_pLog->WriteLog( logInput ); -		return MIstatus::success; -	} - -	// Write to the Log that a 'command' was not valid.  -	// Report back to the MI client via MI result record. -	CMIUtilString strNotInCmdFactory; -	if( bCmdNotInCmdFactor ) -		strNotInCmdFactory = CMIUtilString::Format( MIRSRC( IDS_DRIVER_CMD_NOT_IN_FACTORY ), cmdData.strMiCmd.c_str() ); -	const CMIUtilString strNot( CMIUtilString::Format( "%s ", MIRSRC( IDS_WORD_NOT ) ) ); -	const CMIUtilString msg( CMIUtilString::Format( MIRSRC( IDS_DRIVER_CMD_RECEIVED ), vTextLine.c_str(), strNot.c_str(), strNotInCmdFactory.c_str() ) ); -	const CMICmnMIValueConst vconst = CMICmnMIValueConst( msg ); -	const CMICmnMIValueResult valueResult( "msg", vconst ); -	const CMICmnMIResultRecord miResultRecord( cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, valueResult ); -	m_rStdOut.WriteMIResponse( miResultRecord.GetString() ); -	 -	// Proceed to wait for or execute next command -	return MIstatus::success; +    vwbCmdYesValid = false; + +    bool bCmdNotInCmdFactor = false; +    SMICmdData cmdData; +    CMICmdMgr &rCmdMgr = CMICmdMgr::Instance(); +    if (!rCmdMgr.CmdInterpret(vTextLine, vwbCmdYesValid, bCmdNotInCmdFactor, cmdData)) +        return MIstatus::failure; + +    if (vwbCmdYesValid) +    { +        // For debugging only +        // m_pLog->WriteLog( cmdData.strMiCmdAll.c_str() ); + +        return ExecuteCommand(cmdData); +    } + +    // Check for escape character, may be cursor control characters +    // This code is not necessary for application operation, just want to keep tabs on what +    // is been given to the driver to try and intepret. +    if (vTextLine.at(0) == 27) +    { +        CMIUtilString logInput(MIRSRC(IDS_STDIN_INPUT_CTRL_CHARS)); +        for (MIuint i = 0; i < vTextLine.length(); i++) +        { +            logInput += CMIUtilString::Format("%d ", vTextLine.at(i)); +        } +        m_pLog->WriteLog(logInput); +        return MIstatus::success; +    } + +    // Write to the Log that a 'command' was not valid. +    // Report back to the MI client via MI result record. +    CMIUtilString strNotInCmdFactory; +    if (bCmdNotInCmdFactor) +        strNotInCmdFactory = CMIUtilString::Format(MIRSRC(IDS_DRIVER_CMD_NOT_IN_FACTORY), cmdData.strMiCmd.c_str()); +    const CMIUtilString strNot(CMIUtilString::Format("%s ", MIRSRC(IDS_WORD_NOT))); +    const CMIUtilString msg( +        CMIUtilString::Format(MIRSRC(IDS_DRIVER_CMD_RECEIVED), vTextLine.c_str(), strNot.c_str(), strNotInCmdFactory.c_str())); +    const CMICmnMIValueConst vconst = CMICmnMIValueConst(msg); +    const CMICmnMIValueResult valueResult("msg", vconst); +    const CMICmnMIResultRecord miResultRecord(cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, valueResult); +    m_rStdOut.WriteMIResponse(miResultRecord.GetString()); + +    // Proceed to wait for or execute next command +    return MIstatus::success;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Having previously had the potential command validated and found valid now -//			get the command executed. -//			This function is used by the application's main thread. -// Type:	Method. -// Args:	vCmdData	- (RW) Command meta data. -// Return:	MIstatus::success - Functional succeeded. -//			MIstatus::failure - Functional failed. -// Throws:	None. +// Details: Having previously had the potential command validated and found valid now +//          get the command executed. +//          This function is used by the application's main thread. +// Type:    Method. +// Args:    vCmdData    - (RW) Command meta data. +// Return:  MIstatus::success - Functional succeeded. +//          MIstatus::failure - Functional failed. +// Throws:  None.  //-- -bool CMIDriver::ExecuteCommand( const SMICmdData & vCmdData ) +bool +CMIDriver::ExecuteCommand(const SMICmdData &vCmdData)  { -	CMICmdMgr & rCmdMgr = CMICmdMgr::Instance(); -	return rCmdMgr.CmdExecute( vCmdData ); +    CMICmdMgr &rCmdMgr = CMICmdMgr::Instance(); +    return rCmdMgr.CmdExecute(vCmdData);  }  //++ ------------------------------------------------------------------------------------ -// Details:	Set the MI Driver's exit application flag. The application checks this flag  -//			after every stdin line is read so the exit may not be instantaneous. -//			If vbForceExit is false the MI Driver queries its state and determines if is -//			should exit or continue operating depending on that running state. -//			This is related to the running state of the MI driver. -// Type:	Overridden. -// Args:	None. -// Return:	None. -// Throws:	None. +// Details: Set the MI Driver's exit application flag. The application checks this flag +//          after every stdin line is read so the exit may not be instantaneous. +//          If vbForceExit is false the MI Driver queries its state and determines if is +//          should exit or continue operating depending on that running state. +//          This is related to the running state of the MI driver. +// Type:    Overridden. +// Args:    None. +// Return:  None. +// Throws:  None.  //-- -void CMIDriver::SetExitApplicationFlag( const bool vbForceExit ) +void +CMIDriver::SetExitApplicationFlag(const bool vbForceExit)  { -	if( vbForceExit ) -	{ -		CMIUtilThreadLock lock( m_threadMutex ); -		m_bExitApp = true; -		return; -	} - -	// CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM -	// Did we receive a SIGINT from the client during a running debug program, if -	// so then SIGINT is not to be taken as meaning kill the MI driver application -	// but halt the inferior program being debugged instead -	if( m_eCurrentDriverState == eDriverState_RunningDebugging ) -	{ -		InjectMICommand( "-exec-interrupt" ); -		return; -	} - -	m_bExitApp = true; +    if (vbForceExit) +    { +        CMIUtilThreadLock lock(m_threadMutex); +        m_bExitApp = true; +        m_rStdin.OnExitHandler(); +        return; +    } + +    // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM +    // Did we receive a SIGINT from the client during a running debug program, if +    // so then SIGINT is not to be taken as meaning kill the MI driver application +    // but halt the inferior program being debugged instead +    if (m_eCurrentDriverState == eDriverState_RunningDebugging) +    { +        InjectMICommand("-exec-interrupt"); +        return; +    } + +    m_bExitApp = true; +    m_rStdin.OnExitHandler();  }  //++ ------------------------------------------------------------------------------------ -// Details:	Get the  MI Driver's exit exit application flag.  -//			This is related to the running state of the MI driver. -// Type:	Method. -// Args:	None. -// Return:	bool	- True = MI Driver is shutting down, false = MI driver is running. -// Throws:	None. +// Details: Get the  MI Driver's exit exit application flag. +//          This is related to the running state of the MI driver. +// Type:    Method. +// Args:    None. +// Return:  bool    - True = MI Driver is shutting down, false = MI driver is running. +// Throws:  None.  //-- -bool CMIDriver::GetExitApplicationFlag( void ) const +bool +CMIDriver::GetExitApplicationFlag(void) const  { -	return m_bExitApp; +    return m_bExitApp;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Get the current running state of the MI Driver.  -// Type:	Method. -// Args:	None. -// Return:	DriverState_e	- The current running state of the application. -// Throws:	None. +// Details: Get the current running state of the MI Driver. +// Type:    Method. +// Args:    None. +// Return:  DriverState_e   - The current running state of the application. +// Throws:  None.  //-- -CMIDriver::DriverState_e CMIDriver::GetCurrentDriverState( void ) const +CMIDriver::DriverState_e +CMIDriver::GetCurrentDriverState(void) const  { -	return m_eCurrentDriverState; +    return m_eCurrentDriverState;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Set the current running state of the MI Driver to running and currently not in -//			a debug session.  -// Type:	Method. -// Return:	MIstatus::success - Functionality succeeded. -//			MIstatus::failure - Functionality failed. -// Return:	DriverState_e	- The current running state of the application. -// Throws:	None. +// Details: Set the current running state of the MI Driver to running and currently not in +//          a debug session. +// Type:    Method. +// Return:  MIstatus::success - Functionality succeeded. +//          MIstatus::failure - Functionality failed. +// Return:  DriverState_e   - The current running state of the application. +// Throws:  None.  //-- -bool CMIDriver::SetDriverStateRunningNotDebugging( void ) +bool +CMIDriver::SetDriverStateRunningNotDebugging(void)  { -	// CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM -		 -	if( m_eCurrentDriverState == eDriverState_RunningNotDebugging ) -		return MIstatus::success; - -	// Driver cannot be in the following states to set eDriverState_RunningNotDebugging -	switch( m_eCurrentDriverState ) -	{ -	case eDriverState_NotRunning: -	case eDriverState_Initialising: -	case eDriverState_ShuttingDown: -	{ -		SetErrorDescription( MIRSRC( IDS_DRIVER_ERR_DRIVER_STATE_ERROR ) ); -		return MIstatus::failure; -	} -	case eDriverState_RunningDebugging: -	case eDriverState_RunningNotDebugging: -		break; -	case eDriverState_count: -	default: -		SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_CODE_ERR_INVALID_ENUMERATION_VALUE ), "SetDriverStateRunningNotDebugging()" ) ); -		return MIstatus::failure; -	} - -	// Driver must be in this state to set eDriverState_RunningNotDebugging -	if( m_eCurrentDriverState != eDriverState_RunningDebugging ) -	{ -		SetErrorDescription( MIRSRC( IDS_DRIVER_ERR_DRIVER_STATE_ERROR ) ); -		return MIstatus::failure; -	} - -	m_eCurrentDriverState = eDriverState_RunningNotDebugging; - -	return MIstatus::success; +    // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM + +    if (m_eCurrentDriverState == eDriverState_RunningNotDebugging) +        return MIstatus::success; + +    // Driver cannot be in the following states to set eDriverState_RunningNotDebugging +    switch (m_eCurrentDriverState) +    { +        case eDriverState_NotRunning: +        case eDriverState_Initialising: +        case eDriverState_ShuttingDown: +        { +            SetErrorDescription(MIRSRC(IDS_DRIVER_ERR_DRIVER_STATE_ERROR)); +            return MIstatus::failure; +        } +        case eDriverState_RunningDebugging: +        case eDriverState_RunningNotDebugging: +            break; +        case eDriverState_count: +            SetErrorDescription( +                CMIUtilString::Format(MIRSRC(IDS_CODE_ERR_INVALID_ENUMERATION_VALUE), "SetDriverStateRunningNotDebugging()")); +            return MIstatus::failure; +    } + +    // Driver must be in this state to set eDriverState_RunningNotDebugging +    if (m_eCurrentDriverState != eDriverState_RunningDebugging) +    { +        SetErrorDescription(MIRSRC(IDS_DRIVER_ERR_DRIVER_STATE_ERROR)); +        return MIstatus::failure; +    } + +    m_eCurrentDriverState = eDriverState_RunningNotDebugging; + +    return MIstatus::success;  }  //++ ------------------------------------------------------------------------------------ -// Details:	Set the current running state of the MI Driver to running and currently not in -//			a debug session. The driver's state must in the state running and in a -//			debug session to set this new state. -// Type:	Method. -// Return:	MIstatus::success - Functionality succeeded. -//			MIstatus::failure - Functionality failed. -// Return:	DriverState_e	- The current running state of the application. -// Throws:	None. +// Details: Set the current running state of the MI Driver to running and currently not in +//          a debug session. The driver's state must in the state running and in a +//          debug session to set this new state. +// Type:    Method. +// Return:  MIstatus::success - Functionality succeeded. +//          MIstatus::failure - Functionality failed. +// Return:  DriverState_e   - The current running state of the application. +// Throws:  None.  //-- -bool CMIDriver::SetDriverStateRunningDebugging( void ) +bool +CMIDriver::SetDriverStateRunningDebugging(void)  { -	// CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM -		 -	if( m_eCurrentDriverState == eDriverState_RunningDebugging ) -		return MIstatus::success; - -	// Driver cannot be in the following states to set eDriverState_RunningDebugging -	switch( m_eCurrentDriverState ) -	{ -	case eDriverState_NotRunning: -	case eDriverState_Initialising: -	case eDriverState_ShuttingDown: -	{ -		SetErrorDescription( MIRSRC( IDS_DRIVER_ERR_DRIVER_STATE_ERROR ) ); -		return MIstatus::failure; -	} -	case eDriverState_RunningDebugging: -	case eDriverState_RunningNotDebugging: -		break; -	case eDriverState_count: -	default: -		SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_CODE_ERR_INVALID_ENUMERATION_VALUE ), "SetDriverStateRunningDebugging()" ) ); -		return MIstatus::failure; -	} - -	// Driver must be in this state to set eDriverState_RunningDebugging -	if( m_eCurrentDriverState != eDriverState_RunningNotDebugging ) -	{ -		SetErrorDescription( MIRSRC( IDS_DRIVER_ERR_DRIVER_STATE_ERROR ) ); -		return MIstatus::failure; -	} - -	m_eCurrentDriverState = eDriverState_RunningDebugging; - -	return MIstatus::success; +    // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM + +    if (m_eCurrentDriverState == eDriverState_RunningDebugging) +        return MIstatus::success; + +    // Driver cannot be in the following states to set eDriverState_RunningDebugging +    switch (m_eCurrentDriverState) +    { +        case eDriverState_NotRunning: +        case eDriverState_Initialising: +        case eDriverState_ShuttingDown: +        { +            SetErrorDescription(MIRSRC(IDS_DRIVER_ERR_DRIVER_STATE_ERROR)); +            return MIstatus::failure; +        } +        case eDriverState_RunningDebugging: +        case eDriverState_RunningNotDebugging: +            break; +        case eDriverState_count: +            SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_CODE_ERR_INVALID_ENUMERATION_VALUE), "SetDriverStateRunningDebugging()")); +            return MIstatus::failure; +    } + +    // Driver must be in this state to set eDriverState_RunningDebugging +    if (m_eCurrentDriverState != eDriverState_RunningNotDebugging) +    { +        SetErrorDescription(MIRSRC(IDS_DRIVER_ERR_DRIVER_STATE_ERROR)); +        return MIstatus::failure; +    } + +    m_eCurrentDriverState = eDriverState_RunningDebugging; + +    return MIstatus::success;  }  //++ ------------------------------------------------------------------------------------ -// Details: Prepare the client IDE so it will start working/communicating with *this MI  -//			driver. -// Type:	Method. -// Args:	None. -// Return:	MIstatus::success - Functionality succeeded. -//			MIstatus::failure - Functionality failed. -// Throws:	None. +// Details: Prepare the client IDE so it will start working/communicating with *this MI +//          driver. +// Type:    Method. +// Args:    None. +// Return:  MIstatus::success - Functionality succeeded. +//          MIstatus::failure - Functionality failed. +// Throws:  None.  //-- -bool CMIDriver::InitClientIDEToMIDriver( void ) const +bool +CMIDriver::InitClientIDEToMIDriver(void) const  { -	// Put other IDE init functions here -	return InitClientIDEEclipse(); +    // Put other IDE init functions here +    return InitClientIDEEclipse();  }  //++ ------------------------------------------------------------------------------------  // Details: The IDE Eclipse when debugging locally expects "(gdb)\n" character -//			sequence otherwise it refuses to communicate and times out. This should be -//			sent to Eclipse before anything else. -// Type:	Method. -// Args:	None. -// Return:	MIstatus::success - Functionality succeeded. -//			MIstatus::failure - Functionality failed. -// Throws:	None. +//          sequence otherwise it refuses to communicate and times out. This should be +//          sent to Eclipse before anything else. +// Type:    Method. +// Args:    None. +// Return:  MIstatus::success - Functionality succeeded. +//          MIstatus::failure - Functionality failed. +// Throws:  None.  //-- -bool CMIDriver::InitClientIDEEclipse( void ) const +bool +CMIDriver::InitClientIDEEclipse(void) const  { -	std::cout << "(gdb)" << std::endl; +    std::cout << "(gdb)" << std::endl; -	return MIstatus::success; +    return MIstatus::success;  }  //++ ------------------------------------------------------------------------------------ -// Details: Ask *this driver whether it found an executable in the MI Driver's list of  -//			arguments which to open and debug. If so instigate commands to set up a debug -//			session for that executable. -// Type:	Method. -// Args:	None. -// Return:	bool - True = True = Yes executable given as one of the parameters to the MI  -//				   Driver. -//				   False = not found. -// Throws:	None. +// Details: Ask *this driver whether it found an executable in the MI Driver's list of +//          arguments which to open and debug. If so instigate commands to set up a debug +//          session for that executable. +// Type:    Method. +// Args:    None. +// Return:  bool - True = True = Yes executable given as one of the parameters to the MI +//                 Driver. +//                 False = not found. +// Throws:  None.  //-- -bool CMIDriver::HaveExecutableFileNamePathOnCmdLine( void ) const +bool +CMIDriver::HaveExecutableFileNamePathOnCmdLine(void) const  { -	return m_bHaveExecutableFileNamePathOnCmdLine; +    return m_bHaveExecutableFileNamePathOnCmdLine;  }  //++ ------------------------------------------------------------------------------------  // Details: Retrieve from *this driver executable file name path to start a debug session -//			with (if present see HaveExecutableFileNamePathOnCmdLine()). -// Type:	Method. -// Args:	None. -// Return:	CMIUtilString & - Executeable file name path or empty string. -// Throws:	None. +//          with (if present see HaveExecutableFileNamePathOnCmdLine()). +// Type:    Method. +// Args:    None. +// Return:  CMIUtilString & - Executeable file name path or empty string. +// Throws:  None.  //-- -const CMIUtilString & CMIDriver::GetExecutableFileNamePathOnCmdLine( void ) const +const CMIUtilString & +CMIDriver::GetExecutableFileNamePathOnCmdLine(void) const  { -	return m_strCmdLineArgExecuteableFileNamePath; +    return m_strCmdLineArgExecuteableFileNamePath;  }  //++ ------------------------------------------------------------------------------------  // Details: Execute commands (by injecting them into the stdin line queue container) and -//			other code to set up the MI Driver such that is can take the executable  -//			argument passed on the command and create a debug session for it. -// Type:	Method. -// Args:	None. -// Return:	MIstatus::success - Functionality succeeded. -//			MIstatus::failure - Functionality failed. -// Throws:	None. +//          other code to set up the MI Driver such that is can take the executable +//          argument passed on the command and create a debug session for it. +// Type:    Method. +// Args:    None. +// Return:  MIstatus::success - Functionality succeeded. +//          MIstatus::failure - Functionality failed. +// Throws:  None.  //-- -bool CMIDriver::LocalDebugSessionStartupInjectCommands( void ) +bool +CMIDriver::LocalDebugSessionStartupInjectCommands(void)  { -	const CMIUtilString strCmd( CMIUtilString::Format( "-file-exec-and-symbols %s", m_strCmdLineArgExecuteableFileNamePath.c_str() ) ); -	 -	return InjectMICommand( strCmd ); +    const CMIUtilString strCmd(CMIUtilString::Format("-file-exec-and-symbols %s", m_strCmdLineArgExecuteableFileNamePath.c_str())); + +    return InjectMICommand(strCmd);  }  //++ ------------------------------------------------------------------------------------  // Details: Set the MI Driver into "its debugging an executable passed as an argument" -//			mode as against running via a client like Eclipse. -// Type:	Method. -// Args:	None. -// Return:	None. -// Throws:	None. +//          mode as against running via a client like Eclipse. +// Type:    Method. +// Args:    None. +// Return:  None. +// Throws:  None.  //-- -void CMIDriver::SetDriverDebuggingArgExecutable( void ) +void +CMIDriver::SetDriverDebuggingArgExecutable(void)  { -	m_bDriverDebuggingArgExecutable = true; +    m_bDriverDebuggingArgExecutable = true;  }  //++ ------------------------------------------------------------------------------------ -// Details: Retrieve the MI Driver state indicating if it is operating in "its debugging  -//			an executable passed as an argument" mode as against running via a client  -//			like Eclipse. -// Type:	Method. -// Args:	None. -// Return:	None. -// Throws:	None. +// Details: Retrieve the MI Driver state indicating if it is operating in "its debugging +//          an executable passed as an argument" mode as against running via a client +//          like Eclipse. +// Type:    Method. +// Args:    None. +// Return:  None. +// Throws:  None.  //-- -bool CMIDriver::IsDriverDebuggingArgExecutable( void ) const +bool +CMIDriver::IsDriverDebuggingArgExecutable(void) const  { -	return m_bDriverDebuggingArgExecutable; +    return m_bDriverDebuggingArgExecutable;  } -  | 
