| //===-- MICmdCmdMiscellanous.cpp --------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // Overview: CMICmdCmdGdbExit implementation. |
| // CMICmdCmdListThreadGroups implementation. |
| // CMICmdCmdInterpreterExec implementation. |
| // CMICmdCmdInferiorTtySet implementation. |
| |
| // Third Party Headers: |
| #include "lldb/API/SBCommandInterpreter.h" |
| #include "lldb/API/SBThread.h" |
| |
| // In-house headers: |
| #include "MICmdArgValFile.h" |
| #include "MICmdArgValListOfN.h" |
| #include "MICmdArgValNumber.h" |
| #include "MICmdArgValOptionLong.h" |
| #include "MICmdArgValOptionShort.h" |
| #include "MICmdArgValString.h" |
| #include "MICmdArgValThreadGrp.h" |
| #include "MICmdCmdMiscellanous.h" |
| #include "MICmnLLDBDebugSessionInfo.h" |
| #include "MICmnLLDBDebugger.h" |
| #include "MICmnMIOutOfBandRecord.h" |
| #include "MICmnMIResultRecord.h" |
| #include "MICmnMIValueConst.h" |
| #include "MICmnStreamStderr.h" |
| #include "MICmnStreamStdout.h" |
| #include "MIDriverBase.h" |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmdCmdGdbExit constructor. |
| // Type: Method. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmdCmdGdbExit::CMICmdCmdGdbExit() { |
| // Command factory matches this name with that received from the stdin stream |
| m_strMiCmd = "gdb-exit"; |
| |
| // Required by the CMICmdFactory when registering *this command |
| m_pSelfCreatorFn = &CMICmdCmdGdbExit::CreateSelf; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmdCmdGdbExit destructor. |
| // Type: Overrideable. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmdCmdGdbExit::~CMICmdCmdGdbExit() {} |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The command does work in this |
| // function. |
| // The command is likely to communicate with the LLDB SBDebugger in |
| // here. |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdGdbExit::Execute() { |
| CMICmnLLDBDebugger::Instance().GetDriver().SetExitApplicationFlag(true); |
| const lldb::SBError sbErr = m_rLLDBDebugSessionInfo.GetProcess().Destroy(); |
| // Do not check for sbErr.Fail() here, m_lldbProcess is likely !IsValid() |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The command prepares a MI Record |
| // Result |
| // for the work carried out in the Execute(). |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdGdbExit::Acknowledge() { |
| const CMICmnMIResultRecord miRecordResult( |
| m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Exit); |
| m_miResultRecord = miRecordResult; |
| |
| // Prod the client i.e. Eclipse with out-of-band results to help it 'continue' |
| // because it is using LLDB debugger |
| // Give the client '=thread-group-exited,id="i1"' |
| m_bHasResultRecordExtra = true; |
| const CMICmnMIValueConst miValueConst2("i1"); |
| const CMICmnMIValueResult miValueResult2("id", miValueConst2); |
| const CMICmnMIOutOfBandRecord miOutOfBand( |
| CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupExited, miValueResult2); |
| m_miResultRecordExtra = miOutOfBand.GetString(); |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Required by the CMICmdFactory when registering *this command. The |
| // factory |
| // calls this function to create an instance of *this command. |
| // Type: Static method. |
| // Args: None. |
| // Return: CMICmdBase * - Pointer to a new command. |
| // Throws: None. |
| //-- |
| CMICmdBase *CMICmdCmdGdbExit::CreateSelf() { return new CMICmdCmdGdbExit(); } |
| |
| //--------------------------------------------------------------------------------------- |
| //--------------------------------------------------------------------------------------- |
| //--------------------------------------------------------------------------------------- |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmdCmdListThreadGroups constructor. |
| // Type: Method. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmdCmdListThreadGroups::CMICmdCmdListThreadGroups() |
| : m_bIsI1(false), m_bHaveArgOption(false), m_bHaveArgRecurse(false), |
| m_constStrArgNamedAvailable("available"), |
| m_constStrArgNamedRecurse("recurse"), m_constStrArgNamedGroup("group"), |
| m_constStrArgNamedThreadGroup("i1") { |
| // Command factory matches this name with that received from the stdin stream |
| m_strMiCmd = "list-thread-groups"; |
| |
| // Required by the CMICmdFactory when registering *this command |
| m_pSelfCreatorFn = &CMICmdCmdListThreadGroups::CreateSelf; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmdCmdListThreadGroups destructor. |
| // Type: Overrideable. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmdCmdListThreadGroups::~CMICmdCmdListThreadGroups() { |
| m_vecMIValueTuple.clear(); |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The parses the command line |
| // options |
| // arguments to extract values for each of those arguments. |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdListThreadGroups::ParseArgs() { |
| m_setCmdArgs.Add( |
| new CMICmdArgValOptionLong(m_constStrArgNamedAvailable, false, true)); |
| m_setCmdArgs.Add( |
| new CMICmdArgValOptionLong(m_constStrArgNamedRecurse, false, true, |
| CMICmdArgValListBase::eArgValType_Number, 1)); |
| m_setCmdArgs.Add( |
| new CMICmdArgValListOfN(m_constStrArgNamedGroup, false, true, |
| CMICmdArgValListBase::eArgValType_Number)); |
| m_setCmdArgs.Add( |
| new CMICmdArgValThreadGrp(m_constStrArgNamedThreadGroup, false, true)); |
| return ParseValidateCmdOptions(); |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The command does work in this |
| // function. |
| // The command is likely to communicate with the LLDB SBDebugger in |
| // here. |
| // Synopsis: -list-thread-groups [ --available ] [ --recurse 1 ] [ |
| // group ... ] |
| // This command does not follow the MI documentation exactly. Has an |
| // extra |
| // argument "i1" to handle. |
| // Ref: |
| // http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Miscellaneous-Commands.html#GDB_002fMI-Miscellaneous-Commands |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdListThreadGroups::Execute() { |
| if (m_setCmdArgs.IsArgContextEmpty()) |
| // No options so "top level thread groups" |
| return MIstatus::success; |
| |
| CMICMDBASE_GETOPTION(pArgAvailable, OptionLong, m_constStrArgNamedAvailable); |
| CMICMDBASE_GETOPTION(pArgRecurse, OptionLong, m_constStrArgNamedRecurse); |
| CMICMDBASE_GETOPTION(pArgThreadGroup, ThreadGrp, |
| m_constStrArgNamedThreadGroup); |
| |
| // Got some options so "threads" |
| if (pArgAvailable->GetFound()) { |
| if (pArgRecurse->GetFound()) { |
| m_bHaveArgRecurse = true; |
| return MIstatus::success; |
| } |
| |
| m_bHaveArgOption = true; |
| return MIstatus::success; |
| } |
| // "i1" as first argument (pos 0 of possible arg) |
| if (!pArgThreadGroup->GetFound()) |
| return MIstatus::success; |
| m_bIsI1 = true; |
| |
| CMICmnLLDBDebugSessionInfo &rSessionInfo( |
| CMICmnLLDBDebugSessionInfo::Instance()); |
| lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); |
| |
| // Note do not check for sbProcess is IsValid(), continue |
| |
| m_vecMIValueTuple.clear(); |
| const MIuint nThreads = sbProcess.GetNumThreads(); |
| for (MIuint i = 0; i < nThreads; i++) { |
| // GetThreadAtIndex() uses a base 0 index |
| // GetThreadByIndexID() uses a base 1 index |
| lldb::SBThread thread = sbProcess.GetThreadAtIndex(i); |
| |
| if (thread.IsValid()) { |
| CMICmnMIValueTuple miTuple; |
| if (!rSessionInfo.MIResponseFormThreadInfo( |
| m_cmdData, thread, |
| CMICmnLLDBDebugSessionInfo::eThreadInfoFormat_NoFrames, miTuple)) |
| return MIstatus::failure; |
| |
| m_vecMIValueTuple.push_back(miTuple); |
| } |
| } |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The command prepares a MI Record |
| // Result |
| // for the work carried out in the Execute(). |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdListThreadGroups::Acknowledge() { |
| if (m_bHaveArgOption) { |
| if (m_bHaveArgRecurse) { |
| const CMICmnMIValueConst miValueConst( |
| MIRSRC(IDS_WORD_NOT_IMPLEMENTED_BRKTS)); |
| const CMICmnMIValueResult miValueResult("msg", miValueConst); |
| const CMICmnMIResultRecord miRecordResult( |
| m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, |
| miValueResult); |
| m_miResultRecord = miRecordResult; |
| |
| return MIstatus::success; |
| } |
| |
| const CMICmnMIValueConst miValueConst1("i1"); |
| const CMICmnMIValueResult miValueResult1("id", miValueConst1); |
| CMICmnMIValueTuple miTuple(miValueResult1); |
| |
| const CMICmnMIValueConst miValueConst2("process"); |
| const CMICmnMIValueResult miValueResult2("type", miValueConst2); |
| miTuple.Add(miValueResult2); |
| |
| CMICmnLLDBDebugSessionInfo &rSessionInfo( |
| CMICmnLLDBDebugSessionInfo::Instance()); |
| if (rSessionInfo.GetProcess().IsValid()) { |
| const lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); |
| const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); |
| const CMICmnMIValueConst miValueConst3(strPid); |
| const CMICmnMIValueResult miValueResult3("pid", miValueConst3); |
| miTuple.Add(miValueResult3); |
| } |
| |
| const CMICmnMIValueConst miValueConst4( |
| MIRSRC(IDS_WORD_NOT_IMPLEMENTED_BRKTS)); |
| const CMICmnMIValueResult miValueResult4("num_children", miValueConst4); |
| miTuple.Add(miValueResult4); |
| |
| const CMICmnMIValueConst miValueConst5( |
| MIRSRC(IDS_WORD_NOT_IMPLEMENTED_BRKTS)); |
| const CMICmnMIValueResult miValueResult5("cores", miValueConst5); |
| miTuple.Add(miValueResult5); |
| |
| const CMICmnMIValueList miValueList(miTuple); |
| const CMICmnMIValueResult miValueResult6("groups", miValueList); |
| const CMICmnMIResultRecord miRecordResult( |
| m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, |
| miValueResult6); |
| m_miResultRecord = miRecordResult; |
| |
| return MIstatus::success; |
| } |
| |
| if (!m_bIsI1) { |
| const CMICmnMIValueConst miValueConst1("i1"); |
| const CMICmnMIValueResult miValueResult1("id", miValueConst1); |
| CMICmnMIValueTuple miTuple(miValueResult1); |
| |
| const CMICmnMIValueConst miValueConst2("process"); |
| const CMICmnMIValueResult miValueResult2("type", miValueConst2); |
| miTuple.Add(miValueResult2); |
| |
| CMICmnLLDBDebugSessionInfo &rSessionInfo( |
| CMICmnLLDBDebugSessionInfo::Instance()); |
| if (rSessionInfo.GetProcess().IsValid()) { |
| const lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); |
| const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); |
| const CMICmnMIValueConst miValueConst3(strPid); |
| const CMICmnMIValueResult miValueResult3("pid", miValueConst3); |
| miTuple.Add(miValueResult3); |
| } |
| |
| if (rSessionInfo.GetTarget().IsValid()) { |
| lldb::SBTarget sbTrgt = rSessionInfo.GetTarget(); |
| const char *pDir = sbTrgt.GetExecutable().GetDirectory(); |
| const char *pFileName = sbTrgt.GetExecutable().GetFilename(); |
| const CMIUtilString strFile( |
| CMIUtilString::Format("%s/%s", pDir, pFileName)); |
| const CMICmnMIValueConst miValueConst4(strFile); |
| const CMICmnMIValueResult miValueResult4("executable", miValueConst4); |
| miTuple.Add(miValueResult4); |
| } |
| |
| const CMICmnMIValueList miValueList(miTuple); |
| const CMICmnMIValueResult miValueResult5("groups", miValueList); |
| const CMICmnMIResultRecord miRecordResult( |
| m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, |
| miValueResult5); |
| m_miResultRecord = miRecordResult; |
| return MIstatus::success; |
| } |
| |
| // Build up a list of thread information from tuples |
| VecMIValueTuple_t::const_iterator it = m_vecMIValueTuple.begin(); |
| if (it == m_vecMIValueTuple.end()) { |
| const CMICmnMIValueConst miValueConst("[]"); |
| const CMICmnMIValueResult miValueResult("threads", miValueConst); |
| const CMICmnMIResultRecord miRecordResult( |
| m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, |
| miValueResult); |
| m_miResultRecord = miRecordResult; |
| return MIstatus::success; |
| } |
| CMICmnMIValueList miValueList(*it); |
| ++it; |
| while (it != m_vecMIValueTuple.end()) { |
| const CMICmnMIValueTuple &rTuple(*it); |
| miValueList.Add(rTuple); |
| |
| // Next |
| ++it; |
| } |
| |
| const CMICmnMIValueResult miValueResult("threads", miValueList); |
| const CMICmnMIResultRecord miRecordResult( |
| m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, |
| miValueResult); |
| m_miResultRecord = miRecordResult; |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Required by the CMICmdFactory when registering *this command. The |
| // factory |
| // calls this function to create an instance of *this command. |
| // Type: Static method. |
| // Args: None. |
| // Return: CMICmdBase * - Pointer to a new command. |
| // Throws: None. |
| //-- |
| CMICmdBase *CMICmdCmdListThreadGroups::CreateSelf() { |
| return new CMICmdCmdListThreadGroups(); |
| } |
| |
| //--------------------------------------------------------------------------------------- |
| //--------------------------------------------------------------------------------------- |
| //--------------------------------------------------------------------------------------- |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmdCmdInterpreterExec constructor. |
| // Type: Method. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmdCmdInterpreterExec::CMICmdCmdInterpreterExec() |
| : m_constStrArgNamedInterpreter("interpreter"), |
| m_constStrArgNamedCommand("command") { |
| // Command factory matches this name with that received from the stdin stream |
| m_strMiCmd = "interpreter-exec"; |
| |
| // Required by the CMICmdFactory when registering *this command |
| m_pSelfCreatorFn = &CMICmdCmdInterpreterExec::CreateSelf; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmdCmdInterpreterExec destructor. |
| // Type: Overrideable. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmdCmdInterpreterExec::~CMICmdCmdInterpreterExec() {} |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The parses the command line |
| // options |
| // arguments to extract values for each of those arguments. |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdInterpreterExec::ParseArgs() { |
| m_setCmdArgs.Add( |
| new CMICmdArgValString(m_constStrArgNamedInterpreter, true, true)); |
| m_setCmdArgs.Add( |
| new CMICmdArgValString(m_constStrArgNamedCommand, true, true, true)); |
| return ParseValidateCmdOptions(); |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The command does work in this |
| // function. |
| // The command is likely to communicate with the LLDB SBDebugger in |
| // here. |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdInterpreterExec::Execute() { |
| CMICMDBASE_GETOPTION(pArgInterpreter, String, m_constStrArgNamedInterpreter); |
| CMICMDBASE_GETOPTION(pArgCommand, String, m_constStrArgNamedCommand); |
| |
| // Handle the interpreter parameter by do nothing on purpose (set to 'handled' |
| // in |
| // the arg definition above) |
| const CMIUtilString &rStrInterpreter(pArgInterpreter->GetValue()); |
| MIunused(rStrInterpreter); |
| |
| const CMIUtilString &rStrCommand(pArgCommand->GetValue()); |
| CMICmnLLDBDebugSessionInfo &rSessionInfo( |
| CMICmnLLDBDebugSessionInfo::Instance()); |
| const lldb::ReturnStatus rtn = |
| rSessionInfo.GetDebugger().GetCommandInterpreter().HandleCommand( |
| rStrCommand.c_str(), m_lldbResult, true); |
| MIunused(rtn); |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The command prepares a MI Record |
| // Result |
| // for the work carried out in the Execute(). |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdInterpreterExec::Acknowledge() { |
| if (m_lldbResult.GetOutputSize() > 0) { |
| const CMIUtilString line(m_lldbResult.GetOutput()); |
| const bool bEscapeQuotes(true); |
| CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes)); |
| CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_ConsoleStreamOutput, miValueConst); |
| const bool bOk = CMICmnStreamStdout::TextToStdout(miOutOfBandRecord.GetString()); |
| if (!bOk) |
| return MIstatus::failure; |
| } |
| if (m_lldbResult.GetErrorSize() > 0) { |
| const CMIUtilString line(m_lldbResult.GetError()); |
| const bool bEscapeQuotes(true); |
| CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes)); |
| CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_LogStreamOutput, miValueConst); |
| const bool bOk = CMICmnStreamStdout::TextToStdout(miOutOfBandRecord.GetString()); |
| if (!bOk) |
| return MIstatus::failure; |
| } |
| |
| const CMICmnMIResultRecord miRecordResult( |
| m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); |
| m_miResultRecord = miRecordResult; |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Required by the CMICmdFactory when registering *this command. The |
| // factory |
| // calls this function to create an instance of *this command. |
| // Type: Static method. |
| // Args: None. |
| // Return: CMICmdBase * - Pointer to a new command. |
| // Throws: None. |
| //-- |
| CMICmdBase *CMICmdCmdInterpreterExec::CreateSelf() { |
| return new CMICmdCmdInterpreterExec(); |
| } |
| |
| //--------------------------------------------------------------------------------------- |
| //--------------------------------------------------------------------------------------- |
| //--------------------------------------------------------------------------------------- |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmdCmdInferiorTtySet constructor. |
| // Type: Method. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmdCmdInferiorTtySet::CMICmdCmdInferiorTtySet() { |
| // Command factory matches this name with that received from the stdin stream |
| m_strMiCmd = "inferior-tty-set"; |
| |
| // Required by the CMICmdFactory when registering *this command |
| m_pSelfCreatorFn = &CMICmdCmdInferiorTtySet::CreateSelf; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmdCmdInferiorTtySet destructor. |
| // Type: Overrideable. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmdCmdInferiorTtySet::~CMICmdCmdInferiorTtySet() {} |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The command does work in this |
| // function. |
| // The command is likely to communicate with the LLDB SBDebugger in |
| // here. |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdInferiorTtySet::Execute() { |
| // Do nothing |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The invoker requires this function. The command prepares a MI Record |
| // Result |
| // for the work carried out in the Execute(). |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmdCmdInferiorTtySet::Acknowledge() { |
| const CMICmnMIResultRecord miRecordResult( |
| m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error); |
| m_miResultRecord = miRecordResult; |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Required by the CMICmdFactory when registering *this command. The |
| // factory |
| // calls this function to create an instance of *this command. |
| // Type: Static method. |
| // Args: None. |
| // Return: CMICmdBase * - Pointer to a new command. |
| // Throws: None. |
| //-- |
| CMICmdBase *CMICmdCmdInferiorTtySet::CreateSelf() { |
| return new CMICmdCmdInferiorTtySet(); |
| } |