| // |
| // C++ Implementation: PresetFactoryManager |
| // |
| // Description: |
| // |
| // |
| // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008 |
| // |
| // Copyright: See COPYING file that comes with this distribution |
| // |
| // |
| #include "PresetFactoryManager.hpp" |
| |
| #ifndef DISABLE_MILKDROP_PRESETS |
| #include "MilkdropPresetFactory/MilkdropPresetFactory.hpp" |
| #endif |
| |
| #ifndef DISABLE_NATIVE_PRESETS |
| #include "NativePresetFactory/NativePresetFactory.hpp" |
| #endif |
| |
| #include <sstream> |
| PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0), initialized(false) {} |
| |
| PresetFactoryManager::~PresetFactoryManager() { |
| for (std::vector<PresetFactory *>::iterator pos = _factoryList.begin(); |
| pos != _factoryList.end(); ++pos) { |
| assert(*pos); |
| delete(*pos); |
| } |
| |
| initialized = false; |
| } |
| |
| void PresetFactoryManager::initialize(int gx, int gy) { |
| _gx = gx; |
| _gy = gy; |
| |
| if (!initialized) { |
| initialized = true; |
| } else { |
| std::cout << "already initialized " << std::endl; |
| return; |
| } |
| |
| PresetFactory * factory; |
| |
| #ifndef DISABLE_MILKDROP_PRESETS |
| factory = new MilkdropPresetFactory(_gx, _gy); |
| registerFactory(factory->supportedExtensions(), factory); |
| #endif |
| |
| #ifndef DISABLE_NATIVE_PRESETS |
| factory = new NativePresetFactory(); |
| registerFactory(factory->supportedExtensions(), factory); |
| #endif |
| } |
| |
| // Current behavior if a conflict is occurs is to override the previous request |
| |
| void PresetFactoryManager::registerFactory(const std::string & extensions, PresetFactory * factory) { |
| |
| std::stringstream ss(extensions); |
| std::string extension; |
| |
| _factoryList.push_back(factory); |
| |
| while (ss >> extension) { |
| if (_factoryMap.count(extension)) { |
| std::cerr << "[PresetFactoryManager] Warning: extension \"" << extension << |
| "\" already has a factory. New factory handler ignored." << std::endl; |
| } else { |
| _factoryMap.insert(std::make_pair(extension, factory)); |
| } |
| } |
| } |
| |
| PresetFactory & PresetFactoryManager::factory(const std::string & extension) { |
| |
| if (!_factoryMap.count(extension)) { |
| std::ostringstream os; |
| os << "No factory associated with \"" << extension << "\"." << std::endl; |
| throw PresetFactoryException(os.str()); |
| } |
| return *_factoryMap[extension]; |
| } |
| |
| bool PresetFactoryManager::extensionHandled(const std::string & extension) const { |
| return _factoryMap.count(extension); |
| } |