summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcus Fritzsch <marcus_fritzsch@mentor.com>2017-07-06 11:32:50 +0200
committerMarcus Fritzsch <marcus_fritzsch@mentor.com>2017-08-08 17:24:00 +0200
commit9dfa6b9427115e7402ce25e40e4d78b20d559c93 (patch)
treea790ce4ce7b15930c1550c5b08bc51930dd75dbc
parentba5360ac03286364abd9fde6b500e2c0fabe56b1 (diff)
Move all nlohmann::json to json_helper.cpp
Signed-off-by: Marcus Fritzsch <marcus_fritzsch@mentor.com>
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/json_helper.cpp72
-rw-r--r--src/json_helper.hpp16
-rw-r--r--src/main.cpp65
-rw-r--r--src/wayland.hpp20
5 files changed, 114 insertions, 61 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4a0eafe..17796be 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -13,7 +13,7 @@ add_library(winman MODULE
wayland.hpp
util.cpp
util.hpp
- ${IVI_CON_PROTO})
+ ${IVI_CON_PROTO} json_helper.cpp json_helper.hpp)
target_include_directories(winman
PRIVATE
diff --git a/src/json_helper.cpp b/src/json_helper.cpp
new file mode 100644
index 0000000..823c030
--- /dev/null
+++ b/src/json_helper.cpp
@@ -0,0 +1,72 @@
+#include "json_helper.hpp"
+
+#include <json.h>
+
+#include <json.hpp>
+
+using json = nlohmann::json;
+
+template <typename T>
+json_object *to_json_(T const *s) {
+ auto j = json::object({
+ {"id", s->id},
+ {"size", {{"width", s->size.w}, {"height", s->size.h}}},
+ {"dst",
+ {{"width", s->dst_rect.w},
+ {"height", s->dst_rect.h},
+ {"x", s->dst_rect.x},
+ {"y", s->dst_rect.y}}},
+ {"src",
+ {{"width", s->src_rect.w},
+ {"height", s->src_rect.h},
+ {"x", s->src_rect.x},
+ {"y", s->src_rect.y}}},
+ {"visibility", s->visibility},
+ {"opacity", s->opacity},
+ {"orientation", s->orientation},
+ });
+ return json_tokener_parse(j.dump().c_str());
+}
+
+json_object *to_json(genivi::surface const *s) { return to_json_(s); }
+
+json_object *to_json(genivi::layer const *l) { return to_json_(l); }
+
+json_object *to_json(genivi::screen const *s) {
+ auto o = json_object_new_object();
+ json_object_object_add(o, "id", json_object_new_int(s->id));
+ return o;
+}
+
+template <typename T>
+json_object *to_json_(T const &s) {
+ auto a = json_object_new_array();
+
+ if (!s.empty()) {
+ for (auto const &i : s) {
+ json_object_array_add(a, to_json(i.second.get()));
+ }
+ }
+
+ return a;
+}
+
+json_object *to_json(genivi::controller::surface_map_type const &s) {
+ return to_json_(s);
+}
+
+json_object *to_json(genivi::controller::layer_map_type const &l) {
+ return to_json_(l);
+}
+
+json_object *to_json(genivi::controller::screen_map_type const &s) {
+ return to_json_(s);
+}
+
+json_object *to_json(std::vector<uint32_t> const &v) {
+ auto a = json_object_new_array();
+ for (const auto i : v) {
+ json_object_array_add(a, json_object_new_int(i));
+ }
+ return a;
+}
diff --git a/src/json_helper.hpp b/src/json_helper.hpp
new file mode 100644
index 0000000..4a536d3
--- /dev/null
+++ b/src/json_helper.hpp
@@ -0,0 +1,16 @@
+#ifndef TMCAGLWM_JSON_HELPER_HPP
+#define TMCAGLWM_JSON_HELPER_HPP
+
+#include "wayland.hpp"
+
+struct json_object;
+
+json_object *to_json(genivi::surface const *s);
+json_object *to_json(genivi::layer const *l);
+json_object *to_json(genivi::screen const *s);
+json_object *to_json(genivi::controller::surface_map_type const &s);
+json_object *to_json(genivi::controller::layer_map_type const &l);
+json_object *to_json(genivi::controller::screen_map_type const &s);
+json_object *to_json(std::vector<uint32_t> const &v);
+
+#endif // TMCAGLWM_JSON_HELPER_HPP
diff --git a/src/main.cpp b/src/main.cpp
index 1ac26f1..a2331c4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,3 +1,4 @@
+#include "json_helper.hpp"
#include "util.hpp"
#include "wayland.hpp"
@@ -11,8 +12,6 @@ extern "C" {
#include <systemd/sd-event.h>
}
-#include <json.hpp>
-
namespace {
struct wayland {
std::unique_ptr<wl::display> display;
@@ -178,8 +177,7 @@ int binding_init_() {
g_wayland->display->get_fd(), EPOLLIN,
display_event_callback, g_wayland);
if (ret < 0) {
- AFB_ERROR("Could not initialize wayland event handler: %s",
- std::strerror(-ret));
+ AFB_ERROR("Could not initialize wayland event handler: %d", -ret);
goto error;
}
}
@@ -224,67 +222,26 @@ void debug_status(struct afb_req req) noexcept {
CHECK_WAYLAND();
- try {
- using json = nlohmann::json;
-
- json j;
-
- if (!g_wayland->controller->surfaces.empty()) {
- auto a = json::array();
- for (auto const &i : g_wayland->controller->surfaces) {
- auto const &r = i.second->dst_rect;
- auto const &s = i.second->size;
- a.push_back({{"id", i.first},
- {"size", {s.w, s.h}},
- {"dst_rect", {r.w, r.h, r.x, r.y}}});
- }
- j["surfaces"] = a;
- }
-
- if (!g_wayland->controller->layers.empty()) {
- auto a = json::array();
- for (auto const &i : g_wayland->controller->layers) {
- auto const &r = i.second->dst_rect;
- auto const &s = i.second->size;
- a.push_back({{"id", i.first},
- {"size", {s.w, s.h}},
- {"dst_rect", {r.w, r.h, r.x, r.y}}});
- }
- j["layers"] = a;
- }
+ auto o = json_object_new_object();
+ json_object_object_add(o, "surfaces",
+ to_json(g_wayland->controller->surfaces));
+ json_object_object_add(o, "layers", to_json(g_wayland->controller->layers));
+ json_object_object_add(o, "screens",
+ to_json(g_wayland->controller->screens));
- afb_req_success(req, json_tokener_parse(j.dump().c_str()), "status");
- } catch (std::exception &e) {
- afb_req_fail_f(req, "failed", "Uncaught exception: %s", e.what());
- }
+ afb_req_success(req, o, "status");
}
void debug_surfaces(afb_req req) noexcept {
CHECK_WAYLAND();
- auto a = json_object_new_array();
-
- if (!g_wayland->controller->surfaces.empty()) {
- for (auto const &i : g_wayland->controller->surfaces) {
- json_object_array_add(a, json_object_new_int(i.first));
- }
- }
-
- afb_req_success(req, a, "surfaces");
+ afb_req_success(req, to_json(g_wayland->controller->surfaces), "surfaces");
}
void debug_layers(afb_req req) noexcept {
CHECK_WAYLAND();
- auto a = json_object_new_array();
-
- if (!g_wayland->controller->layers.empty()) {
- for (auto const &i : g_wayland->controller->layers) {
- json_object_array_add(a, json_object_new_int(i.first));
- }
- }
-
- afb_req_success(req, a, "surfaces");
+ afb_req_success(req, to_json(g_wayland->controller->layers), "layers");
}
const struct afb_verb_v2 verbs[] = {
diff --git a/src/wayland.hpp b/src/wayland.hpp
index 4865e42..7e005f1 100644
--- a/src/wayland.hpp
+++ b/src/wayland.hpp
@@ -228,6 +228,14 @@ struct screen : public wayland_proxy<struct ivi_controller_screen>,
// \___\___/|_| |_|\__|_| \___/|_|_|\___|_|
//
struct controller : public wayland_proxy<struct ivi_controller> {
+ typedef std::unordered_map<uintptr_t, uint32_t> proxy_to_id_map_type;
+ typedef std::unordered_map<uint32_t, std::unique_ptr<struct surface>>
+ surface_map_type;
+ typedef std::unordered_map<uint32_t, std::unique_ptr<struct layer>>
+ layer_map_type;
+ typedef std::unordered_map<uint32_t, std::unique_ptr<struct screen>>
+ screen_map_type;
+
// HACK:
// The order of these member is mandatory, as when objects are destroyed
// they will call their parent (that's us right here!) and remove their
@@ -235,13 +243,13 @@ struct controller : public wayland_proxy<struct ivi_controller> {
// when the surfaces/layers/screens maps are destroyed. This sucks, but
// I cannot see a better solution w/o globals or some other horrible
// call-our-parent construct.
- std::unordered_map<uintptr_t, uint32_t> surface_proxy_to_id;
- std::unordered_map<uintptr_t, uint32_t> layer_proxy_to_id;
- std::unordered_map<uintptr_t, uint32_t> screen_proxy_to_id;
+ proxy_to_id_map_type surface_proxy_to_id;
+ proxy_to_id_map_type layer_proxy_to_id;
+ proxy_to_id_map_type screen_proxy_to_id;
- std::unordered_map<uint32_t, std::unique_ptr<struct surface>> surfaces;
- std::unordered_map<uint32_t, std::unique_ptr<struct layer>> layers;
- std::unordered_map<uint32_t, std::unique_ptr<struct screen>> screens;
+ surface_map_type surfaces;
+ layer_map_type layers;
+ screen_map_type screens;
typedef std::pair<char const *, std::function<void(struct controller *)>>
name_task_pair;