X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fmoof%2Fresource.cc;h=c57b527fe706e8de09e61b67ca7e81cac48b9ee0;hp=053fc0b31849e9b37991d90f671e71ee7983800d;hb=ed04ddaaa59dcc42e375ec492dbda77f693530e9;hpb=6945b41482b9549f21dcab251c3305b3f6756994 diff --git a/src/moof/resource.cc b/src/moof/resource.cc index 053fc0b..c57b527 100644 --- a/src/moof/resource.cc +++ b/src/moof/resource.cc @@ -33,24 +33,32 @@ 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::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::iterator it; + it = table.find(extension); + if (it != table.end()) loader = (*it).second; + break; + } } + + return loader; } static std::string search_paths_; @@ -58,9 +66,7 @@ static std::string search_paths_; typedef boost::weak_ptr resource_weakptr; static hash resource_table_; -// static member -//resource::type_lookup_ptr resource::type_lookup_; -//resource::type_lookup resource::type_lookup_; +static hash prefix_table_; #ifdef USE_HOTLOADING @@ -123,19 +129,24 @@ 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)); +} - std::string path1 = path; - if (!find(path1)) - { - log_error("trying to load missing resource:", path1); - return resource_ptr(); - } +resource_ptr resource::load(const std::string& name) +{ + return load_with_path(find_file(name)); +} + + +resource_ptr resource::load_with_path(const std::string& path) +{ + std::string extension = stlplus::extension_part(path); hash::iterator it; - it = resource_table_.find(path1); + it = resource_table_.find(path); if (it != resource_table_.end()) { resource_weakptr rsrc = (*it).second; @@ -144,23 +155,24 @@ resource_ptr resource::load(const std::string& path) } 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(); } @@ -218,26 +230,54 @@ bool resource::find(const std::string& path) 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 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) { - *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(); } +std::string resource::find_file(const std::string& name, + const std::string& ext) +{ + std::string actual_ext = stlplus::extension_part(name); + if (actual_ext != ext) + { + return find_file(stlplus::create_filename(name, ext)); + } + return find_file(name); +} + FILE* resource::open_file(const std::string& path, const std::string& mode) { return fopen(find_file(path).c_str(), mode.c_str());