All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
plugin.h
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
7#ifndef PXR_BASE_PLUG_PLUGIN_H
8#define PXR_BASE_PLUG_PLUGIN_H
9
10#include "pxr/pxr.h"
11#include "pxr/base/plug/api.h"
12
13#include "pxr/base/js/types.h"
16
17#include <atomic>
18#include <string>
19#include <utility>
20#include <vector>
21
22PXR_NAMESPACE_OPEN_SCOPE
23
25
26class Plug_RegistrationMetadata;
27class TfType;
28
40class PlugPlugin : public TfWeakBase {
41public:
42 PLUG_API ~PlugPlugin();
43
46 PLUG_API bool Load();
47
50 PLUG_API bool IsLoaded() const;
51
52#ifdef PXR_PYTHON_SUPPORT_ENABLED
54 PLUG_API bool IsPythonModule() const;
55#endif // PXR_PYTHON_SUPPORT_ENABLED
56
58 PLUG_API bool IsResource() const;
59
61 PLUG_API JsObject GetMetadata();
62
64 PLUG_API JsObject GetMetadataForType(const TfType &type);
65
67 PLUG_API JsObject GetDependencies();
68
72 PLUG_API bool DeclaresType(const TfType& type, bool includeSubclasses = false) const;
73
75 std::string const &GetName() const {
76 return _name;
77 }
78
80 std::string const &GetPath() const {
81 return _path;
82 }
83
85 std::string const &GetResourcePath() const {
86 return _resourcePath;
87 }
88
91 PLUG_API std::string MakeResourcePath(const std::string& path) const;
92
97 PLUG_API std::string FindPluginResource(const std::string& path, bool verify = true) const;
98
99private:
100 enum _Type {
101 LibraryType,
102 PythonType,
103 ResourceType
104 };
105
106 // Private ctor, plugins are constructed only by PlugRegistry.
107 PLUG_LOCAL
108 PlugPlugin(const std::string & path,
109 const std::string & name,
110 const std::string & resourcePath,
111 const JsObject & plugInfo,
112 _Type type);
113
114 PLUG_LOCAL
115 static PlugPluginPtr _GetPluginForType(const TfType & type);
116
117 PLUG_LOCAL
118 static void _RegisterAllPlugins();
119 PLUG_LOCAL
120 static PlugPluginPtr _GetPluginWithName(const std::string& name);
121 PLUG_LOCAL
122 static PlugPluginPtrVector _GetAllPlugins();
123
124 template <class PluginMap>
125 PLUG_LOCAL
126 static std::pair<PlugPluginPtr, bool>
127 _NewPlugin(const Plug_RegistrationMetadata &metadata,
128 _Type pluginType,
129 const std::string& pluginCreationPath,
130 PluginMap *allPluginsByNamePtr);
131
132 PLUG_LOCAL
133 static std::pair<PlugPluginPtr, bool>
134 _NewDynamicLibraryPlugin(const Plug_RegistrationMetadata& metadata);
135
136#ifdef PXR_PYTHON_SUPPORT_ENABLED
137 PLUG_LOCAL
138 static std::pair<PlugPluginPtr, bool>
139 _NewPythonModulePlugin(const Plug_RegistrationMetadata& metadata);
140#endif // PXR_PYTHON_SUPPORT_ENABLED
141
142 PLUG_LOCAL
143 static std::pair<PlugPluginPtr, bool>
144 _NewResourcePlugin(const Plug_RegistrationMetadata& metadata);
145
146 PLUG_LOCAL
147 bool _Load();
148
149 PLUG_LOCAL
150 void _DeclareAliases( TfType t, const JsObject & metadata );
151 PLUG_LOCAL
152 void _DeclareTypes();
153 PLUG_LOCAL
154 void _DeclareType(const std::string &name, const JsObject &dict);
155 PLUG_LOCAL
156 static void _DefineType( TfType t );
157
158 struct _SeenPlugins;
159 PLUG_LOCAL
160 bool _LoadWithDependents(_SeenPlugins * seenPlugins);
161
162 PLUG_LOCAL
163 static void _UpdatePluginMaps( const TfType & baseType );
164
165 PLUG_LOCAL
166 static constexpr char const *_GetPluginTypeDisplayName(_Type type);
167
168private:
169 std::string _name;
170 std::string _path;
171 std::string _resourcePath;
172 JsObject _dict;
173 void *_handle; // the handle returned by ArchLibraryOpen() is a void*
174 std::atomic<bool> _isLoaded;
175 _Type _type;
176
177 friend class PlugRegistry;
178};
179
184PLUG_API
185std::string
186PlugFindPluginResource(const PlugPluginPtr& plugin,
187 const std::string& path, bool verify = true);
188
189PXR_NAMESPACE_CLOSE_SCOPE
190
191#endif // PXR_BASE_PLUG_PLUGIN_H
Defines an interface to registered plugins.
Definition: plugin.h:40
std::string const & GetName() const
Returns the plugin's name.
Definition: plugin.h:75
std::string const & GetResourcePath() const
Returns the plugin's resources filesystem path.
Definition: plugin.h:85
PLUG_API bool IsLoaded() const
Returns true if the plugin is currently loaded.
PLUG_API JsObject GetMetadataForType(const TfType &type)
Returns the metadata sub-dictionary for a particular type.
PLUG_API bool DeclaresType(const TfType &type, bool includeSubclasses=false) const
Returns true if type is declared by this plugin.
PLUG_API JsObject GetDependencies()
Returns the dictionary containing the dependencies for the plugin.
PLUG_API std::string MakeResourcePath(const std::string &path) const
Build a plugin resource path by returning a given absolute path or combining the plugin's resource pa...
std::string const & GetPath() const
Returns the plugin's filesystem path.
Definition: plugin.h:80
PLUG_API bool Load()
Loads the plugin.
PLUG_API JsObject GetMetadata()
Returns the dictionary containing meta-data for the plugin.
PLUG_API std::string FindPluginResource(const std::string &path, bool verify=true) const
Find a plugin resource by absolute or relative path optionally verifying that file exists.
PLUG_API bool IsPythonModule() const
Returns true if the plugin is a python module.
PLUG_API bool IsResource() const
Returns true if the plugin is resource-only.
Defines an interface for registering plugins.
Definition: registry.h:319
TfType represents a dynamic runtime type.
Definition: type.h:48
Enable a concrete base class for use with TfWeakPtr.
Definition: weakBase.h:124
Standard pointer typedefs.
#define TF_DECLARE_WEAK_PTRS(type)
Define standard weak pointer types.
Definition: declarePtrs.h:45