radio/lib/wServerUtils/commands.cpp

86 lines
1.9 KiB
C++

#include "commands.h"
U::Commands::Commands(const W::Address& address, QObject* parent):
M::Vocabulary(address, parent),
commands(new Map())
{
}
U::Commands::~Commands()
{
Map::iterator beg = commands->begin();
Map::iterator end = commands->end();
for (; beg != end; ++beg) {
Command* cmd = beg->second;
if (cmd->enabled) {
removeHandler(cmd->handler);
}
delete cmd->handler;
delete cmd;
}
delete commands;
}
void U::Commands::addCommand(const W::String& key, W::Handler* handler, const W::Vocabulary& args)
{
Map::const_iterator itr = commands->find(key);
if (itr != commands->end()) {
throw 1;
}
Command* cmd = new Command{key, handler, args, false};
commands->insert(std::make_pair(cmd->name, cmd));
}
void U::Commands::enableCommand(const W::String& key, bool value)
{
Map::const_iterator itr = commands->find(key);
if (itr == commands->end()) {
throw 2;
}
Command* cmd = itr->second;
if (cmd->enabled != value) {
if (value) {
enableCommand(cmd);
} else {
disableCommand(cmd);
}
}
}
void U::Commands::enableCommand(U::Commands::Command* cmd)
{
addHandler(cmd->handler);
cmd->enabled = true;
W::Vocabulary* vc = new W::Vocabulary;
vc->insert(u"address", cmd->handler->getAddress());
vc->insert(u"arguments", cmd->arguments);
insert(cmd->name, vc);
}
void U::Commands::disableCommand(U::Commands::Command* cmd)
{
removeHandler(cmd->handler);
cmd->enabled = false;
erase(cmd->name);
}
void U::Commands::removeCommand(const W::String& key)
{
Map::const_iterator itr = commands->find(key);
if (itr == commands->end()) {
throw 2;
}
Command* cmd = itr->second;
if (cmd->enabled) {
disableCommand(cmd);
}
commands->erase(itr);
delete cmd->handler;
delete cmd;
}