31LoaderFileTypeRegistry::
32LoaderFileTypeRegistry() {
38LoaderFileTypeRegistry::
39~LoaderFileTypeRegistry() {
48 if (find(_types.begin(), _types.end(), type) != _types.end()) {
49 if (loader_cat->is_debug()) {
51 <<
"Attempt to register LoaderFileType " << type->get_name()
52 <<
" (" << type->get_type() <<
") more than once.\n";
57 _types.push_back(type);
59 if (!type->get_extension().empty()) {
60 record_extension(type->get_extension(), type);
65 vector_string::const_iterator wi;
66 for (wi = words.begin(); wi != words.end(); ++wi) {
67 record_extension(*wi, type);
79 string dcextension =
downcase(extension);
81 Extensions::const_iterator ei;
82 ei = _extensions.find(dcextension);
83 if (ei != _extensions.end()) {
86 if (loader_cat->is_debug()) {
88 <<
"Attempt to register loader library " << library
89 <<
" (" << dcextension <<
") when extension is already known.\n";
94 DeferredTypes::const_iterator di;
95 di = _deferred_types.find(dcextension);
96 if (di != _deferred_types.end()) {
97 if ((*di).second == library) {
98 if (loader_cat->is_debug()) {
100 <<
"Attempt to register loader library " << library
101 <<
" (" << dcextension <<
") more than once.\n";
105 if (loader_cat->is_debug()) {
107 <<
"Multiple libraries registered that use the extension "
108 << dcextension <<
"\n";
113 _deferred_types[dcextension] = library;
121 Types::iterator it = find(_types.begin(), _types.end(), type);
122 if (it == _types.end()) {
123 if (loader_cat.is_debug()) {
125 <<
"Attempt to unregister LoaderFileType " << type->get_name()
126 <<
" (" << type->get_type() <<
"), which was not registered.\n";
134 std::string dcextension =
downcase(type->get_extension());
135 Extensions::iterator ei = _extensions.find(dcextension);
136 if (ei != _extensions.end() && ei->second == type) {
137 _extensions.erase(ei);
143 for (
const std::string &word : words) {
144 Extensions::iterator ei = _extensions.find(
downcase(word));
145 if (ei != _extensions.end() && ei->second == type) {
146 _extensions.erase(ei);
156 return _types.size();
164 nassertr(n >= 0 && n < (
int)_types.size(),
nullptr);
174 string dcextension =
downcase(extension);
176 Extensions::const_iterator ei;
177 ei = _extensions.find(dcextension);
178 if (ei == _extensions.end()) {
181 DeferredTypes::iterator di;
182 di = _deferred_types.find(dcextension);
183 if (di != _deferred_types.end()) {
187 string name = (*di).second;
188 Filename dlname = Filename::dso_filename(
"lib" + name +
".so");
189 _deferred_types.erase(di);
192 <<
"loading file type module: " << name << std::endl;
193 void *tmp = load_dso(get_plugin_path().get_value(), dlname);
194 if (tmp ==
nullptr) {
195 loader_cat->warning()
197 << load_dso_error() << std::endl;
199 }
else if (loader_cat.is_debug()) {
201 <<
"done loading file type module: " << name << std::endl;
205 ei = _extensions.find(dcextension);
209 if (ei == _extensions.end()) {
223write(std::ostream &out,
int indent_level)
const {
224 if (_types.empty()) {
225 indent(out, indent_level) <<
"(No file types are known).\n";
227 Types::const_iterator ti;
228 for (ti = _types.begin(); ti != _types.end(); ++ti) {
230 string name = type->get_name();
231 indent(out, indent_level) << name;
232 indent(out, std::max(30 - (
int)name.length(), 0)) <<
" ";
235 if (!type->get_extension().empty()) {
236 out <<
" ." << type->get_extension();
242 vector_string::const_iterator wi;
243 for (wi = words.begin(); wi != words.end(); ++wi) {
255 if (!_deferred_types.empty()) {
256 indent(out, indent_level) <<
"Also available:";
257 DeferredTypes::const_iterator di;
258 for (di = _deferred_types.begin(); di != _deferred_types.end(); ++di) {
259 const string &extension = (*di).first;
260 out <<
" ." << extension;
271 if (_global_ptr ==
nullptr) {
280void LoaderFileTypeRegistry::
282 string dcextension =
downcase(extension);
283 Extensions::const_iterator ei;
284 ei = _extensions.find(dcextension);
285 if (ei != _extensions.end()) {
286 if (loader_cat->is_debug()) {
288 <<
"Multiple LoaderFileTypes registered that use the extension "
289 << dcextension <<
"\n";
292 _extensions.insert(Extensions::value_type(dcextension, type));
295 _deferred_types.erase(dcextension);
The name of a file, such as a texture file or an Egg file.
std::string to_os_specific() const
Converts the filename from our generic Unix-like convention (forward slashes starting with the root a...
This class maintains the set of all known LoaderFileTypes in the universe.
get_num_types
Returns the total number of types registered.
void register_type(LoaderFileType *type)
Defines a new LoaderFileType in the universe.
get_type
Returns the nth type registered.
void write(std::ostream &out, int indent_level=0) const
Writes a list of supported file types to the indicated output stream, one per line.
static LoaderFileTypeRegistry * get_global_ptr()
Returns a pointer to the global LoaderFileTypeRegistry object.
void unregister_type(LoaderFileType *type)
Removes a type previously registered using register_type.
LoaderFileType * get_type_from_extension(const std::string &extension)
Determines the type of the file based on the indicated extension (without a leading dot).
void register_deferred_type(const std::string &extension, const std::string &library)
Records a type associated with a particular extension to be loaded in the future.
This is the base class for a family of scene-graph file types that the Loader supports.
virtual std::string get_additional_extensions() const
Returns a space-separated list of extension, in addition to the one returned by get_extension(),...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
int extract_words(const string &str, vector_string &words)
Divides the string into a number of words according to whitespace.
string downcase(const string &s)
Returns the input string with all uppercase letters converted to lowercase.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.