b8036db4797d5ba8163eccb1edbb22af1b6608fe
[vlp.git] / src / lgconfig / lgconfig.cpp
1 #include <QtGui/QApplication>
2 #include <QtGui/QMainWindow>
3 #include <Qt3Support/q3multilineedit.h>
4 #include <QtGui/QDialog>
5 #include <QtGui/QButtonGroup>
6 #include <QtGui/QLabel>
7 #include <QtGui/QLineEdit>
8 #include <Qt3Support/Q3ListBox>
9 #include <QtGui/QPushButton>
10 #include <QtGui/QRadioButton>
11 #include <QtCore/QList>
12 #include <QtCore/qfile.h>
13 #include <QtGui/qcombobox.h>
14 #include <QtGui/QToolTip>
15 #include <QtGui/QFont>
16 #include <QtGui/QPixmap>
17 #include <QtGui/QMessageBox>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <unistd.h>
21
22 #include <libconfig.h>
23
24 #include "lgconfig.h"
25 #include "AddNodeDialog.h"
26
27 namespace loglan {
28 namespace vlp {
29
30 QInstall::QInstall()
31 {
32         setupUi(this);
33
34         Nodes.clear();
35 }
36
37 bool QInstall::check_id(int id)
38 {
39         QListIterator<VLPEntry *> nodesIterator(Nodes);
40         VLPEntry *node = NULL;
41
42         while (nodesIterator.hasNext()) {
43                 node = nodesIterator.next();
44                 if (node->ID == id)
45                         return false;
46         }
47         return true;
48 }
49
50 bool QInstall::check_addr(QString addr)
51 {
52         QListIterator<VLPEntry *> nodesIterator(Nodes);
53         VLPEntry *node = NULL;
54
55         while (nodesIterator.hasNext()) {
56                 node = nodesIterator.next();
57                 if (node->addr == addr)
58                         return false;
59         }
60         return true;
61 }
62
63 void QInstall::AddNode()
64 {
65         dialog::AddNodeDialog dialog(this);
66
67         if (dialog.exec()) {
68                 int nodeId = dialog.getNodeNumber();
69                 QString ipAddress = dialog.getIPAddress();
70                 if (check_id(nodeId)) {
71                         if (check_addr(ipAddress)) {
72
73                                 VLPEntry *pom = new VLPEntry;
74                                 pom->ID = nodeId;
75                                 if (dialog.getConnectionType() == "Explicit") {
76                                         pom->type = 0;
77                                 }
78                                 strcpy(pom->addr, ipAddress.toStdString().c_str());
79                                 strcpy(pom->progdir, dialog.getProgramsDirectory().toStdString().c_str());
80                                 strcpy(pom->homedir, dialog.getVLPDirectory().toStdString().c_str());
81                                 
82                                 QString info;
83                                 info.sprintf("Node: %d\tAddr: %s\tHome dir: %s",
84                                         pom->ID,
85                                         pom->addr,
86                                         pom->homedir
87                                 );
88
89                                 strcpy(pom->item, info.toStdString().c_str());
90
91                                 nodelist->insertItem(info);
92                                 Nodes.append(pom);
93                         }
94                         else {
95                                 QMessageBox::warning(this, "Error!", "Only one VLP on a single computer!", QMessageBox::Ok);
96                         }
97                 }
98                 else {
99                         QMessageBox::warning(this, "Error!", "ID must be unique!", QMessageBox::Ok);
100                 }
101         }
102 }
103
104 void QInstall::DelNode()
105 {
106         if (nodelist->currentItem() >= 0) {
107                 VLPEntry *node = NULL;
108                 QString currentNodeInfo = nodelist->text(nodelist->currentItem());
109
110                 QListIterator<VLPEntry *> nodesIterator(Nodes);
111                 
112                 while (nodesIterator.hasNext()) {
113                         node = nodesIterator.next();
114                         if (currentNodeInfo == node->item) {
115                                 break;
116                         }
117                 }
118
119                 if (node != NULL) {
120                         if (QMessageBox::question(this,
121                                 "Delete VLP",
122                                 "Are you sure?",
123                                 QMessageBox::Ok | QMessageBox::Cancel
124                         ) == QMessageBox::Ok) {
125                                 nodelist->removeItem(nodelist->currentItem());
126                                 Nodes.removeOne(node);
127                         }
128                 }
129         }
130 }
131
132 void QInstall::on_actionConfigure_triggered()
133 {
134         QDialog dlg(this);
135         QLabel *tmpQLabel;
136         QPushButton *addbtn, *delbtn, *okbtn, *cancelbtn;
137         VLPEntry *pom;
138         int i;
139         char pomstr[255];
140
141         //dlg.setStyle(WindowsStyle);
142         nodelist = new Q3ListBox(&dlg);
143         nodelist->setGeometry(20, 40, 480, 160);
144
145         tmpQLabel = new QLabel(&dlg);
146         tmpQLabel->setGeometry(20, 10, 100, 30);
147         tmpQLabel->setText("Nodes:");
148
149         addbtn = new QPushButton(&dlg);
150         addbtn->setGeometry(30, 210, 100, 30);
151         addbtn->setText("Add VLP");
152         connect(addbtn, SIGNAL(clicked()), this, SLOT(AddNode()));
153
154         delbtn = new QPushButton(&dlg);
155         delbtn->setGeometry(150, 210, 100, 30);
156         delbtn->setText("Del VLP");
157         connect(delbtn, SIGNAL(clicked()), this, SLOT(DelNode()));
158
159         okbtn = new QPushButton(&dlg);
160         okbtn->setGeometry(270, 210, 100, 30);
161         okbtn->setText("Save files");
162         connect(okbtn, SIGNAL(clicked()), &dlg, SLOT(accept()));
163
164         cancelbtn = new QPushButton(&dlg);
165         cancelbtn->setGeometry(390, 210, 100, 30);
166         cancelbtn->setText("Cancel");
167         connect(cancelbtn, SIGNAL(clicked()), &dlg, SLOT(reject()));
168
169         dlg.resize(520, 260);
170
171         if (dlg.exec()) {
172                 if (!Nodes.isEmpty()) {
173                         QListIterator<VLPEntry *> nodesIterator(Nodes);
174
175                         while (nodesIterator.hasNext()) {
176                                 pom = nodesIterator.next();
177                                 i = Nodes.indexOf(pom);
178                                 sprintf(pomstr, "%s.cfg", pom->addr);
179
180                                 config_t cfg;
181                                 config_setting_t *root, *setting;
182                                 config_init(&cfg);
183
184                                 root = config_root_setting(&cfg);
185
186                                 setting = config_setting_get_member(root, "progdir");
187                                 if(!setting) {
188                                         setting = config_setting_add(root, "progdir", CONFIG_TYPE_STRING);
189                                 }
190                                 config_setting_set_string(setting, pom->progdir);
191
192                                 setting = config_setting_get_member(root, "homedir");
193                                 if(!setting) {
194                                         setting = config_setting_add(root, "homedir", CONFIG_TYPE_STRING);
195                                 }
196                                 config_setting_set_string(setting, pom->homedir);
197
198                                 setting = config_setting_get_member(root, "node_number");
199                                 if(!setting) {
200                                         setting = config_setting_add(root, "node_number", CONFIG_TYPE_INT);
201                                 }
202                                 config_setting_set_int(setting, pom->ID);
203
204                                 if (pom->type == 0) {
205                                         setting = config_setting_get_member(root, "type");
206                                         if(!setting) {
207                                                 setting = config_setting_add(root, "type", CONFIG_TYPE_STRING);
208                                         }
209                                         config_setting_set_string(setting, "explicit");
210                                 }
211                                 for (auto node : Nodes) {
212                                         if (pom != node) {
213                                                 setting = config_setting_get_member(root, "host");
214                                                 if (!setting) {
215                                                         setting = config_setting_add(root, "host", CONFIG_TYPE_STRING);
216                                                 }
217                                                 config_setting_set_string(setting, node->addr);
218                                         }
219                                 }
220
221                                 if(!config_write_file(&cfg, pomstr)) {
222                                         fprintf(stderr, "Error while writing to file: %s.\n", pomstr);
223                                 }
224                                 config_destroy(&cfg);
225
226                                 pom = Nodes.at(i);
227                         }
228                 }
229         }
230 }
231
232
233 void QInstall::on_actionQuit_triggered()
234 {
235         QApplication::instance()->quit();
236 }
237
238 }
239 }
240
241
242 int main(int argc, char **argv)
243 {
244         QApplication *app = new QApplication(argc,argv);
245         loglan::vlp::QInstall cfg;
246         cfg.show();
247         return app->exec();
248 }