X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fmoof%2Fresource.cc;h=57bd99b927df9fabfdee70f22faeae208c2d823b;hp=d22ae217a28d81269460fa8fda3201764bccc37d;hb=151f60a78d5e45c8d46c3e793fdefee306c6dc4c;hpb=bc795376d093ee097040f029b891b5435eb3bd21 diff --git a/src/moof/resource.cc b/src/moof/resource.cc index d22ae21..57bd99b 100644 --- a/src/moof/resource.cc +++ b/src/moof/resource.cc @@ -9,18 +9,17 @@ * **************************************************************************/ -#include "../config.h" - -#include +#include "config.h" #ifdef USE_HOTLOADING #include #include #endif +#include + #include #include - #include #include "hash.hh" @@ -35,13 +34,39 @@ namespace moof { +bool resource::call_registry(const std::string& extension, + loader_ptr& loader, + registry_action action) +{ + static type_lookup table; + + switch (action) + { + case set: + { + if (loader) table[extension] = loader; + else table.erase(extension); + break; + } + + case lookup: + { + std::map::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_weakptr; static hash resource_table_; -// static member -resource::type_lookup_ptr resource::type_lookup_; +static hash prefix_table_; #ifdef USE_HOTLOADING @@ -104,11 +129,21 @@ resource::~resource() } -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)); +} - if (!find(path)) return resource_ptr(); + +resource_ptr resource::load_with_path(const std::string& path) +{ + std::string extension = stlplus::extension_part(path); hash::iterator it; it = resource_table_.find(path); @@ -119,17 +154,16 @@ resource_ptr resource::load(const std::string& path) if (locked) return locked; } - std::map::iterator jt; - jt = type_lookup_->find(extension); - if (jt != type_lookup_->end()) + loader_ptr loader; + call_registry(extension, loader, lookup); + if (loader) { - resource_ptr rsrc((*jt).second->load(path)); - rsrc->set_loader(path, (*jt).second); + 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_, - path.c_str(), IN_MODIFY); + int wd = inotify_add_watch(monitor_fd_, path.c_str(), IN_MODIFY); rsrc->set_watch_descriptor(wd); monitor_lookup_[wd] = path; #endif @@ -138,6 +172,7 @@ resource_ptr resource::load(const std::string& path) return rsrc; } + log_warning("cannot load resource of unknown type:", path); return resource_ptr(); } @@ -172,8 +207,7 @@ void resource::reload() unloader_ = resource->unloader_; #ifdef USE_HOTLOADING - int wd = inotify_add_watch(monitor_fd_, - path_.c_str(), IN_MODIFY); + int wd = inotify_add_watch(monitor_fd_, path_.c_str(), IN_MODIFY); set_watch_descriptor(wd); monitor_lookup_[wd] = path_; #endif @@ -188,15 +222,51 @@ void resource::add_search_paths(const std::string& paths) } -bool resource::find(const std::string& path) +std::string resource::find_file(const std::string& name) { - return !stlplus::lookup(path, search_paths_, ":").empty(); + std::vector 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::iterator it; + for (it = paths.begin(); it != paths.end(); ++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) { - std::string file = stlplus::lookup(path, search_paths_, ":"); - return fopen(file.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); }