Move all nlohmann::json to json_helper.cpp
authorMarcus Fritzsch <marcus_fritzsch@mentor.com>
Thu, 6 Jul 2017 09:32:50 +0000 (11:32 +0200)
committerMarcus Fritzsch <marcus_fritzsch@mentor.com>
Tue, 8 Aug 2017 15:24:00 +0000 (17:24 +0200)
Signed-off-by: Marcus Fritzsch <marcus_fritzsch@mentor.com>
src/CMakeLists.txt
src/json_helper.cpp [new file with mode: 0644]
src/json_helper.hpp [new file with mode: 0644]
src/main.cpp
src/wayland.hpp

index 4a0eafe..17796be 100644 (file)
@@ -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 (file)
index 0000000..823c030
--- /dev/null
@@ -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 (file)
index 0000000..4a536d3
--- /dev/null
@@ -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
index 1ac26f1..a2331c4 100644 (file)
@@ -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[] = {
index 4865e42..7e005f1 100644 (file)
@@ -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;