void Accountintegration::test_LogoutOperation() { Logout op; op->setSerialno(1); Anonymous op_arg; op_arg->setParents(std::list<std::string>()); op->setArgs1(op_arg); OpVector res; m_ac->operation(op, res); // FIXME Account should have been removed from Lobby, and also from // Connection }
void ClientConnection::dispatchOOG(const RootOperation& op) { switch (op->getClassNo()) { case LOOK_NO: processOOGLook(smart_dynamic_cast<Look>(op)); return; case MOVE_NO: return; case TALK_NO: { Talk tk = smart_dynamic_cast<Talk>(op); processTalk(tk); return; } case LOGOUT_NO: { Logout logout = smart_dynamic_cast<Logout>(op); Info logoutInfo; logoutInfo->setArgs1(logout); logoutInfo->setTo(m_account); logoutInfo->setRefno(logout->getSerialno()); send(logoutInfo); return; } case CREATE_NO: { const StringList& arg0Parents(op->getArgs().front()->getParents()); if (arg0Parents.front() == "__fail__") { sendError("bad type for char creation", op); return; } if (arg0Parents.front() == "settler") { createCharacter(op); return; } } default: error() << "clientConnection failed to handle OOG op"; } // of classNo switch }
int main() { // WorldRouter world; // Entity & e = world.m_gameWorld; ServerRouting server(*(BaseWorld*)0, "noruleset", "unittesting", "1", 1, "2", 2); CommServer commServer(server); TestCommClient * tcc = new TestCommClient(commServer); TestConnection * tc = new TestConnection(*tcc, server, "addr", "3", 3); Account * ac = tc->testAddAccount("bob", "foo"); assert(ac != 0); ac = tc->testRemoveAccount(ac); assert(ac != 0); tc->removeObject(ac); assert(tc->numObjects() == 0); { Create op; OpVector res; tc->operation(op, res); op->setArgs1(Root()); tc->operation(op, res); restricted_flag = true; tc->operation(op, res); restricted_flag = false; Anonymous op_arg; op->setArgs1(op_arg); tc->operation(op, res); op_arg->setId("jim"); // Legacy op tc->operation(op, res); op_arg->setAttr("username", 1); // Malformed username tc->operation(op, res); op_arg->setAttr("username", "jim"); // username, no password tc->operation(op, res); op_arg->setAttr("password", ""); // zero length password tc->operation(op, res); op_arg->setAttr("username", ""); op_arg->setAttr("password", "foo"); // zero length username tc->operation(op, res); op_arg->setAttr("username", "jim"); // valid username and password tc->operation(op, res); assert(tc->numObjects() != 0); } { Login op; OpVector res; tc->operation(op, res); op->setArgs1(Root()); tc->operation(op, res); Anonymous op_arg; op->setArgs1(op_arg); tc->operation(op, res); op_arg->setId("bob"); tc->operation(op, res); op_arg->setAttr("username", 1); tc->operation(op, res); op_arg->setAttr("username", ""); tc->operation(op, res); op_arg->setAttr("username", "bob"); tc->operation(op, res); op_arg->setAttr("password", "foo"); tc->operation(op, res); tc->operation(op, res); } { Get op; OpVector res; tc->operation(op, res); Root op_arg; op->setArgs1(op_arg); tc->operation(op, res); op_arg->setId("1"); tc->operation(op, res); op_arg->setId("game_entity"); tc->operation(op, res); } { Logout op; OpVector res; tc->operation(op, res); op->setSerialno(24); tc->operation(op, res); Root op_arg; op->setArgs1(op_arg); tc->operation(op, res); op_arg->setId("-1"); tc->operation(op, res); op_arg->setId("23"); tc->operation(op, res); // How to determine the real ID? const RouterMap rm = tc->getObjects(); RouterMap::const_iterator I = rm.begin(); for (;I != rm.end(); ++I) { std::string object_id = String::compose("%1", I->first); std::cout << "ID: " << object_id << std::endl; op_arg->setId(object_id); tc->operation(op, res); } } delete tc; }
/// \brief Handle an Info op response sent as reply to a teleport request /// /// @param op The Info op sent back as reply to a teleport request /// @param res The result set of replies void Peer::peerTeleportResponse(const Operation &op, OpVector &res) { log(INFO, "Got a peer teleport response"); // Response to a Create op const std::vector<Root> & args = op->getArgs(); if (args.size() < 1) { log(ERROR, "Malformed args in Info op"); return; } const Root & arg = args.front(); if (op->isDefaultRefno()) { log(ERROR, "Response to teleport has no refno"); return; } long iid = op->getRefno(); CommPeer *peer = dynamic_cast<CommPeer*>(&m_commClient); if(peer == 0) { log(ERROR, "Unable to get CommPeer object"); return; } TeleportMap::iterator I = m_teleports.find(iid); if (I == m_teleports.end()) { log(ERROR, "Info op for unknown create"); return; } TeleportState *s = I->second; assert (s != NULL); s->setCreated(); log(INFO, String::compose("Entity with ID %1 replicated on peer", iid)); // This is the sender entity. This is retreived again rather than // relying on a pointer (in the TeleportState object perhaps) as the // entity might have been deleted in the time between sending and response Entity * entity = BaseWorld::instance().getEntity(iid); if (entity == 0) { log(ERROR, String::compose("No entity found with ID: %1", iid)); // Clean up the teleport state object m_teleports.erase(I); return; } // If entity has a mind, add extra information in the Logout op if (s->isMind()) { Character * chr = dynamic_cast<Character *>(entity); if (!chr) { log(ERROR, "Entity is not a character"); return; } if (chr->m_externalMind == 0) { log(ERROR, "No external mind (though teleport state claims it)"); return; } ExternalMind * mind = dynamic_cast<ExternalMind*>(chr->m_externalMind); if (mind == 0 || !mind->isConnected()) { log(ERROR, "Mind is NULL or not connected"); return; } std::vector<Root> logout_args; Anonymous op_arg; op_arg->setId(entity->getId()); logout_args.push_back(op_arg); Anonymous ip_arg; ip_arg->setAttr("teleport_host", peer->getHost()); ip_arg->setAttr("teleport_port", peer->getPort()); ip_arg->setAttr("possess_key", s->getPossessKey()); ip_arg->setAttr("possess_entity_id", arg->getId()); logout_args.push_back(ip_arg); Logout logoutOp; logoutOp->setArgs(logout_args); logoutOp->setTo(entity->getId()); OpVector temp; mind->operation(logoutOp, temp); log(INFO, "Sent random key to connected mind"); } // FIXME Remove from the world cleanly, not delete. // Delete the entity from the current world Delete delOp; Anonymous del_arg; del_arg->setId(entity->getId()); delOp->setArgs1(del_arg); delOp->setTo(entity->getId()); entity->sendWorld(delOp); log(INFO, "Deleted entity from current server"); logEvent(EXPORT_ENT, String::compose("%1 - %2 Exported entity", getId(), entity->getId())); // Clean up the teleport state object m_teleports.erase(I); }
void Interactive::exec(const std::string & cmd, const std::string & arg) { bool reply_expected = true; reply_flag = false; error_flag = false; boost::shared_ptr<ObjectContext> command_context = m_currentContext.lock(); if (!command_context) { std::cout << "ERROR: Context free" << std::endl << std::flush; return; } if (cmd == "stat") { Get g; send(g); } else if (cmd == "install") { size_t space = arg.find(' '); if (space == std::string::npos || space >= (arg.size() - 1)) { std::cout << "usage: install <type id> <parent id>" << std::endl << std::flush; } else { Create c; c->setFrom(m_accountId); Anonymous ent; ent->setId(std::string(arg, 0, space)); ent->setObjtype("class"); ent->setParents(std::list<std::string>(1, std::string(arg, space + 1))); c->setArgs1(ent); send(c); } reply_expected = false; } else if (cmd == "look") { Look l; if (!arg.empty()) { Anonymous cmap; cmap->setId(arg); l->setArgs1(cmap); } l->setSerialno(newSerialNo()); command_context->setFromContext(l); send(l); reply_expected = false; } else if (cmd == "logout") { Logout l; l->setFrom(m_accountId); if (!arg.empty()) { Anonymous lmap; lmap->setId(arg); l->setArgs1(lmap); reply_expected = false; } send(l); } else if (cmd == "say") { Talk t; Anonymous ent; ent->setAttr("say", arg); t->setArgs1(ent); t->setFrom(m_accountId); send(t); } else if (cmd == "help" || cmd == "?") { reply_expected = false; help(); } else if (cmd == "query") { Get g; if (!arg.empty()) { Anonymous cmap; if (::isdigit(arg[0])) { cmap->setObjtype("obj"); } else { cmap->setObjtype("meta"); } cmap->setId(arg); g->setArgs1(cmap); } g->setFrom(m_accountId); send(g); } else if (cmd == "reload") { if (arg.empty()) { reply_expected = false; std::cout << "reload: Argument required" << std::endl << std::flush; } else { Set s; Anonymous tmap; tmap->setObjtype("class"); tmap->setId(arg); s->setArgs1(tmap); s->setFrom(m_accountId); send(s); } } else if (cmd == "get") { Get g; if (!arg.empty()) { Anonymous cmap; if (::isdigit(arg[0])) { cmap->setObjtype("obj"); } else { cmap->setObjtype("meta"); } cmap->setId(arg); g->setArgs1(cmap); } g->setFrom(m_accountId); send(g); } else if (cmd == "monitor") { ClientTask * task = new OperationMonitor; if (runTask(task, arg) == 0) { Monitor m; m->setArgs1(Anonymous()); m->setFrom(m_accountId); send(m); } reply_expected = false; } else if (cmd == "unmonitor") { OperationMonitor * om = dynamic_cast<OperationMonitor *>(m_currentTask); if (om != 0) { Monitor m; m->setFrom(m_accountId); send(m); reply_expected = false; SystemTime now; now.update(); time_t monitor_time = now.seconds() - om->startTime(); std::cout << om->count() << " operations monitored in " << monitor_time << " seconds = " << om->count() / monitor_time << " operations per second" << std::endl << std::flush; endTask(); } } else if (cmd == "connect") { std::vector<std::string> args; tokenize(arg, args); if (args.size() != 2) { std::cout << "usage: connect <hostname> <port>" << std::endl << std::flush; reply_expected = false; } else { Anonymous cmap; cmap->setAttr("hostname", args[0]); cmap->setAttr("port", strtol(args[1].c_str(), 0, 10)); Connect m; m->setArgs1(cmap); // No serialno yet // FIXME add serialno once Juncture context can handle this command_context->setFromContext(m); send(m); } } else if (cmd == "add_agent") { std::string agent_type("creator"); if (!arg.empty()) { agent_type = arg; } Create c; Anonymous cmap; cmap->setParents(std::list<std::string>(1, agent_type)); cmap->setName("cycmd agent"); cmap->setObjtype("obj"); c->setArgs1(cmap); c->setSerialno(newSerialNo()); command_context->setFromContext(c); send(c); } else if (cmd == "delete") { if (arg.empty()) { std::cout << "Please specify the entity to delete" << std::endl << std::flush; reply_expected = false; } else { Delete del; Anonymous del_arg; del_arg->setId(arg); del->setArgs1(del_arg); command_context->setFromContext(del); send(del); reply_expected = false; } } else if (cmd == "find_by_name") { if (arg.empty()) { std::cout << "Please specify the name to search for" << std::endl << std::flush; reply_expected = false; } else { Look l; Anonymous lmap; lmap->setName(arg); l->setArgs1(lmap); l->setSerialno(newSerialNo()); command_context->setFromContext(l); send(l); reply_expected = false; } } else if (cmd == "find_by_type") { if (arg.empty()) { std::cout << "Please specify the type to search for" << std::endl << std::flush; reply_expected = false; } else { Look l; Anonymous lmap; lmap->setParents(std::list<std::string>(1, arg)); l->setArgs1(lmap); l->setSerialno(newSerialNo()); command_context->setFromContext(l); send(l); reply_expected = false; } } else if (cmd == "flush") { if (arg.empty()) { // FIXME usage std::cout << "Please specify the type to flush" << std::endl << std::flush; reply_expected = false; } else { ClientTask * task = new Flusher(command_context); runTask(task, arg); reply_expected = false; } } else if (cmd == "cancel") { if (endTask() != 0) { std::cout << "No task currently running" << std::endl << std::flush; } } else if (cmd == "dump") { if (command_context->repr() != "avatar") { std::cout << "You must have an agent in the world in order to dump the world." << std::endl << std::flush; } else { //Extract the avatar id by "misusing" the setFromContext method Operation op; command_context->setFromContext(op); ClientTask * task = new EntityExporter(m_accountId, op->getFrom()); runTask(task, "world.xml"); reply_expected = false; } } else if (cmd == "restore") { if (command_context->repr() != "avatar") { std::cout << "You must have an agent in the world in order to dump the world." << std::endl << std::flush; } else { //Extract the avatar id by "misusing" the setFromContext method Operation op; command_context->setFromContext(op); ClientTask * task = new EntityImporter(m_accountId, op->getFrom()); runTask(task, "world.xml"); reply_expected = false; } } else if (cmd == "create") { std::vector<std::string> args; tokenize(arg, args); if (args.size() < 1) { std::cout << "usage: create <type> <params> ... " << std::endl << std::flush; } else { Anonymous cmap; cmap->setParents(std::list<std::string>(1, args[0])); cmap->setObjtype("obj"); Create c; c->setArgs1(cmap); c->setSerialno(newSerialNo()); command_context->setFromContext(c); send(c); } reply_expected = false; } else if (cmd == "login") { std::vector<std::string> args; tokenize(arg, args); if (args.size() != 2) { std::cout << "usage: login <username> <password>" << std::endl << std::flush; reply_expected = false; } else { Anonymous cmap; cmap->setAttr("username", args[0]); cmap->setAttr("password", args[1]); Login m; m->setArgs1(cmap); m->setSerialno(newSerialNo()); command_context->setFromContext(m); send(m); } } else { reply_expected = false; std::cout << cmd << ": Command not known" << std::endl << std::flush; } if (!reply_expected) { updatePrompt(); return; } // Wait for reply time_t wait_start_time = time(NULL); while (!reply_flag) { if (time(NULL) - wait_start_time > 5) { std::cout << cmd << ": No reply from server" << std::endl << std::flush; return; } if (select(false) != 0) { return; } } }
int main() { database_flag = false; (void)new Domain; WorldRouter world; Entity & e = world.m_gameWorld; ServerRouting server(world, "noruleset", "unittesting", "1", 1, "2", 2); CommServer commServer(server); TestCommClient * tc = new TestCommClient(commServer); Connection * c = new Connection(*tc, server, "addr", "3", 3); TestAccount * ac = new TestAccount(c, "user", "password", "4", 4); Entity * chr; { chr = new Entity("5", 5); chr->m_location.m_loc = &e; chr->m_location.m_loc->makeContainer(); assert(chr->m_location.m_loc->m_contains != 0); chr->m_location.m_loc->m_contains->insert(chr); ac->addCharacter(chr); chr->destroy(); } { chr = new Character("6", 6); chr->m_location.m_loc = &e; chr->m_location.m_loc->makeContainer(); assert(chr->m_location.m_loc->m_contains != 0); chr->m_location.m_loc->m_contains->insert(chr); ac->addCharacter(chr); chr->destroy(); } { chr = new Character("7", 7); chr->m_location.m_loc = &e; chr->m_location.m_loc->makeContainer(); assert(chr->m_location.m_loc->m_contains != 0); chr->m_location.m_loc->m_contains->insert(chr); ac->addCharacter(chr); } { Anonymous new_char; Entity * chr = ac->testAddNewCharacter("thing", new_char, RootEntity()); assert(chr != 0); } ac->getType(); { MapType emap; ac->addToMessage(emap); } { RootEntity ent; ac->addToEntity(ent); } { Create op; OpVector res; ac->operation(op, res); op->setArgs1(Root()); ac->operation(op, res); Anonymous op_arg; op->setArgs1(op_arg); ac->operation(op, res); op_arg->setParents(std::list<std::string>()); ac->operation(op, res); op_arg->setParents(std::list<std::string>(1, "game_entity")); ac->operation(op, res); op_arg->setName("Bob"); ac->operation(op, res); } { Get op; OpVector res; ac->operation(op, res); op->setArgs1(Root()); ac->operation(op, res); Anonymous op_arg; op->setArgs1(op_arg); ac->operation(op, res); op_arg->setParents(std::list<std::string>()); ac->operation(op, res); } { Imaginary op; OpVector res; ac->operation(op, res); op->setArgs1(Root()); ac->operation(op, res); op->setSerialno(1); ac->operation(op, res); Anonymous op_arg; op->setArgs1(op_arg); ac->operation(op, res); op_arg->setLoc("2"); ac->operation(op, res); } { Look op; OpVector res; ac->operation(op, res); op->setArgs1(Root()); ac->operation(op, res); Anonymous op_arg; op->setArgs1(op_arg); ac->operation(op, res); op_arg->setId("1"); ac->operation(op, res); op_arg->setId(chr->getId()); ac->operation(op, res); } { Set op; OpVector res; ac->operation(op, res); op->setArgs1(Root()); ac->operation(op, res); Anonymous op_arg; op->setArgs1(op_arg); ac->operation(op, res); op_arg->setId("1"); ac->operation(op, res); op_arg->setId(chr->getId()); ac->operation(op, res); op_arg->setAttr("guise", "foo"); ac->operation(op, res); op_arg->setAttr("height", 3.0); ac->operation(op, res); BBox newBox(WFMath::Point<3>(-0.5, -0.5, 0.0), WFMath::Point<3>(-0.5, -0.5, 2.0)); chr->m_location.setBBox(newBox); op_arg->setAttr("height", 3.0); ac->operation(op, res); op_arg->setAttr("tasks", ListType()); ac->operation(op, res); } { Talk op; OpVector res; ac->operation(op, res); op->setArgs1(Root()); ac->operation(op, res); Anonymous op_arg; op->setArgs1(op_arg); ac->operation(op, res); op_arg->setParents(std::list<std::string>()); ac->operation(op, res); op->setSerialno(1); ac->operation(op, res); op_arg->setLoc("1"); ac->operation(op, res); } { Logout op; OpVector res; ac->operation(op, res); op->setSerialno(1); ac->operation(op, res); op->setArgs1(Root()); ac->operation(op, res); Anonymous op_arg; op->setArgs1(op_arg); ac->operation(op, res); op_arg->setParents(std::list<std::string>()); ac->operation(op, res); } { // Move has no meaning Move op; OpVector res; ac->operation(op, res); op->setArgs1(Root()); ac->operation(op, res); Anonymous op_arg; op->setArgs1(op_arg); ac->operation(op, res); op_arg->setParents(std::list<std::string>()); ac->operation(op, res); } { Entity e("7", 7); int ret = ac->connectCharacter(&e); assert(ret == -1); } { Character e("8", 8); int ret = ac->connectCharacter(&e); assert(ret == 0); } delete ac; return 0; }