diff options
Diffstat (limited to 'src/broker.cc')
-rw-r--r-- | src/broker.cc | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/src/broker.cc b/src/broker.cc new file mode 100644 index 0000000..9d7f728 --- /dev/null +++ b/src/broker.cc @@ -0,0 +1,190 @@ +/** --------------------------------------------------------------------- + * @file broker.cc + * @brief Implementation of the Broker class + * @author Andreas Aardal Hanssen + * @date 2002-2005 + * ----------------------------------------------------------------- **/ +#include <map> +#include <string> + +#include "broker.h" +#include "convert.h" +#include "operators.h" +#include "recursivedescent.h" +#include "session.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +BrokerFactory::BrokerFactory(void) +{ + brokers[Session::NONAUTHENTICATED] = new Broker(); + brokers[Session::AUTHENTICATED] = new Broker(); + brokers[Session::SELECTED] = new Broker(); +} + +//---------------------------------------------------------------------- +BrokerFactory::~BrokerFactory(void) +{ + for (map<int, Broker *>::iterator i = brokers.begin(); + i != brokers.end(); ++i) + delete i->second; +} + +//---------------------------------------------------------------------- +BrokerFactory &BrokerFactory::getInstance(void) +{ + static BrokerFactory brokerfactory; + return brokerfactory; +} + +//---------------------------------------------------------------------- +void BrokerFactory::addCapability(const std::string &c) +{ + for (map<int, Broker *>::iterator i = brokers.begin(); + i != brokers.end(); ++i) { + CapabilityOperator * o; + o = dynamic_cast<CapabilityOperator*>(i->second->get("CAPABILITY")); + if (o != 0) { + o->addCapability(c); + break; + } + } +} + +//---------------------------------------------------------------------- +void BrokerFactory::assign(const string &fname, Operator *o) +{ + int deletable = true; + for (map<int, Broker *>::iterator i = brokers.begin(); + i != brokers.end(); ++i) + if (i->first & o->getState()) { + i->second->assign(fname, o, deletable); + deletable = false; + } +} + +//---------------------------------------------------------------------- +Operator *BrokerFactory::getOperator(int state, const string &name) const +{ + if (brokers.find(state) == brokers.end()) + return 0; + else + return brokers.find(state)->second->get(name); +} + +//---------------------------------------------------------------------- +Broker *BrokerFactory::getBroker(int state) +{ + if (brokers.find(state) == brokers.end()) { + setLastError("No appropriate broker for state."); + return 0; + } + + return brokers[state]; +} + +//---------------------------------------------------------------------- +Broker::Broker(void) +{ +} + +//---------------------------------------------------------------------- +Broker::~Broker(void) +{ +} + +//---------------------------------------------------------------------- +void Broker::assign(const string &fname, Operator *o, bool deletable) +{ + deletables[fname] = deletable; + operators[fname] = o; +} + +//---------------------------------------------------------------------- +Operator *Broker::get(const string &name) const +{ + if (operators.find(name) == operators.end()) return 0; + + return operators.find(name)->second; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Broker::parseStub(Request &command) +{ + Session &session = Session::getInstance(); + + string tag; + string cmd; + + switch (expectTag(tag)) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; first token must be a tag"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + switch (expectSPACE()) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; second token must be a SPACE"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + switch (expectAstring(cmd)) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; third token must be a command"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + uppercase(cmd); + + if (cmd == "UID") { + command.setUidMode(); + + switch (expectSPACE()) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; after UID there" + " must come a SPACE"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + switch (expectAstring(cmd)) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; after UID " + "SPACE there must come a command"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + uppercase(cmd); + } + + command.setTag(tag); + command.setName(cmd); + + return Operator::ACCEPT; +} |