3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include "convert_json.h"
28 #include "main.h" // for g_settings
30 #include "httpfetch.h"
33 Json::Value fetchJsonValue(const std::string &url,
34 std::vector<std::string> *extra_headers) {
36 HTTPFetchRequest fetchrequest;
37 HTTPFetchResult fetchresult;
38 fetchrequest.url = url;
39 fetchrequest.caller = HTTPFETCH_SYNC;
41 if (extra_headers != NULL)
42 fetchrequest.extra_headers = *extra_headers;
44 httpfetch_sync(fetchrequest,fetchresult);
46 if (!fetchresult.succeeded) {
51 std::istringstream stream(fetchresult.data);
53 if (!reader.parse( stream, root ) )
55 errorstream << "URL: " << url << std::endl;
56 errorstream << "Failed to parse json data " << reader.getFormattedErrorMessages();
57 errorstream << "data: \"" << fetchresult.data << "\"" << std::endl;
64 if ((root["list"].isArray())) {
74 std::vector<ModStoreMod> readModStoreList(Json::Value& modlist) {
75 std::vector<ModStoreMod> retval;
77 if (modlist.isArray()) {
78 for (unsigned int i = 0; i < modlist.size(); i++)
84 if (modlist[i]["id"].asString().size()) {
85 std::string id_raw = modlist[i]["id"].asString();
87 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
89 if ((id_raw != "") && (*endptr == 0)) {
90 toadd.id = numbervalue;
93 errorstream << "readModStoreList: missing id" << std::endl;
98 errorstream << "readModStoreList: missing id" << std::endl;
103 if (modlist[i]["title"].asString().size()) {
104 toadd.title = modlist[i]["title"].asString();
107 errorstream << "readModStoreList: missing title" << std::endl;
112 if (modlist[i]["basename"].asString().size()) {
113 toadd.basename = modlist[i]["basename"].asString();
116 errorstream << "readModStoreList: missing basename" << std::endl;
127 retval.push_back(toadd);
134 ModStoreModDetails readModStoreModDetails(Json::Value& details) {
136 ModStoreModDetails retval;
141 if (details["version_set"].isArray()) {
142 for (unsigned int i = 0; i < details["version_set"].size(); i++)
144 ModStoreVersionEntry toadd;
146 if (details["version_set"][i]["id"].asString().size()) {
147 std::string id_raw = details["version_set"][i]["id"].asString();
149 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
151 if ((id_raw != "") && (*endptr == 0)) {
152 toadd.id = numbervalue;
156 errorstream << "readModStoreModDetails: missing version_set id" << std::endl;
157 retval.valid = false;
161 if (details["version_set"][i]["date"].asString().size()) {
162 toadd.date = details["version_set"][i]["date"].asString();
166 if (details["version_set"][i]["file"].asString().size()) {
167 toadd.file = details["version_set"][i]["file"].asString();
170 errorstream << "readModStoreModDetails: missing version_set file" << std::endl;
171 retval.valid = false;
179 retval.versions.push_back(toadd);
187 if (retval.versions.size() < 1) {
188 infostream << "readModStoreModDetails: not a single version specified!" << std::endl;
189 retval.valid = false;
193 if (details["categories"].isObject()) {
194 for (unsigned int i = 0; i < details["categories"].size(); i++) {
195 ModStoreCategoryInfo toadd;
197 if (details["categories"][i]["id"].asString().size()) {
199 std::string id_raw = details["categories"][i]["id"].asString();
201 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
203 if ((id_raw != "") && (*endptr == 0)) {
204 toadd.id = numbervalue;
208 errorstream << "readModStoreModDetails: missing categories id" << std::endl;
209 retval.valid = false;
211 if (details["categories"][i]["title"].asString().size()) {
212 toadd.name = details["categories"][i]["title"].asString();
215 errorstream << "readModStoreModDetails: missing categories title" << std::endl;
216 retval.valid = false;
220 retval.categories.push_back(toadd);
229 if (details["author"].isObject()) {
230 if (details["author"]["id"].asString().size()) {
232 std::string id_raw = details["author"]["id"].asString();
234 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
236 if ((id_raw != "") && (*endptr == 0)) {
237 retval.author.id = numbervalue;
240 errorstream << "readModStoreModDetails: missing author id (convert)" << std::endl;
241 retval.valid = false;
245 errorstream << "readModStoreModDetails: missing author id" << std::endl;
246 retval.valid = false;
249 if (details["author"]["username"].asString().size()) {
250 retval.author.username = details["author"]["username"].asString();
253 errorstream << "readModStoreModDetails: missing author username" << std::endl;
254 retval.valid = false;
258 errorstream << "readModStoreModDetails: missing author" << std::endl;
259 retval.valid = false;
263 if (details["license"].isObject()) {
264 if (details["license"]["id"].asString().size()) {
266 std::string id_raw = details["license"]["id"].asString();
268 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
270 if ((id_raw != "") && (*endptr == 0)) {
271 retval.license.id = numbervalue;
275 errorstream << "readModStoreModDetails: missing license id" << std::endl;
276 retval.valid = false;
279 if (details["license"]["short"].asString().size()) {
280 retval.license.shortinfo = details["license"]["short"].asString();
283 errorstream << "readModStoreModDetails: missing license short" << std::endl;
284 retval.valid = false;
287 if (details["license"]["link"].asString().size()) {
288 retval.license.url = details["license"]["link"].asString();
294 if (details["titlepic"].isObject()) {
295 if (details["titlepic"]["id"].asString().size()) {
297 std::string id_raw = details["titlepic"]["id"].asString();
299 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
301 if ((id_raw != "") && (*endptr == 0)) {
302 retval.titlepic.id = numbervalue;
306 if (details["titlepic"]["file"].asString().size()) {
307 retval.titlepic.file = details["titlepic"]["file"].asString();
310 if (details["titlepic"]["desc"].asString().size()) {
311 retval.titlepic.description = details["titlepic"]["desc"].asString();
314 if (details["titlepic"]["mod"].asString().size()) {
316 std::string mod_raw = details["titlepic"]["mod"].asString();
318 int numbervalue = strtol(mod_raw.c_str(),&endptr,10);
320 if ((mod_raw != "") && (*endptr == 0)) {
321 retval.titlepic.mod = numbervalue;
327 if (details["id"].asString().size()) {
329 std::string id_raw = details["id"].asString();
331 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
333 if ((id_raw != "") && (*endptr == 0)) {
334 retval.id = numbervalue;
338 errorstream << "readModStoreModDetails: missing id" << std::endl;
339 retval.valid = false;
343 if (details["title"].asString().size()) {
344 retval.title = details["title"].asString();
347 errorstream << "readModStoreModDetails: missing title" << std::endl;
348 retval.valid = false;
352 if (details["basename"].asString().size()) {
353 retval.basename = details["basename"].asString();
356 errorstream << "readModStoreModDetails: missing basename" << std::endl;
357 retval.valid = false;
361 if (details["desc"].asString().size()) {
362 retval.description = details["desc"].asString();
366 if (details["replink"].asString().size()) {
367 retval.repository = details["replink"].asString();
371 if (details["rating"].asString().size()) {
373 std::string id_raw = details["rating"].asString();
375 float numbervalue = strtof(id_raw.c_str(),&endptr);
377 if ((id_raw != "") && (*endptr == 0)) {
378 retval.rating = numbervalue;
386 if (details["depends"].isArray()) {
391 if (details["softdep"].isArray()) {
396 if (details["screenshot_url"].asString().size()) {
397 retval.screenshot_url = details["screenshot_url"].asString();