[Wesnoth-cvs-commits] wesnoth src/game.cpp src/config.cpp src/config.... (June 11, 2005 - 05:31)

 

CVSROOT:	/cvsroot/wesnoth
Module name:	wesnoth
Branch: 	
Changes by:	David White <Sirp@xxxxxxxxxxxxxxxx>	05/06/11 02:41:38

Modified files:
	src            : game.cpp config.cpp config.hpp 
	data           : game.cfg 

Log message:
	made it so a corrupt user campaign won't stop the game from starting

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/game.cpp.diff?tr1=1.252&tr2=1.253&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/config.cpp.diff?tr1=1.139&tr2=1.140&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/config.hpp.diff?tr1=1.62&tr2=1.63&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/data/game.cfg.diff?tr1=1.162&tr2=1.163&r1=text&r2=text

Patches:
Index: wesnoth/data/game.cfg
diff -u wesnoth/data/game.cfg:1.162 wesnoth/data/game.cfg:1.163
--- wesnoth/data/game.cfg:1.162	Wed Jun  1 22:25:43 2005
+++ wesnoth/data/game.cfg	Sat Jun 11 02:41:38 2005
@@ -22,7 +22,6 @@
 {terrain_generator.cfg}
 
 {campaigns}
-{~campaigns}
 
 {help.cfg}
 
Index: wesnoth/src/config.cpp
diff -u wesnoth/src/config.cpp:1.139 wesnoth/src/config.cpp:1.140
--- wesnoth/src/config.cpp:1.139	Sat Jun  4 19:16:05 2005
+++ wesnoth/src/config.cpp	Sat Jun 11 02:41:37 2005
@@ -1,4 +1,4 @@
-/* $Id: config.cpp,v 1.139 2005/06/04 19:16:05 ott Exp $ */
+/* $Id: config.cpp,v 1.140 2005/06/11 02:41:37 Sirp Exp $ */
 /*
    Copyright (C) 2003 by David White <davidnwhite@xxxxxxxxxxx>
    Copyright (C) 2005 by Guillaume Melquiond <guillaume.melquiond@xxxxxxxxx>
@@ -59,6 +59,22 @@
 	for(string_map::const_iterator j = cfg.values.begin(); j != cfg.values.end(); ++j) {
 		values[j->first] = j->second;
 	}
+}
+
+void config::merge_children(const std::string& key)
+{
+	config merged_children;
+	const child_list& children = get_children(key);
+	if(children.size() < 2) {
+		return;
+	}
+
+	for(child_list::const_iterator i = children.begin(); i != children.end(); ++i) {
+		merged_children.append(**i);
+	}
+
+	clear_children(key);
+	add_child(key,merged_children);
 }
 
 config::child_itors config::child_range(const std::string& key)
Index: wesnoth/src/config.hpp
diff -u wesnoth/src/config.hpp:1.62 wesnoth/src/config.hpp:1.63
--- wesnoth/src/config.hpp:1.62	Sat Jun  4 19:16:05 2005
+++ wesnoth/src/config.hpp	Sat Jun 11 02:41:37 2005
@@ -1,4 +1,4 @@
-/* $Id: config.hpp,v 1.62 2005/06/04 19:16:05 ott Exp $ */
+/* $Id: config.hpp,v 1.63 2005/06/11 02:41:37 Sirp Exp $ */
 /*
    Copyright (C) 2003 by David White <davidnwhite@xxxxxxxxxxx>
    Part of the Battle for Wesnoth Project http://www.wesnoth.org/
@@ -122,7 +122,11 @@
 
 	//append data from another config object to this one. attributes in the
 	//latter config object will clobber attributes in this one.
-	void append(const config& cfg);
+	void append(const config& cfg);
+
+	//all children with the given key will be merged into the first element
+	//with that key
+	void merge_children(const std::string& key);
 
 	//resets the translated values of all strings contained in this object
 	void reset_translation() const;
Index: wesnoth/src/game.cpp
diff -u wesnoth/src/game.cpp:1.252 wesnoth/src/game.cpp:1.253
--- wesnoth/src/game.cpp:1.252	Sat Jun  4 19:16:05 2005
+++ wesnoth/src/game.cpp	Sat Jun 11 02:41:37 2005
@@ -1,4 +1,4 @@
-/* $Id: game.cpp,v 1.252 2005/06/04 19:16:05 ott Exp $ */
+/* $Id: game.cpp,v 1.253 2005/06/11 02:41:37 Sirp Exp $ */
 /*
    Copyright (C) 2003 by David White <davidnwhite@xxxxxxxxxxx>
    Part of the Battle for Wesnoth Project http://www.wesnoth.org/
@@ -1278,7 +1278,40 @@
 				scoped_istream stream = preprocess_file("data/game.cfg", &defines);
 
 				std::string error_log;
-				read(cfg, *stream, &error_log);
+				read(cfg, *stream, &error_log);
+
+				//load user campaigns
+				const std::string user_campaign_dir = get_user_data_dir() + "/data/campaigns/";
+				std::vector<std::string> user_campaigns, error_campaigns;
+				get_files_in_dir(user_campaign_dir,&user_campaigns,NULL,ENTIRE_FILE_PATH);
+				for(std::vector<std::string>::const_iterator uc = user_campaigns.begin(); uc != user_campaigns.end(); ++uc) {
+					try {
+						scoped_istream stream = preprocess_file(*uc,&defines);
+
+						config user_campaign_cfg;
+						read(user_campaign_cfg,*stream,NULL);
+						cfg.append(user_campaign_cfg);
+					} catch(config::error&) {
+						std::cerr << "error processing user campaign '" << *uc << "'\n";
+						error_campaigns.push_back(*uc);
+					} catch(io_exception&) {
+						std::cerr << "error reading user campaign '" << *uc << "'\n";
+						error_campaigns.push_back(*uc);
+					}
+				}
+
+				if(error_campaigns.empty() == false) {
+					std::stringstream msg;
+					msg << _("The following add-on campaign(s) had errors and could not be loaded:");
+					for(std::vector<std::string>::const_iterator i = error_campaigns.begin(); i != error_campaigns.end(); ++i) {
+						msg << "\n" << *i;
+					}
+
+					gui::show_error_message(disp(),msg.str());
+				}
+
+				cfg.merge_children("units");
+
 				if(!error_log.empty()) {
 					gui::show_error_message(disp(),
 							_("Warning: Errors occurred while loading game configuration files: '") +
@@ -1511,19 +1544,19 @@
 		return 0;
 	}
 
-#ifdef WIN32
-	res = game.init_config();
-	if(res == false) {
-		std::cerr << "could not initialize game config\n";
-		return 0;
-	}
-#endif
-
 	res = game.init_video();
 	if(res == false) {
 		std::cerr << "could not initialize display\n";
 		return 0;
 	}
+
+#ifdef WIN32
+	res = game.init_config();
+	if(res == false) {
+		std::cerr << "could not initialize game config\n";
+		return 0;
+	}
+#endif
 
 	res = game.init_language();
 	if(res == false) {
@@ -1618,6 +1651,10 @@
 	}
 
 	return 0;
+}
+
+void f() {
+	throw config::error("");
 }
 
 int main(int argc, char** argv)



You are on the gna.org mail server.

Generated by mhonarc, Tue Sep 20 16:50:19 2005