namespace moof {
-void resource::print_types()
-{
-}
-void resource::manage_loader(const std::string& extension, loader_ptr& loader, bool set)
+bool resource::call_registry(const std::string& extension,
+ loader_ptr& loader,
+ registry_action action)
{
- static type_lookup lookup;
+ static type_lookup table;
- if (loader || set)
+ switch (action)
{
- lookup[extension] = loader;
- }
- else
- {
- std::map<std::string,loader_ptr>::iterator it;
- it = lookup.find(extension);
- if (it != lookup.end()) loader = (*it).second;
+ case set:
+ {
+ if (loader) table[extension] = loader;
+ else table.erase(extension);
+ break;
+ }
+
+ case lookup:
+ {
+ std::map<std::string,loader_ptr>::iterator it;
+ it = table.find(extension);
+ if (it != table.end()) loader = (*it).second;
+ break;
+ }
}
+
+ return loader;
}
static std::string search_paths_;
typedef boost::weak_ptr<resource> resource_weakptr;
static hash<std::string,resource_weakptr,hash_function> resource_table_;
-// static member
-//resource::type_lookup_ptr resource::type_lookup_;
-//resource::type_lookup resource::type_lookup_;
+static hash<std::string,std::string,hash_function> prefix_table_;
#ifdef USE_HOTLOADING
}
-resource_ptr resource::load(const std::string& path)
+resource_ptr resource::load(const std::string& name,
+ const std::string& ext)
{
- std::string extension = stlplus::extension_part(path);
+ return load_with_path(find_file(name, ext));
+}
+
+resource_ptr resource::load(const std::string& name)
+{
+ return load_with_path(find_file(name));
+}
- std::string path1 = path;
- if (!find(path1))
- {
- log_error("trying to load missing resource:", path1);
- return resource_ptr();
- }
+
+resource_ptr resource::load_with_path(const std::string& path)
+{
+ std::string extension = stlplus::extension_part(path);
hash<std::string,resource_weakptr,hash_function>::iterator it;
- it = resource_table_.find(path1);
+ it = resource_table_.find(path);
if (it != resource_table_.end())
{
resource_weakptr rsrc = (*it).second;
}
loader_ptr loader;
- manage_loader(extension, loader);
+ call_registry(extension, loader, lookup);
if (loader)
{
- resource_ptr rsrc(loader->load(path1));
- rsrc->set_loader(path1, loader);
- resource_table_[path1] = rsrc;
+ resource_ptr rsrc(loader->load(path));
+ rsrc->set_loader(path, loader);
+ resource_table_[path] = rsrc;
#ifdef USE_HOTLOADING
- int wd = inotify_add_watch(monitor_fd_, path1.c_str(), IN_MODIFY);
+ int wd = inotify_add_watch(monitor_fd_, path.c_str(), IN_MODIFY);
rsrc->set_watch_descriptor(wd);
- monitor_lookup_[wd] = path1;
+ monitor_lookup_[wd] = path;
#endif
log_info("loaded", rsrc.get());
return rsrc;
}
+ log_warning("cannot load resource of unknown type:", path);
return resource_ptr();
}
}
-bool resource::find(const std::string& path)
-{
- //std::string file = stlplus::lookup(path, search_paths_, ":");
- //log_info("found file", file, "in", search_paths_);
- //return !stlplus::lookup(path, search_paths_, ":").empty();
- return find_file(path) != "";
-}
-
std::string resource::find_file(const std::string& name)
{
- //log_info("looking for", name, "in", search_paths_);
- //return stlplus::lookup(name, search_paths_, ":");
-
std::vector<std::string> paths;
boost::split(paths, search_paths_, boost::is_any_of(":"));
+ std::string ext = stlplus::extension_part(name);
+ std::string prefix("hi");
+
+ loader_ptr loader;
+ call_registry(ext, loader, lookup);
+ if (loader) prefix = loader->prefix();
+
+ log_info("find_file:", ext, prefix);
+
std::vector<std::string>::iterator it;
for (it = paths.begin(); it != paths.end(); ++it)
{
- *it += "/";
- *it += name;
- log_info("looking for", name, "in", *it);
- if (stlplus::file_exists(*it)) return *it;
+ std::string path = stlplus::create_filespec(*it, name);
+ log_info("looking for", name, "at", path);
+ if (stlplus::file_exists(path)) return path;
+
+ // try it with the prefix added
+ if (!prefix.empty())
+ {
+ *it = stlplus::create_filespec(*it, prefix);
+ path = stlplus::create_filespec(*it, name);
+ log_info("looking for", name, "at", path);
+ if (stlplus::file_exists(path)) return path;
+ }
}
+
+ log_error("cannot find resource file:", name);
return std::string();
}
-FILE* resource::open_file(const std::string& path, const std::string& mode)
+std::string resource::find_file(const std::string& name,
+ const std::string& ext)
{
- return fopen(find_file(path).c_str(), mode.c_str());
+ std::string actual_ext = stlplus::extension_part(name);
+ if (actual_ext != ext)
+ {
+ return find_file(stlplus::create_filename(name, ext));
+ }
+ return find_file(name);
}