]> git.vomp.tv Git - vompclient.git/blob - config.cc
Fix argv/config daemonize and logging options
[vompclient.git] / config.cc
1 #include <iostream>
2 #include <string>
3 #include <fstream>
4 #include <streambuf>
5
6 // http://open-source-parsers.github.io/jsoncpp-docs/doxygen/namespacemembers.html
7
8
9 #include "config.h"
10
11 Config* Config::instance = NULL;
12
13 Config::Config()
14 : jconfigro(jconfig)
15 {
16   instance = this;
17   applyDefaults();
18 }
19
20 Config::~Config()
21 {
22   instance = NULL;
23 }
24
25 Config* Config::getInstance()
26 {
27   return instance;
28 }
29
30 void Config::applyDefaults()
31 {
32   // Insert the value only if it doesn't already exist
33   auto insertBool   = [&] (const char* s, const char* k, bool v)        { if (jconfig[s][k].isNull()) jconfig[s][k] = v; };
34   auto insertString = [&] (const char* s, const char* k, const char* v) { if (jconfig[s][k].isNull()) jconfig[s][k] = v; };
35
36   insertBool("main", "daemonize", true);
37
38   insertBool("log", "enabled", false);
39   insertString("log", "filename", "stdout");
40   insertString("log", "level", "debug");
41
42   #ifdef VOMP_PLATFORM_RASPBERRY
43   insertBool("input", "mod_cec_enabled", true);
44   #else
45   insertBool("input", "mod_cec_enabled", false);
46   #endif
47
48   insertBool("input", "mod_udp_enabled", true);
49   insertBool("input", "mod_lirc_enabled", false);
50 }
51
52 bool Config::loadFile()
53 {
54   jconfig.clear();
55
56   std::ifstream configFile("config.json");
57
58   Json::CharReaderBuilder builder;
59   builder["collectComments"] = false;
60   builder["allowTrailingCommas"] = true; // FIXME
61   std::string errs;
62
63   bool ok = Json::parseFromStream(builder, configFile, &jconfig, &errs);
64   if (!ok)
65   {
66     std::cout << errs << std::endl;
67     return false;
68   }
69
70   applyDefaults();
71   return true;
72 }
73
74 bool Config::getString(const std::string& section, const std::string& key, std::string& out) const
75 {
76   Json::Value v = jconfigro[section][key];
77   if (!v.isString()) return false;
78   out = v.asString();
79   return true;
80 }
81
82 bool Config::getInt(const std::string& section, const std::string& key, int& out) const
83 {
84   Json::Value v = jconfigro[section][key];
85   if (!v.isInt64()) return false;
86   out = v.asInt64();
87   return true;
88 }
89
90 bool Config::getBool(const std::string& section, const std::string& key, bool& out) const
91 {
92   Json::Value v = jconfigro[section][key];
93   if (!v.isBool()) return false;
94   out = v.asBool();
95   return true;
96 }
97 /*
98 bool Config::getBool(const char* section, const char* key, bool& out) const
99 {
100   Json::Value v = jconfigro[section][key];
101   if (!v.isBool()) return false;
102   out = v.asBool();
103   return true;
104 }*/
105
106 void Config::dump() const
107 {
108   std::cout << jconfigro << std::endl;
109 }
110
111 bool Config::foreachInArray(const std::string& section, const std::string& key, std::function<void(const std::string&)> callback) const
112 {
113   const Json::Value& v = jconfigro[section][key];
114   if (!v.isArray()) return false;
115
116   for(Json::Value::const_iterator i = v.begin(); i != v.end(); i++)
117   {
118     const Json::Value& jv = *i;
119     if (jv.isString())
120       callback(jv.asString());
121   }
122
123   return true;
124 }
125
126 bool Config::foreachPairInObject(const std::string& section, const std::string& key, std::function<void(const std::string&, const std::string&)> callback) const
127 {
128   const Json::Value& v = jconfigro[section][key];
129   if (!v.isObject()) return false;
130
131   for(Json::Value::const_iterator i = v.begin(); i != v.end(); i++)
132   {
133     const Json::Value& jv = *i;
134     if (jv.isString())
135       callback(i.key().asString(), jv.asString());
136   }
137
138   return true;
139 }
140
141 void Config::set(const std::string& section, const std::string& key, const std::string& value)
142 {
143   jconfig[section][key] = value;
144 }
145
146 void Config::set(const std::string& section, const std::string& key, bool value)
147 {
148   jconfig[section][key] = value;
149 }
150
151 void Config::set(const std::string& section, const std::string& key, const char* value)
152 {
153   jconfig[section][key] = value;
154 }