]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/catalogue.cpp
Get rid of some obsolete #includes
[r2c2.git] / source / libr2c2 / catalogue.cpp
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>
7 #include "catalogue.h"
8 #include "signaltype.h"
9 #include "terraintype.h"
10 #include "trackappearance.h"
11 #include "tracktype.h"
12 #include "vehicletype.h"
13
14 using namespace std;
15 using namespace Msp;
16
17 namespace R2C2 {
18
19 Catalogue::Catalogue():
20         scale(1),
21         layout(*this)
22 {
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");
28
29         add_source("data/r2c2");
30 }
31
32 void Catalogue::add_source(const FS::Path &path)
33 {
34         string ext = FS::extpart(path.str());
35         DataFile::CollectionSource *source = 0;
36         IO::Seekable *init_file = 0;
37         if(ext==".mdt")
38         {
39                 DataFile::PackSource *pack_source = new DataFile::PackSource;
40                 pack_source->add_pack_file(path.str());
41                 source = pack_source;
42
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)
45                 {
46                         string fext = FS::extpart(i->name);
47                         if(fext==".cat" && !init_file)
48                                 init_file = pack_source->open(i->name);
49                 }
50         }
51         else if(FS::is_dir(path))
52         {
53                 DataFile::DirectorySource *dir_source = new DataFile::DirectorySource;
54                 dir_source->add_directory(path);
55
56                 list<FS::Path> queue;
57                 queue.push_back(path);
58                 while(!queue.empty())
59                 {
60                         FS::Path dir = queue.front();
61                         queue.pop_front();
62                         list<string> files = FS::list_files(dir);
63                         for(list<string>::const_iterator i=files.begin(); i!=files.end(); ++i)
64                         {
65                                 FS::Path full = dir/ *i;
66                                 if(FS::is_dir(full))
67                                 {
68                                         dir_source->add_directory(full);
69                                         queue.push_back(full);
70                                 }
71
72                                 string fext = FS::extpart(*i);
73                                 if(fext==".cat" && !init_file)
74                                         init_file = new IO::BufferedFile(full.str());
75                         }
76                 }
77
78                 source = dir_source;
79         }
80
81         sources.push_back(source);
82         Collection::add_source(*source);
83         signal_source_added.emit(*source);
84
85         if(init_file)
86         {
87                 DataFile::Parser parser(*init_file, path.str());
88                 Loader ldr(*this);
89                 ldr.load(parser);
90         }
91         delete init_file;
92 }
93
94
95 Catalogue::Loader::Loader(Catalogue &c):
96         Collection::Loader(c),
97         cat(c)
98 {
99         add("layout", &Loader::layout);
100         add("scale", &Loader::scale);
101 }
102
103 void Catalogue::Loader::layout()
104 {
105         load_sub(cat.layout);
106 }
107
108 void Catalogue::Loader::scale(float n, float d)
109 {
110         cat.scale = n/d;
111 }
112
113 } // namespace R2C2