14 #include <boost/bind.hpp>
22 struct BaseCommandMgrHooks {
23 int hook_index_command_processed_;
26 BaseCommandMgrHooks() {
27 hook_index_command_processed_ = HooksManager::registerHook(
"command_processed");
35 BaseCommandMgrHooks
Hooks;
42 BaseCommandMgr::BaseCommandMgr() {
43 registerCommand(
"list-commands", boost::bind(&BaseCommandMgr::listCommandsHandler,
48 BaseCommandMgr::registerCommand(
const std::string& cmd,
CommandHandler handler) {
53 HandlerContainer::const_iterator it = handlers_.find(cmd);
54 if (it != handlers_.end()) {
56 <<
"' is already installed.");
61 handlers_.insert(make_pair(cmd, handlers));
67 BaseCommandMgr::registerExtendedCommand(
const std::string& cmd,
73 HandlerContainer::const_iterator it = handlers_.find(cmd);
74 if (it != handlers_.end()) {
76 <<
"' is already installed.");
81 handlers_.insert(make_pair(cmd, handlers));
87 BaseCommandMgr::deregisterCommand(
const std::string& cmd) {
88 if (cmd ==
"list-commands") {
90 "Can't uninstall internal command 'list-commands'");
93 HandlerContainer::iterator it = handlers_.find(cmd);
94 if (it == handlers_.end()) {
104 BaseCommandMgr::deregisterAll() {
109 registerCommand(
"list-commands",
110 boost::bind(&BaseCommandMgr::listCommandsHandler,
this, _1, _2));
117 "Command processing failed: NULL command parameter"));
129 if (HooksManager::calloutsPresent(
Hooks.hook_index_command_processed_)) {
135 callout_handle->setArgument(
"name", name);
136 callout_handle->setArgument(
"arguments", arg);
137 callout_handle->setArgument(
"response", response);
140 HooksManager::callCallouts(
Hooks.hook_index_command_processed_,
145 callout_handle->getArgument(
"response", response);
153 std::string(
"Error during command processing: ")
159 BaseCommandMgr::handleCommand(
const std::string& cmd_name,
162 auto it = handlers_.find(cmd_name);
163 if (it == handlers_.end()) {
166 "'" + cmd_name +
"' command not supported."));
170 if (it->second.handler) {
171 return (it->second.handler(cmd_name, params));
173 return (it->second.extended_handler(cmd_name, params, original_cmd));
177 BaseCommandMgr::listCommandsHandler(
const std::string& ,
181 for (HandlerContainer::const_iterator it = handlers_.begin();
182 it != handlers_.end(); ++it) {