Changeset 9869 in orxonox.OLD for trunk/src/lib/util/loading/resource.cc
- Timestamp:
- Oct 3, 2006, 12:19:30 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/util/loading/resource.cc
r9406 r9869 14 14 */ 15 15 16 #define DEBUG_SPECIAL_MODULE DEBUG_MODULE_LOAD ING16 #define DEBUG_SPECIAL_MODULE DEBUG_MODULE_LOAD 17 17 18 18 #include "resource.h" 19 20 21 22 23 /** 24 * standard constructor 25 */ 26 Resource::Resource (const std::string& fileName) 19 #include "resource_manager.h" 20 21 #include "debug.h" 22 23 24 namespace Resources 27 25 { 28 // this->setClassID(CL_RESOURCE, "Resource"); 29 26 //! Define an ObjectList for the Resources 27 ObjectListDefinition(Resource); 28 29 30 /** 31 * @brief standard constructor 32 * @param type the Type this resource belongs to. 33 */ 34 Resource::Resource (Type* type) 35 : _pointer(NULL), _type(type) 36 { 37 this->registerObject(this, Resource::_objectList); 38 } 39 40 /** 41 * @brief standard deconstructor 42 */ 43 Resource::~Resource () 44 { 45 // delete what has to be deleted here 46 } 47 48 /** 49 * @brief Locates a File inside of the Resources Paths and returns the appended path. 50 * 51 * @param fileName the Name of the file to look for. 52 * @returns the Name of the File prepended with the PAth it is in, if found, empty String ("") otherwise. 53 * 54 * This Function searches in (ordered): 55 * 1. mainGlobalPath (from ResourceManger) 56 * 2. all of the global Paths (from ResourceManger) 57 * 3. all of the Resources Paths (from Resources::Type) 58 * 59 * in each of these directory, first "./" is searched, and afterwards all of the subDirs (from Resources::Type) are searched. 60 * 61 * @todo finish it!! 62 */ 63 std::string Resource::locateFile(const std::string& fileName) const 64 { 65 if ((ResourceManager::getInstance()->mainGlobalPath() + File(fileName)).exists() ) 66 return (ResourceManager::getInstance()->mainGlobalPath() + File(fileName)).name(); 67 68 std::string locatedFile; 69 locatedFile = locateFileInSubDir(ResourceManager::getInstance()->mainGlobalPath(), fileName); 70 if (!locatedFile.empty()) 71 { 72 return locatedFile; 73 } 74 75 if (File(fileName).exists()) 76 return fileName; 77 78 return (ResourceManager::getInstance()->mainGlobalPath() + File(fileName)).name(); 79 } 80 81 /** 82 * @brief tests in all the SubDirectories defined in Resource under Directory if the fileName exists. 83 * @param directory the directory to in what to search for all subdirectories for. 84 * @param fileName the Name of the File to query for 85 * @return true on success. 86 */ 87 std::string Resource::locateFileInSubDir(const Directory& directory, const std::string& fileName) const 88 { 89 std::vector<Directory>::const_iterator it; 90 for (it = this->_type->resourceSubPaths().begin(); it != this->_type->resourceSubPaths().end(); ++it) 91 { 92 Directory dir = directory + (*it); 93 File file = dir + File(fileName); 94 if ((dir+ File(fileName)).exists()) 95 return (dir+File(fileName)).name(); 96 } 97 return ""; 98 } 99 100 101 /** 102 * @param loadString the Identifier of the Resource. 103 * @returns a Store-Pointer to the Resource if found, NULL otherwise 104 */ 105 StorePointer* Resource::acquireResource(const std::string& loadString) 106 { 107 //const Type* const type = _resourceTypes[this->_type->id()]; 108 109 for (unsigned int i = 0; i < _type->storedResources().size(); ++i) 110 { 111 if (_type->storedResources()[i]->loadString() == loadString) 112 return _type->storedResources()[i]; 113 } 114 115 return NULL; 116 } 117 118 /** 119 * @brief registers a StorePointer to a Resource's Type. 120 * @param pointer the StorePointer to register. 121 */ 122 void Resource::addResource(StorePointer* pointer) 123 { 124 assert(pointer != NULL); 125 this->_type->addResource(pointer); 126 } 127 128 129 130 131 132 133 /////////////////// 134 //// KEEPLEVEL //// 135 /////////////////// 136 137 //! Constructs a default KeepLevel as Set in the ResourceManager via setDefaultKeepLevel. 138 KeepLevel::KeepLevel() 139 { 140 this->_keepLevel = ResourceManager::getInstance()->defaultKeepLevel().keepLevel(); 141 } 142 /** 143 * @param keepLevel the level to set. 144 */ 145 KeepLevel::KeepLevel(unsigned int keepLevel) 146 { 147 _keepLevel = keepLevel; 148 } 149 150 /** 151 * @brief constructor of a KeepLevel. 152 * @param keepLevelName the Name of the KeepLevel. Must be one Name of the defined Names in the ResourceManager. 153 * 154 * @note the Name is transformed into an Integer for fast interpretation. 155 */ 156 KeepLevel::KeepLevel(const std::string& keepLevelName) 157 { 158 this->_keepLevel = ResourceManager::getInstance()->getKeepLevelID(keepLevelName); 159 } 160 161 /** 162 * @returns the name of the KeepLevel. 163 */ 164 const std::string& KeepLevel::name() const 165 { 166 return ResourceManager::getInstance()->getKeepLevelName(this->_keepLevel); 167 } 168 169 170 171 /////////////////////// 172 //// STORE POINTER //// 173 /////////////////////// 174 /** 175 * @brief allocates a StorePointer. 176 * @param loadString An identifier String that is unique between all resources of this type. 177 * @param keepLevel the KeepLevel at wich to keep this resource. 178 */ 179 StorePointer::StorePointer(const std::string& loadString, const KeepLevel& keeplevel) 180 : _loadString(loadString), _keepLevel(keeplevel) 181 { 182 PRINTF(4)("Acquired a Resource with LoadString '%s' and KeepLevel '%s'\n", _loadString.c_str(), _keepLevel.name().c_str()); 183 } 184 185 StorePointer::~StorePointer() 186 { 187 PRINTF(4)("Deleting Stored Resource '%s' from KeepLevel '%s'\n", _loadString.c_str(), _keepLevel.name().c_str()); 188 }; 189 190 191 192 ////////////// 193 //// TYPE //// 194 ////////////// 195 /** 196 * @brief allocates a Type. 197 * @param typeName the Name of the Type to be stored in this Container. 198 */ 199 Type::Type(const std::string& typeName) 200 : _typeName(typeName) 201 { 202 ResourceManager::getInstance()->registerType(this); 203 PRINTF(4)("Created ResourceType '%s'\n", typeName.c_str()); 204 } 205 206 //! Destructs a Type. 207 Type::~Type() 208 { 209 ResourceManager::getInstance()->unregisterType(this); 210 } 211 212 /** 213 * @brief adds a Resource to this Resource's type. 214 * @param resource the Resource to add. 215 */ 216 void Type::addResource(StorePointer* resource) 217 { 218 this->_storedResources.push_back(resource); 219 } 220 221 /** 222 * @brief adds a Path to the Type's resource-paths. 223 * @param path the path-name to add. 224 */ 225 bool Type::addResourcePath(const std::string& path) 226 { 227 std::vector<Directory>::const_iterator it; 228 for (it = this->_resourcePaths.begin(); it != this->_resourcePaths.end(); ++it) 229 if ((*it) == path) 230 return false; 231 this->_resourcePaths.push_back(path); 232 return true; 233 234 } 235 236 /** 237 * @brief Adds a SubPath to the Type's resource-subpaths. 238 * @param subPath the subpath to add. 239 */ 240 bool Type::addResourceSubPath(const std::string& subPath) 241 { 242 std::vector<Directory>::const_iterator it; 243 for (it = this->_resourceSubPaths.begin(); it != this->_resourceSubPaths.end(); ++it) 244 if ((*it) == subPath) 245 return false; 246 this->_resourceSubPaths.push_back(subPath); 247 return true; 248 } 249 250 /** 251 * @brief Unloads all Resources below a certain Level. 252 * @param keepLevel the KeepLevel at what to remove the Resources from. 253 */ 254 void Type::unloadAllBelowKeepLevel(const Resources::KeepLevel& keepLevel) 255 { 256 std::vector<Resources::StorePointer*>::iterator it, it2; 257 bool finished = false; 258 259 while (!finished) 260 { 261 finished = true; 262 for (it = this->_storedResources.begin(); it != this->_storedResources.end();++it) 263 if((*it)->keepLevel() < keepLevel && (*it)->last()) 264 { 265 delete (*it); 266 this->_storedResources.erase(it); 267 finished = false; 268 break; 269 } 270 } 271 } 272 273 /** 274 * @brief print out some nice Debug information in a beatifully designed style 275 */ 276 void Type::debug() const 277 { 278 PRINT(0)(" ResourceType '%s' stores %d Resources\n", this->_typeName.c_str(), this->_storedResources.size()); 279 PRINT(0)(" Paths:\n"); 280 for (unsigned int i = 0; i < this->_resourcePaths.size(); ++i) 281 PRINT(0)(" %s\n", this->_resourcePaths[i].name().c_str()); 282 PRINT(0)(" Sub-Paths:"); 283 for (unsigned int i = 0; i < this->_resourceSubPaths.size(); ++i) 284 PRINT(0)(" '%s'", this->_resourceSubPaths[i].name().c_str()); 285 PRINT(0)("\n"); 286 287 PRINT(0)(" Loaded Resources:\n"); 288 std::vector<Resources::StorePointer*>::const_iterator it; 289 for (it = this->_storedResources.begin(); it != this->_storedResources.end(); ++it) 290 PRINT(0)(" '%s' : KeepLevel '%s'\n", (*it)->loadString().c_str(), (*it)->keepLevel().name().c_str()); 291 } 30 292 } 31 32 /**33 * standard deconstructor34 */35 Resource::~Resource ()36 {37 // delete what has to be deleted here38 }
Note: See TracChangeset
for help on using the changeset viewer.