]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/catalogue.cpp
3c8e279bcf354a957f05a418c2592538b3f97f67
[r2c2.git] / source / libmarklin / catalogue.cpp
1 #include <fstream>
2 #include <msp/parser/parser.h>
3 #include "catalogue.h"
4 #include "track.h"
5
6 using namespace std;
7 using namespace Msp;
8
9 namespace Marklin {
10
11 Track *Catalogue::get_track(unsigned art_nr)
12 {
13         TrackMap::const_iterator i=tracks.find(art_nr);
14
15         if(i!=tracks.end())
16                 return i->second;
17
18         return 0;
19 }
20
21 void Catalogue::load(const string &fn)
22 {
23         ifstream in(fn.c_str());
24         if(!in)
25                 throw Exception("File not found");
26
27         Parser::Parser parser(in, fn);
28         Loader loader(*this);
29         loader.load(parser);
30 }
31
32 Catalogue::~Catalogue()
33 {
34         for(TrackMap::iterator i=tracks.begin(); i!=tracks.end(); ++i)
35                 delete i->second;
36 }
37
38 Catalogue::Loader::Loader(Catalogue &c):
39         cat(c)
40 {
41         add("track", &Loader::track);
42 }
43
44 void Catalogue::Loader::track(unsigned art_no)
45 {
46         TrackMap::iterator i=cat.tracks.find(art_no);
47         if(i!=cat.tracks.end())
48                 throw Exception("Duplicate track number");
49
50         Track *trk=new Track(art_no);
51         try
52         {
53                 load_sub(*trk);
54         }
55         catch(const Msp::Exception &)
56         {
57                 delete trk;
58                 throw;
59         }
60         cat.tracks.insert(TrackMap::value_type(trk->get_article_number(), trk));
61 }
62
63 } // namespace Marklin