1 #include <msp/core/maputils.h>
2 #include <msp/core/refptr.h>
3 #include <msp/datafile/directorysource.h>
4 #include <msp/datafile/packsource.h>
5 #include <msp/datafile/parser.h>
6 #include <msp/fs/dir.h>
7 #include <msp/fs/stat.h>
8 #include <msp/fs/utils.h>
10 #include "signaltype.h"
11 #include "terraintype.h"
12 #include "tracktype.h"
13 #include "vehicletype.h"
20 Catalogue::Catalogue():
24 add_type<TrackType>().keyword("track");
25 add_type<SignalType>().keyword("signal");
26 add_type<VehicleType>().suffix(".veh").keyword("vehicle");
27 add_type<TerrainType>().suffix(".terr").keyword("terrain");
28 add_type<TrackAppearance>().suffix("trkapp").keyword("track_appearance");
30 add_source("data/r2c2");
33 void Catalogue::add_source(const FS::Path &path)
35 string ext = FS::extpart(path.str());
36 DataFile::CollectionSource *source = 0;
37 IO::Seekable *init_file = 0;
40 DataFile::PackSource *pack_source = new DataFile::PackSource;
41 pack_source->add_pack_file(path.str());
44 list<DataFile::PackSource::FileInfo> files = pack_source->list_files();
45 for(list<DataFile::PackSource::FileInfo>::const_iterator i=files.begin(); i!=files.end(); ++i)
47 string fext = FS::extpart(i->name);
48 if(fext==".cat" && !init_file)
49 init_file = pack_source->open(i->name);
52 else if(FS::is_dir(path))
54 DataFile::DirectorySource *dir_source = new DataFile::DirectorySource;
55 dir_source->add_directory(path);
58 queue.push_back(path);
61 FS::Path dir = queue.front();
63 list<string> files = FS::list_files(dir);
64 for(list<string>::const_iterator i=files.begin(); i!=files.end(); ++i)
66 FS::Path full = dir/ *i;
69 dir_source->add_directory(full);
70 queue.push_back(full);
73 string fext = FS::extpart(*i);
74 if(fext==".cat" && !init_file)
75 init_file = new IO::BufferedFile(full.str());
82 sources.push_back(source);
83 Collection::add_source(*source);
84 signal_source_added.emit(*source);
88 DataFile::Parser parser(*init_file, path.str());
96 Catalogue::Loader::Loader(Catalogue &c):
97 Collection::Loader(c),
100 add("layout", &Loader::layout);
101 add("scale", &Loader::scale);
104 void Catalogue::Loader::layout()
106 load_sub(cat.layout);
109 void Catalogue::Loader::scale(float n, float d)