/// \brief Handle a relay operation void Entity::RelayOperation(const Operation & op, OpVector & res) { if (op->getArgs().empty()) { log(ERROR, "Entity::RelayOperation no args."); return; } Operation relayedOp = Atlas::Objects::smart_dynamic_cast<Operation>( op->getArgs().front()); if (!relayedOp.isValid()) { log(ERROR, "Entity::RelayOperation first arg is not an operation."); return; } if (op->isDefaultSerialno()) { log(ERROR, "Entity::RelayOperation no serial number."); return; } //Add a sight of the operation Sight sight; sight->setArgs1(relayedOp); Atlas::Objects::Operation::Generic responseOp; responseOp->setType("relay", Atlas::Objects::Operation::RELAY_NO); responseOp->setArgs1(sight); responseOp->setTo(op->getFrom()); res.push_back(responseOp); //Make sure that the contained op is addressed to the entity relayedOp->setTo(getId()); operation(relayedOp, res); }
/// \brief Report an Error. /// /// The error reported is noted in the log, and an error operation is /// genereated. /// @param op The operation that caused the error. /// @param errstring A message describing the error. /// @param res The resulting error operation is returned here. /// @param to The error operation should be directed to this ID. void Router::error(const Operation & op, const std::string & errstring, OpVector & res, const std::string & to) const { Atlas::Objects::Operation::Error e; log(NOTICE, String::compose("ERROR generated by %1 with message [%2]", getId(), errstring)); std::vector<Atlas::Objects::Root> & args = e->modifyArgs(); Atlas::Objects::Entity::Anonymous arg1; arg1->setAttr("message", errstring); args.push_back(arg1); args.push_back(op); if (!to.empty()) { if (!op->isDefaultSerialno()) { e->setRefno(op->getSerialno()); } e->setTo(to); } res.push_back(e); }
void Admin::createObject(const std::string & type_str, const Root & arg, const Operation & op, OpVector & res) { const std::string & objtype = arg->getObjtype(); if (objtype == "class" || objtype == "op_definition") { // New entity type if (!arg->hasAttrFlag(Atlas::Objects::ID_FLAG)) { error(op, "Set arg has no id.", res, getId()); return; } const std::string & id = arg->getId(); if (Inheritance::instance().hasClass(id)) { error(op, "Attempt to install type that already exists", res, getId()); return; } const Root & o = Inheritance::instance().getClass(type_str); if (!o.isValid()) { error(op, compose("Attempt to install type with non-existant " "parent \"%1\"", type_str), res, getId()); return; } if (Ruleset::instance()->installRule(id, "unknown", arg) == 0) { Info info; info->setTo(getId()); info->setArgs1(arg); res.push_back(info); } else { error(op, "Installing new type failed", res, getId()); } } else if (type_str == "juncture") { std::string junc_id; long junc_iid = newId(junc_id); if (junc_iid < 0) { error(op, "Juncture failed as no ID available", res, getId()); return; } Juncture * j = new Juncture(m_connection, junc_id, junc_iid); m_connection->addObject(j); m_connection->m_server.addObject(j); Anonymous info_arg; j->addToEntity(info_arg); Info info; info->setTo(getId()); info->setArgs1(info_arg); if (!op->isDefaultSerialno()) { info->setRefno(op->getSerialno()); } res.push_back(info); } else { Account::createObject(type_str, arg, op, res); } }
void EntityImporterBase::sendOperation(const Operation& op) { if (!op->isDefaultSerialno()) { sigc::slot<void, const Operation&> slot = sigc::mem_fun(*this, &EntityImporterBase::operation); sendAndAwaitResponse(op, slot); } else { send(op); } }
void EntityImporterBase::sendOperation(const Operation& op) { //std::cout << "Sending op ============"; //debug_dump(op, std::cout); if (!op->isDefaultSerialno()) { sigc::slot<void, const Operation&> slot = sigc::mem_fun(*this, &EntityImporterBase::operation); sendAndAwaitResponse(op, slot); } else { send(op); } }
void Entity::externalOperation(const Operation & op, Link &) { OpVector res; operation(op, res); OpVector::const_iterator Iend = res.end(); for (OpVector::const_iterator I = res.begin(); I != Iend; ++I) { if (!op->isDefaultSerialno()) { (*I)->setRefno(op->getSerialno()); } sendWorld(*I); } }
void Juncture::LoginOperation(const Operation & op, OpVector & res) { log(INFO, "Juncture got login"); const std::vector<Root> & args = op->getArgs(); if (args.empty()) { error(op, "No argument to connect op", res, getId()); return; } const Root & arg = args.front(); Element username_attr; if (arg->copyAttr("username", username_attr) != 0 || !username_attr.isString()) { error(op, "Argument to connect op has no username", res, getId()); return; } const std::string & username = username_attr.String(); Element password_attr; if (arg->copyAttr("password", password_attr) != 0 || !password_attr.isString()) { error(op, "Argument to connect op has no password", res, getId()); return; } const std::string & password = password_attr.String(); if (m_peer == 0) { error(op, "Juncture not connected", res, getId()); return; } assert(m_socket == 0); if (m_peer->getAuthState() != PEER_INIT) { error(op, "Juncture not ready", res, getId()); return; } Anonymous account; account->setAttr("username", username); account->setAttr("password", password); Login l; l->setArgs1(account); if (!op->isDefaultSerialno()) { l->setSerialno(op->getSerialno()); } // Send the login op m_peer->send(l); m_peer->setAuthState(PEER_AUTHENTICATING); }
void Juncture::externalOperation(const Operation & op, Link &) { log(ERROR, String::compose("%1 called", __PRETTY_FUNCTION__)); assert(m_connection != 0); OpVector reply; long serialno = op->getSerialno(); operation(op, reply); OpVector::const_iterator Iend = reply.end(); for(OpVector::const_iterator I = reply.begin(); I != Iend; ++I) { if (!op->isDefaultSerialno()) { // Should we respect existing refnos? if ((*I)->isDefaultRefno()) { (*I)->setRefno(serialno); } } // FIXME detect socket failure here m_connection->send(*I); } }
void Router::buildError(const Operation & op, const std::string & errstring, const Operation & e, const std::string & to) const { std::vector<Atlas::Objects::Root> & args = e->modifyArgs(); Atlas::Objects::Entity::Anonymous arg1; arg1->setAttr("message", errstring); args.push_back(arg1); args.push_back(op); if (!to.empty()) { if (!op->isDefaultSerialno()) { e->setRefno(op->getSerialno()); } e->setTo(to); } }