summaryrefslogtreecommitdiff
path: root/tools/lldb-mi/MICmdFactory.cpp
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2014-11-25 21:00:58 +0000
committerEd Maste <emaste@FreeBSD.org>2014-11-25 21:00:58 +0000
commit0cac4ca3916ac24ab6139d03cbfd18db9e715bfe (patch)
treec94307da318be46e5aeea1a325c1e91749506e4f /tools/lldb-mi/MICmdFactory.cpp
parent03b99097822ca3ac69252d9afae716a584ed56c4 (diff)
Diffstat (limited to 'tools/lldb-mi/MICmdFactory.cpp')
-rw-r--r--tools/lldb-mi/MICmdFactory.cpp229
1 files changed, 229 insertions, 0 deletions
diff --git a/tools/lldb-mi/MICmdFactory.cpp b/tools/lldb-mi/MICmdFactory.cpp
new file mode 100644
index 000000000000..4897c60e4d66
--- /dev/null
+++ b/tools/lldb-mi/MICmdFactory.cpp
@@ -0,0 +1,229 @@
+//===-- MICmdFactory.cpp ----------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+//++
+// File: MICmdFactory.cpp
+//
+// Overview: CMICmdFactory implementation.
+//
+// Environment: Compilers: Visual C++ 12.
+// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
+// Libraries: See MIReadmetxt.
+//
+// Copyright: None.
+//--
+
+// In-house headers:
+#include "MICmdFactory.h"
+#include "MICmnResources.h"
+#include "MICmdData.h"
+#include "MICmdBase.h"
+#include "MICmdCommands.h"
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdFactory constructor.
+// Type: Method.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMICmdFactory::CMICmdFactory( void )
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdFactory destructor.
+// Type: Overridable.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMICmdFactory::~CMICmdFactory( void )
+{
+ Shutdown();
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Initialize resources for *this Command factory.
+// Type: Method.
+// Args: None.
+// Return: MIstatus::success - Functionality succeeded.
+// MIstatus::failure - Functionality failed.
+// Throws: None.
+//--
+bool CMICmdFactory::Initialize( void )
+{
+ m_clientUsageRefCnt++;
+
+ if( m_bInitialized )
+ return MIstatus::success;
+
+ m_bInitialized = true;
+
+ MICmnCommands::RegisterAll();
+
+ return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Release resources for *this Command Factory.
+// Type: Method.
+// Args: None.
+// Return: MIstatus::success - Functionality succeeded.
+// MIstatus::failure - Functionality failed.
+// Throws: None.
+//--
+bool CMICmdFactory::Shutdown( void )
+{
+ if( --m_clientUsageRefCnt > 0 )
+ return MIstatus::success;
+
+ if( !m_bInitialized )
+ return MIstatus::success;
+
+ m_mapMiCmdToCmdCreatorFn.clear();
+
+ m_bInitialized = false;
+
+ return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Register a command's creator function with the command identitier the MI
+// command name i.e. 'file-exec-and-symbols'.
+// Type: Method.
+// Args: vMiCmd - (R) Command's name, the MI command.
+// vCmdCreateFn - (R) Command's creator function pointer.
+// Return: MIstatus::success - Functionality succeeded.
+// MIstatus::failure - Functionality failed.
+// Throws: None.
+//--
+bool CMICmdFactory::CmdRegister( const CMIUtilString & vMiCmd, CmdCreatorFnPtr vCmdCreateFn )
+{
+ if( !IsValid( vMiCmd ) )
+ {
+ SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_CMDFACTORY_ERR_INVALID_CMD_NAME ), vMiCmd.c_str() ) );
+ return MIstatus::failure;
+ }
+ if( vCmdCreateFn == nullptr )
+ {
+ SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_CMDFACTORY_ERR_INVALID_CMD_CR8FN ), vMiCmd.c_str() ) );
+ return MIstatus::failure;
+ }
+
+ if( HaveAlready( vMiCmd ) )
+ {
+ SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_CMDFACTORY_ERR_CMD_ALREADY_REGED ), vMiCmd.c_str() ) );
+ return MIstatus::failure;
+ }
+
+ MapPairMiCmdToCmdCreatorFn_t pr( vMiCmd, vCmdCreateFn );
+ m_mapMiCmdToCmdCreatorFn.insert( pr );
+
+ return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Check a command is already registered.
+// Type: Method.
+// Args: vMiCmd - (R) Command's name, the MI command.
+// Return: True - registered.
+// False - not found.
+// Throws: None.
+//--
+bool CMICmdFactory::HaveAlready( const CMIUtilString & vMiCmd ) const
+{
+ const MapMiCmdToCmdCreatorFn_t::const_iterator it = m_mapMiCmdToCmdCreatorFn.find( vMiCmd );
+ if( it != m_mapMiCmdToCmdCreatorFn.end() )
+ return true;
+
+ return false;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Check a command's name is valid:
+// - name is not empty
+// - name does not have spaces
+// Type: Method.
+// Args: vMiCmd - (R) Command's name, the MI command.
+// Return: True - valid.
+// False - not valid.
+// Throws: None.
+//--
+bool CMICmdFactory::IsValid( const CMIUtilString & vMiCmd ) const
+{
+ bool bValid = true;
+
+ if( vMiCmd.empty() )
+ {
+ bValid = false;
+ return false;
+ }
+
+ const MIint nPos = vMiCmd.find( " " );
+ if( nPos != (MIint) std::string::npos )
+ bValid = false;
+
+ return bValid;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Check a command is already registered.
+// Type: Method.
+// Args: vMiCmd - (R) Command's name, the MI command.
+// Return: True - registered.
+// False - not found.
+// Throws: None.
+//--
+bool CMICmdFactory::CmdExist( const CMIUtilString & vMiCmd ) const
+{
+ return HaveAlready( vMiCmd );
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Create a command given the specified MI command name. The command data object
+// contains the options for the command.
+// Type: Method.
+// Args: vMiCmd - (R) Command's name, the MI command.
+// vCmdData - (RW) Command's metadata status/information/result object.
+// vpNewCmd - (W) New command instance.
+// Return: MIstatus::success - Functionality succeeded.
+// MIstatus::failure - Functionality failed.
+// Throws: None.
+//--
+bool CMICmdFactory::CmdCreate( const CMIUtilString & vMiCmd, const SMICmdData & vCmdData, CMICmdBase *& vpNewCmd )
+{
+ bool bOk = MIstatus::success;
+
+ vpNewCmd = nullptr;
+
+ if( !IsValid( vMiCmd ) )
+ {
+ SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_CMDFACTORY_ERR_INVALID_CMD_NAME ), vMiCmd.c_str() ) );
+ return MIstatus::failure;
+ }
+ if( !HaveAlready( vMiCmd ) )
+ {
+ SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_CMDFACTORY_ERR_CMD_NOT_REGISTERED ), vMiCmd.c_str() ) );
+ return MIstatus::failure;
+ }
+
+ const MapMiCmdToCmdCreatorFn_t::const_iterator it = m_mapMiCmdToCmdCreatorFn.find( vMiCmd );
+ const CMIUtilString & rMiCmd( (*it).first ); MIunused( rMiCmd );
+ CmdCreatorFnPtr pFn = (*it).second;
+ CMICmdBase * pCmd = (*pFn)();
+
+ SMICmdData cmdData( vCmdData );
+ cmdData.id = pCmd->GetGUID();
+ bOk = pCmd->SetCmdData( cmdData );
+ if( bOk )
+ vpNewCmd = pCmd;
+
+ return bOk;
+}