diff --git a/src/Magnum/Trade/AbstractImporter.cpp b/src/Magnum/Trade/AbstractImporter.cpp index 537f04d88..4ee01d4d5 100644 --- a/src/Magnum/Trade/AbstractImporter.cpp +++ b/src/Magnum/Trade/AbstractImporter.cpp @@ -62,6 +62,19 @@ void AbstractImporter::doOpenData(Containers::ArrayView) { CORRADE_ASSERT(false, "Trade::AbstractImporter::openData(): feature advertised but not implemented", ); } +bool AbstractImporter::openState(const void* state, const std::string& filePath) { + CORRADE_ASSERT(features() & Feature::OpenState, + "Trade::AbstractImporter::OpenState(): feature not supported", {}); + + close(); + doOpenState(state, filePath); + return isOpened(); +} + +void AbstractImporter::doOpenState(const void*, const std::string&) { + CORRADE_ASSERT(false, "Trade::AbstractImporter::openState(): feature advertised but not implemented", ); +} + bool AbstractImporter::openFile(const std::string& filename) { close(); doOpenFile(filename); @@ -461,8 +474,4 @@ const void* AbstractImporter::importerState() const { const void* AbstractImporter::doImporterState() const { return nullptr; } -void AbstractImporter::openState(const void* state) { return doOpenState(state); } - -void AbstractImporter::doOpenState(const void*) {} - }} diff --git a/src/Magnum/Trade/AbstractImporter.h b/src/Magnum/Trade/AbstractImporter.h index cd96ba350..a54bffa44 100644 --- a/src/Magnum/Trade/AbstractImporter.h +++ b/src/Magnum/Trade/AbstractImporter.h @@ -97,7 +97,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractManagingPlug */ enum class Feature: UnsignedByte { /** Opening files from raw data using @ref openData() */ - OpenData = 1 << 0 + OpenData = 1 << 0, + /** Opening already loaded state using @ref openState() */ + OpenState = 1 << 1 }; /** @brief Set of features supported by this importer */ @@ -128,6 +130,17 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractManagingPlug */ bool openData(Containers::ArrayView data); + + /** + * @brief Open already loaded state + * + * Closes previous file, if it was opened, and tries to open given + * state. Available only if @ref Feature::OpenState is supported. Returns + * `true` on success, `false` otherwise. + * @see @ref features(), @ref openData() + */ + bool openState(const void* state, const std::string& filePath = {}); + /** * @brief Open file * @@ -496,8 +509,6 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractManagingPlug */ const void* importerState() const; - void openState(const void* state); - protected: /** * @brief Implementation for @ref openFile() @@ -523,6 +534,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractManagingPlug /** @brief Implementation for @ref openData() */ virtual void doOpenData(Containers::ArrayView data); + /** @brief Implementation for @ref openState() */ + virtual void doOpenState(const void* state, const std::string& filePath = {}); + /** @brief Implementation for @ref close() */ virtual void doClose() = 0; @@ -823,9 +837,6 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractManagingPlug /** @brief Implementation for @ref importerState() */ virtual const void* doImporterState() const; - - /** @brief Implementation for @ref openState() */ - virtual void doOpenState(const void* state); }; CORRADE_ENUMSET_OPERATORS(AbstractImporter::Features)