blob: db3d79ebdd50c74144e95c5ce45324616d284b44 [file] [log] [blame]
Ilya Moiseenko18c8a132013-10-24 01:52:52 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
2/*
3 * @copyright See LICENCE for copyright and license information.
4 *
5 * @author Ilya Moiseenko <iliamo@ucla.edu>
6 */
7
Alexander Afanasyev669ea1a2013-11-08 22:25:23 -08008#include "config.h"
9
Ilya Moiseenko18c8a132013-10-24 01:52:52 -070010#include "tray-menu.h"
11#include "ui_traymenu.h" //generated from traymenu.ui
12#include "quit-dialog.h"
13#include "fib-input-dialog.h"
Ilya Moiseenko656d52d2013-10-25 14:19:10 -070014#include "network-manager.h"
Ilya Moiseenko18c8a132013-10-24 01:52:52 -070015
16#include <QMenu>
17#include <QCloseEvent>
18#include <QDesktopServices>
Ilya Moiseenko18c8a132013-10-24 01:52:52 -070019#include <QUrl>
20#include <QCheckBox>
21#include <QLabel>
22#include <QHBoxLayout>
23#include <QLineEdit>
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -070024#include <QDir>
Ilya Moiseenko69abb972013-11-04 16:02:20 -080025#include <QScrollBar>
26
Ilya Moiseenko18c8a132013-10-24 01:52:52 -070027
28TrayMenu::TrayMenu(QWidget *parent) :
29 QMainWindow(parent),
30 ui(new Ui::TrayMenu)
31{
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -070032 networkManager = new NetworkManager();
33
34 QCoreApplication::setOrganizationName("UCLA");
35 QCoreApplication::setOrganizationDomain("named-data.net");
36 QCoreApplication::setApplicationName("NDNx Control Center");
37
38 persistentSettings = new QSettings();
39
Ilya Moiseenko18c8a132013-10-24 01:52:52 -070040 ui->setupUi(this);
41
42 createTrayIcon();
43 setIcon(true);
44 createToolbar();
45 createTableView();
46
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -070047 loadSettings();
Ilya Moiseenko656d52d2013-10-25 14:19:10 -070048
Ilya Moiseenko18c8a132013-10-24 01:52:52 -070049 connect(ui->openTrafficMapButton, SIGNAL(pressed()), this, SLOT(openTrafficMap()));
50 connect(ui->openRoutingStatusButton, SIGNAL(pressed()), this, SLOT(openRoutingStatus()));
51 connect(ui->addFibButton, SIGNAL(pressed()), this, SLOT(showFibInputDialog()));
52 connect(ui->deleteFibButton, SIGNAL(released()), this, SLOT(deleteFibEntry()));
53 connect(ui->softwareUpdateCheckbox, SIGNAL(stateChanged(int)), this, SLOT(changeSoftwareUpdate()));
54 connect(ui->hubDiscoveryCheckbox, SIGNAL(stateChanged(int)), this, SLOT(changeHubDiscovery()));
55 connect(ui->loginStartCheckbox, SIGNAL(stateChanged(int)), this, SLOT(changeLoginStart()));
56 connect(ui->shutdownCheckbox, SIGNAL(stateChanged(int)), this, SLOT(changeShutdownExit()));
57 connect(ui->tableView, SIGNAL(clicked(QModelIndex)), this, SLOT(selectTableRow()));
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -070058 connect(ui->openNdnCertificationButton, SIGNAL(released()), this, SLOT(openCertificationPage()));
Ilya Moiseenko18c8a132013-10-24 01:52:52 -070059
60 statusUpdateThread = new QThread();
61 statusUpdateThread->start();
62
63 daemonStatusTimer = new QTimer(statusUpdateThread);
64 connect(daemonStatusTimer, SIGNAL(timeout()), this, SLOT(daemonStatusUpdate()));
Ilya Moiseenko69abb972013-11-04 16:02:20 -080065 daemonStatusTimer->start(2000);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -070066
67 trayIcon->show();
Ilya Moiseenko69abb972013-11-04 16:02:20 -080068 model = NULL;
69 dialog = new FibInputDialog(this);
70
71 urlManager = new QNetworkAccessManager(this);
72 connect(urlManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(runXmlProc(QNetworkReply*)));
Ilya Moiseenko18c8a132013-10-24 01:52:52 -070073}
74
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -070075void TrayMenu::loadSettings()
76{
77 QVariant value;
78
79 value = persistentSettings->value(ALLOW_SOFTWARE_UPDATES);
80 if(!value.isNull())
81 {
82 allowAutomaticUpdates = value.toBool();
83 ui->softwareUpdateCheckbox->setChecked(allowAutomaticUpdates);
84 }
85 else
86 {
87 ui->softwareUpdateCheckbox->setChecked(true);
88 changeSoftwareUpdate();
89 }
90
91 value = persistentSettings->value(ENABLE_HUB_DISCOVERY);
92 if(!value.isNull())
93 {
94 enableHubDiscovery = value.toBool();
95 ui->hubDiscoveryCheckbox->setChecked(enableHubDiscovery);
96 }
97 else
98 {
99 ui->hubDiscoveryCheckbox->setChecked(true);
100 changeHubDiscovery();
101 }
102
103 value = persistentSettings->value(ENABLE_START_ON_LOGIN);
104 if(!value.isNull())
105 {
106 enableStartOnLogin = value.toBool();
107 ui->loginStartCheckbox->setChecked(enableStartOnLogin);
108 }
109 else
110 {
111 ui->loginStartCheckbox->setChecked(false);
112 changeLoginStart();
113 }
114
115 value = persistentSettings->value(SHUTDOWN_ON_EXIT);
116 if(!value.isNull())
117 {
118 shutdownOnExit = value.toBool();
119 ui->shutdownCheckbox->setChecked(shutdownOnExit);
120 }
121 else
122 {
123 ui->shutdownCheckbox->setChecked(false);
124 changeShutdownExit();
125 }
126}
127
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700128void TrayMenu::changeSoftwareUpdate()
129{
130 if(ui->softwareUpdateCheckbox->isChecked())
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700131 {
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700132 allowAutomaticUpdates = true;
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700133 persistentSettings->setValue(ALLOW_SOFTWARE_UPDATES, true);
134 }
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700135 else
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700136 {
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700137 allowAutomaticUpdates = false;
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700138 persistentSettings->setValue(ALLOW_SOFTWARE_UPDATES, false);
139 }
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700140}
141
142void TrayMenu::changeHubDiscovery()
143{
144 if(ui->hubDiscoveryCheckbox->isChecked())
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700145 {
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700146 enableHubDiscovery = true;
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700147 persistentSettings->setValue(ENABLE_HUB_DISCOVERY, true);
148 }
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700149 else
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700150 {
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700151 enableHubDiscovery = false;
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700152 persistentSettings->setValue(ENABLE_HUB_DISCOVERY, false);
153 }
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700154}
155
156void TrayMenu::changeLoginStart()
157{
158 if(ui->loginStartCheckbox->isChecked())
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700159 {
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700160 enableStartOnLogin = true;
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700161 persistentSettings->setValue(ENABLE_START_ON_LOGIN, true);
162 makeAutostartDirectory();
163 }
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700164 else
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700165 {
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700166 enableStartOnLogin = false;
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700167 persistentSettings->setValue(ENABLE_START_ON_LOGIN, false);
168
169 QProcess *process = new QProcess();
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800170 connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700171 QStringList arguments;
172 arguments << QDir::homePath() + AUTOSTART_DIRECTORY + SHORTCUT_FILE;
173 process->start("rm", arguments);
174 }
175}
176
177void TrayMenu::makeAutostartDirectory()
178{
179 QProcess *process = new QProcess();
180 connect(process, SIGNAL(finished(int)), this, SLOT(copyFile()));
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800181 connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700182 QStringList arguments;
183 arguments << QDir::homePath() + AUTOSTART_DIRECTORY;
184 process->start("mkdir", arguments);
185}
186
187void TrayMenu::copyFile()
188{
189 QProcess *process = new QProcess();
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800190 connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700191 QStringList arguments;
Alexander Afanasyeveb111572013-11-08 22:59:43 -0800192 arguments << QString(RESOURCES_DIR) + "/" + SHORTCUT_FILE << QDir::homePath() + AUTOSTART_DIRECTORY;
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700193 process->start("cp",arguments);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700194}
195
196void TrayMenu::changeShutdownExit()
197{
198 if(ui->shutdownCheckbox->isChecked())
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700199 {
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700200 shutdownOnExit = true;
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700201 persistentSettings->setValue(SHUTDOWN_ON_EXIT, true);
202 }
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700203 else
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700204 {
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700205 shutdownOnExit = false;
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700206 persistentSettings->setValue(SHUTDOWN_ON_EXIT, false);
207 }
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700208}
209
210void TrayMenu::showFibInputDialog()
211{
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800212 dialog->clear();
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700213 dialog->exec();
214}
215
216void TrayMenu::openTrafficMap()
217{
218 QDesktopServices::openUrl(QUrl("http://ndnmap.arl.wustl.edu/", QUrl::TolerantMode));
219}
220
221void TrayMenu::openRoutingStatus()
222{
223 QDesktopServices::openUrl(QUrl("http://netlab.cs.memphis.edu/script/htm/status.htm", QUrl::TolerantMode));
224}
225
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700226void TrayMenu::openCertificationPage()
227{
228 QDesktopServices::openUrl(QUrl("http://ndncert.named-data.net", QUrl::TolerantMode));
229}
230
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700231void TrayMenu::createTrayIcon()
232{
233 trayIconMenu = new QMenu(this);
234
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800235 statusIndicator = new QAction("Inactive", this);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700236 trayIconMenu->addAction(statusIndicator);
237
238 trayIconMenu->addSeparator();
239
Ilya Moiseenko3adef432013-11-01 03:42:40 -0700240 displayStatus = new QAction(" Sent / Recv ", this);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700241 trayIconMenu->addAction(displayStatus);
Ilya Moiseenko3adef432013-11-01 03:42:40 -0700242 interestSentRecv = new QAction("Interests 0 / 0", this);
243 trayIconMenu->addAction(interestSentRecv);
244 dataSentRecv = new QAction("Data 0 / 0", this);
245 trayIconMenu->addAction(dataSentRecv);
246
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700247 trayIconMenu->addSeparator();
248
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800249 open = new QAction("Preferences...", this);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700250 connect(open, SIGNAL(triggered()), this, SLOT(show()));
251 trayIconMenu->addAction(open);
252
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800253 close = new QAction("Quit...", this);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700254 connect(close, SIGNAL(triggered()), this, SLOT(confirmQuit()));
255 trayIconMenu->addAction(close);
256
257 trayIcon = new QSystemTrayIcon(this);
258 trayIcon->setContextMenu(trayIconMenu);
259
260 connect(
261 trayIcon,
262 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
263 this,
264 SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason))
265 );
266}
267
268void TrayMenu::createToolbar()
269{
270 toolBar = new QToolBar(this);
271 toolBar->setFloatable(false);
272 toolBar->setMovable(false);
273 toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
274 toolBar->setAllowedAreas(Qt::TopToolBarArea);
275 toolBar->setOrientation(Qt::Horizontal);
276 toolBar->setIconSize(QSize(32,32));
277 toolBar->resize(this->width(), 64);
278
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800279 openGeneralSettings = new QAction("General", this);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700280 openGeneralSettings->setIcon(QIcon(":/resource/Resources/preferences-desktop.png"));
281 connect(openGeneralSettings,SIGNAL(triggered()),this, SLOT(generalSettingsClicked()));
282
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800283 openForwardingSettings = new QAction("Forwarding", this);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700284 openForwardingSettings->setIcon(QIcon(":/resource/Resources/emblem-web.png"));
285 connect(openForwardingSettings,SIGNAL(triggered()),this, SLOT(forwardingSettingsClicked()));
286
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800287 openSecuritySettings = new QAction("Security", this);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700288 openSecuritySettings->setIcon(QIcon(":/resource/Resources/emblem-system.png"));
289 connect(openSecuritySettings,SIGNAL(triggered()),this, SLOT(securitySettingsClicked()));
290
291 toolBar->addAction(openGeneralSettings);
292 toolBar->addAction(openForwardingSettings);
293 toolBar->addAction(openSecuritySettings);
294}
295
296void TrayMenu::generalSettingsClicked()
297{
298 ui->generalSettingsWidget->show();
299 ui->forwardingSettingsWidget->hide();
300 ui->securitySettingsWidget->hide();
301}
302
303void TrayMenu::forwardingSettingsClicked()
304{
305 ui->generalSettingsWidget->hide();
306 ui->forwardingSettingsWidget->show();
307 ui->securitySettingsWidget->hide();
308}
309
310void TrayMenu::securitySettingsClicked()
311{
312 ui->generalSettingsWidget->hide();
313 ui->forwardingSettingsWidget->hide();
314 ui->securitySettingsWidget->show();
315}
316
317void TrayMenu::displayPopup()
318{
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800319 trayIcon->showMessage("NDNx Status", statusXml);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700320}
321
322void TrayMenu::addFibEntry()
323{
324 QString name = dialog->getPrefixName();
325 QString tunnelType = dialog->getTunnelType();
326 QString endpoint = dialog->getEndpoint();
327
328 QStringList arguments;
329 arguments << "add" << name << tunnelType << endpoint;
330
331 dialog->hide();
332
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700333 QProcess *process = new QProcess();
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800334 connect(process,SIGNAL(finished(int)),process, SLOT(deleteLater()));
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700335 process->start(NDND_FIB_COMMAND, arguments);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700336}
337
338void TrayMenu::confirmQuit()
339{
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700340 if(shutdownOnExit)
341 terminateDaemonAndClose();
342 else
343 {
344 QuitDialog dialog(this);
345 dialog.exec();
346 }
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700347}
348
349void TrayMenu::terminateDaemonAndClose()
350{
351 QProcess *process = new QProcess(this);
352 process->start(NDND_STOP_COMMAND);
353 connect(process,SIGNAL(finished(int)), qApp, SLOT(quit()));
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800354 connect(process,SIGNAL(finished(int)), process, SLOT(deleteLater()));
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700355}
356
357void TrayMenu::closeEvent(QCloseEvent *event)
358{
359 if (trayIcon->isVisible())
360 {
361 hide();
362 event->ignore();
363 }
364}
365
366void TrayMenu::showEvent(QShowEvent * event)
367{
368 ui->generalSettingsWidget->show();
369 ui->forwardingSettingsWidget->hide();
370 ui->securitySettingsWidget->hide();
371}
372
373void TrayMenu::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
374{
375 if(reason == QSystemTrayIcon::Trigger)
376 this->show();
377}
378
379void TrayMenu::setIcon(bool isConnected)
380{
381 if(isConnected)
382 trayIcon->setIcon(QIcon(":/resource/Resources/icon-connected-white.png"));
383 else
384 trayIcon->setIcon(QIcon(":/resource/Resources/icon-disconnected-white.png"));
385}
386
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700387void TrayMenu::daemonStatusUpdate()
388{
Alexander Afanasyev669ea1a2013-11-08 22:25:23 -0800389 urlManager->get(QNetworkRequest(QUrl("http://localhost:6363/?f=xml")));
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800390}
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700391
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800392void TrayMenu::runXmlProc(QNetworkReply *reply)
393{
394 QByteArray buffer = reply->readAll();
395 applyStatusXslt = new QProcess();
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700396
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800397 QStringList arguments;
Alexander Afanasyeveb111572013-11-08 22:59:43 -0800398 arguments << QString(RESOURCES_DIR) + "/" + STATUS_XSLT_FILE << "-";
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800399 connect(applyStatusXslt,SIGNAL(finished(int)), this, SLOT(parseStatusXml()));
400 //connect(applyStatusXslt,SIGNAL(finished(int)), applyStatusXslt, SLOT(deleteLater()));
Alexander Afanasyev669ea1a2013-11-08 22:25:23 -0800401 applyStatusXslt->start(XSLTPROC,arguments);
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800402 applyStatusXslt->write(buffer);
403 applyStatusXslt->closeWriteChannel();
404
405 applyFibXslt = new QProcess();
406 QStringList args;
Alexander Afanasyeveb111572013-11-08 22:59:43 -0800407 args << QString(RESOURCES_DIR) + "/" + FIB_XSLT_FILE << "-";
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800408 connect(applyFibXslt,SIGNAL(finished(int)), this, SLOT(parseFibXml()));
409 //connect(applyFibXslt,SIGNAL(finished(int)), applyFibXslt, SLOT(deleteLater()));
Alexander Afanasyev669ea1a2013-11-08 22:25:23 -0800410 applyFibXslt->start(XSLTPROC,args);
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800411 applyFibXslt->write(buffer);
412 applyFibXslt->closeWriteChannel();
413}
414
415void TrayMenu::parseStatusXml()
416{
417 QByteArray stdout = applyStatusXslt->readAllStandardOutput();
418 QByteArray stderr = applyStatusXslt->readAllStandardError();
419 applyStatusXslt->deleteLater();
420
421 statusXml = QString(stdout);
422
423 if((statusXml == "") || (stderr.length()>0)) // there was an error during Query evaluation
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700424 {
425 daemonStarted = false;
426 setIcon(false);
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800427 statusIndicator->setText("Starting...");
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700428
429 QProcess *process = new QProcess();
430 if(enableHubDiscovery)
431 connect(process, SIGNAL(finished(int)), networkManager, SLOT(autoconfigDaemon()));
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800432
433 connect(process,SIGNAL(finished(int)), process, SLOT(deleteLater()));
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700434 process->start(NDND_START_COMMAND);
435 }
436 else
437 {
438 daemonStarted = true;
439 setIcon(true);
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800440 statusIndicator->setText("Active");
441
Ilya Moiseenko3adef432013-11-01 03:42:40 -0700442 QString interestIn = statusXml.mid(statusXml.indexOf("<in>")+4, statusXml.indexOf("</in>") - (statusXml.indexOf("<in>")+4));
443 QString interestOut = statusXml.mid(statusXml.indexOf("<out>")+5, statusXml.indexOf("</out>") - (statusXml.indexOf("<out>")+5));
444 QString dataIn = statusXml.mid(statusXml.lastIndexOf("<in>")+4, statusXml.lastIndexOf("</in>") - (statusXml.lastIndexOf("<in>")+4));
445 QString dataOut = statusXml.mid(statusXml.lastIndexOf("<out>")+5, statusXml.lastIndexOf("</out>") - (statusXml.lastIndexOf("<out>")+5));
446
447 int i = 0;
448 int k = 0;
449 if((dataOut.length() - interestOut.length()) > 0)
450 {
451 i = dataOut.length() - interestOut.length();
452 i*=2; //because space takes less space than a letter
453 }
454
455 if((interestOut.length() - dataOut.length()) > 0)
456 {
457 k = interestOut.length() - dataOut.length();
458 k*=2; //because space takes less space than a letter
459 }
460
461 QString interestStats = QString("%1%2%3%4").arg("Interests",-16,' ').arg(interestOut,6+i,' ').arg(" / ",3).arg(interestIn,-6,' ');
462 QString dataStats = QString("%1%2%3%4").arg("Data",-20,' ').arg(dataOut,6+k,' ').arg(" / ",3).arg(dataIn,-6,' ');
463
464 //Now I try to align header "Sent / Recv" centrally with the upper line
465 QString padding;
466 for(int j = 0; j < interestStats.indexOf(interestOut); j++)
467 {
468 if(interestStats.at(j)==' ')
469 padding +=" ";
470 else
471 padding += " "; //because space takes less space than a letter
472 }
473
474 QString header;
475 int m = 0;
476 if(interestOut.length() - QString("Sent").length() > 0)
477 {
478 m = interestOut.length() - QString("Sent").length();
479 m *=3;
Ilya Moiseenko3adef432013-11-01 03:42:40 -0700480 header = QString("%1%2").arg(padding).arg(" Sent / Recv",QString(" Sent / Recv").length() + m,' ');
481 }
482 else if(interestOut.length() - QString("Sent").length() < 0)
483 {
Ilya Moiseenko3adef432013-11-01 03:42:40 -0700484 padding.truncate(padding.length()-(QString("Sent").length() - interestOut.length()));
485 header = padding + "Sent / Recv";
486 }
487 else
488 {
489 header = padding + " Sent / Recv";
490 }
491
492 interestSentRecv->setText(interestStats);
493 dataSentRecv->setText(dataStats);
494 displayStatus->setText(header);
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700495 }
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800496}
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700497
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800498void TrayMenu::parseFibXml()
499{
500 QByteArray stdout = applyFibXslt->readAllStandardOutput();
501 QByteArray stderr = applyFibXslt->readAllStandardError();
502 applyFibXslt->deleteLater();
503
504 fibContentsXml = QString(stdout);
505
506 if((stdout == "") || (stderr.length()>0))
507 return;
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700508
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700509 if ((enableHubDiscovery) && (fibContentsXml.indexOf("ndn:/autoconf-route",0,Qt::CaseInsensitive) == -1))
510 {
511 networkManager->autoconfigDaemon();
512 }
513
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700514 QDomDocument xmldoc;
515 QDomElement root;
516
517 xmldoc.setContent(fibContentsXml);
518 root=xmldoc.documentElement();
519
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800520 if(model != NULL)
521 {
522 scrollPosition = ui->tableView->verticalScrollBar()->value();
523 model->clear();
524 delete model;
525 }
526
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700527 model = new QStandardItemModel(root.childNodes().count(),3);
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800528 model->setHorizontalHeaderItem(0, new QStandardItem("NDN prefix"));
529 model->setHorizontalHeaderItem(1, new QStandardItem("Face ID"));
530 model->setHorizontalHeaderItem(2, new QStandardItem("Endpoint"));
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700531
532 int row = 0;
533 QDomNode fibEntry=root.firstChild();
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800534
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700535 while (!fibEntry.isNull())
536 {
537 QDomNodeList properties = fibEntry.childNodes();
538
539 QDomNode faceID = properties.at(0);
540 QDomNode ip = properties.at(1);
541 QDomNode prefix = properties.at(2);
542
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700543 model->setItem(row, 0, new QStandardItem(prefix.toElement().text()));
544 model->setItem(row, 1, new QStandardItem(faceID.toElement().text()));
545 model->setItem(row, 2, new QStandardItem(ip.toElement().text()));
546
547 fibEntry = fibEntry.nextSibling();
548 row++;
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800549 }
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700550
551 ui->tableView->setModel(model);
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800552 //ui->tableView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
553 ui->tableView->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
554 ui->tableView->setColumnWidth(0, 260);
555 ui->tableView->setColumnWidth(1, 57);
556 ui->tableView->setColumnWidth(2, 150);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700557
558 if(selectedRow >= 0)
559 ui->tableView->selectRow(selectedRow);
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800560
561 if(scrollPosition >= 0)
562 ui->tableView->verticalScrollBar()->setValue(scrollPosition);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700563}
564
565void TrayMenu::createTableView()
566{
567 ui->tableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
568 ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
569 ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
570
571 selectedRow = -1;
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800572 scrollPosition = -1;
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700573}
574
575void TrayMenu::selectTableRow()
576{
577 selectedRow = ui->tableView->selectionModel()->selection().indexes().at(0).row();
578}
579
580void TrayMenu::deleteFibEntry()
581{
582 if(selectedRow < 0)
583 return;
584
585 QStandardItem *prefix = model->item(selectedRow,0);
586 if(prefix == NULL)
587 return;
588
589 QStandardItem *faceID = model->item(selectedRow,1);
590 if(faceID == NULL)
591 return;
592
593 QStringList arguments;
594 arguments << "del" << prefix->text() << "face" << faceID->text();
595
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700596 QProcess *process = new QProcess();
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800597 connect(process,SIGNAL(finished(int)), process, SLOT(deleteLater()));
Ilya Moiseenko393cbdc2013-10-29 00:45:40 -0700598 process->start(NDND_FIB_COMMAND, arguments);
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700599}
600
601TrayMenu::~TrayMenu()
602{
603 daemonStatusTimer->stop();
604 statusUpdateThread->exit();
605 delete ui;
606 delete trayIcon;
607 delete trayIconMenu;
608 delete open;
609 delete close;
610 delete openGeneralSettings;
611 delete openForwardingSettings;
612 delete openSecuritySettings;
613 delete toolBar;
614 delete statusUpdateThread;
615 delete daemonStatusTimer;
616 delete dialog;
Ilya Moiseenko69abb972013-11-04 16:02:20 -0800617 delete networkManager;
618 delete persistentSettings;
Ilya Moiseenko18c8a132013-10-24 01:52:52 -0700619}
Alexander Afanasyeva822b572013-11-04 12:36:34 -0800620
621#if WAF
622#include "tray-menu.moc"
623#include "tray-menu.cpp.moc"
624#endif