1 #ifndef MSP_DATAFILE_PACKSOURCE_H_
2 #define MSP_DATAFILE_PACKSOURCE_H_
4 #include <msp/core/refptr.h>
5 #include "collectionsource.h"
6 #include "objectloader.h"
12 A source that loads data from pack files. As opposed to plain collection
13 files, pack files are composed from a number of logical files. They also
14 contain an index of objects contained in the pack and which logical files they
15 are in. This allows the pack to be loaded in a piecewise manner instead of all
18 It's possible for a pack file to contain plain collection files as well. When
19 an object from such a file is requested, the entire sub-collection it is stored
22 class PackSource: public CollectionSource
35 typedef std::map<std::string, const File *> FileMap;
36 typedef std::map<std::string, const Object *> ObjectMap;
41 class Loader: public ObjectLoader<Pack>
46 void file(const std::string &);
52 std::list<File> files;
55 Pack(const std::string &);
57 const std::string &get_filename() const { return filename; }
58 unsigned get_base_offset() const { return base_offset; }
60 void collect_files(FileMap &, const std::string &) const;
66 class Loader: public ObjectLoader<File>
71 virtual void finish();
72 void object(const std::string &, const std::string &);
81 std::list<Object> objects;
85 File(const Pack &, const std::string &);
87 RefPtr<IO::Seekable> open() const;
88 const std::string &get_filename() const { return filename; }
89 FileInfo get_info() const;
90 std::string get_full_name() const;
91 bool is_collection() const { return collection; }
94 bool is_loaded() const { return loaded; }
96 void collect_objects(ObjectMap &) const;
107 Object(File &, const std::string &, const std::string &);
109 File &get_file() const { return file; }
110 const std::string &get_name() const { return name; }
111 const std::string &get_keyword() const { return keyword; }
114 std::list<Pack> packs;
119 /// Adds a pack file to load objects from. The index is read immediately.
120 void add_pack_file(const std::string &);
122 /** Adds a pack file with a regex to filter logical files. The index is
123 read on the first call; subsequent calls will use cached data. */
124 void add_pack_file(const std::string &, const std::string &);
126 /// Returns information about the files in the pack.
127 std::list<FileInfo> list_files() const;
129 virtual bool is_loadable(const CollectionItemTypeBase &, const std::string &) const;
130 virtual NameList get_names(const CollectionItemTypeBase &) const;
131 virtual void load(Collection &, const CollectionItemTypeBase &, const std::string &) const;
132 virtual IO::Seekable *open(const std::string &) const;
135 } // namespace DataFile