Commit f3924ec8 authored by twanvl's avatar twanvl

Package manager for maanging the data files

parent 54916c4a
......@@ -172,7 +172,7 @@ class Packaged : public Package {
protected:
/// filename of the data file, and extension of the package file
virtual String typeName() = 0;
virtual String typeName() const = 0;
/// Can be overloaded to do validation after loading
virtual void validate() {}
......
//+----------------------------------------------------------------------------+
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
//| Copyright: (C) 2001 - 2006 Twan van Laarhoven |
//| License: GNU General Public License 2 or later (see file COPYING) |
//+----------------------------------------------------------------------------+
// ----------------------------------------------------------------------------- : Includes
#include <util/io/package_manager.hpp>
#include <util/error.hpp>
// ----------------------------------------------------------------------------- : PackageManager
String programDir() {
return _("."); //TODO
}
PackageManager packages;
PackageManager::PackageManager() {
// determine data directory
dataDirectory = programDir();
// check if this is the actual data directory, especially during debugging,
// the data may be higher up:
// exe path = mse/build/debug/mse.exe
// data path = mse/data
while (!wxDirExists(dataDirectory + _("/data"))) {
String d = dataDirectory;
dataDirectory = wxPathOnly(dataDirectory);
if (d == dataDirectory) {
// we are at the root -> 'data' not found anywhere in the path -> fatal error
throw Error(_("The MSE data files can not be found, there should be a directory called 'data' with these files"));
}
}
dataDirectory += _("/data");
}
//+----------------------------------------------------------------------------+
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
//| Copyright: (C) 2001 - 2006 Twan van Laarhoven |
//| License: GNU General Public License 2 or later (see file COPYING) |
//+----------------------------------------------------------------------------+
#ifndef HEADER_UTIL_IO_PACKAGE_MANAGER
#define HEADER_UTIL_IO_PACKAGE_MANAGER
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <util/io/package.hpp>
#include <wx/filename.h>
DECLARE_POINTER_TYPE(Packaged);
// ----------------------------------------------------------------------------- : PackageManager
/// Package manager, loads data files from the default data directory
/** The PackageManager ensures that each package is only loaded once.
* There is a single global instance of the PackageManager, called packages
*/
class PackageManager {
public:
PackageManager();
/// Open a package with the specified name (including extension)
template <typename T>
shared_ptr<T> open(const String& name) {
wxFileName fn(dataDirectory + _("/") + name);
fn.Normalize();
String filename = fn.GetFullPath();
// Is this package already loaded?
PackagedP& p = loadedPackages[filename];
shared_ptr<T> typedP = dynamic_pointer_cast<T>(p);
if (typedP) {
return typedP;
} else {
// not loaded, or loaded with wrong type
p = typedP = new_shared<T>();
typedP->open(filename);
return typedP;
}
}
/// Open a package with the specified name
/// the type of package is determined by its extension!
PackagedP openAnyPackage(const String& filename);
private:
map<String, PackagedP> loadedPackages;
String dataDirectory;
};
/// The global PackageManager instance
extern PackageManager packages;
// ----------------------------------------------------------------------------- : EOF
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment