From 5c7ecdb7c583c98cbe6bdf54ae7a07e6a6a61007 Mon Sep 17 00:00:00 2001
From: sapier <Sapier at GMX dot net>
Date: Sat, 13 Jul 2013 01:36:58 +0200
Subject: [PATCH] Add support for modstore screenshots Add error output on
 invalid mmdb entries

---
 builtin/modstore.lua |  8 ++++---
 src/convert_json.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++
 src/guiLuaApi.cpp    |  4 ++++
 src/mods.h           |  8 +++++++
 4 files changed, 67 insertions(+), 3 deletions(-)

diff --git a/builtin/modstore.lua b/builtin/modstore.lua
index 2c9e69069..fe0ceb75f 100644
--- a/builtin/modstore.lua
+++ b/builtin/modstore.lua
@@ -216,10 +216,12 @@ function modstore.getmodlist(list)
 			if details.screenshot_url ~= nil and
 				details.screenshot_url ~= "" then
 				if list.data[i].texturename == nil then
-					print("downloading screenshot: " .. details.screenshot_url)
+					local fullurl = engine.setting_get("modstore_download_url") ..
+								details.screenshot_url
+					print("downloading screenshot: " .. fullurl)
 					local filename = os.tempfolder()
 					
-					if engine.download_file(details.screenshot_url,filename) then
+					if engine.download_file(fullurl,filename) then
 						list.data[i].texturename = filename
 					end
 				end
@@ -238,7 +240,7 @@ function modstore.getmodlist(list)
 			
 			--description
 			local descriptiony = screenshot_ypos + 0.5
-			retval = retval .. "textarea[3," .. descriptiony .. ";6.5,1.6;;" .. 
+			retval = retval .. "textarea[3," .. descriptiony .. ";6.5,1.55;;" .. 
 				fs_escape_string(details.description) .. ";]"
 			--rating
 			local ratingy = screenshot_ypos + 0.6
diff --git a/src/convert_json.cpp b/src/convert_json.cpp
index 9b704aca6..71cba0695 100644
--- a/src/convert_json.cpp
+++ b/src/convert_json.cpp
@@ -111,6 +111,7 @@ std::vector<ModStoreMod>    readModStoreList(Json::Value& modlist) {
 				}
 			}
 			else {
+				errorstream << "readModStoreList: missing id" << std::endl;
 				toadd.valid = false;
 			}
 
@@ -119,6 +120,7 @@ std::vector<ModStoreMod>    readModStoreList(Json::Value& modlist) {
 				toadd.title = modlist[i]["title"].asString();
 			}
 			else {
+				errorstream << "readModStoreList: missing title" << std::endl;
 				toadd.valid = false;
 			}
 
@@ -127,6 +129,7 @@ std::vector<ModStoreMod>    readModStoreList(Json::Value& modlist) {
 				toadd.basename = modlist[i]["basename"].asString();
 			}
 			else {
+				errorstream << "readModStoreList: missing basename" << std::endl;
 				toadd.valid = false;
 			}
 
@@ -166,6 +169,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 				}
 			}
 			else {
+				errorstream << "readModStoreModDetails: missing version_set id" << std::endl;
 				retval.valid = false;
 			}
 
@@ -179,6 +183,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 				toadd.file = details["version_set"][i]["file"].asString();
 			}
 			else {
+				errorstream << "readModStoreModDetails: missing version_set file" << std::endl;
 				retval.valid = false;
 			}
 
@@ -196,6 +201,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 	}
 
 	if (retval.versions.size() < 1) {
+		errorstream << "readModStoreModDetails: not a single version specified!" << std::endl;
 		retval.valid = false;
 	}
 
@@ -215,12 +221,14 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 				}
 			}
 			else {
+				errorstream << "readModStoreModDetails: missing categories id" << std::endl;
 				retval.valid = false;
 			}
 			if (details["categories"][i]["title"].asString().size()) {
 				toadd.name = details["categories"][i]["title"].asString();
 			}
 			else {
+				errorstream << "readModStoreModDetails: missing categories title" << std::endl;
 				retval.valid = false;
 			}
 
@@ -245,10 +253,12 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 				retval.author.id = numbervalue;
 			}
 			else {
+				errorstream << "readModStoreModDetails: missing author id (convert)" << std::endl;
 				retval.valid = false;
 			}
 		}
 		else {
+			errorstream << "readModStoreModDetails: missing author id" << std::endl;
 			retval.valid = false;
 		}
 
