Small changes in loggraph porting to 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->insertItem(0, "Explicit");
157
158         tmpQLabel = new QLabel(&dlg);
159         tmpQLabel->setGeometry(20, 170, 110, 30);
160         tmpQLabel->setText("Programs directory");
161
162         progs = new QLineEdit(&dlg);
163         progs->setGeometry(130, 170, 230, 30);
164         progs->setText("");
165
166         tmpQLabel = new QLabel(&dlg);
167         tmpQLabel->setGeometry(20, 210, 100, 30);
168         tmpQLabel->setText("VLP directory");
169
170         home = new QLineEdit(&dlg);
171         home->setGeometry(130, 210, 230, 30);
172         home->setText("");
173
174         okbtn = new QPushButton(&dlg);
175         okbtn->setGeometry(80, 250, 100, 30);
176         okbtn->setText("Ok");
177         connect(okbtn,SIGNAL(clicked()), &dlg, SLOT(accept()));
178         cancelbtn = new QPushButton(&dlg);
179         cancelbtn->setGeometry(210, 250, 100, 30);
180         cancelbtn->setText("Cancel");
181         connect(cancelbtn,SIGNAL(clicked()), &dlg, SLOT(reject()));
182         dlg.resize(380, 300);
183         if (dlg.exec()) {
184                 pom = new VLPEntry;
185                 pom->ID = id->text().toInt();
186                 if (check_id(pom->ID)) {
187                         strcpy(pom->addr, addr->text().toStdString().c_str());
188                         if (check_addr(pom->addr)) {
189                                 if (tmpQComboBox->currentText() == "Explicit") {
190                                         pom->type=0;
191                                 }
192                                 strcpy(pom->progdir, progs->text().toStdString().c_str());
193                                 strcpy(pom->homedir, home->text().toStdString().c_str());
194                                 Nodes.append(pom);
195                                 sprintf(pomstr, "Node: %d\t"
196                                                 "Addr: %s\t"
197                                                 "Home dir: %s", pom->ID, pom->addr, pom->homedir);
198                                 nodelist->insertItem(pomstr);
199                                 strcpy(pom->item, pomstr);
200                         } else {
201                                 QMessageBox::warning(this, "Error!", "Only one VLP on a single computer!", "Ok");
202                         }
203                 } else {
204                         QMessageBox::warning(this, "Error!", "ID must be unique!", "Ok");
205                 }
206         }
207 }
208
209 void QInstall::DelNode()
210 {
211         char pom[255];
212         VLPEntry *vpom;
213
214         if (nodelist->currentItem() >= 0) {
215                 strcpy(pom, nodelist->text(nodelist->currentItem()).toStdString().c_str());
216                 vpom = Nodes.first();
217                 while (vpom != NULL) {
218                         if (strcmp(pom, vpom->item) == 0)
219                                 break;
220                         vpom = Nodes.takeFirst();
221                 }
222                 if (vpom != NULL)
223                         if (QMessageBox::question(this, "Delete VLP", "Are you sure?", "Yes", "No")) {
224                                 nodelist->removeItem(nodelist->currentItem());
225                                 Nodes.removeOne(vpom);
226                         }
227         }
228 }
229
230 void QInstall::SetOptions()
231 {
232         QDialog dlg(this);
233         QLabel *tmpQLabel;
234         QPushButton *addbtn, *delbtn, *okbtn, *cancelbtn;
235         VLPEntry *pom;
236         int i, j;
237         char pomstr[255];
238
239         //dlg.setStyle(WindowsStyle);
240         nodelist = new Q3ListBox(&dlg);
241         nodelist->setGeometry(20, 40, 480, 160);
242
243         tmpQLabel = new QLabel(&dlg);
244         tmpQLabel->setGeometry(20, 10, 100, 30);
245         tmpQLabel->setText("Nodes:");
246
247         addbtn = new QPushButton(&dlg);
248         addbtn->setGeometry(30, 210, 100, 30);
249         addbtn->setText("Add VLP");
250         connect(addbtn, SIGNAL(clicked()), this, SLOT(AddNode()));
251
252         delbtn = new QPushButton(&dlg);
253         delbtn->setGeometry(150, 210, 100, 30);
254         delbtn->setText("Del VLP");
255         connect(delbtn, SIGNAL(clicked()), this, SLOT(DelNode()));
256
257         okbtn = new QPushButton(&dlg);
258         okbtn->setGeometry(270, 210, 100, 30);
259         okbtn->setText("Save files");
260         connect(okbtn, SIGNAL(clicked()), &dlg, SLOT(accept()));
261
262         cancelbtn = new QPushButton(&dlg);
263         cancelbtn->setGeometry(390, 210, 100, 30);
264         cancelbtn->setText("Cancel");
265         connect(cancelbtn, SIGNAL(clicked()), &dlg, SLOT(reject()));
266
267         dlg.resize(520, 260);
268
269         if (dlg.exec()) {
270                 if (!Nodes.isEmpty()) {
271                         pom = Nodes.first();
272                         while (pom != NULL) {
273                                 j = Nodes.indexOf(pom);
274                                 sprintf(pomstr, "%s.cfg", pom->addr);
275
276                                 config_t cfg;
277                                 config_setting_t *root, *setting;
278                                 config_init(&cfg);
279
280                                 root = config_root_setting(&cfg);
281
282                                 setting = config_setting_get_member(root, "progdir");
283                                 if(!setting) {
284                                         setting = config_setting_add(root, "progdir", CONFIG_TYPE_STRING);
285                                 }
286                                 config_setting_set_string(setting, pom->progdir);
287
288                                 setting = config_setting_get_member(root, "homedir");
289                                 if(!setting) {
290                                         setting = config_setting_add(root, "homedir", CONFIG_TYPE_STRING);
291                                 }
292                                 config_setting_set_string(setting, pom->homedir);
293
294                                 setting = config_setting_get_member(root, "node_number");
295                                 if(!setting) {
296                                         setting = config_setting_add(root, "node_number", CONFIG_TYPE_INT);
297                                 }
298                                 config_setting_set_int(setting, pom->ID);
299
300                                 if (pom->type == 0) {
301                                         setting = config_setting_get_member(root, "type");
302                                         if(!setting) {
303                                                 setting = config_setting_add(root, "type", CONFIG_TYPE_STRING);
304                                         }
305                                         config_setting_set_string(setting, "explicit");
306                                 }
307                                 for (i = 0; i < Nodes.count(); i++) {
308                                         if (pom != Nodes.at(i)) {
309                                                 setting = config_setting_get_member(root, "host");
310                                                 if (!setting) {
311                                                         setting = config_setting_add(root, "host", CONFIG_TYPE_STRING);
312                                                 }
313                                                 config_setting_set_string(setting, Nodes.at(i)->addr);
314                                         }
315                                 }
316
317                                 if(!config_write_file(&cfg, pomstr)) {
318                                         fprintf(stderr, "Error while writing to file: %s.\n", pomstr);
319                                 }
320                                 config_destroy(&cfg);
321
322                                 pom = Nodes.at(j);
323                                 pom = Nodes.takeFirst();
324                         }
325                 }
326         }
327 }
328
329 #include "lgconfig.moc"
330
331 int main(int argc, char **argv)
332 {
333         app = new QApplication(argc,argv);
334         QInstall cfg;
335         cfg.show();
336         return app->exec();
337 }