+#include "vlp/config.h"
+
+#include <cstring>
+
+namespace loglan {
+namespace vlp {
+
+Config::Config()
+{
+ config_init(&cfg);
+ file = NULL;
+}
+
+Config::~Config()
+{
+ config_destroy(&cfg);
+ if (file) {
+ fclose(file);
+ file = NULL;
+ }
+}
+
+bool Config::load(const char * configFilePath)
+{
+ file = fopen(configFilePath, "rt");
+ if (!file) {
+ fprintf(stderr,
+ "Error: Cannot load configuration file: %s!\n",
+ configFilePath
+ );
+ return false;
+ }
+
+ if (!config_read(&cfg, file)) {
+ fprintf(stderr,
+ "%s! In file %s, line %d\n",
+ config_error_text(&cfg),
+ config_error_file(&cfg),
+ config_error_line(&cfg));
+ return false;
+ }
+
+ return true;
+}
+
+bool Config::save(const char * configFilePath)
+{
+ return false;
+}
+
+int Config::getNodeNumber()
+{
+ config_setting_t *setting = config_lookup(&cfg, "node_number");
+
+ if (!setting) {
+ fprintf(stderr,
+ "%s! In file %s, '%s' was not found.\n",
+ "Warning",
+ config_error_file(&cfg),
+ "node_number"
+ );
+
+ throw;
+ }
+
+ return config_setting_get_int(setting);
+}
+void Config::setNodeNumber(int nodeNumber)
+{
+}
+
+std::vector<std::string> Config::getHosts()
+{
+ config_setting_t *setting = config_lookup(&cfg, "host");
+ std::vector<std::string> hosts;
+
+ if (!setting) {
+ fprintf(stderr,
+ "%s! In file %s, '%s' was not found.\n",
+ "Warning",
+ "configuration",//config_error_file(&cfg),
+ "host"
+ );
+
+ return hosts;
+ }
+
+ switch(config_setting_type(setting)) {
+ /* TODO: Deprecated. Made for back compatibility. */
+ case CONFIG_TYPE_STRING: {
+ std::string host(config_setting_get_string(setting));
+ hosts.push_back(host);
+ break;
+ }
+ case CONFIG_TYPE_ARRAY: {
+ int size = config_setting_length(setting);
+ std::string host;
+ for (int i = 0; i < size; i++) {
+ host = config_setting_get_string_elem(setting, i);
+ hosts.push_back(host);
+ }
+ break;
+ }
+ default:
+ fprintf(stderr,
+ "%s! In file %s, bad entry type for %s will not be read.\n",
+ "Warning",
+ "configuration",//config_error_file(&cfg),
+ "host"
+ );
+ }
+
+ return hosts;
+}
+
+ConnectionType Config::getConnectionType()
+{
+ config_setting_t *setting = config_lookup(&cfg, "type");
+
+ if (!setting) {
+ fprintf(stderr,
+ "%s! In file %s, '%s' was not found.\n",
+ "Warning",
+ "configuration",//config_error_file(&cfg),
+ "type"
+ );
+
+ throw;
+ }
+
+ /* same as strcmp(..) == 0 */
+ if (!strcmp(config_setting_get_string(setting), "explicit")) {
+ return EXPLICIT;
+ }
+
+ return REGISTER;
+}
+void Config::setConnectionType(ConnectionType type)
+{
+}
+
+const char * Config::getProgramDir()
+{
+ config_setting_t *setting = config_lookup(&cfg, "progdir");
+
+ if (!setting) {
+ fprintf(stderr,
+ "%s! In file %s, '%s' was not found.\n",
+ "Warning",
+ "configuration",//config_error_file(&cfg),
+ "progdir"
+ );
+ }
+
+ return config_setting_get_string(setting);
+}
+void Config::setProgramDir(const char * programDir)
+{
+}
+
+}
+}
\ No newline at end of file