// This file may be redistributed and modified only under the terms of // the GNU Lesser General Public License (See COPYING for details). // Copyright 2000-2001 Aloril. // Copyright 2001-2005 Alistair Riddoch. // Automatically generated using gen_cpp.py. #include #include #include #include #include namespace Atlas { namespace Objects { int enumMax = 42; using Atlas::Message::Element; using Atlas::Message::ListType; using Atlas::Message::MapType; NoSuchFactoryException::~NoSuchFactoryException() throw () { } SmartPtr generic_factory(const std::string & name, int no) { Operation::Generic obj; obj->setType(name, no); return obj; } SmartPtr anonymous_factory(const std::string & name, int no) { Entity::Anonymous obj; obj->setType(name, no); return obj; } std::map objectDefinitions; class AddFactories { public: AddFactories(); } addThemHere; AddFactories::AddFactories() { Factories * objectFactory = Factories::instance(); objectFactory->addFactory("root", &factory, ROOT_NO); objectFactory->addFactory("root_entity", &factory, Entity::ROOT_ENTITY_NO); objectFactory->addFactory("admin_entity", &factory, Entity::ADMIN_ENTITY_NO); objectFactory->addFactory("account", &factory, Entity::ACCOUNT_NO); objectFactory->addFactory("player", &factory, Entity::PLAYER_NO); objectFactory->addFactory("admin", &factory, Entity::ADMIN_NO); objectFactory->addFactory("game", &factory, Entity::GAME_NO); objectFactory->addFactory("game_entity", &factory, Entity::GAME_ENTITY_NO); objectFactory->addFactory("root_operation", &factory, Operation::ROOT_OPERATION_NO); objectFactory->addFactory("action", &factory, Operation::ACTION_NO); objectFactory->addFactory("create", &factory, Operation::CREATE_NO); objectFactory->addFactory("combine", &factory, Operation::COMBINE_NO); objectFactory->addFactory("divide", &factory, Operation::DIVIDE_NO); objectFactory->addFactory("communicate", &factory, Operation::COMMUNICATE_NO); objectFactory->addFactory("talk", &factory, Operation::TALK_NO); objectFactory->addFactory("delete", &factory, Operation::DELETE_NO); objectFactory->addFactory("set", &factory, Operation::SET_NO); objectFactory->addFactory("affect", &factory, Operation::AFFECT_NO); objectFactory->addFactory("move", &factory, Operation::MOVE_NO); objectFactory->addFactory("wield", &factory, Operation::WIELD_NO); objectFactory->addFactory("get", &factory, Operation::GET_NO); objectFactory->addFactory("perceive", &factory, Operation::PERCEIVE_NO); objectFactory->addFactory("look", &factory, Operation::LOOK_NO); objectFactory->addFactory("listen", &factory, Operation::LISTEN_NO); objectFactory->addFactory("sniff", &factory, Operation::SNIFF_NO); objectFactory->addFactory("touch", &factory, Operation::TOUCH_NO); objectFactory->addFactory("login", &factory, Operation::LOGIN_NO); objectFactory->addFactory("logout", &factory, Operation::LOGOUT_NO); objectFactory->addFactory("imaginary", &factory, Operation::IMAGINARY_NO); objectFactory->addFactory("use", &factory, Operation::USE_NO); objectFactory->addFactory("info", &factory, Operation::INFO_NO); objectFactory->addFactory("perception", &factory, Operation::PERCEPTION_NO); objectFactory->addFactory("sight", &factory, Operation::SIGHT_NO); objectFactory->addFactory("appearance", &factory, Operation::APPEARANCE_NO); objectFactory->addFactory("disappearance", &factory, Operation::DISAPPEARANCE_NO); objectFactory->addFactory("sound", &factory, Operation::SOUND_NO); objectFactory->addFactory("smell", &factory, Operation::SMELL_NO); objectFactory->addFactory("feel", &factory, Operation::FEEL_NO); objectFactory->addFactory("error", &factory, Operation::ERROR_NO); objectFactory->addFactory("anonymous", &factory, Entity::ANONYMOUS_NO); objectFactory->addFactory("generic", &factory, Operation::GENERIC_NO); } Factories::Factories() { } Factories::Factories(const Factories & other) : m_factories(other.m_factories) { } bool Factories::hasFactory(const std::string& name) { FactoryMap::const_iterator I = m_factories.find(name); return I != m_factories.end(); } Root Factories::createObject(const std::string& name) { FactoryMap::const_iterator I = m_factories.find(name); if (I == m_factories.end()) { return Root(0); } else { return (*I).second.first(name, (*I).second.second); } } Root Factories::createObject(const MapType & msg_map) { Root obj(0); // is this instance of entity or operation? MapType::const_iterator I = msg_map.find(Atlas::Objects::OBJTYPE_ATTR); MapType::const_iterator Iend = msg_map.end(); bool is_instance = false; if(I != Iend && I->second.isString()) { const std::string & objtype = I->second.String(); if(objtype == "op" || objtype == "obj" || objtype == "object") { // get parent I = msg_map.find(Atlas::Objects::PARENTS_ATTR); if(I != Iend && I->second.isList()) { const ListType & parents_lst = I->second.List(); if(parents_lst.size()>=1 && parents_lst.front().isString()) { const std::string & parent = parents_lst.front().String(); // objtype and parent ok, try to create it: FactoryMap::const_iterator I = m_factories.find(parent); if (I != m_factories.end()) { obj = I->second.first(parent, I->second.second); } else { if (objtype == "op") { obj = Atlas::Objects::Operation::Generic(); } else { obj = Atlas::Objects::Entity::Anonymous(); } } is_instance = true; // FIXME We might want to do something different here. } // parent list ok? } // has parent attr? } // has known objtype } // has objtype attr if (!is_instance) { // Should we really use factory? Why not just instantiate by hand? obj = Atlas::Objects::Entity::Anonymous(); } // not instance for (I = msg_map.begin(); I != Iend; I++) { obj->setAttr(I->first, I->second); } return obj; } std::list Factories::getKeys() { std::list keys; for (FactoryMap::const_iterator I = m_factories.begin(); I != m_factories.end(); I++) { keys.push_back(I->first); } return keys; } void Factories::addFactory(const std::string& name, FactoryMethod method, int classno) { m_factories[name] = std::make_pair(method, classno); } int Factories::addFactory(const std::string& name, FactoryMethod method) { int classno = ++enumMax; m_factories[name] = std::make_pair(method, classno); return classno; } Factories * Factories::instance() { if (m_instance == 0) { m_instance = new Factories; } return m_instance; } Factories * Factories::m_instance = 0; } } // namespace Atlas::Objects