|
- //-----------------------------------------------------------------------------
- // Project : SDK Core
- //
- // Category : SDK Core Interfaces
- // Filename : pluginterfaces/base/ipluginbase.h
- // Created by : Steinberg, 01/2004
- // Description : Basic Plug-in Interfaces
- //
- //-----------------------------------------------------------------------------
- // 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 "funknown.h"
- #include "fstrdefs.h"
-
- namespace Steinberg {
-
- //------------------------------------------------------------------------
- /** Basic interface to a Plug-in component.
- \ingroup pluginBase
- - [plug imp]
- - initialize/terminate the Plug-in component
-
- The host uses this interface to initialize and to terminate the Plug-in component.
- The context that is passed to the initialize method contains any interface to the
- host that the Plug-in will need to work. These interfaces can vary from category to category.
- A list of supported host context interfaces should be included in the documentation
- of a specific category. */
- //------------------------------------------------------------------------
- class IPluginBase: public FUnknown
- {
- public:
- //------------------------------------------------------------------------
- /** The host passes a number of interfaces as context to initialize the Plug-in class.
- @note Extensive memory allocations etc. should be performed in this method rather than in the class' constructor!
- If the method does NOT return kResultOk, the object is released immediately. In this case terminate is not called! */
- virtual tresult PLUGIN_API initialize (FUnknown* context) = 0;
-
- /** This function is called before the Plug-in is unloaded and can be used for
- cleanups. You have to release all references to any host application interfaces. */
- virtual tresult PLUGIN_API terminate () = 0;
-
- //------------------------------------------------------------------------
- static const FUID iid;
- };
-
- DECLARE_CLASS_IID (IPluginBase, 0x22888DDB, 0x156E45AE, 0x8358B348, 0x08190625)
-
-
- //------------------------------------------------------------------------
- /** Basic Information about the class factory of the Plug-in.
- \ingroup pluginBase
- */
- //------------------------------------------------------------------------
- struct PFactoryInfo
- {
- //------------------------------------------------------------------------
- enum FactoryFlags
- {
- kNoFlags = 0, ///< Nothing
- kClassesDiscardable = 1 << 0, ///< The number of exported classes can change each time the Module is loaded. If this flag is set, the host does not cache class information. This leads to a longer startup time because the host always has to load the Module to get the current class information.
- kLicenseCheck = 1 << 1, ///< Class IDs of components are interpreted as Syncrosoft-License (LICENCE_UID). Loaded in a Steinberg host, the module will not be loaded when the license is not valid
- kComponentNonDiscardable = 1 << 3, ///< Component won't be unloaded until process exit
- kUnicode = 1 << 4 ///< Components have entirely unicode encoded strings. (True for VST 3 Plug-ins so far)
- };
-
- enum
- {
- kURLSize = 256,
- kEmailSize = 128,
- kNameSize = 64
- };
-
- //------------------------------------------------------------------------
- char8 vendor[kNameSize]; ///< e.g. "Steinberg Media Technologies"
- char8 url[kURLSize]; ///< e.g. "http://www.steinberg.de"
- char8 email[kEmailSize]; ///< e.g. "info@steinberg.de"
- int32 flags; ///< (see above)
- //------------------------------------------------------------------------
- PFactoryInfo (const char8* _vendor, const char8* _url, const char8* _email, int32 _flags)
- {
- strncpy8 (vendor, _vendor, kNameSize);
- strncpy8 (url, _url, kURLSize);
- strncpy8 (email, _email, kEmailSize);
- flags = _flags;
- #ifdef UNICODE
- flags |= kUnicode;
- #endif
- }
- #if SMTG_CPP11
- constexpr PFactoryInfo () : vendor (), url (), email (), flags () {}
- #else
- PFactoryInfo () { memset (this, 0, sizeof (PFactoryInfo)); }
- #endif
- };
-
- //------------------------------------------------------------------------
- /** Basic Information about a class provided by the Plug-in.
- \ingroup pluginBase
- */
- //------------------------------------------------------------------------
- struct PClassInfo
- {
- //------------------------------------------------------------------------
- enum ClassCardinality
- {
- kManyInstances = 0x7FFFFFFF
- };
-
- enum
- {
- kCategorySize = 32,
- kNameSize = 64
- };
- //------------------------------------------------------------------------
- TUID cid; ///< Class ID 16 Byte class GUID
- int32 cardinality; ///< cardinality of the class, set to kManyInstances (see \ref ClassCardinality)
- char8 category[kCategorySize]; ///< class category, host uses this to categorize interfaces
- char8 name[kNameSize]; ///< class name, visible to the user
- //------------------------------------------------------------------------
-
- PClassInfo (const TUID _cid, int32 _cardinality, const char8* _category, const char8* _name)
- {
- memset (this, 0, sizeof (PClassInfo));
- memcpy (cid, _cid, sizeof (TUID));
- if (_category)
- strncpy8 (category, _category, kCategorySize);
- if (_name)
- strncpy8 (name, _name, kNameSize);
- cardinality = _cardinality;
- }
- #if SMTG_CPP11
- constexpr PClassInfo () : cid (), cardinality (), category (), name () {}
- #else
- PClassInfo () { memset (this, 0, sizeof (PClassInfo)); }
- #endif
- };
-
-
- //------------------------------------------------------------------------
- // IPluginFactory interface declaration
- //------------------------------------------------------------------------
- /** Class factory that any Plug-in defines for creating class instances.
- \ingroup pluginBase
- - [plug imp]
-
- From the host's point of view a Plug-in module is a factory which can create
- a certain kind of object(s). The interface IPluginFactory provides methods
- to get information about the classes exported by the Plug-in and a
- mechanism to create instances of these classes (that usually define the IPluginBase interface).
-
- <b> An implementation is provided in public.sdk/source/common/pluginfactory.cpp </b>
- \see GetPluginFactory
- */
- //------------------------------------------------------------------------
- class IPluginFactory : public FUnknown
- {
- public:
- //------------------------------------------------------------------------
- /** Fill a PFactoryInfo structure with information about the Plug-in vendor. */
- virtual tresult PLUGIN_API getFactoryInfo (PFactoryInfo* info) = 0;
-
- /** Returns the number of exported classes by this factory.
- If you are using the CPluginFactory implementation provided by the SDK, it returns the number of classes you registered with CPluginFactory::registerClass. */
- virtual int32 PLUGIN_API countClasses () = 0;
-
- /** Fill a PClassInfo structure with information about the class at the specified index. */
- virtual tresult PLUGIN_API getClassInfo (int32 index, PClassInfo* info) = 0;
-
- /** Create a new class instance. */
- virtual tresult PLUGIN_API createInstance (FIDString cid, FIDString _iid, void** obj) = 0;
-
- //------------------------------------------------------------------------
- static const FUID iid;
- };
-
- DECLARE_CLASS_IID (IPluginFactory, 0x7A4D811C, 0x52114A1F, 0xAED9D2EE, 0x0B43BF9F)
-
-
- //------------------------------------------------------------------------
- /** Version 2 of Basic Information about a class provided by the Plug-in.
- \ingroup pluginBase
- */
- //------------------------------------------------------------------------
- struct PClassInfo2
- {
- //------------------------------------------------------------------------
- TUID cid; ///< Class ID 16 Byte class GUID
- int32 cardinality; ///< cardinality of the class, set to kManyInstances (see \ref ClassCardinality)
- char8 category[PClassInfo::kCategorySize]; ///< class category, host uses this to categorize interfaces
- char8 name[PClassInfo::kNameSize]; ///< class name, visible to the user
-
- enum {
- kVendorSize = 64,
- kVersionSize = 64,
- kSubCategoriesSize = 128
- };
-
- uint32 classFlags; ///< flags used for a specific category, must be defined where category is defined
- char8 subCategories[kSubCategoriesSize]; ///< module specific subcategories, can be more than one, logically added by the \c OR operator
- char8 vendor[kVendorSize]; ///< overwrite vendor information from factory info
- char8 version[kVersionSize]; ///< Version string (e.g. "1.0.0.512" with Major.Minor.Subversion.Build)
- char8 sdkVersion[kVersionSize]; ///< SDK version used to build this class (e.g. "VST 3.0")
-
- //------------------------------------------------------------------------
-
- PClassInfo2 (const TUID _cid, int32 _cardinality, const char8* _category, const char8* _name,
- int32 _classFlags, const char8* _subCategories, const char8* _vendor, const char8* _version,
- const char8* _sdkVersion)
- {
- memset (this, 0, sizeof (PClassInfo2));
- memcpy (cid, _cid, sizeof (TUID));
- cardinality = _cardinality;
- if (_category)
- strncpy8 (category, _category, PClassInfo::kCategorySize);
- if (_name)
- strncpy8 (name, _name, PClassInfo::kNameSize);
- classFlags = static_cast<uint32> (_classFlags);
- if (_subCategories)
- strncpy8 (subCategories, _subCategories, kSubCategoriesSize);
- if (_vendor)
- strncpy8 (vendor, _vendor, kVendorSize);
- if (_version)
- strncpy8 (version, _version, kVersionSize);
- if (_sdkVersion)
- strncpy8 (sdkVersion, _sdkVersion, kVersionSize);
- }
- #if SMTG_CPP11
- constexpr PClassInfo2 ()
- : cid ()
- , cardinality ()
- , category ()
- , name ()
- , classFlags ()
- , subCategories ()
- , vendor ()
- , version ()
- , sdkVersion ()
- {
- }
- #else
- PClassInfo2 () { memset (this, 0, sizeof (PClassInfo2)); }
- #endif
- };
-
- //------------------------------------------------------------------------
- // IPluginFactory2 interface declaration
- //------------------------------------------------------------------------
- /** Version 2 of class factory supporting PClassInfo2.
- \ingroup pluginBase
- \copydoc IPluginFactory
- */
- //------------------------------------------------------------------------
- class IPluginFactory2 : public IPluginFactory
- {
- public:
- //------------------------------------------------------------------------
- /** Returns the class info (version 2) for a given index. */
- virtual tresult PLUGIN_API getClassInfo2 (int32 index, PClassInfo2* info) = 0;
-
- //------------------------------------------------------------------------
- static const FUID iid;
- };
- DECLARE_CLASS_IID (IPluginFactory2, 0x0007B650, 0xF24B4C0B, 0xA464EDB9, 0xF00B2ABB)
-
-
- //------------------------------------------------------------------------
- /** Unicode Version of Basic Information about a class provided by the Plug-in */
- //------------------------------------------------------------------------
- struct PClassInfoW
- {
- //------------------------------------------------------------------------
- TUID cid; ///< see \ref PClassInfo
- int32 cardinality; ///< see \ref PClassInfo
- char8 category[PClassInfo::kCategorySize]; ///< see \ref PClassInfo
- char16 name[PClassInfo::kNameSize]; ///< see \ref PClassInfo
-
- enum {
- kVendorSize = 64,
- kVersionSize = 64,
- kSubCategoriesSize = 128
- };
-
- uint32 classFlags; ///< flags used for a specific category, must be defined where category is defined
- char8 subCategories[kSubCategoriesSize];///< module specific subcategories, can be more than one, logically added by the \c OR operator
- char16 vendor[kVendorSize]; ///< overwrite vendor information from factory info
- char16 version[kVersionSize]; ///< Version string (e.g. "1.0.0.512" with Major.Minor.Subversion.Build)
- char16 sdkVersion[kVersionSize]; ///< SDK version used to build this class (e.g. "VST 3.0")
-
- //------------------------------------------------------------------------
- PClassInfoW (const TUID _cid, int32 _cardinality, const char8* _category, const char16* _name,
- int32 _classFlags, const char8* _subCategories, const char16* _vendor, const char16* _version,
- const char16* _sdkVersion)
- {
- memset (this, 0, sizeof (PClassInfoW));
- memcpy (cid, _cid, sizeof (TUID));
- cardinality = _cardinality;
- if (_category)
- strncpy8 (category, _category, PClassInfo::kCategorySize);
- if (_name)
- strncpy16 (name, _name, PClassInfo::kNameSize);
- classFlags = static_cast<uint32> (_classFlags);
- if (_subCategories)
- strncpy8 (subCategories, _subCategories, kSubCategoriesSize);
- if (_vendor)
- strncpy16 (vendor, _vendor, kVendorSize);
- if (_version)
- strncpy16 (version, _version, kVersionSize);
- if (_sdkVersion)
- strncpy16 (sdkVersion, _sdkVersion, kVersionSize);
- }
- #if SMTG_CPP11
- constexpr PClassInfoW ()
- : cid ()
- , cardinality ()
- , category ()
- , name ()
- , classFlags ()
- , subCategories ()
- , vendor ()
- , version ()
- , sdkVersion ()
- {
- }
- #else
- PClassInfoW () { memset (this, 0, sizeof (PClassInfoW)); }
- #endif
-
- void fromAscii (const PClassInfo2& ci2)
- {
- memcpy (cid, ci2.cid, sizeof (TUID));
- cardinality = ci2.cardinality;
- strncpy8 (category, ci2.category, PClassInfo::kCategorySize);
- str8ToStr16 (name, ci2.name, PClassInfo::kNameSize);
- classFlags = ci2.classFlags;
- strncpy8 (subCategories, ci2.subCategories, kSubCategoriesSize);
-
- str8ToStr16 (vendor, ci2.vendor, kVendorSize);
- str8ToStr16 (version, ci2.version, kVersionSize);
- str8ToStr16 (sdkVersion, ci2.sdkVersion, kVersionSize);
- }
- };
-
-
- //------------------------------------------------------------------------
- // IPluginFactory3 interface declaration
- //------------------------------------------------------------------------
- /** Version 3 of class factory supporting PClassInfoW.
- \ingroup pluginBase
- \copydoc IPluginFactory
- */
- //------------------------------------------------------------------------
- class IPluginFactory3 : public IPluginFactory2
- {
- public:
- //------------------------------------------------------------------------
- /** Returns the unicode class info for a given index. */
- virtual tresult PLUGIN_API getClassInfoUnicode (int32 index, PClassInfoW* info) = 0;
-
- /** Receives information about host*/
- virtual tresult PLUGIN_API setHostContext (FUnknown* context) = 0;
-
- //------------------------------------------------------------------------
- static const FUID iid;
- };
- DECLARE_CLASS_IID (IPluginFactory3, 0x4555A2AB, 0xC1234E57, 0x9B122910, 0x36878931)
- //------------------------------------------------------------------------
- } // namespace Steinberg
-
-
- //------------------------------------------------------------------------
- #define LICENCE_UID(l1, l2, l3, l4) \
- { \
- (int8)((l1 & 0xFF000000) >> 24), (int8)((l1 & 0x00FF0000) >> 16), \
- (int8)((l1 & 0x0000FF00) >> 8), (int8)((l1 & 0x000000FF) ), \
- (int8)((l2 & 0xFF000000) >> 24), (int8)((l2 & 0x00FF0000) >> 16), \
- (int8)((l2 & 0x0000FF00) >> 8), (int8)((l2 & 0x000000FF) ), \
- (int8)((l3 & 0xFF000000) >> 24), (int8)((l3 & 0x00FF0000) >> 16), \
- (int8)((l3 & 0x0000FF00) >> 8), (int8)((l3 & 0x000000FF) ), \
- (int8)((l4 & 0xFF000000) >> 24), (int8)((l4 & 0x00FF0000) >> 16), \
- (int8)((l4 & 0x0000FF00) >> 8), (int8)((l4 & 0x000000FF) ) \
- }
-
-
- //------------------------------------------------------------------------
- // GetPluginFactory
- //------------------------------------------------------------------------
- /** Plug-in entry point.
- \ingroup pluginBase
- Any Plug-in must define and export this function. \n
- A typical implementation of GetPluginFactory looks like this
- \code
- IPluginFactory* PLUGIN_API GetPluginFactory ()
- {
- if (!gPluginFactory)
- {
- static PFactoryInfo factoryInfo =
- {
- "My Company Name",
- "http://www.mywebpage.com",
- "mailto:myemail@address.com",
- PFactoryInfo::kNoFlags
- };
-
- gPluginFactory = new CPluginFactory (factoryInfo);
-
- static PClassInfo componentClass =
- {
- INLINE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000), // replace by a valid uid
- 1,
- "Service", // category
- "Name"
- };
-
- gPluginFactory->registerClass (&componentClass, MyComponentClass::newInstance);
- }
- else
- gPluginFactory->addRef ();
-
- return gPluginFactory;
- }
- \endcode
- \see \ref loadPlugin
- */
- //------------------------------------------------------------------------
- extern "C"
- {
- Steinberg::IPluginFactory* PLUGIN_API GetPluginFactory ();
- typedef Steinberg::IPluginFactory* (PLUGIN_API *GetFactoryProc) ();
- }
|