Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/blink/src/lib/util/loading/resource.cc

Last change on this file was 9869, checked in by bensch, 18 years ago

orxonox/trunk: merged the new_class_id branche back to the trunk.
merged with command:
svn merge https://svn.orxonox.net/orxonox/branches/new_class_id trunk -r9683:HEAD
no conflicts… puh..

File size: 8.3 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_LOAD
17
18#include "resource.h"
19#include "resource_manager.h"
20
21#include "debug.h"
22
23
24namespace Resources
25{
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  }
292}
Note: See TracBrowser for help on using the repository browser.