Separate class for handling configuration file
[vlp.git] / src / global / vlp / config.cpp
1 #include "vlp/config.h"
2
3 #include <cstring>
4
5 namespace loglan {
6 namespace vlp {
7
8 Config::Config()
9 {
10         config_init(&cfg);
11         file = NULL;
12 }
13
14 Config::~Config()
15 {
16         config_destroy(&cfg);
17         if (file) {
18                 fclose(file);
19                 file = NULL;
20         }
21 }
22
23 bool Config::load(const char * configFilePath)
24 {
25         file = fopen(configFilePath, "rt");
26         if (!file) {
27                 fprintf(stderr,
28                         "Error: Cannot load configuration file: %s!\n",
29                         configFilePath
30                 );
31                 return false;
32         }
33         
34         if (!config_read(&cfg, file)) {
35                 fprintf(stderr,
36                         "%s! In file %s, line %d\n",
37                         config_error_text(&cfg),
38                         config_error_file(&cfg),
39                         config_error_line(&cfg));
40                 return false;
41         }
42
43         return true;
44 }
45
46 bool Config::save(const char * configFilePath)
47 {
48         return false;
49 }
50
51 int Config::getNodeNumber()
52 {
53         config_setting_t *setting = config_lookup(&cfg, "node_number");
54
55         if (!setting) {
56                 fprintf(stderr,
57                         "%s! In file %s, '%s' was not found.\n",
58                         "Warning",
59                         config_error_file(&cfg),
60                         "node_number"
61                 );
62
63                 throw;
64         }
65
66         return config_setting_get_int(setting);
67 }
68 void Config::setNodeNumber(int nodeNumber)
69 {
70 }
71
72 std::vector<std::string> Config::getHosts()
73 {
74         config_setting_t *setting = config_lookup(&cfg, "host");
75         std::vector<std::string> hosts;
76
77         if (!setting) {
78                 fprintf(stderr,
79                         "%s! In file %s, '%s' was not found.\n", 
80                         "Warning",
81                         "configuration",//config_error_file(&cfg),
82                         "host"
83                 );
84
85                 return hosts;
86         }
87
88         switch(config_setting_type(setting)) {
89         /* TODO: Deprecated. Made for back compatibility. */
90         case CONFIG_TYPE_STRING: {
91                 std::string host(config_setting_get_string(setting));
92                 hosts.push_back(host);
93                 break;
94         }
95         case CONFIG_TYPE_ARRAY: {
96                 int size = config_setting_length(setting);
97                 std::string host;
98                 for (int i = 0; i < size; i++) {
99                         host = config_setting_get_string_elem(setting, i);
100                         hosts.push_back(host);
101                 }
102                 break;
103         }
104         default:
105                 fprintf(stderr,
106                         "%s! In file %s, bad entry type for %s will not be read.\n",
107                         "Warning",
108                         "configuration",//config_error_file(&cfg),
109                         "host"
110                 );
111         }
112
113         return hosts;
114 }
115
116 ConnectionType Config::getConnectionType()
117 {
118         config_setting_t *setting = config_lookup(&cfg, "type");
119
120         if (!setting) {
121                 fprintf(stderr,
122                         "%s! In file %s, '%s' was not found.\n",
123                         "Warning",
124                         "configuration",//config_error_file(&cfg),
125                         "type"
126                 );
127
128                 throw;
129         }
130
131         /* same as strcmp(..) == 0 */
132         if (!strcmp(config_setting_get_string(setting), "explicit")) {
133                 return EXPLICIT;
134         }
135
136         return REGISTER;
137 }
138 void Config::setConnectionType(ConnectionType type)
139 {
140 }
141
142 const char * Config::getProgramDir()
143 {
144         config_setting_t *setting = config_lookup(&cfg, "progdir");
145
146         if (!setting) {
147                 fprintf(stderr,
148                         "%s! In file %s, '%s' was not found.\n",
149                         "Warning",
150                         "configuration",//config_error_file(&cfg),
151                         "progdir"
152                 );
153         }
154
155         return config_setting_get_string(setting);
156 }
157 void Config::setProgramDir(const char * programDir)
158 {
159 }
160
161 }
162 }