1 #include <msp/datafile/directorysource.h>
2 #include <msp/datafile/packsource.h>
3 #include <msp/datafile/parser.h>
4 #include <msp/fs/dir.h>
5 #include <msp/fs/stat.h>
6 #include <msp/fs/utils.h>
8 #include "signaltype.h"
9 #include "terraintype.h"
10 #include "trackappearance.h"
11 #include "tracktype.h"
12 #include "vehicletype.h"
19 Catalogue::Catalogue():
23 add_type<TrackType>().keyword("track");
24 add_type<SignalType>().keyword("signal");
25 add_type<VehicleType>().suffix(".veh").keyword("vehicle");
26 add_type<TerrainType>().suffix(".terr").keyword("terrain");
27 add_type<TrackAppearance>().suffix("trkapp").keyword("track_appearance");
29 add_source("data/r2c2");
32 void Catalogue::add_source(const FS::Path &path)
34 string ext = FS::extpart(path.str());
35 DataFile::CollectionSource *source = 0;
36 IO::Seekable *init_file = 0;
39 DataFile::PackSource *pack_source = new DataFile::PackSource;
40 pack_source->add_pack_file(path.str());
43 list<DataFile::PackSource::FileInfo> files = pack_source->list_files();
44 for(list<DataFile::PackSource::FileInfo>::const_iterator i=files.begin(); i!=files.end(); ++i)
46 string fext = FS::extpart(i->name);
47 if(fext==".cat" && !init_file)
48 init_file = pack_source->open(i->name);
51 else if(FS::is_dir(path))
53 DataFile::DirectorySource *dir_source = new DataFile::DirectorySource;
54 dir_source->add_directory(path);
57 queue.push_back(path);
60 FS::Path dir = queue.front();
62 list<string> files = FS::list_files(dir);
63 for(list<string>::const_iterator i=files.begin(); i!=files.end(); ++i)
65 FS::Path full = dir/ *i;
68 dir_source->add_directory(full);
69 queue.push_back(full);
72 string fext = FS::extpart(*i);
73 if(fext==".cat" && !init_file)
74 init_file = new IO::BufferedFile(full.str());
81 sources.push_back(source);
82 Collection::add_source(*source);
83 signal_source_added.emit(*source);
87 DataFile::Parser parser(*init_file, path.str());
95 Catalogue::Loader::Loader(Catalogue &c):
96 Collection::Loader(c),
99 add("layout", &Loader::layout);
100 add("scale", &Loader::scale);
103 void Catalogue::Loader::layout()
105 load_sub(cat.layout);
108 void Catalogue::Loader::scale(float n, float d)