From fdffc84c57b4e74f5408b6faf901722824548657 Mon Sep 17 00:00:00 2001 From: w1z7ard Date: Sat, 13 Sep 2008 03:51:33 +0000 Subject: [PATCH] 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 --- src/libprojectM/CompiledPresetFactory.hpp | 2 +- src/libprojectM/MilkdropPresetFactory.hpp | 2 +- src/libprojectM/PresetFactory.hpp | 5 +-- src/libprojectM/PresetFactoryManager.cpp | 38 +++++++++++++++-------- src/libprojectM/PresetFactoryManager.hpp | 3 +- 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/libprojectM/CompiledPresetFactory.hpp b/src/libprojectM/CompiledPresetFactory.hpp index 04bc1f204..c17b65923 100644 --- a/src/libprojectM/CompiledPresetFactory.hpp +++ b/src/libprojectM/CompiledPresetFactory.hpp @@ -29,7 +29,7 @@ public: virtual std::auto_ptr allocate(const std::string & url, const std::string & name = std::string(), const std::string & author = std::string()); - std::string extension() const { return "so"; } + std::string supportedExtensions() const { return "so"; } private: PresetLibrary * loadLibrary(const std::string & url); diff --git a/src/libprojectM/MilkdropPresetFactory.hpp b/src/libprojectM/MilkdropPresetFactory.hpp index 831c854c5..047a1f685 100644 --- a/src/libprojectM/MilkdropPresetFactory.hpp +++ b/src/libprojectM/MilkdropPresetFactory.hpp @@ -29,7 +29,7 @@ public: std::auto_ptr allocate(const std::string & url, const std::string & name = std::string(), const std::string & author = std::string()); - std::string extension() const { return "milk"; } + std::string supportedExtensions() const { return "milk prjm"; } private: PresetOutputs _presetOutputs; diff --git a/src/libprojectM/PresetFactory.hpp b/src/libprojectM/PresetFactory.hpp index 4d75c8bb5..025ccacbb 100644 --- a/src/libprojectM/PresetFactory.hpp +++ b/src/libprojectM/PresetFactory.hpp @@ -20,7 +20,6 @@ class PresetFactory { public: - inline PresetFactory() {} inline virtual ~PresetFactory() {} @@ -33,7 +32,9 @@ public: virtual std::auto_ptr allocate(const std::string & url, const std::string & name=std::string(), const std::string & author=std::string()) = 0; - virtual std::string extension() const = 0; + /// Returns a space separated list of supported extensions + virtual std::string supportedExtensions() const = 0; + }; #endif diff --git a/src/libprojectM/PresetFactoryManager.cpp b/src/libprojectM/PresetFactoryManager.cpp index 3e0288833..29a4358bb 100644 --- a/src/libprojectM/PresetFactoryManager.cpp +++ b/src/libprojectM/PresetFactoryManager.cpp @@ -20,12 +20,13 @@ #include "CompiledPresetFactory.hpp" #endif +#include PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0) {} PresetFactoryManager::~PresetFactoryManager() { - for (std::map::iterator pos = _factories.begin(); - pos != _factories.end(); ++pos) - delete(pos->second); + for (std::vector::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]; } diff --git a/src/libprojectM/PresetFactoryManager.hpp b/src/libprojectM/PresetFactoryManager.hpp index 5f5c419ff..bf03cd7a3 100644 --- a/src/libprojectM/PresetFactoryManager.hpp +++ b/src/libprojectM/PresetFactoryManager.hpp @@ -40,7 +40,8 @@ class PresetFactoryManager { private: int _gx, _gy; - mutable std::map _factories; + mutable std::map _factoryMap; + mutable std::vector _factoryList; void registerFactory(const std::string & extension, PresetFactory * factory); };