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 fetch_request;
37 HTTPFetchResult fetch_result;
38 fetch_request.url = url;
39 fetch_request.caller = HTTPFETCH_SYNC;
41 if (extra_headers != NULL)
42 fetch_request.extra_headers = *extra_headers;
44 httpfetch_sync(fetch_request, fetch_result);
46 if (!fetch_result.succeeded) {
51 std::istringstream stream(fetch_result.data);
53 if (!reader.parse(stream, root)) {
54 errorstream << "URL: " << url << std::endl;
55 errorstream << "Failed to parse json data " << reader.getFormattedErrorMessages();
56 errorstream << "data: \"" << fetch_result.data << "\"" << std::endl;
63 std::vector<ModStoreMod> readModStoreList(Json::Value& modlist) {
64 std::vector<ModStoreMod> retval;
66 if (modlist.isArray()) {
67 for (unsigned int i = 0; i < modlist.size(); i++)
73 if (modlist[i]["id"].asString().size()) {
74 std::string id_raw = modlist[i]["id"].asString();
76 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
78 if ((id_raw != "") && (*endptr == 0)) {
79 toadd.id = numbervalue;
82 errorstream << "readModStoreList: missing id" << std::endl;
87 errorstream << "readModStoreList: missing id" << std::endl;
92 if (modlist[i]["title"].asString().size()) {
93 toadd.title = modlist[i]["title"].asString();
96 errorstream << "readModStoreList: missing title" << std::endl;
101 if (modlist[i]["basename"].asString().size()) {
102 toadd.basename = modlist[i]["basename"].asString();
105 errorstream << "readModStoreList: missing basename" << std::endl;
116 retval.push_back(toadd);
123 ModStoreModDetails readModStoreModDetails(Json::Value& details) {
125 ModStoreModDetails retval;
130 if (details["version_set"].isArray()) {
131 for (unsigned int i = 0; i < details["version_set"].size(); i++)
133 ModStoreVersionEntry toadd;
135 if (details["version_set"][i]["id"].asString().size()) {
136 std::string id_raw = details["version_set"][i]["id"].asString();
138 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
140 if ((id_raw != "") && (*endptr == 0)) {
141 toadd.id = numbervalue;
145 errorstream << "readModStoreModDetails: missing version_set id" << std::endl;
146 retval.valid = false;
150 if (details["version_set"][i]["date"].asString().size()) {
151 toadd.date = details["version_set"][i]["date"].asString();
155 if (details["version_set"][i]["file"].asString().size()) {
156 toadd.file = details["version_set"][i]["file"].asString();
159 errorstream << "readModStoreModDetails: missing version_set file" << std::endl;
160 retval.valid = false;
168 retval.versions.push_back(toadd);
176 if (retval.versions.size() < 1) {
177 infostream << "readModStoreModDetails: not a single version specified!" << std::endl;
178 retval.valid = false;
182 if (details["categories"].isObject()) {
183 for (unsigned int i = 0; i < details["categories"].size(); i++) {
184 ModStoreCategoryInfo toadd;
186 if (details["categories"][i]["id"].asString().size()) {
188 std::string id_raw = details["categories"][i]["id"].asString();
190 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
192 if ((id_raw != "") && (*endptr == 0)) {
193 toadd.id = numbervalue;
197 errorstream << "readModStoreModDetails: missing categories id" << std::endl;
198 retval.valid = false;
200 if (details["categories"][i]["title"].asString().size()) {
201 toadd.name = details["categories"][i]["title"].asString();
204 errorstream << "readModStoreModDetails: missing categories title" << std::endl;
205 retval.valid = false;
209 retval.categories.push_back(toadd);
218 if (details["author"].isObject()) {
219 if (details["author"]["id"].asString().size()) {
221 std::string id_raw = details["author"]["id"].asString();
223 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
225 if ((id_raw != "") && (*endptr == 0)) {
226 retval.author.id = numbervalue;
229 errorstream << "readModStoreModDetails: missing author id (convert)" << std::endl;
230 retval.valid = false;
234 errorstream << "readModStoreModDetails: missing author id" << std::endl;
235 retval.valid = false;
238 if (details["author"]["username"].asString().size()) {
239 retval.author.username = details["author"]["username"].asString();
242 errorstream << "readModStoreModDetails: missing author username" << std::endl;
243 retval.valid = false;
247 errorstream << "readModStoreModDetails: missing author" << std::endl;
248 retval.valid = false;
252 if (details["license"].isObject()) {
253 if (details["license"]["id"].asString().size()) {
255 std::string id_raw = details["license"]["id"].asString();
257 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
259 if ((id_raw != "") && (*endptr == 0)) {
260 retval.license.id = numbervalue;
264 errorstream << "readModStoreModDetails: missing license id" << std::endl;
265 retval.valid = false;
268 if (details["license"]["short"].asString().size()) {
269 retval.license.shortinfo = details["license"]["short"].asString();
272 errorstream << "readModStoreModDetails: missing license short" << std::endl;
273 retval.valid = false;
276 if (details["license"]["link"].asString().size()) {
277 retval.license.url = details["license"]["link"].asString();
283 if (details["titlepic"].isObject()) {
284 if (details["titlepic"]["id"].asString().size()) {
286 std::string id_raw = details["titlepic"]["id"].asString();
288 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
290 if ((id_raw != "") && (*endptr == 0)) {
291 retval.titlepic.id = numbervalue;
295 if (details["titlepic"]["file"].asString().size()) {
296 retval.titlepic.file = details["titlepic"]["file"].asString();
299 if (details["titlepic"]["desc"].asString().size()) {
300 retval.titlepic.description = details["titlepic"]["desc"].asString();
303 if (details["titlepic"]["mod"].asString().size()) {
305 std::string mod_raw = details["titlepic"]["mod"].asString();
307 int numbervalue = strtol(mod_raw.c_str(),&endptr,10);
309 if ((mod_raw != "") && (*endptr == 0)) {
310 retval.titlepic.mod = numbervalue;
316 if (details["id"].asString().size()) {
318 std::string id_raw = details["id"].asString();
320 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
322 if ((id_raw != "") && (*endptr == 0)) {
323 retval.id = numbervalue;
327 errorstream << "readModStoreModDetails: missing id" << std::endl;
328 retval.valid = false;
332 if (details["title"].asString().size()) {
333 retval.title = details["title"].asString();
336 errorstream << "readModStoreModDetails: missing title" << std::endl;
337 retval.valid = false;
341 if (details["basename"].asString().size()) {
342 retval.basename = details["basename"].asString();
345 errorstream << "readModStoreModDetails: missing basename" << std::endl;
346 retval.valid = false;
350 if (details["desc"].asString().size()) {
351 retval.description = details["desc"].asString();
355 if (details["replink"].asString().size()) {
356 retval.repository = details["replink"].asString();
360 if (details["rating"].asString().size()) {
362 std::string id_raw = details["rating"].asString();
364 float numbervalue = strtof(id_raw.c_str(),&endptr);
366 if ((id_raw != "") && (*endptr == 0)) {
367 retval.rating = numbervalue;
375 if (details["depends"].isArray()) {
380 if (details["softdep"].isArray()) {
385 if (details["screenshot_url"].asString().size()) {
386 retval.screenshot_url = details["screenshot_url"].asString();