X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.cpp;h=65b4d5a3914192192f2092425e686b7d8ee56576;hb=619629ce1ce6343630b967c9fb46ab43256ddfe1;hp=984fb74da8e7a6007645e6f85aa002b8ae6f894a;hpb=9b1656018f783eb4aad2fbdc1de1404691e89bb1;p=libs%2Fdatafile.git diff --git a/source/collection.cpp b/source/collection.cpp index 984fb74..65b4d5a 100644 --- a/source/collection.cpp +++ b/source/collection.cpp @@ -1,3 +1,4 @@ +#include #include "collection.h" using namespace std; @@ -97,18 +98,20 @@ IO::Seekable *Collection::open_from_sources(const string &name) if(IO::Seekable *io = (*i)->open(name)) return io; - throw IO::file_not_found(name); + 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) @@ -118,7 +121,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); + } } }