//----------------------------------------------------------------------------- // Project : VST SDK // // Category : Helpers // Filename : public.sdk/source/vst/hosting/module.h // Created by : Steinberg, 08/2016 // Description : hosting module classes // //----------------------------------------------------------------------------- // This file is part of a Steinberg SDK. It is subject to the license terms // in the LICENSE file found in the top-level directory of this distribution // and at www.steinberg.net/sdklicenses. // No part of the SDK, including this file, may be copied, modified, propagated, // or distributed except according to the terms contained in the LICENSE file. //----------------------------------------------------------------------------- #pragma once #include "../utility/uid.h" #include "pluginterfaces/base/ipluginbase.h" #include #include //------------------------------------------------------------------------ namespace VST3 { namespace Hosting { //------------------------------------------------------------------------ class FactoryInfo { public: //------------------------------------------------------------------------ using PFactoryInfo = Steinberg::PFactoryInfo; FactoryInfo () noexcept {} ~FactoryInfo () noexcept {} FactoryInfo (const FactoryInfo&) noexcept = default; FactoryInfo (PFactoryInfo&&) noexcept; FactoryInfo (FactoryInfo&&) noexcept = default; FactoryInfo& operator= (const FactoryInfo&) noexcept = default; FactoryInfo& operator= (FactoryInfo&&) noexcept; FactoryInfo& operator= (PFactoryInfo&&) noexcept; std::string vendor () const noexcept; std::string url () const noexcept; std::string email () const noexcept; Steinberg::int32 flags () const noexcept; bool classesDiscardable () const noexcept; bool licenseCheck () const noexcept; bool componentNonDiscardable () const noexcept; PFactoryInfo& get () noexcept { return info; } //------------------------------------------------------------------------ private: PFactoryInfo info {}; }; //------------------------------------------------------------------------ class ClassInfo { public: //------------------------------------------------------------------------ using SubCategories = std::vector; using PClassInfo = Steinberg::PClassInfo; using PClassInfo2 = Steinberg::PClassInfo2; using PClassInfoW = Steinberg::PClassInfoW; //------------------------------------------------------------------------ ClassInfo () noexcept {} explicit ClassInfo (const PClassInfo& info) noexcept; explicit ClassInfo (const PClassInfo2& info) noexcept; explicit ClassInfo (const PClassInfoW& info) noexcept; ClassInfo (const ClassInfo&) = default; ClassInfo& operator= (const ClassInfo&) = default; ClassInfo (ClassInfo&&) = default; ClassInfo& operator= (ClassInfo&&) = default; const UID& ID () const noexcept; int32_t cardinality () const noexcept; const std::string& category () const noexcept; const std::string& name () const noexcept; const std::string& vendor () const noexcept; const std::string& version () const noexcept; const std::string& sdkVersion () const noexcept; const SubCategories& subCategories () const noexcept; std::string subCategoriesString () const noexcept; Steinberg::uint32 classFlags () const noexcept; struct Data { UID classID; int32_t cardinality; std::string category; std::string name; std::string vendor; std::string version; std::string sdkVersion; SubCategories subCategories; Steinberg::uint32 classFlags = 0; }; Data& get () noexcept { return data; } //------------------------------------------------------------------------ private: void parseSubCategories (const std::string& str) noexcept; Data data {}; }; //------------------------------------------------------------------------ class PluginFactory { public: //------------------------------------------------------------------------ using ClassInfos = std::vector; using PluginFactoryPtr = Steinberg::IPtr; //------------------------------------------------------------------------ explicit PluginFactory (const PluginFactoryPtr& factory) noexcept; void setHostContext (Steinberg::FUnknown* context) const noexcept; FactoryInfo info () const noexcept; uint32_t classCount () const noexcept; ClassInfos classInfos () const noexcept; template Steinberg::IPtr createInstance (const UID& classID) const noexcept; const PluginFactoryPtr& get () const noexcept { return factory; } //------------------------------------------------------------------------ private: PluginFactoryPtr factory; }; //------------------------------------------------------------------------ //------------------------------------------------------------------------ class Module { public: //------------------------------------------------------------------------ struct Snapshot { struct ImageDesc { double scaleFactor {1.}; std::string path; }; UID uid; std::vector images; static Optional decodeScaleFactor (const std::string& path); static Optional decodeUID (const std::string& filename); }; using Ptr = std::shared_ptr; using PathList = std::vector; using SnapshotList = std::vector; //------------------------------------------------------------------------ static Ptr create (const std::string& path, std::string& errorDescription); static PathList getModulePaths (); static SnapshotList getSnapshots (const std::string& modulePath); /** get the path to the module info json file if it exists */ static Optional getModuleInfoPath (const std::string& modulePath); /** validate the bundle structure */ static bool validateBundleStructure (const std::string& path, std::string& errorDescription); const std::string& getName () const noexcept { return name; } const std::string& getPath () const noexcept { return path; } const PluginFactory& getFactory () const noexcept { return factory; } bool isBundle () const noexcept { return hasBundleStructure; } //------------------------------------------------------------------------ protected: virtual ~Module () noexcept = default; virtual bool load (const std::string& path, std::string& errorDescription) = 0; PluginFactory factory {nullptr}; std::string name; std::string path; bool hasBundleStructure {true}; }; //------------------------------------------------------------------------ template inline Steinberg::IPtr PluginFactory::createInstance (const UID& classID) const noexcept { T* obj = nullptr; if (factory->createInstance (classID.data (), T::iid, reinterpret_cast (&obj)) == Steinberg::kResultTrue) return Steinberg::owned (obj); return nullptr; } //------------------------------------------------------------------------ } // Hosting } // VST3