X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Fcollection.cpp;h=9f135f0c0ed8eab31c6ffe730b23fd683b69e98e;hp=070991948d33d7315074ec6bb480cc06344d45cc;hb=5e677b2b3eeb2b3c41216a329f7b1363aade0aed;hpb=a5d5fa04bcbe360fc55fdb25b45937b29fb5c9cd diff --git a/source/collection.cpp b/source/collection.cpp index 0709919..9f135f0 100644 --- a/source/collection.cpp +++ b/source/collection.cpp @@ -1,3 +1,4 @@ +#include #include "collection.h" using namespace std; @@ -35,15 +36,9 @@ const Variant &Collection::get_var(const string &name, const CollectionItemTypeB loaded = items.count(name); } if(!loaded && fallback) - { - for(TypeList::const_iterator j=fallback->types.begin(); j!=fallback->types.end(); ++j) - if((*j)->is_same_type(*type)) - { - if(fallback->get_status(name, **j)) - return fallback->get_var(name, *j); - break; - } - } + if(CollectionItemTypeBase *fb_type = fallback->get_type(*type)) + if(fallback->get_status(name, *fb_type)) + return fallback->get_var(name, fb_type); } return get_item(items, name); @@ -72,12 +67,23 @@ unsigned Collection::get_status(const string &name, const CollectionItemTypeBase for(SourceList::const_iterator j=sources.begin(); j!=sources.end(); ++j) if((*j)->is_loadable(type, name)) return 2; + if(fallback) + if(CollectionItemTypeBase *fb_type = fallback->get_type(type)) + return fallback->get_status(name, *fb_type); return 0; } return type.check_item_type(i->second); } +CollectionItemTypeBase *Collection::get_type(const CollectionItemTypeBase &type) const +{ + for(TypeList::const_iterator j=types.begin(); j!=types.end(); ++j) + if((*j)->is_same_type(type)) + return *j; + return 0; +} + CollectionItemTypeBase *Collection::get_type_for_item(const Variant &var) const { for(TypeList::const_iterator i=types.begin(); i!=types.end(); ++i) @@ -86,20 +92,31 @@ CollectionItemTypeBase *Collection::get_type_for_item(const Variant &var) const return 0; } -void Collection::add_source(CollectionSource &s) +void Collection::add_source(const CollectionSource &s) { sources.push_back(&s); } +IO::Seekable *Collection::open_raw(const string &name) const +{ + for(SourceList::const_iterator i=sources.begin(); i!=sources.end(); ++i) + if(IO::Seekable *io = (*i)->open(name)) + return io; + + return 0; +} + void Collection::gather_names_from_sources(list &names, const CollectionItemTypeBase &type) const { + set new_names; for(SourceList::const_iterator i=sources.begin(); i!=sources.end(); ++i) { std::list available_names = (*i)->get_names(type); for(std::list::iterator j=available_names.begin(); j!=available_names.end(); ++j) if(!items.count(*j)) - names.push_back(*j); + new_names.insert(*j); } + names.insert(names.end(), new_names.begin(), new_names.end()); } void Collection::load_items_from_sources(const CollectionItemTypeBase &type) @@ -109,7 +126,16 @@ void Collection::load_items_from_sources(const CollectionItemTypeBase &type) std::list available_names = (*i)->get_names(type); for(std::list::iterator j=available_names.begin(); j!=available_names.end(); ++j) if(!items.count(*j)) - (*i)->load(*this, type, *j); + { + bool loaded = false; + if(type.can_create()) + { + type.create_item(*this, *j); + loaded = items.count(*j); + } + if(!loaded) + (*i)->load(*this, type, *j); + } } }