5830ca02b94c05d59802f75ac5a6ba0124453799
[vlp.git] / src / kernel / options.cpp
1 #include <QtGui/QDialog>
2 #include <libconfig.h>
3
4 #include "vlp/config.h"
5 #include "options.h"
6
7 OptionsDialog::OptionsDialog(QString configFilePath, QWidget * parent)
8         : QDialog(parent)
9 {
10         setupUi(this);
11         
12         connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
13         connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
14         
15         loadConfig(configFilePath.toStdString().c_str());
16 }
17
18 OptionsDialog::~OptionsDialog()
19 {
20 }
21
22 /**
23  * Adds IP address to the configuration.
24  * Additional window is displayed to add address to the list
25  */
26 void OptionsDialog::on_addConnectionButton_clicked()
27 {
28         QDialog d(this, Qt::Dialog);
29         QLabel lab("IP Address:", &d);
30         QLineEdit ed("", &d);
31         QPushButton ob("", &d);
32         QPushButton cb("", &d);
33
34         if (connections) {
35                 ob.setGeometry(30, 60, 80, 30);
36                 ob.setText("Ok");
37                 ob.setDefault(TRUE);
38                 lab.setGeometry(10, 10, 60, 30);
39                 lab.setText("Address");
40                 ed.setGeometry(70, 10, 140, 30);
41                 cb.setGeometry(130, 60, 80, 30);
42                 cb.setText("Cancel");
43                 d.resize(240, 100);
44                 connect(&ob, SIGNAL(clicked()), &d, SLOT(accept()));
45                 connect(&cb, SIGNAL(clicked()), &d, SLOT(reject())); 
46                 if (d.exec())
47                         if (strcmp(ed.text().toAscii().data(), "") != 0) {
48                                 connections->addItem(ed.text());
49                         }
50         }
51 }
52
53 /**
54  * Deletes current address from available connections.
55  */
56 void OptionsDialog::on_delConnectionButton_clicked()
57 {
58         if (connections->currentRow() != -1) {
59                 connections->takeItem(connections->currentRow());
60         }
61 }
62
63 /**
64  * Loads configuration from the given file.
65  *
66  * @see QKernel::LoadConfig
67  *
68  * @param fname Filename of the configuration file.
69  */
70 void OptionsDialog::loadConfig(const char * fname)
71 {
72         loglan::vlp::Config config;
73         config.load(fname);
74
75         nodeNumber->setValue(config.getNodeNumber());
76         switch(config.getConnectionType()) {
77         case loglan::vlp::EXPLICIT:
78                 explicitConnectionMode->setEnabled(true);
79                 registrationConnectionMode->setDisabled(true);
80                 break;
81         case loglan::vlp::REGISTER:
82                 registrationConnectionMode->setEnabled(true);
83                 explicitConnectionMode->setDisabled(true);
84                 break;
85         }
86
87         for (auto host : config.getHosts()) {
88                 connections->addItem(host.c_str());
89         }
90
91         programsDirectory->setText(config.getProgramDir());
92 }
93
94 void OptionsDialog::saveConfig(QString fname)
95 {
96         saveConfig(fname.toStdString().c_str());
97 }
98
99 void OptionsDialog::saveConfig(const char * fname)
100 {
101         config_t cfg;
102         config_setting_t *root;
103         config_setting_t *setting;
104         config_init(&cfg);
105
106         root = config_root_setting(&cfg);
107
108         setting = config_setting_add(root, "progdir", CONFIG_TYPE_STRING);
109         config_setting_set_string(setting, programsDirectory->text().toStdString().c_str());
110
111         setting = config_setting_add(root, "node_number", CONFIG_TYPE_INT);
112         config_setting_set_int(setting, nodeNumber->value());
113
114         setting = config_setting_add(root, "type", CONFIG_TYPE_STRING);
115         if (explicitConnectionMode->isChecked()) {
116                 config_setting_set_string(setting, "explicit");
117
118                 config_setting_t *hosts = NULL;
119                 hosts = config_setting_add(root, "host", CONFIG_TYPE_ARRAY);
120                 for(int i = 0; i < connections->count(); i++) {
121                         setting = config_setting_add(hosts, NULL, CONFIG_TYPE_STRING);
122                         config_setting_set_string(setting, connections->item(i)->text().toStdString().c_str());
123                 }
124         } else {
125                 config_setting_set_string(setting, "register");
126         }
127
128         if (!config_write_file(&cfg, fname)) {
129                 fprintf(stderr, "Error while writing to file: %s.\n", fname);
130         }
131         config_destroy(&cfg);
132 }