#ifndef PXR_BASE_PLUG_PLUGIN_H
#define PXR_BASE_PLUG_PLUGIN_H
#include "pxr/pxr.h"
#include "pxr/base/plug/api.h"
#include "pxr/base/js/types.h"
#include "pxr/base/tf/declarePtrs.h"
#include "pxr/base/tf/refPtr.h"
#include "pxr/base/tf/weakPtr.h"
#include <atomic>
#include <string>
#include <utility>
#include <vector>
PXR_NAMESPACE_OPEN_SCOPE
TF_DECLARE_WEAK_AND_REF_PTRS(PlugPlugin);
class Plug_RegistrationMetadata;
class TfType;
class PlugPlugin : public TfRefBase, public TfWeakBase {
public:
PLUG_API virtual ~PlugPlugin();
PLUG_API bool Load();
PLUG_API bool IsLoaded() const;
#ifdef PXR_PYTHON_SUPPORT_ENABLED
PLUG_API bool IsPythonModule() const;
#endif
PLUG_API bool IsResource() const;
PLUG_API JsObject GetMetadata();
PLUG_API JsObject GetMetadataForType(const TfType &type);
PLUG_API JsObject GetDependencies();
PLUG_API bool DeclaresType(const TfType& type, bool includeSubclasses = false) const;
std::string const &GetName() const {
return _name;
}
std::string const &GetPath() const {
return _path;
}
std::string const &GetResourcePath() const {
return _resourcePath;
}
PLUG_API std::string MakeResourcePath(const std::string& path) const;
PLUG_API std::string FindPluginResource(const std::string& path, bool verify = true) const;
private:
enum _Type {
LibraryType,
#ifdef PXR_PYTHON_SUPPORT_ENABLED
PythonType,
#endif ResourceType
};
PLUG_LOCAL
PlugPlugin(const std::string & path,
const std::string & name,
const std::string & resourcePath,
const JsObject & plugInfo,
_Type type);
PLUG_LOCAL
static PlugPluginPtr _GetPluginForType(const TfType & type);
PLUG_LOCAL
static void _RegisterAllPlugins();
PLUG_LOCAL
static PlugPluginPtr _GetPluginWithName(const std::string& name);
PLUG_LOCAL
static PlugPluginPtrVector _GetAllPlugins();
template <class PluginMap>
PLUG_LOCAL
static std::pair<PlugPluginPtr, bool>
_NewPlugin(const Plug_RegistrationMetadata &metadata,
_Type pluginType,
const std::string& pluginCreationPath,
PluginMap *allPluginsByNamePtr);
PLUG_LOCAL
static std::pair<PlugPluginPtr, bool>
_NewDynamicLibraryPlugin(const Plug_RegistrationMetadata& metadata);
#ifdef PXR_PYTHON_SUPPORT_ENABLED
PLUG_LOCAL
static std::pair<PlugPluginPtr, bool>
_NewPythonModulePlugin(const Plug_RegistrationMetadata& metadata);
#endif
PLUG_LOCAL
static std::pair<PlugPluginPtr, bool>
_NewResourcePlugin(const Plug_RegistrationMetadata& metadata);
PLUG_LOCAL
bool _Load();
PLUG_LOCAL
void _DeclareAliases( TfType t, const JsObject & metadata );
PLUG_LOCAL
void _DeclareTypes();
PLUG_LOCAL
void _DeclareType(const std::string &name, const JsObject &dict);
PLUG_LOCAL
static void _DefineType( TfType t );
struct _SeenPlugins;
PLUG_LOCAL
bool _LoadWithDependents(_SeenPlugins * seenPlugins);
PLUG_LOCAL
static void _UpdatePluginMaps( const TfType & baseType );
PLUG_LOCAL
static constexpr char const *_GetPluginTypeDisplayName(_Type type);
private:
std::string _name;
std::string _path;
std::string _resourcePath;
JsObject _dict;
void *_handle; std::atomic<bool> _isLoaded;
_Type _type;
friend class PlugRegistry;
};
PLUG_API
std::string
PlugFindPluginResource(const PlugPluginPtr& plugin,
const std::string& path, bool verify = true);
PXR_NAMESPACE_CLOSE_SCOPE
#endif