diff --git a/src/gui/movieplayer.cpp b/src/gui/movieplayer.cpp index e9f2be7e0..1f7e94cac 100644 --- a/src/gui/movieplayer.cpp +++ b/src/gui/movieplayer.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include @@ -842,12 +843,12 @@ bool CMoviePlayerGui::luaGetUrl(const std::string &script, const std::string &fi return false; } + string errMsg = ""; Json::Value root; - Json::Reader reader; - bool parsedSuccess = reader.parse(result_string, root, false); - if (!parsedSuccess) { + bool ok = parseJsonFromString(result_string, &root, &errMsg); + if (!ok) { printf("Failed to parse JSON\n"); - printf("%s\n", reader.getFormattedErrorMessages().c_str()); + printf("%s\n", errMsg.c_str()); if (box != NULL) { box->hide(); delete box; diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index c30aca3b4..aadc472ad 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -69,6 +69,7 @@ #include #include #include +#include #include #include @@ -739,16 +740,15 @@ bool CTimerList::RemoteBoxChanExists(t_channel_id channel_id) r_url += string_printf_helper(PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS, channel_id); r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); + string errMsg = ""; Json::Value root; - Json::Reader reader; - bool parsedSuccess = reader.parse(r_url, root, false); - if (!parsedSuccess) { + bool ok = parseJsonFromString(r_url, &root, &errMsg); + if (!ok) { printf("Failed to parse JSON\n"); - printf("%s\n", reader.getFormattedErrorMessages().c_str()); + printf("%s\n", errMsg.c_str()); } r_url = root.get("success","false").asString(); - if (r_url == "false") ShowMsg(LOCALE_REMOTEBOX_CHANNEL_NA, convertChannelId2String(channel_id), CMsgBox::mbrOk, CMsgBox::mbOk, NULL, 450, 30, false); @@ -797,13 +797,12 @@ void CTimerList::RemoteBoxTimerList(CTimerd::TimerList &rtimerlist) r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); //printf("[remotetimer] timers:%s\n",r_url.c_str()); + string errMsg = ""; Json::Value root; - Json::Reader reader; - bool parsedSuccess = reader.parse(r_url, root, false); - if (!parsedSuccess) - { + bool ok = parseJsonFromString(r_url, &root, &errMsg); + if (!ok) { printf("Failed to parse JSON\n"); - printf("%s\n", reader.getFormattedErrorMessages().c_str()); + printf("%s\n", errMsg.c_str()); it->online = false; } else it->online = true; @@ -1287,13 +1286,12 @@ void CTimerList::paintItem(int pos) r_url += string_printf_helper(PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS, timer.channel_id); r_url = httpTool.downloadString(r_url, -1, httpConnectTimeout); + string errMsg = ""; Json::Value root; - Json::Reader reader; - bool parsedSuccess = reader.parse(r_url, root, false); - if (!parsedSuccess) - { + bool ok = parseJsonFromString(r_url, &root, &errMsg); + if (!ok) { printf("Failed to parse JSON\n"); - printf("%s\n", reader.getFormattedErrorMessages().c_str()); + printf("%s\n", errMsg.c_str()); } Json::Value remotechannel = root["data"]["channel"][0]; diff --git a/src/gui/tmdb.cpp b/src/gui/tmdb.cpp index 8ebe101c1..5a8208e27 100644 --- a/src/gui/tmdb.cpp +++ b/src/gui/tmdb.cpp @@ -35,6 +35,7 @@ #include "system/settings.h" #include "system/helpers.h" +#include #include "system/set_threadname.h" #include "gui/widget/hintbox.h" @@ -197,12 +198,12 @@ bool cTmdb::GetMovieDetails(std::string lang) if (!getUrl(url, answer)) return false; + string errMsg = ""; Json::Value root; - Json::Reader reader; - bool parsedSuccess = reader.parse(answer, root, false); - if (!parsedSuccess) { + bool ok = parseJsonFromString(answer, &root, &errMsg); + if (!ok) { printf("Failed to parse JSON\n"); - printf("%s\n", reader.getFormattedErrorMessages().c_str()); + printf("%s\n", errMsg.c_str()); return false; } @@ -219,10 +220,11 @@ bool cTmdb::GetMovieDetails(std::string lang) answer.clear(); if (!getUrl(url, answer)) return false; - parsedSuccess = reader.parse(answer, root, false); - if (!parsedSuccess) { + + ok = parseJsonFromString(answer, &root, &errMsg); + if (!ok) { printf("Failed to parse JSON\n"); - printf("%s\n", reader.getFormattedErrorMessages().c_str()); + printf("%s\n", errMsg.c_str()); return false; } diff --git a/src/gui/widget/keychooser.cpp b/src/gui/widget/keychooser.cpp index 6d8f712ab..8473a4008 100644 --- a/src/gui/widget/keychooser.cpp +++ b/src/gui/widget/keychooser.cpp @@ -68,7 +68,7 @@ int CKeyChooserItem::exec(CMenuTarget* parent, const std::string &) int timeout = 10; CHintBox hintbox(name, LOCALE_KEYCHOOSER_TEXT, HINTBOX_MIN_WIDTH, NEUTRINO_ICON_SETTINGS, NEUTRINO_ICON_HINT_KEYS); - //hintbox.setTimeOut(timeout); + hintbox.setTimeOut(timeout); hintbox.paint(); CFrameBuffer::getInstance()->blit(); @@ -79,6 +79,7 @@ int CKeyChooserItem::exec(CMenuTarget* parent, const std::string &) timeoutEnd = CRCInput::calcTimeoutEnd(timeout); get_Message: + hintbox.enableTimeOutBar(); g_RCInput->getMsgAbsoluteTimeout( &msg, &data, &timeoutEnd ); if (msg != CRCInput::RC_timeout) @@ -92,6 +93,7 @@ int CKeyChooserItem::exec(CMenuTarget* parent, const std::string &) } g_RCInput->setLongPressAny(false); + hintbox.disableTimeOutBar(); hintbox.hide(); return res; } diff --git a/src/system/helpers-json.h b/src/system/helpers-json.h new file mode 100644 index 000000000..0e4923649 --- /dev/null +++ b/src/system/helpers-json.h @@ -0,0 +1,31 @@ +#ifndef __system_helpers_json__ +#define __system_helpers_json__ + +/* + Neutrino-HD + + License: GPL + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include + +using namespace std; + +bool parseJsonFromFile(string& jFile, Json::Value *root, string *errMsg); +bool parseJsonFromString(string& jData, Json::Value *root, string *errMsg); + +#endif diff --git a/src/system/helpers.cpp b/src/system/helpers.cpp index 392b38feb..3a60720d0 100644 --- a/src/system/helpers.cpp +++ b/src/system/helpers.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include "debug.h" @@ -51,6 +52,7 @@ #include //#include #include +#include #include #include #define MD5_DIGEST_LENGTH 16 @@ -1406,3 +1408,51 @@ string readLink(string lnk) return ""; } + +string readFile(string file) +{ + string ret_s; + ifstream tmpData(file.c_str(), ifstream::binary); + if (tmpData.is_open()) { + tmpData.seekg(0, tmpData.end); + int length = tmpData.tellg(); + tmpData.seekg(0, tmpData.beg); + char* buffer = new char[length+1]; + tmpData.read(buffer, length); + tmpData.close(); + buffer[length] = '\0'; + ret_s = (string)buffer; + delete [] buffer; + } + else { + cerr << "Error read " << file << endl; + return ""; + } + + return ret_s; +} + +bool parseJsonFromFile(string& jFile, Json::Value *root, string *errMsg) +{ + string jData = readFile(jFile); + bool ret = parseJsonFromString(jData, root, errMsg); + jData.clear(); + return ret; +} + +bool parseJsonFromString(string& jData, Json::Value *root, string *errMsg) +{ + Json::CharReaderBuilder builder; + Json::CharReader* reader(builder.newCharReader()); + JSONCPP_STRING errs = ""; + const char* jData_c = jData.c_str(); + + bool ret = reader->parse(jData_c, jData_c + strlen(jData_c), root, &errs); + if (!ret || (!errs.empty())) { + ret = false; + if (errMsg != NULL) + *errMsg = errs; + } + delete reader; + return ret; +} diff --git a/src/system/helpers.h b/src/system/helpers.h index 350728ea8..adc87fd05 100644 --- a/src/system/helpers.h +++ b/src/system/helpers.h @@ -151,4 +151,6 @@ std::string filehash(const char * file); std::string get_path(const char * path); inline bool file_exists(const std::string file) { return file_exists(file.c_str()); } +std::string readFile(std::string file); + #endif diff --git a/src/system/ytparser.cpp b/src/system/ytparser.cpp index 407d452a4..6bd43c576 100644 --- a/src/system/ytparser.cpp +++ b/src/system/ytparser.cpp @@ -38,6 +38,7 @@ #include #include "settings.h" #include "helpers.h" +#include "helpers-json.h" #include "set_threadname.h" #include #include @@ -288,25 +289,25 @@ std::string cYTFeedParser::getXmlData(xmlNodePtr node) bool cYTFeedParser::parseFeedJSON(std::string &answer) { + string errMsg = ""; Json::Value root; - Json::Reader reader; std::ostringstream ss; std::ifstream fh(curfeedfile.c_str(),std::ifstream::in); ss << fh.rdbuf(); std::string filedata = ss.str(); - bool parsedSuccess = reader.parse(filedata,root,false); + bool parsedSuccess = parseJsonFromString(filedata, &root, NULL); if(!parsedSuccess) { - parsedSuccess = reader.parse(answer,root,false); + parsedSuccess = parseJsonFromString(answer, &root, &errMsg); } if(!parsedSuccess) { printf("Failed to parse JSON\n"); - printf("%s\n", reader.getFormattedErrorMessages().c_str()); + printf("%s\n", errMsg.c_str()); return false; } @@ -383,15 +384,16 @@ bool cYTFeedParser::parseFeedDetailsJSON(cYTVideoInfo* vinfo) if (!getUrl(url, answer)) return false; + string errMsg = ""; Json::Value root; - Json::Reader reader; - bool parsedSuccess = reader.parse(answer, root, false); + bool parsedSuccess = parseJsonFromString(answer, &root, &errMsg); if (!parsedSuccess) { printf("Failed to parse JSON\n"); - printf("%s\n", reader.getFormattedErrorMessages().c_str()); + printf("%s\n", errMsg.c_str()); return false; } + Json::Value elements = root["items"]; std::string duration = elements[0]["contentDetails"].get("duration", "").asString(); if (duration.find("PT") != std::string::npos) {