From 3e17b73df63dce443c98c4f2e277c034ed5eb371 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Tue, 19 Sep 2017 19:36:32 +0200 Subject: [PATCH 1/3] CKeyChooserItem: add missing 'timeoutbar' while waiting for pressed key --- src/gui/widget/keychooser.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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; } From 05d8ed4105e8da783645d9985bd0de4eaf8a5bc8 Mon Sep 17 00:00:00 2001 From: "M. Liebmann" Date: Tue, 19 Sep 2017 21:38:38 +0200 Subject: [PATCH 2/3] helpers.cpp: Add new functions - readFile() - parseJsonFromFile() - parseJsonFromString() parseJsonFromString() and parseJsonFromFile() use Json::CharReader instead of the obsolete function Json::Reader --- src/system/helpers-json.h | 31 ++++++++++++++++++++++++ src/system/helpers.cpp | 50 +++++++++++++++++++++++++++++++++++++++ src/system/helpers.h | 2 ++ 3 files changed, 83 insertions(+) create mode 100644 src/system/helpers-json.h 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 cc0f01325..d47485a62 100644 --- a/src/system/helpers.cpp +++ b/src/system/helpers.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include "debug.h" @@ -49,6 +50,7 @@ #include //#include #include +#include #include #include #define MD5_DIGEST_LENGTH 16 @@ -1445,3 +1447,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 7bd7afb2d..910f9ea3c 100644 --- a/src/system/helpers.h +++ b/src/system/helpers.h @@ -152,4 +152,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 From 25ae9295231f1bcdb6c1819eec93b1feb2626685 Mon Sep 17 00:00:00 2001 From: "M. Liebmann" Date: Tue, 19 Sep 2017 21:39:59 +0200 Subject: [PATCH 3/3] Use parseJsonFromString() for parsing json data in - CMoviePlayerGui::luaGetUrl() - CTimerList::RemoteBoxChanExists() - CTimerList::RemoteBoxTimerList() - CTimerList::paintItem() - cTmdb::GetMovieDetails() - cYTFeedParser::parseFeedJSON() - cYTFeedParser::parseFeedDetailsJSON() --- src/gui/movieplayer.cpp | 9 +++++---- src/gui/timerlist.cpp | 28 +++++++++++++--------------- src/gui/tmdb.cpp | 16 +++++++++------- src/system/ytparser.cpp | 16 +++++++++------- 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/gui/movieplayer.cpp b/src/gui/movieplayer.cpp index 22f7d892c..ab5b69b3f 100644 --- a/src/gui/movieplayer.cpp +++ b/src/gui/movieplayer.cpp @@ -59,6 +59,7 @@ #include #include #include +#include #include @@ -814,12 +815,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 a0e33df98..4d2baf318 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -69,6 +69,7 @@ #include #include #include +#include #include #include @@ -738,16 +739,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); @@ -796,13 +796,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; @@ -1286,13 +1285,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/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) {