X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Flayout.cpp;h=af7304da6aeef557f3f4f8119d08cc4aaca1ace4;hb=02c12263ac40289afc626156358ebb705ed84a5b;hp=43ce921475cf9971b3ff518f48cf6d5425aedf14;hpb=53c9798cdfd56a25b2437d3df1cf7f6a60d1c7a9;p=r2c2.git diff --git a/source/libr2c2/layout.cpp b/source/libr2c2/layout.cpp index 43ce921..af7304d 100644 --- a/source/libr2c2/layout.cpp +++ b/source/libr2c2/layout.cpp @@ -69,31 +69,69 @@ Driver &Layout::get_driver() const void Layout::add(Object &o) { if(objects.insert(o)) - signal_object_added.emit(o); + { + try + { + signal_object_added.emit(o); + } + catch(...) + { + objects.erase(o); + throw; + } + } } void Layout::add(Track &t) { if(objects.insert(t)) { - // Blocks must be recreated first - create_blocks(); - signal_object_added.emit(t); + try + { + // Blocks must be recreated first + create_blocks(); + signal_object_added.emit(t); + } + catch(...) + { + objects.erase(t); + create_blocks(); + throw; + } } } void Layout::add(TrackChain &g) { if(track_chains.insert(g)) - signal_track_chain_added.emit(g); + { + try + { + signal_track_chain_added.emit(g); + } + catch(...) + { + track_chains.erase(g); + throw; + } + } } void Layout::add(Block &b) { if(track_chains.insert(b)) { - b.signal_reserved.connect(sigc::bind<0>(signal_block_reserved, sigc::ref(b))); - signal_track_chain_added.emit(b); + sigc::connection conn = b.signal_reserved.connect(sigc::bind<0>(signal_block_reserved, sigc::ref(b))); + try + { + signal_track_chain_added.emit(b); + } + catch(...) + { + track_chains.erase(b); + conn.disconnect(); + throw; + } } } @@ -420,7 +458,7 @@ void Layout::save(const string &fn) const for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) { DataFile::Statement st("track"); - st.append((*i)->get_type().get_article_number()); + st.append(catalogue.get_name(&(*i)->get_type())); (*i)->save(st.sub); writer.write(st); } @@ -429,7 +467,7 @@ void Layout::save(const string &fn) const for(set::const_iterator i=signals.begin(); i!=signals.end(); ++i) { DataFile::Statement st("signal"); - st.append((*i)->get_type().get_article_number()); + st.append(catalogue.get_name(&(*i)->get_type())); (*i)->save(st.sub); writer.write(st); } @@ -438,7 +476,7 @@ void Layout::save(const string &fn) const for(set::const_iterator i=terrains.begin(); i!=terrains.end(); ++i) { DataFile::Statement st("terrain"); - st.append((*i)->get_type().get_article_number()); + st.append(catalogue.get_name(&(*i)->get_type())); (*i)->save(st.sub); writer.write(st); } @@ -490,7 +528,7 @@ void Layout::save_dynamic(const string &fn) const for(map::const_iterator i=trains.begin(); i!=trains.end(); ++i) { DataFile::Statement st("train"); - st.append(i->second->get_locomotive_type().get_article_number()); + st.append(catalogue.get_name(&i->second->get_locomotive_type())); st.append(i->second->get_address()); st.append(i->second->get_protocol()); i->second->save(st.sub); @@ -594,21 +632,21 @@ void Layout::Loader::route() load_sub(*rte); } -void Layout::Loader::signal(ArticleNumber art_nr) +void Layout::Loader::signal(const string &n) { - Signal *sig = new Signal(obj, obj.catalogue.get(art_nr)); + Signal *sig = new Signal(obj, obj.catalogue.get(n)); load_sub(*sig); } -void Layout::Loader::terrain(ArticleNumber art_nr) +void Layout::Loader::terrain(const string &n) { - Terrain *ter = new Terrain(obj, obj.catalogue.get(art_nr)); + Terrain *ter = new Terrain(obj, obj.catalogue.get(n)); load_sub(*ter); } -void Layout::Loader::track(ArticleNumber art_nr) +void Layout::Loader::track(const string &n) { - Track *trk = new Track(obj, obj.catalogue.get(art_nr)); + Track *trk = new Track(obj, obj.catalogue.get(n)); load_sub(*trk); const set &tracks = obj.objects.get(); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) @@ -616,9 +654,9 @@ void Layout::Loader::track(ArticleNumber art_nr) trk->link_to(**i); } -void Layout::Loader::train(ArticleNumber art_nr, unsigned addr, const std::string &proto) +void Layout::Loader::train(const string &n, unsigned addr, const std::string &proto) { - Train *trn = new Train(obj, obj.catalogue.get(art_nr), addr, proto); + Train *trn = new Train(obj, obj.catalogue.get(n), addr, proto); load_sub(*trn); }