X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fmoof%2Fresource.hh;h=9d991053c21b841be3ebc164e6b538244c80bb82;hp=f8fd4f6327ee9b18ad47b6e0360e0c25115a5d1d;hb=151f60a78d5e45c8d46c3e793fdefee306c6dc4c;hpb=1da520638918096276158ecdfaeebc14a3d70be7 diff --git a/src/moof/resource.hh b/src/moof/resource.hh index f8fd4f6..9d99105 100644 --- a/src/moof/resource.hh +++ b/src/moof/resource.hh @@ -19,7 +19,6 @@ #include "config.h" -#include #include #include #include @@ -46,7 +45,7 @@ class resource { public: - // FIXME: this won't be necessary once the existing code is modified to + // XXX: this won't be necessary once the existing code is modified to // use the resource handles resource() {} @@ -63,21 +62,10 @@ public: * return, this is changed to an absolute path to the resource. * \return True if a path to a resource was found, false otherwise. */ - static bool find(const std::string& file); - static std::string find_file(const std::string& name); - /** - * Get the path to a resource of a given name and open it if a resource - * was found. - * \param path The name of the resource to find. Upon successful - * return, this is changed to an absolute path to the resource. - * \param mode The open mode. - * \return The FILE* if the resource was found, 0 otherwise. - */ - static FILE* open_file(const std::string& path, - const std::string& mode = "rb"); - + static std::string find_file(const std::string& name, + const std::string& ext); /** * Register a type with the extension of files which this type can @@ -86,13 +74,11 @@ public: * \param extension The file extension. */ template - static void register_type(const std::string& extension) + static void register_type(const std::string& extension, + const std::string& prefix = "") { - //if (!type_lookup_) type_lookup_ = type_lookup_ptr(new type_lookup); - loader_ptr loader(new specific_loader); - //(*type_lookup_)[extension] = loader; - //type_lookup_[extension] = loader; - manage_loader(extension, loader, true); + loader_ptr loader(new specific_loader(prefix)); + call_registry(extension, loader, set); } /** @@ -103,14 +89,14 @@ public: */ static void unregister_type(const std::string& extension) { - //type_lookup_.erase(extension); - //type_lookup_->erase(extension); loader_ptr loader; - manage_loader(extension, loader, true); + call_registry(extension, loader, set); } - static resource_ptr load(const std::string& path); + static resource_ptr load(const std::string& name); + static resource_ptr load(const std::string& name, + const std::string& ext); static resource_ptr reload(std::string& path); @@ -169,21 +155,35 @@ public: */ static int reload_as_needed(); - static void print_types(); - private: + static resource_ptr load_with_path(const std::string& path); + class loader { public: + //loader() {} + loader(const std::string& prefix) : + prefix_(prefix) {} + virtual ~loader() {} virtual resource* load(const std::string& path) { return 0; } + + const std::string& prefix() const + { + return prefix_; + } + + + private: + + std::string prefix_; }; typedef boost::shared_ptr loader_ptr; @@ -193,6 +193,10 @@ private: { public: + //specific_loader() {} + specific_loader(const std::string& prefix) : + loader(prefix) {} + virtual resource* load(const std::string& path) { log_info("loading resource of type ", typeid(T).name()); @@ -249,8 +253,16 @@ private: //typedef boost::shared_ptr type_lookup_ptr; //static type_lookup_ptr type_lookup_; //static type_lookup type_lookup_; + + enum registry_action + { + lookup, + set + }; - static void manage_loader(const std::string& extension, loader_ptr& loader, bool set = false); + static bool call_registry(const std::string& extension, + loader_ptr& loader, + registry_action action); #ifdef USE_HOTLOADING int wd_; @@ -285,6 +297,13 @@ public: resource_handle(resource_ptr ptr) : resource_(ptr) {} + explicit resource_handle(const std::string& name) : + resource_(resource::load(name)) {} + + resource_handle(const std::string& name, const std::string& ext) : + resource_(resource::load(name, ext)) {} + + /** * Get whether or not the handle is dereferenceable to the type of this @@ -342,6 +361,15 @@ public: } + /** + * Unload the resource associated with this handle. + */ + void unload() + { + resource_ = resource_ptr(); + } + + private: resource_ptr resource_;