@@ -256,10 +266,12 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 			retval.author.username = details["author"]["username"].asString();
 		}
 		else {
+			errorstream << "readModStoreModDetails: missing author username" << std::endl;
 			retval.valid = false;
 		}
 	}
 	else {
+		errorstream << "readModStoreModDetails: missing author" << std::endl;
 		retval.valid = false;
 	}
 
@@ -276,6 +288,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 			}
 		}
 		else {
+			errorstream << "readModStoreModDetails: missing license id" << std::endl;
 			retval.valid = false;
 		}
 
@@ -283,6 +296,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 			retval.license.shortinfo = details["license"]["short"].asString();
 		}
 		else {
+			errorstream << "readModStoreModDetails: missing license short" << std::endl;
 			retval.valid = false;
 		}
 
@@ -292,6 +306,39 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 
 	}
 
+	//titlepic
+	if (details["titlepic"].isObject()) {
+		if (details["titlepic"]["id"].asString().size()) {
+
+			const char* id_raw = details["titlepic"]["id"].asString().c_str();
+			char* endptr = 0;
+			int numbervalue = strtol(id_raw,&endptr,10);
+
+			if ((*id_raw != 0) && (*endptr == 0)) {
+				retval.titlepic.id = numbervalue;
+			}
+		}
+
+		if (details["titlepic"]["file"].asString().size()) {
+			retval.titlepic.file = details["titlepic"]["file"].asString();
+		}
+
+		if (details["titlepic"]["desc"].asString().size()) {
+			retval.titlepic.description = details["titlepic"]["desc"].asString();
+		}
+
+		if (details["titlepic"]["mod"].asString().size()) {
+
+			const char* mod_raw = details["titlepic"]["mod"].asString().c_str();
+			char* endptr = 0;
+			int numbervalue = strtol(mod_raw,&endptr,10);
+
+			if ((*mod_raw != 0) && (*endptr == 0)) {
+				retval.titlepic.mod = numbervalue;
+			}
+		}
+	}
+
 	//id
 	if (details["id"].asString().size()) {
 
@@ -304,6 +351,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 		}
 	}
 	else {
+		errorstream << "readModStoreModDetails: missing id" << std::endl;
 		retval.valid = false;
 	}
 
@@ -312,6 +360,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 		retval.title = details["title"].asString();
 	}
 	else {
+		errorstream << "readModStoreModDetails: missing title" << std::endl;
 		retval.valid = false;
 	}
 
@@ -320,6 +369,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 		retval.basename = details["basename"].asString();
 	}
 	else {
+		errorstream << "readModStoreModDetails: missing basename" << std::endl;
 		retval.valid = false;
 	}
 
diff --git a/src/guiLuaApi.cpp b/src/guiLuaApi.cpp
index 4ed5cb24c..6bf8df607 100644
--- a/src/guiLuaApi.cpp
+++ b/src/guiLuaApi.cpp
@@ -430,6 +430,10 @@ int guiLuaApi::l_get_modstore_details(lua_State *L)
 			lua_pushstring(L,current_mod.versions[0].file.c_str());
 			lua_settable(L, top);
 
+			lua_pushstring(L,"screenshot_url");
+			lua_pushstring(L,current_mod.titlepic.file.c_str());
+			lua_settable(L, top);
+
 			lua_pushstring(L,"license");
 			lua_pushstring(L,current_mod.license.shortinfo.c_str());
 			lua_settable(L, top);
diff --git a/src/mods.h b/src/mods.h
index eb453bf6a..e10d49324 100644
--- a/src/mods.h
+++ b/src/mods.h
@@ -202,11 +202,19 @@ struct ModStoreVersionEntry {
 	int mtversion;
 };
 
+struct ModStoreTitlePic {
+	int id;
+	std::string file;
+	std::string description;
+	int mod;
+};
+
 struct ModStoreModDetails {
 	/* version_set?? */
 	std::vector<ModStoreCategoryInfo> categories;
 	ModAuthorInfo author;
 	ModLicenseInfo license;
+	ModStoreTitlePic titlepic;
 	int id;
 	std::string title;
 	std::string basename;
-- 
GitLab