Port most of the code to the Qt4
[vlp.git] / src / lgconfig / lgconfig.cpp
1 #include <QtGui/QApplication>
2 #include <QtGui/QMainWindow>
3 #include <Qt3Support/q3multilineedit.h>
4 #include <QtGui/QMenuBar>
5 // #include <qpopmenu.h>
6 #include <QtGui/QDialog>
7 #include <QtGui/QButtonGroup>
8 #include <QtGui/QLabel>
9 #include <QtGui/QLineEdit>
10 #include <Qt3Support/Q3ListBox>
11 #include <QtGui/QPushButton>
12 #include <QtGui/QRadioButton>
13 #include <QtCore/QList>
14 #include <QtCore/qfile.h>
15 #include <QtGui/qcombobox.h>
16 #include <QtGui/QToolTip>
17 #include <QtGui/QFont>
18 #include <QtGui/QPixmap>
19 #include <QtGui/QMessageBox>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23
24 #include <libconfig.h>
25
26 class VLPEntry {
27 public:
28         int ID;
29         char addr[255];
30         /** 0 - explicit */
31         int type;
32         char progdir[255];
33         char homedir[255];
34         char item[255];
35 };
36
37 class QInstall: public QMainWindow {
38         Q_OBJECT
39 public:
40         QMenuBar *bar;
41         Q3ListBox *nodelist;
42         QPushButton *infob;
43         QList<VLPEntry*> Nodes;
44
45         QInstall();
46         bool check_id(int);
47         bool check_addr(char*);
48
49 public slots:
50         void SetOptions();
51         void AddNode();
52         void DelNode();
53         void Info();
54 };
55
56
57 QApplication *app;
58
59 QInstall::QInstall()
60 {
61         QFont f("Helvetica", 12, QFont::Bold);
62         QPixmap mp;
63
64 //      infob = new QPushButton(this);
65
66         setWindowTitle("VLP Configuration Tool");
67
68         QMenu * programMenu = NULL;
69         programMenu = menuBar()->addMenu("&Program");
70         programMenu->addAction("Configure", this, SLOT(SetOptions()));
71         programMenu->addAction("Quit", app, SLOT(quit()));
72
73 //      bar = new QMenuBar(this);
74 //      bar->insertItem("Configure", this, SLOT(SetOptions()));
75 //      bar->insertItem("Quit", app, SLOT(quit()));
76 //      bar->setFont(f);
77 //      infob->setGeometry(0, bar->height(), 200, 30);
78         if (mp.load("logo.bmp")) {
79 //              infob->setPixmap(mp);
80 //              infob->resize(mp.width(), mp.height());
81         }
82 //      resize(infob->width(), infob->height() + bar->height());
83         Nodes.clear();
84 }
85
86 bool QInstall::check_id(int id)
87 {
88         VLPEntry *pom;
89
90         pom = Nodes.first();
91         while (pom != NULL) {
92                 if (pom->ID == id)
93                         return FALSE;
94                 pom = Nodes.takeFirst();
95         }
96         return TRUE;
97 }
98
99 bool QInstall::check_addr(char *addr)
100 {
101         VLPEntry *pom;
102
103         pom = Nodes.first();
104         while (pom != NULL) {
105                 if (strcmp(pom->addr, addr) == 0)
106                         return FALSE;
107                 pom = Nodes.takeFirst();
108         }
109         return TRUE;
110 }
111
112 /**
113  * @attention Currently not in use
114  */
115 void QInstall::Info()
116 {
117 }
118
119 void QInstall::AddNode()
120 {
121         QDialog dlg(this);
122         QLabel *tmpQLabel;
123         QLineEdit *id, *addr, *progs, *home;
124         QPushButton *okbtn, *cancelbtn;
125         VLPEntry *pom;
126         char pomstr[255];
127
128         tmpQLabel = new QLabel(&dlg);
129         tmpQLabel->setGeometry(110, 10, 180, 30);
130         tmpQLabel->setFrameStyle(49);
131         tmpQLabel->setText("Virtual Processor Properties");
132
133         id = new QLineEdit(&dlg);
134         id->setGeometry(130, 50, 50, 30);
135         id->setText("");
136
137         tmpQLabel = new QLabel(&dlg);
138         tmpQLabel->setGeometry(20, 50, 90, 30);
139         tmpQLabel->setText("Node number");
140
141         tmpQLabel = new QLabel(&dlg);
142         tmpQLabel->setGeometry(20, 90, 80, 30);
143         tmpQLabel->setText("IP Address");
144
145         addr = new QLineEdit(&dlg);
146         addr->setGeometry(130, 90, 120, 30);
147         addr->setText("");
148
149         tmpQLabel = new QLabel(&dlg);
150         tmpQLabel->setGeometry(20, 130, 100, 30);
151         tmpQLabel->setText("Connection type");
152
153         QComboBox* tmpQComboBox;
154         tmpQComboBox = new QComboBox(&dlg);
155         tmpQComboBox->setGeometry(130, 130, 100, 30);
156 //      tmpQComboBox->setSizeLimit(2);
157 //      tmpQComboBox->setAutoResize(FALSE);
158         tmpQComboBox->insertItem(0, "Explicit");
159
160         tmpQLabel = new QLabel(&dlg);
161         tmpQLabel->setGeometry(20, 170, 110, 30);
162         tmpQLabel->setText("Programs directory");
163
164         progs = new QLineEdit(&dlg);
165         progs->setGeometry(130, 170, 230, 30);
166         progs->setText("");
167
168         tmpQLabel = new QLabel(&dlg);
169         tmpQLabel->setGeometry(20, 210, 100, 30);
170         tmpQLabel->setText("VLP directory");
171
172         home = new QLineEdit(&dlg);
173         home->setGeometry(130, 210, 230, 30);
174         home->setText("");
175
176         okbtn = new QPushButton(&dlg);
177         okbtn->setGeometry(80, 250, 100, 30);
178         okbtn->setText("Ok");
179         connect(okbtn,SIGNAL(clicked()), &dlg, SLOT(accept()));
180         cancelbtn = new QPushButton(&dlg);
181         cancelbtn->setGeometry(210, 250, 100, 30);
182         cancelbtn->setText("Cancel");
183         connect(cancelbtn,SIGNAL(clicked()), &dlg, SLOT(reject()));
184         dlg.resize(380, 300);
185         if (dlg.exec()) {
186                 pom = new VLPEntry;
187                 pom->ID = id->text().toInt();
188                 if (check_id(pom->ID)) {
189                         strcpy(pom->addr, addr->text().toStdString().c_str());
190                         if (check_addr(pom->addr)) {
191                                 if (tmpQComboBox->currentText() == "Explicit") {
192                                         pom->type=0;
193                                 }
194                                 strcpy(pom->progdir, progs->text().toStdString().c_str());
195                                 strcpy(pom->homedir, home->text().toStdString().c_str());
196                                 Nodes.append(pom);
197                                 sprintf(pomstr, "Node: %d\t"
198                                                 "Addr: %s\t"
199                                                 "Home dir: %s", pom->ID, pom->addr, pom->homedir);
200                                 nodelist->insertItem(pomstr);
201                                 strcpy(pom->item, pomstr);
202                         } else {
203                                 QMessageBox::warning(this, "Error!", "Only one VLP on a single computer!", "Ok");
204                         }
205                 } else {
206                         QMessageBox::warning(this, "Error!", "ID must be unique!", "Ok");
207                 }
208         }
209 }
210
211 void QInstall::DelNode()
212 {
213         char pom[255];
214         VLPEntry *vpom;
215
216         if (nodelist->currentItem() >= 0) {
217                 strcpy(pom, nodelist->text(nodelist->currentItem()).toStdString().c_str());
218                 vpom = Nodes.first();
219                 while (vpom != NULL) {
220                         if (strcmp(pom, vpom->item) == 0)
221                                 break;
222                         vpom = Nodes.takeFirst();
223                 }
224                 if (vpom != NULL)
225                         if (QMessageBox::question(this, "Delete VLP", "Are you sure?", "Yes", "No")) {
226                                 nodelist->removeItem(nodelist->currentItem());
227                                 Nodes.removeOne(vpom);
228                         }
229         }
230 }
231
232 void QInstall::SetOptions()
233 {
234         QDialog dlg(this);
235         QLabel *tmpQLabel;
236         QPushButton *addbtn, *delbtn, *okbtn, *cancelbtn;
237         VLPEntry *pom;
238         int i, j;
239         char pomstr[255];
240
241         //dlg.setStyle(WindowsStyle);
242         nodelist = new Q3ListBox(&dlg);
243         nodelist->setGeometry(20, 40, 480, 160);
244
245         tmpQLabel = new QLabel(&dlg);
246         tmpQLabel->setGeometry(20, 10, 100, 30);
247         tmpQLabel->setText("Nodes:");
248
249         addbtn = new QPushButton(&dlg);
250         addbtn->setGeometry(30, 210, 100, 30);
251         addbtn->setText("Add VLP");
252         connect(addbtn, SIGNAL(clicked()), this, SLOT(AddNode()));
253
254         delbtn = new QPushButton(&dlg);
255         delbtn->setGeometry(150, 210, 100, 30);
256         delbtn->setText("Del VLP");
257         connect(delbtn, SIGNAL(clicked()), this, SLOT(DelNode()));
258
259         okbtn = new QPushButton(&dlg);
260         okbtn->setGeometry(270, 210, 100, 30);
261         okbtn->setText("Save files");
262         connect(okbtn, SIGNAL(clicked()), &dlg, SLOT(accept()));
263
264         cancelbtn = new QPushButton(&dlg);
265         cancelbtn->setGeometry(390, 210, 100, 30);
266         cancelbtn->setText("Cancel");
267         connect(cancelbtn, SIGNAL(clicked()), &dlg, SLOT(reject()));
268
269         dlg.resize(520, 260);
270
271         if (dlg.exec()) {
272                 if (!Nodes.isEmpty()) {
273                         pom = Nodes.first();
274                         while (pom != NULL) {
275                                 j = Nodes.indexOf(pom);
276                                 sprintf(pomstr, "%s.cfg", pom->addr);
277
278                                 config_t cfg;
279                                 config_setting_t *root, *setting;
280                                 config_init(&cfg);
281
282                                 root = config_root_setting(&cfg);
283
284                                 setting = config_setting_get_member(root, "progdir");
285                                 if(!setting) {
286                                         setting = config_setting_add(root, "progdir", CONFIG_TYPE_STRING);
287                                 }
288                                 config_setting_set_string(setting, pom->progdir);
289
290                                 setting = config_setting_get_member(root, "homedir");
291                                 if(!setting) {
292                                         setting = config_setting_add(root, "homedir", CONFIG_TYPE_STRING);
293                                 }
294                                 config_setting_set_string(setting, pom->homedir);
295
296                                 setting = config_setting_get_member(root, "node_number");
297                                 if(!setting) {
298                                         setting = config_setting_add(root, "node_number", CONFIG_TYPE_INT);
299                                 }
300                                 config_setting_set_int(setting, pom->ID);
301
302                                 if (pom->type == 0) {
303                                         setting = config_setting_get_member(root, "type");
304                                         if(!setting) {
305                                                 setting = config_setting_add(root, "type", CONFIG_TYPE_STRING);
306                                         }
307                                         config_setting_set_string(setting, "explicit");
308                                 }
309                                 for (i = 0; i < Nodes.count(); i++) {
310                                         if (pom != Nodes.at(i)) {
311                                                 setting = config_setting_get_member(root, "host");
312                                                 if (!setting) {
313                                                         setting = config_setting_add(root, "host", CONFIG_TYPE_STRING);
314                                                 }
315                                                 config_setting_set_string(setting, Nodes.at(i)->addr);
316                                         }
317                                 }
318
319                                 if(!config_write_file(&cfg, pomstr)) {
320                                         fprintf(stderr, "Error while writing to file: %s.\n", pomstr);
321                                 }
322                                 config_destroy(&cfg);
323
324                                 pom = Nodes.at(j);
325                                 pom = Nodes.takeFirst();
326                         }
327                 }
328         }
329 }
330
331 #include "lgconfig.moc"
332
333 int main(int argc, char **argv)
334 {
335         app = new QApplication(argc,argv);
336         QInstall cfg;
337         //app->setStyle(WindowsStyle);
338 //      app->setMainWidget(&cfg);
339         cfg.show();
340         return app->exec();
341 }