From: Marcus Fritzsch Date: Tue, 25 Jul 2017 11:03:47 +0000 (+0200) Subject: app: propagate errors from layout parsing, more thorough checking X-Git-Tag: 4.99.1~236 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=95ccbb9f965e2b04ec13ee9ed6d6fb60ef8feb33;p=staging%2Fwindowmanager.git app: propagate errors from layout parsing, more thorough checking Signed-off-by: Marcus Fritzsch --- diff --git a/src/app.cpp b/src/app.cpp index ee3a600..00a8211 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -21,9 +21,12 @@ namespace wm { #ifndef NDEBUG -#define DB(expr) \ - std::cerr << __FILE__ << ":" << __LINE__ << ":" << __func__ << ": " << expr \ - << "\n" +#define DB(expr) \ + do { \ + std::ostringstream o; \ + o << __FILE__ << ":" << __LINE__ << ":" << __func__ << ": " << expr; \ + logdebug(o.str().c_str()); \ + } while (0) #else #define DB(expr) #endif @@ -36,49 +39,56 @@ using json = nlohmann::json; // We ned to manually unwrap numbers template result get(json const &j) { + DB(j); T r; std::istringstream s(j.get()); s >> r; - return s.fail() ? Err("Could not read int") : Ok(r); + return !s.eof() || s.fail() ? Err("Could not read int") : Ok(r); } struct wm::area area_from_json(json const &j) { + DB(j); return wm::area{ j["name"].get(), { - get(j["width"]).unwrap(), - get(j["height"]).unwrap(), - get(j["x"]).unwrap(), - get(j["y"]).unwrap(), + get(j["width"]), + get(j["height"]), + get(j["x"]), + get(j["y"]), }, - get(j["zorder"]).unwrap(), + get(j["zorder"]), }; } -struct layout layout_from_json(json const &j) { +result layout_from_json(json const &j) { + DB(j); auto &ja = j["areas"]; auto l = wm::layout{j["name"].get(), uint32_t(ja.size()), {}}; + if (ja.size() > layout::MAX_N_AREAS) { + return Err("Invalid number of areas in layout"); + } + logdebug("Loading layout '%s' with %u areas", l.name.c_str(), unsigned(ja.size())); std::transform(std::cbegin(ja), std::cend(ja), std::begin(l.areas), area_from_json); - return l; + return Ok(l); } struct result load_layout(char const *filename) { + DB("loading layout from " << filename); + json jlayouts; std::ifstream i(filename); i >> jlayouts; - size_t nlayouts = jlayouts.size(); - auto layouts = layouts_type(nlayouts); - + auto layouts = layouts_type(); std::transform(std::cbegin(jlayouts), std::cend(jlayouts), - std::begin(layouts), layout_from_json); + std::back_inserter(layouts), layout_from_json); return Ok(layouts); } @@ -94,6 +104,11 @@ App::App(wl::display *d) // layouts(load_layout("../layout.json").unwrap()) { assert(g_app == nullptr); g_app = this; + + auto l = load_layout("../layout.json"); + if (l.is_err()) { + DB("Could not load layout: " << l.unwrap_err()); + } } App::~App() { g_app = nullptr; }