1 //===-- MICmdFactory.cpp ----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 // File: MICmdFactory.cpp
13 // Overview: CMICmdFactory implementation.
15 // Environment: Compilers: Visual C++ 12.
16 // gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
17 // Libraries: See MIReadmetxt.
23 #include "MICmdFactory.h"
24 #include "MICmnResources.h"
25 #include "MICmdData.h"
26 #include "MICmdBase.h"
27 #include "MICmdCommands.h"
29 //++ ------------------------------------------------------------------------------------
30 // Details: CMICmdFactory constructor.
36 CMICmdFactory::CMICmdFactory(void)
40 //++ ------------------------------------------------------------------------------------
41 // Details: CMICmdFactory destructor.
47 CMICmdFactory::~CMICmdFactory(void)
52 //++ ------------------------------------------------------------------------------------
53 // Details: Initialize resources for *this Command factory.
56 // Return: MIstatus::success - Functionality succeeded.
57 // MIstatus::failure - Functionality failed.
61 CMICmdFactory::Initialize(void)
63 m_clientUsageRefCnt++;
66 return MIstatus::success;
68 m_bInitialized = true;
70 MICmnCommands::RegisterAll();
72 return MIstatus::success;
75 //++ ------------------------------------------------------------------------------------
76 // Details: Release resources for *this Command Factory.
79 // Return: MIstatus::success - Functionality succeeded.
80 // MIstatus::failure - Functionality failed.
84 CMICmdFactory::Shutdown(void)
86 if (--m_clientUsageRefCnt > 0)
87 return MIstatus::success;
90 return MIstatus::success;
92 m_mapMiCmdToCmdCreatorFn.clear();
94 m_bInitialized = false;
96 return MIstatus::success;
99 //++ ------------------------------------------------------------------------------------
100 // Details: Register a command's creator function with the command identitier the MI
101 // command name i.e. 'file-exec-and-symbols'.
103 // Args: vMiCmd - (R) Command's name, the MI command.
104 // vCmdCreateFn - (R) Command's creator function pointer.
105 // Return: MIstatus::success - Functionality succeeded.
106 // MIstatus::failure - Functionality failed.
110 CMICmdFactory::CmdRegister(const CMIUtilString &vMiCmd, CmdCreatorFnPtr vCmdCreateFn)
112 if (!IsValid(vMiCmd))
114 SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_CMDFACTORY_ERR_INVALID_CMD_NAME), vMiCmd.c_str()));
115 return MIstatus::failure;
117 if (vCmdCreateFn == nullptr)
119 SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_CMDFACTORY_ERR_INVALID_CMD_CR8FN), vMiCmd.c_str()));
120 return MIstatus::failure;
123 if (HaveAlready(vMiCmd))
125 SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_CMDFACTORY_ERR_CMD_ALREADY_REGED), vMiCmd.c_str()));
126 return MIstatus::failure;
129 MapPairMiCmdToCmdCreatorFn_t pr(vMiCmd, vCmdCreateFn);
130 m_mapMiCmdToCmdCreatorFn.insert(pr);
132 return MIstatus::success;
135 //++ ------------------------------------------------------------------------------------
136 // Details: Check a command is already registered.
138 // Args: vMiCmd - (R) Command's name, the MI command.
139 // Return: True - registered.
140 // False - not found.
144 CMICmdFactory::HaveAlready(const CMIUtilString &vMiCmd) const
146 const MapMiCmdToCmdCreatorFn_t::const_iterator it = m_mapMiCmdToCmdCreatorFn.find(vMiCmd);
147 if (it != m_mapMiCmdToCmdCreatorFn.end())
153 //++ ------------------------------------------------------------------------------------
154 // Details: Check a command's name is valid:
155 // - name is not empty
156 // - name does not have spaces
158 // Args: vMiCmd - (R) Command's name, the MI command.
159 // Return: True - valid.
160 // False - not valid.
164 CMICmdFactory::IsValid(const CMIUtilString &vMiCmd) const
174 const MIint nPos = vMiCmd.find(" ");
175 if (nPos != (MIint)std::string::npos)
181 //++ ------------------------------------------------------------------------------------
182 // Details: Check a command is already registered.
184 // Args: vMiCmd - (R) Command's name, the MI command.
185 // Return: True - registered.
186 // False - not found.
190 CMICmdFactory::CmdExist(const CMIUtilString &vMiCmd) const
192 return HaveAlready(vMiCmd);
195 //++ ------------------------------------------------------------------------------------
196 // Details: Create a command given the specified MI command name. The command data object
197 // contains the options for the command.
199 // Args: vMiCmd - (R) Command's name, the MI command.
200 // vCmdData - (RW) Command's metadata status/information/result object.
201 // vpNewCmd - (W) New command instance.
202 // Return: MIstatus::success - Functionality succeeded.
203 // MIstatus::failure - Functionality failed.
207 CMICmdFactory::CmdCreate(const CMIUtilString &vMiCmd, const SMICmdData &vCmdData, CMICmdBase *&vpNewCmd)
209 bool bOk = MIstatus::success;
213 if (!IsValid(vMiCmd))
215 SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_CMDFACTORY_ERR_INVALID_CMD_NAME), vMiCmd.c_str()));
216 return MIstatus::failure;
218 if (!HaveAlready(vMiCmd))
220 SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_CMDFACTORY_ERR_CMD_NOT_REGISTERED), vMiCmd.c_str()));
221 return MIstatus::failure;
224 const MapMiCmdToCmdCreatorFn_t::const_iterator it = m_mapMiCmdToCmdCreatorFn.find(vMiCmd);
225 const CMIUtilString &rMiCmd((*it).first);
227 CmdCreatorFnPtr pFn = (*it).second;
228 CMICmdBase *pCmd = (*pFn)();
230 SMICmdData cmdData(vCmdData);
231 cmdData.id = pCmd->GetGUID();
232 bOk = pCmd->SetCmdData(cmdData);