| // |
| // 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); |
| } |