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