void EntityImporterBase::sendMinds() { if (!mResolvedMindMapping.empty()) { S_LOG_INFO("Sending minds."); for (auto mind : mResolvedMindMapping) { Atlas::Message::MapType message; mind.second->addToMessage(message); Atlas::Message::Element thoughtsElem = message["thoughts"]; Atlas::Message::ListType thoughtArgs; if (thoughtsElem.isList()) { Atlas::Message::ListType thoughtList = thoughtsElem.List(); for (auto& thought : thoughtList) { //If the thought is a list of things the entity owns, we should adjust it with the new entity ids. if (thought.isMap()) { auto& thoughtMap = thought.Map(); if (thoughtMap.count("things") > 0) { auto& thingsElement = thoughtMap.find("things")->second; if (thingsElement.isMap()) { for (auto& thingI : thingsElement.asMap()) { if (thingI.second.isList()) { Atlas::Message::ListType newList; for (auto& thingId : thingI.second.asList()) { if (thingId.isString()) { const auto& entityIdLookupI = mEntityIdMap.find(thingId.asString()); //Check if the owned entity has been created with a new id. If so, replace the data. if (entityIdLookupI != mEntityIdMap.end()) { newList.emplace_back(entityIdLookupI->second); } else { newList.push_back(thingId); } } else { newList.push_back(thingId); } } thingI.second = newList; } } } } if (thoughtMap.count("pending_things") > 0) { //things that the entity owns, but haven't yet discovered are expressed as a list of entity ids auto& pendingThingsElement = thoughtMap.find("pending_things")->second; if (pendingThingsElement.isList()) { Atlas::Message::ListType newList; for (auto& thingId : pendingThingsElement.asList()) { if (thingId.isString()) { const auto& entityIdLookupI = mEntityIdMap.find(thingId.asString()); //Check if the owned entity has been created with a new id. If so, replace the data. if (entityIdLookupI != mEntityIdMap.end()) { newList.emplace_back(entityIdLookupI->second); } else { newList.push_back(thingId); } } else { newList.push_back(thingId); } } pendingThingsElement = newList; } } if (thoughtMap.count("object") > 0) { auto& objectElement = thoughtMap.find("object")->second; if (objectElement.isString()) { std::string& objectString = objectElement.String(); //Other entities are referred to using the syntax "'$eid:...'". //For example, the entity with id 2 would be "'$eid:2'". auto pos = objectString.find("$eid:"); if (pos != std::string::npos) { auto quotePos = objectString.find('\'', pos); if (quotePos != std::string::npos) { auto id = objectString.substr(pos + 5, quotePos - pos - 5); auto I = mEntityIdMap.find(id); if (I != mEntityIdMap.end()) { objectString.replace(pos + 5, quotePos - 7, I->second); } } } } } } thoughtArgs.push_back(thought); } } Atlas::Objects::Operation::RootOperation thinkOp; thinkOp->setParent("think"); thinkOp->setTo(mind.first); //By setting it TO an entity and FROM our avatar we'll make the server deliver it as //if it came from the entity itself (the server rewrites the FROM to be of the entity). thinkOp->setFrom(mAvatarId); thinkOp->setSerialno(newSerialNumber()); Atlas::Objects::Operation::Set setOp; setOp->setArgsAsList(thoughtArgs); thinkOp->setArgs1(setOp); mStats.mindsProcessedCount++; S_LOG_VERBOSE("Restoring mind of " << mind.first); mThoughtOpsInTransit++; sigc::slot<void, const Operation&> slot = sigc::mem_fun(*this, &EntityImporterBase::operationThinkResult); sendAndAwaitResponse(thinkOp, slot); EventProgress.emit(); } mResolvedMindMapping.clear(); } else { complete(); } }
int main() { CommServer comm_server; { new TestCommClient(comm_server); } { new TestCommClient(comm_server, 0); } { TestCommClient * cs = new TestCommClient(comm_server); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setEncoder(); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->setup(0); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_negotiate(); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setConnection(new TestLink(*cs)); cs->test_setNegotiateState(Atlas::Negotiate::SUCCEEDED); cs->test_negotiate(); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setNegotiateState(Atlas::Negotiate::FAILED); cs->test_negotiate(); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setConnectTime(0); cs->test_idle(0); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setConnection(new TestLink(*cs)); cs->test_setNegotiateState(Atlas::Negotiate::SUCCEEDED); cs->test_negotiate(); cs->test_setConnectTime(0); cs->test_idle(0); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setConnectTime(0); cs->test_idle(20); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->read(); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setEncoder(); cs->read(); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); Atlas::Objects::Operation::RootOperation op; cs->send(op); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_openSocket(); Atlas::Objects::Operation::RootOperation op; cs->send(op); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_openSocket(); cs->test_setEncoder(); Atlas::Objects::Operation::RootOperation op; cs->send(op); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setConnection(new TestLink(*cs)); Atlas::Objects::Operation::RootOperation op; cs->test_operation(op); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setConnection(new TestLink(*cs, 1)); Atlas::Objects::Operation::RootOperation op; cs->test_operation(op); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setConnection(new TestLink(*cs, 1)); Atlas::Objects::Operation::RootOperation op; op->setSerialno(23); cs->test_operation(op); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setConnection(new TestLink(*cs, 1)); cs->dispatch(); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); cs->test_setConnection(new TestLink(*cs, 1)); cs->test_setupQueue(); cs->dispatch(); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); Atlas::Objects::Entity::RootEntity ent; cs->test_objectArrived(ent); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); Atlas::Objects::Entity::RootEntity ent; ent->setParents(std::list<std::string>()); cs->test_objectArrived(ent); delete cs; } { TestCommClient * cs = new TestCommClient(comm_server); Atlas::Objects::Operation::RootOperation op; cs->test_objectArrived(op); delete cs; } return 0; }