/** * @file broker.cc * @brief Implementation of the Broker class * @author Andreas Aardal Hanssen * @date 2002-2005 */ #include "broker.h" #include "convert.h" using namespace Binc; using std::string; BrokerFactory::BrokerFactory() { Parser p{Session::getInstance()}; brokers.emplace(Session::State::NONAUTHENTICATED, Broker(p)); brokers.emplace(Session::State::AUTHENTICATED, Broker(p)); brokers.emplace(Session::State::SELECTED, Broker(p)); } BrokerFactory &BrokerFactory::getInstance() { static BrokerFactory brokerfactory; return brokerfactory; } void BrokerFactory::addCapability(const string &c) { for (const auto &[_, second] : brokers) { auto o = dynamic_cast(second.get("CAPABILITY")); if (o != nullptr) { o->addCapability(c); break; } } } void BrokerFactory::assign(const string &fname, std::shared_ptr o) { for (auto &[state, broker] : brokers) { if (state & o->getState()) { broker.assign(fname, o); } } } Operator *BrokerFactory::getOperator(Session::State state, const string &name) const { if (brokers.find(state) == brokers.end()) return nullptr; else return brokers.find(state)->second.get(name); } Broker *BrokerFactory::getBroker(Session::State state) { const auto it = brokers.find(state); if (it == brokers.end()) { setLastError("No appropriate broker for state."); return nullptr; } return &it->second; } void Broker::assign(const string &fname, std::shared_ptr o) { operators[fname] = o; } Operator *Broker::get(const string &name) const { if (operators.find(name) == operators.end()) return nullptr; return operators.find(name)->second.get(); } Parser::ParseResult Broker::parseStub(Request &command) { constexpr auto ACCEPT = Parser::ParseResult::ACCEPT; constexpr auto REJECT = Parser::ParseResult::REJECT; constexpr auto ERROR = Parser::ParseResult::ERROR; constexpr auto TIMEOUT = Parser::ParseResult::TIMEOUT; Session &session = Session::getInstance(); string tag; string cmd; switch (parser.expectTag(tag)) { case ACCEPT: break; case REJECT: session.setLastError("Syntax error; first token must be a tag"); [[fallthrough]]; case ERROR: return ERROR; case TIMEOUT: return TIMEOUT; } switch (parser.expectSPACE()) { case ACCEPT: break; case REJECT: session.setLastError("Syntax error; second token must be a SPACE"); [[fallthrough]]; case ERROR: return ERROR; case TIMEOUT: return TIMEOUT; } switch (parser.expectAstring(cmd)) { case ACCEPT: break; case REJECT: session.setLastError("Syntax error; third token must be a command"); [[fallthrough]]; case ERROR: return ERROR; case TIMEOUT: return TIMEOUT; } uppercase(cmd); if (cmd == "UID") { command.setUidMode(); switch (parser.expectSPACE()) { case ACCEPT: break; case REJECT: session.setLastError("Syntax error; after UID there must come a SPACE"); [[fallthrough]]; case ERROR: return ERROR; case TIMEOUT: return TIMEOUT; } switch (parser.expectAstring(cmd)) { case ACCEPT: break; case REJECT: session.setLastError("Syntax error; after UID SPACE there must come a command"); [[fallthrough]]; case ERROR: return ERROR; case TIMEOUT: return TIMEOUT; } uppercase(cmd); } command.setTag(tag); command.setName(cmd); return ACCEPT; }