31 LoaderFileTypeRegistry::
32 LoaderFileTypeRegistry() {
38 LoaderFileTypeRegistry::
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()) {
223 write(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) {
280 void 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);