From c4d44203dea1d42f59cdeb193fce6ab84840ce55 Mon Sep 17 00:00:00 2001 From: carm Date: Sun, 11 Nov 2012 23:11:21 -0500 Subject: [PATCH] encapsulate factory/preset alloc in one method. throw typed exception in allocate() --- src/libprojectM/PresetFactoryManager.cpp | 17 +++++++++++++++++ src/libprojectM/PresetFactoryManager.hpp | 1 + src/libprojectM/PresetLoader.cpp | 22 +++++++++++----------- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/libprojectM/PresetFactoryManager.cpp b/src/libprojectM/PresetFactoryManager.cpp index 7dea038a9..5e748f138 100644 --- a/src/libprojectM/PresetFactoryManager.cpp +++ b/src/libprojectM/PresetFactoryManager.cpp @@ -19,6 +19,7 @@ #include "NativePresetFactory/NativePresetFactory.hpp" #endif +#include "Common.hpp" #include PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0), initialized(false) {} @@ -75,6 +76,22 @@ void PresetFactoryManager::registerFactory(const std::string & extensions, Prese } } + + +std::auto_ptr PresetFactoryManager::allocate(const std::string & url, const std::string & name) +{ + try { + const std::string extension = parseExtension (url); + + return factory(extension).allocate(url, name); + } catch (const std::exception & e) { + throw PresetFactoryException(e.what()); + } catch (...) { + throw PresetFactoryException("uncaught preset factory exception"); + } + +} + PresetFactory & PresetFactoryManager::factory(const std::string & extension) { if (!_factoryMap.count(extension)) { diff --git a/src/libprojectM/PresetFactoryManager.hpp b/src/libprojectM/PresetFactoryManager.hpp index 2dfa0a042..9fbcac43d 100644 --- a/src/libprojectM/PresetFactoryManager.hpp +++ b/src/libprojectM/PresetFactoryManager.hpp @@ -48,6 +48,7 @@ class PresetFactoryManager { /// \param extension the file name extension to verify /// \returns true if a factory exists, false otherwise bool extensionHandled(const std::string & extension) const; + std::auto_ptr allocate(const std::string & url, const std::string & name); private: int _gx, _gy; diff --git a/src/libprojectM/PresetLoader.cpp b/src/libprojectM/PresetLoader.cpp index e0afec582..6efce8a3f 100644 --- a/src/libprojectM/PresetLoader.cpp +++ b/src/libprojectM/PresetLoader.cpp @@ -136,11 +136,7 @@ std::auto_ptr PresetLoader::loadPreset ( unsigned int index ) const // Check that index isn't insane assert ( index >= 0 ); assert ( index < _entries.size() ); - - // Return a new autopointer to a preset - const std::string extension = parseExtension ( _entries[index] ); - - return _presetFactoryManager.factory(extension).allocate + return _presetFactoryManager.allocate ( _entries[index], _presetNames[index] ); } @@ -149,13 +145,17 @@ std::auto_ptr PresetLoader::loadPreset ( unsigned int index ) const std::auto_ptr PresetLoader::loadPreset ( const std::string & url ) const { - // Return a new autopointer to a preset - const std::string extension = parseExtension ( url ); - - /// @bug probably should not use url for preset name - return _presetFactoryManager.factory(extension).allocate - (url, url); + try { + /// @bug probably should not use url for preset name + return _presetFactoryManager.allocate + (url, url); + } catch (const std::exception & e) { + throw PresetFactoryException(e.what()); + } catch (...) { + throw PresetFactoryException("preset factory exception of unknown cause"); + } + return std::auto_ptr(); } void PresetLoader::handleDirectoryError()