changeset 13064:0881793d7f93 draft

(svn r17562) -Fix [FS#2972]: the NewGRF settings of (remote) network games did not get properly updated when the NewGRFs were rescanned causing reading of freed data
author rubidium <rubidium@openttd.org>
date Thu, 17 Sep 2009 21:14:16 +0000
parents d6196415e66a
children 5f56c9d07dd5
files src/network/network_func.h src/network/network_gamelist.cpp src/newgrf_config.cpp
diffstat 3 files changed, 40 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/network/network_func.h
+++ b/src/network/network_func.h
@@ -85,5 +85,7 @@
 void NetworkUndrawChatMessage();
 void NetworkChatMessageDailyLoop();
 
+void NetworkAfterNewGRFScan();
+
 #endif /* ENABLE_NETWORK */
 #endif /* NETWORK_FUNC_H */
--- a/src/network/network_gamelist.cpp
+++ b/src/network/network_gamelist.cpp
@@ -161,4 +161,37 @@
 	}
 }
 
+/**
+ * Rebuild the GRFConfig's of the servers in the game list as we did
+ * a rescan and might have found new NewGRFs.
+ */
+void NetworkAfterNewGRFScan()
+{
+	for (NetworkGameList *item = _network_game_list; item != NULL; item = item->next) {
+		/* Reset compatability state */
+		item->info.compatible = item->info.version_compatible;
+
+		for (GRFConfig *c = item->info.grfconfig; c != NULL; c = c->next) {
+			assert(HasBit(c->flags, GCF_COPY));
+
+			const GRFConfig *f = FindGRFConfig(c->grfid, c->md5sum);
+			if (f == NULL) {
+				/* Don't know the GRF, so mark game incompatible and the (possibly)
+				 * already resolved name for this GRF (another server has sent the
+				 * name of the GRF already */
+				c->name   = FindUnknownGRFName(c->grfid, c->md5sum, true);
+				c->status = GCS_NOT_FOUND;
+
+				/* If we miss a file, we're obviously incompatible */
+				item->info.compatible = false;
+			} else {
+				c->filename  = f->filename;
+				c->name      = f->name;
+				c->info      = f->info;
+				c->status    = GCS_UNKNOWN;
+			}
+		}
+	}
+}
+
 #endif /* ENABLE_NETWORK */
--- a/src/newgrf_config.cpp
+++ b/src/newgrf_config.cpp
@@ -17,6 +17,7 @@
 #include "string_func.h"
 #include "gamelog.h"
 #include "network/network_type.h"
+#include "network/network_func.h"
 #include "gfx_func.h"
 
 #include "fileio_func.h"
@@ -391,6 +392,10 @@
 	_all_grfs = to_sort[0];
 
 	free(to_sort);
+
+#ifdef ENABLE_NETWORK
+	NetworkAfterNewGRFScan();
+#endif
 }