X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.cpp;h=cffb7e22e7041ba48268c9643c6d7791e118407f;hb=5adc143801103f6a914f3738a0f3986d4bff5630;hp=fbe894a8bb4b073c0baa227655bd2d3ecf3781e3;hpb=bcbe8b90de68e18260313b8f0e8a8dd9c7661903;p=libs%2Fdatafile.git diff --git a/source/collection.cpp b/source/collection.cpp index fbe894a..cffb7e2 100644 --- a/source/collection.cpp +++ b/source/collection.cpp @@ -1,3 +1,4 @@ +#include #include "collection.h" using namespace std; @@ -5,6 +6,10 @@ using namespace std; namespace Msp { namespace DataFile { +Collection::Collection(): + fallback(0) +{ } + Collection::~Collection() { for(TypeList::iterator i = types.begin(); i!=types.end(); ++i) @@ -30,6 +35,16 @@ const Variant &Collection::get_var(const string &name, const CollectionItemTypeB (*j)->load(*this, *type, name); 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; + } + } } return get_item(items, name); @@ -77,15 +92,26 @@ void Collection::add_source(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) @@ -95,10 +121,24 @@ 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); + } } } +void Collection::set_fallback(Collection *f) +{ + fallback = f; +} + Collection::Loader::Loader(Collection &c): coll(c)