multiple preset file extension support in preset factory abstract class

git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/personal/carm/represet@1150 6778bc44-b910-0410-a7a0-be141de4315d
This commit is contained in:
w1z7ard
2008-09-13 03:51:33 +00:00
parent 6a410275bf
commit fdffc84c57
5 changed files with 32 additions and 18 deletions

View File

@ -20,12 +20,13 @@
#include "CompiledPresetFactory.hpp"
#endif
#include <sstream>
PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0) {}
PresetFactoryManager::~PresetFactoryManager() {
for (std::map<std::string, PresetFactory *>::iterator pos = _factories.begin();
pos != _factories.end(); ++pos)
delete(pos->second);
for (std::vector<PresetFactory *>::iterator pos = _factoryList.begin();
pos != _factoryList.end(); ++pos)
delete(*pos);
}
void PresetFactoryManager::initialize(int gx, int gy) {
@ -35,29 +36,40 @@ void PresetFactoryManager::initialize(int gx, int gy) {
#ifndef DISABLE_MILKDROP_PRESETS
factory = new MilkdropPresetFactory(_gx, _gy);
registerFactory(factory->extension(), factory);
registerFactory(factory->supportedExtensions(), factory);
#endif
#ifndef DISABLE_COMPILED_PRESETS
factory = new CompiledPresetFactory();
registerFactory(factory->extension(), factory);
registerFactory(factory->supportedExtensions(), factory);
#endif
}
// Current behavior if a conflict is occurs is to override the previous request
void PresetFactoryManager::registerFactory(const std::string & extension, PresetFactory * factory) {
if (_factories.count(extension)) {
void PresetFactoryManager::registerFactory(const std::string & extensions, PresetFactory * factory) {
std::stringstream ss(extensions);
std::string extension;
while (ss >> extension) {
if (_factoryMap.count(extension)) {
std::cerr << "[PresetFactoryManager] Warning: extension \"" << extension <<
"\" has been overriden by another factory." << std::endl;
delete(_factories[extension]);
"\" already has a factory. New factory handler ignored." << std::endl;
} else {
_factoryMap.insert(std::make_pair(extension, factory));
_factoryList.push_back(factory);
}
}
else
_factories.insert(std::make_pair(extension, factory));
}
PresetFactory & PresetFactoryManager::factory(const std::string & extension) {
return *_factories[extension];
if (!_factoryMap.count(extension)) {
std::ostringstream os;
os << "No factory associated with \"" << extension << "\"." << std::endl;
throw PresetFactoryException(os.str());
}
return *_factoryMap[extension];
}