]> Dogcows Code - chaz/yoink/blobdiff - src/moof/resource.cc
remove some deprected stuff
[chaz/yoink] / src / moof / resource.cc
index 053fc0b31849e9b37991d90f671e71ee7983800d..57bd99b927df9fabfdee70f22faeae208c2d823b 100644 (file)
 
 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_;
@@ -58,9 +66,7 @@ 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
@@ -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));
+}
+
+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;
@@ -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();
 }
 
@@ -210,37 +222,51 @@ void resource::add_search_paths(const std::string& paths)
 }
 
 
-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);
 }
 
 
This page took 0.025676 seconds and 4 git commands to generate.