Add configuration file over-ride mechanism 05/18605/2
authorScott Murray <scott.murray@konsulko.com>
Thu, 6 Dec 2018 15:05:47 +0000 (10:05 -0500)
committerScott Murray <scott.murray@konsulko.com>
Fri, 7 Dec 2018 14:15:24 +0000 (09:15 -0500)
Reusing the windowmanager on the cluster demo platform requires
modifications to the layers.json, areas.db, etc. configuration files.
To allow this without breaking potential shared package feeds by
building two versions, add a mechanism to allow over-riding the
configuration files present in the widget with files in the directory
/etc/xdg/windowmanager.  Affected code has been refactored to use a new
common configuration file path determination helper function to reduce
duplication.

Bug-AGL: SPEC-1805

Change-Id: Ia3e1af0703794079f9537b934b124788129c045c
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
doc/ApplicationGuide.md
policy_manager/CMakeLists.txt
policy_manager/policy_manager.cpp
src/layers.cpp
src/util.cpp
src/util.hpp
src/window_manager.cpp
src/window_manager.hpp

index 2240bb1..3470243 100644 (file)
@@ -144,7 +144,9 @@ Configuration
 
 The window manager is configured with the *layers.json* configuration
 file, by default it is searched in `${AFM_APP_INSTALL_DIR}/etc/layers.json`.
-Note, that the window manager will use default configuration unless this configuration is found.
+However, if /etc/xdg/windowmanager/layers.json exists, it will be used instead.
+The window manager will use a default configuration unless a configuration file
+is found in one of these locations.
 
 A sample configuration is provided with the window manager
 implementation, this sample is installed to ${AFM_APP_INSTALL_DIR}/etc/layers.json.
