Files
projectm/src/libprojectM/PresetFactoryManager.hpp
2023-12-30 14:56:35 +01:00

93 lines
2.7 KiB
C++

#pragma once
#include "PresetFactory.hpp"
#include <map>
#include <utility>
#include <vector>
namespace libprojectM {
/// A simple exception class to strongly type all preset factory related issues
class PresetFactoryException : public std::exception
{
public:
inline PresetFactoryException(std::string message)
: m_message(std::move(message))
{
}
virtual ~PresetFactoryException() = default;
const std::string& message() const
{
return m_message;
}
private:
std::string m_message;
};
/// A manager of preset factories
class PresetFactoryManager
{
public:
PresetFactoryManager() = default;
~PresetFactoryManager();
/**
* @brief Initializes the manager.
*/
void initialize();
/// Requests a factory given a preset extension type
/// \param extension a string denoting the preset suffix type
/// \throws PresetFactoryException if the extension is unhandled
/// \returns a valid preset factory associated with the extension
PresetFactory& factory(const std::string& extension);
/// Tests if an extension has been registered with a factory
/// \param extension the file name extension to verify
/// \returns true if a factory exists, false otherwise
bool extensionHandled(const std::string& extension) const;
/**
* @brief Loads a preset by a given filename or URL.
*
* Supported URLs are "idle://" (loads the idle preset) and "file://". Other URL schemes will
* throw an exception.
*
* @param filename The filename/URL to load.
* @throws PresetFactoryException If any error occurs during preset loading. Exception message
* contains additional details.
* @return A valid pointer to the loaded preset.
*/
std::unique_ptr<Preset> CreatePresetFromFile(const std::string& filename);
/**
* @brief Loads a preset from a stream.
* @param extension The "original" extension. Used to determine preset data format.
* @param data A stream with preset data to load.
* @throws PresetFactoryException If any error occurs during preset loading. Exception message
* contains additional details.
* @return A valid pointer to the loaded preset.
*/
std::unique_ptr<Preset> CreatePresetFromStream(const std::string& extension, std::istream& data);
std::vector<std::string> extensionsHandled() const;
private:
void registerFactory(const std::string& extension, PresetFactory* factory);
auto ParseExtension(const std::string& filename) -> std::string;
mutable std::map<std::string, PresetFactory*> m_factoryMap;
mutable std::vector<PresetFactory*> m_factoryList;
void ClearFactories();
};
} // namespace libprojectM