index 584d311..3ec4c39 100644 (file)
@@ -45,6 +45,7 @@ add_library(${TARGETS_PM}
     SHARED
         policy_manager.cpp
         stm/stm.c
+        ../src/util.cpp
 )
 
 target_include_directories(${TARGETS_PM}
index c7bb007..f3d0d4d 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2018 Konsulko Group
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +23,7 @@
 #include <algorithm>
 #include <json-c/json.h>
 #include "policy_manager.hpp"
+#include "util.hpp"
 #include "hmi-debug.h"
 
 extern "C"
@@ -729,20 +731,7 @@ int PolicyManager::setStateTransitionProcessToSystemd(int event_id, uint64_t del
 
 int PolicyManager::loadRoleDb()
 {
-    std::string file_name;
-
-    // Get afm application installed dir
-    char const *afm_app_install_dir = getenv("AFM_APP_INSTALL_DIR");
-    HMI_DEBUG("wm:pm", "afm_app_install_dir:%s", afm_app_install_dir);
-
-    if (!afm_app_install_dir)
-    {
-        HMI_ERROR("wm:pm", "AFM_APP_INSTALL_DIR is not defined");
-    }
-    else
-    {
-        file_name = std::string(afm_app_install_dir) + std::string("/etc/roles.db");
-    }
+    std::string file_name(get_file_path("roles.db", "wm:pm"));
 
     // Load roles.db
     json_object *json_obj;
@@ -832,19 +821,7 @@ int PolicyManager::loadStateDb()
 {
     HMI_DEBUG("wm:pm", "Call");
 
-    // Get afm application installed dir
-    char const *afm_app_install_dir = getenv("AFM_APP_INSTALL_DIR");
-    HMI_DEBUG("wm:pm", "afm_app_install_dir:%s", afm_app_install_dir);
-
-    std::string file_name;
-    if (!afm_app_install_dir)
-    {
-        HMI_ERROR("wm:pm", "AFM_APP_INSTALL_DIR is not defined");
-    }
-    else
-    {
-        file_name = std::string(afm_app_install_dir) + std::string("/etc/states.db");
-    }
+    std::string file_name(get_file_path("states.db", "wm:pm"));
 
     // Load states.db
     json_object *json_obj;
index bbe7c09..21d975d 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2018 Konsulko Group
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +19,7 @@
 
 #include "layers.hpp"
 #include "json_helper.hpp"
+#include "util.hpp"
 #include "hmi-debug.h"
 
 namespace wm
@@ -210,19 +212,7 @@ int layer_map::loadAreaDb()
 {
     HMI_DEBUG("wm:lm", "Call");
 
-    // Get afm application installed dir
-    char const *afm_app_install_dir = getenv("AFM_APP_INSTALL_DIR");
-    HMI_DEBUG("wm:lm", "afm_app_install_dir:%s", afm_app_install_dir);
-
-    std::string file_name;
-    if (!afm_app_install_dir)
-    {
-        HMI_ERROR("wm:lm", "AFM_APP_INSTALL_DIR is not defined");
-    }
-    else
-    {
-        file_name = std::string(afm_app_install_dir) + std::string("/etc/areas.db");
-    }
+    std::string file_name(get_file_path("areas.db"));
 
     // Load area.db
     json_object *json_obj;
index 672b089..e4cc2ef 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2018 Konsulko Group
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <cstdio>
 #include <cstdlib>
 #include <ctime>
+#include <fstream>
 
 #include <unistd.h>
 
+#include "hmi-debug.h"
+
 #ifdef SCOPE_TRACING
 thread_local int ScopeTrace::indent = 0;
 ScopeTrace::ScopeTrace(char const *func) : f(func)
@@ -93,3 +97,36 @@ void rectangle::set_aspect(double ratio)
     }
 }
 
+std::string get_file_path(const char *file_name, const char *log_category)
+{
+    char const *default_base_path = getenv("AFM_APP_INSTALL_DIR");
+    std::string path("");
+
+    if(!file_name) {
+        return path;
+    }
+
+    if (!default_base_path)
+    {
+        HMI_ERROR(log_category, "AFM_APP_INSTALL_DIR is not defined");
+    }
+    else
+    {
+        path = default_base_path;
+        path.append("/etc/");
+        path.append(file_name);
+    }
+
+    // Check for over-ride in /etc/xdg/windowmanager
+    std::string override_path("/etc/xdg/windowmanager/");
+    override_path.append(file_name);
+    std::ifstream i(override_path);
+    if (i.good())
+    {
+        path = override_path;
+    }
+    i.close();
+
+    HMI_INFO(log_category, "Using %s", path.c_str());
+    return path;
+}
index 2f17845..8782353 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2018 Konsulko Group
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <functional>
 #include <thread>
 #include <vector>
+#include <string>
 
 #include <sys/poll.h>
 
-#ifndef DO_NOT_USE_AFB
-extern "C"
-{
-#include <afb/afb-binding.h>
-};
-#endif
-
 #define CONCAT_(X, Y) X##Y
 #define CONCAT(X, Y) CONCAT_(X, Y)
 
@@ -163,4 +158,7 @@ class rectangle
     long _bottom;
 };
 
+// Configuration file path helper
+std::string get_file_path(const char *file_name, const char *log_category = "wm");
+
 #endif // !WM_UTIL_HPP
index 42930dc..e9cc53a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2018 Konsulko Group
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +20,7 @@
 
 #include "window_manager.hpp"
 #include "json_helper.hpp"
+#include "util.hpp"
 #include "applist.hpp"
 
 extern "C"
@@ -123,17 +125,7 @@ WindowManager::WindowManager(wl::display *d)
       id_alloc{},
       pending_events(false)
 {
-    char const *path_layers_json = getenv("AFM_APP_INSTALL_DIR");
-    std::string path;
-    if (!path_layers_json)
-    {
-        HMI_ERROR("wm", "AFM_APP_INSTALL_DIR is not defined");
-        path = std::string(path_layers_json);
-    }
-    else
-    {
-        path = std::string(path_layers_json) + std::string("/etc/layers.json");
-    }
+    std::string path(get_file_path("layers.json"));
 
     try
     {
@@ -1371,19 +1363,7 @@ const char* WindowManager::convertRoleOldToNew(char const *old_role)
 
 int WindowManager::loadOldRoleDb()
 {
-    // Get afm application installed dir
-    char const *afm_app_install_dir = getenv("AFM_APP_INSTALL_DIR");
-    HMI_DEBUG("wm", "afm_app_install_dir:%s", afm_app_install_dir);
-
-    std::string file_name;
-    if (!afm_app_install_dir)
-    {
-        HMI_ERROR("wm", "AFM_APP_INSTALL_DIR is not defined");
-    }
-    else
-    {
-        file_name = std::string(afm_app_install_dir) + std::string("/etc/old_roles.db");
-    }
+    std::string file_name(get_file_path("old_roles.db"));
 
     // Load old_role.db
     json_object* json_obj;
index 6cbd355..967a87a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2018 Konsulko Group
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include "hmi-debug.h"
 #include "request.hpp"
 #include "wm_error.hpp"
+extern "C" 
+{ 
+#include <afb/afb-binding.h> 
+} 
 
 struct json_object;