summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2013-12-20 16:07:20 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2013-12-20 16:07:20 -0800
commitfe6b7f477c2d12bd02fecf81cc6086f1e935c8d7 (patch)
tree9176114d633ec199f6d1dc5c3a7767732a8787f5
parent434a2f70710542cee07ead4f0add518edc08abf8 (diff)
downloadinfinitytier-fe6b7f477c2d12bd02fecf81cc6086f1e935c8d7.tar.gz
infinitytier-fe6b7f477c2d12bd02fecf81cc6086f1e935c8d7.zip
Fix for GitHub issue #30
-rw-r--r--ZeroTierUI/mainwindow.cpp83
-rw-r--r--ZeroTierUI/mainwindow.h5
-rw-r--r--ZeroTierUI/mainwindow.ui2
-rw-r--r--ZeroTierUI/networkwidget.cpp2
4 files changed, 54 insertions, 38 deletions
diff --git a/ZeroTierUI/mainwindow.cpp b/ZeroTierUI/mainwindow.cpp
index 255b3989..d935d045 100644
--- a/ZeroTierUI/mainwindow.cpp
+++ b/ZeroTierUI/mainwindow.cpp
@@ -21,6 +21,7 @@
#include <QStringList>
#include <QVBoxLayout>
#include <QScrollBar>
+#include <QEventLoop>
// Globally visible
ZeroTier::Node::LocalClient *zeroTierClient = (ZeroTier::Node::LocalClient *)0;
@@ -76,7 +77,7 @@ MainWindow::~MainWindow()
void MainWindow::timerEvent(QTimerEvent *event)
{
- QMainWindow::timerEvent(event);
+ event->accept();
if (!zeroTierClient) {
std::string dotAuthFile((QDir::homePath() + QDir::separator() + ".zeroTierOneAuthToken").toStdString());
@@ -123,7 +124,6 @@ void MainWindow::timerEvent(QTimerEvent *event)
void MainWindow::customEvent(QEvent *event)
{
ZTMessageEvent *m = (ZTMessageEvent *)event; // only one custom event type so far
-
if (m->ztMessage.size() == 0)
return;
@@ -143,46 +143,57 @@ void MainWindow::customEvent(QEvent *event)
if (hdr.size() >= 5)
this->myVersion = hdr[4].c_str();
} else if (hdr[1] == "listnetworks") {
- std::map< std::string,std::vector<std::string> > byNwid;
+ std::map< std::string,std::vector<std::string> > newNetworks;
for(unsigned long i=1;i<m->ztMessage.size();++i) {
std::vector<std::string> l(ZeroTier::Node::LocalClient::splitLine(m->ztMessage[i]));
// 200 listnetworks <nwid> <name> <status> <config age> <type> <dev> <ips>
if ((l.size() == 9)&&(l[2].length() == 16))
- byNwid[l[2]] = l;
- }
-
- std::map< std::string,std::pair<int,NetworkWidget *> > existingByNwid;
- for(int r=0;r<ui->networkListWidget->count();++r) {
- NetworkWidget *nw = (NetworkWidget *)ui->networkListWidget->itemWidget(ui->networkListWidget->item(r));
- existingByNwid[nw->networkId()] = std::make_pair(r,nw);
+ newNetworks[l[2]] = l;
}
- for(std::map< std::string,std::pair<int,NetworkWidget *> >::iterator i(existingByNwid.begin());i!=existingByNwid.end();++i) {
- if (byNwid.count(i->first)) {
- std::vector<std::string> &l = byNwid[i->first];
- i->second.second->setNetworkName(l[3]);
- i->second.second->setStatus(l[4],l[5]);
- i->second.second->setNetworkType(l[6]);
- i->second.second->setNetworkDeviceName(l[7]);
- i->second.second->setIps(l[8]);
- } else {
- delete ui->networkListWidget->takeItem(i->second.first);
+ if (newNetworks != networks) {
+ networks = newNetworks;
+
+ for (bool removed=true;removed;) {
+ removed = false;
+ for(int r=0;r<ui->networkListWidget->count();++r) {
+ NetworkWidget *nw = (NetworkWidget *)ui->networkListWidget->itemWidget(ui->networkListWidget->item(r));
+ if (!networks.count(nw->networkId())) {
+ ui->networkListWidget->setVisible(false); // HACK to prevent an occasional crash here, discovered through hours of shotgun debugging... :P
+ delete ui->networkListWidget->takeItem(r);
+ removed = true;
+ break;
+ }
+ }
}
- }
-
- for(std::map< std::string,std::vector<std::string> >::iterator i(byNwid.begin());i!=byNwid.end();++i) {
- if (!existingByNwid.count(i->first)) {
- std::vector<std::string> &l = i->second;
- NetworkWidget *nw = new NetworkWidget((QWidget *)0,i->first);
- nw->setNetworkName(l[3]);
- nw->setStatus(l[4],l[5]);
- nw->setNetworkType(l[6]);
- nw->setNetworkDeviceName(l[7]);
- nw->setIps(l[8]);
- QListWidgetItem *item = new QListWidgetItem();
- item->setSizeHint(nw->sizeHint());
- ui->networkListWidget->addItem(item);
- ui->networkListWidget->setItemWidget(item,nw);
+ ui->networkListWidget->setVisible(true);
+ std::set<std::string> alreadyDisplayed;
+ for(int r=0;r<ui->networkListWidget->count();++r) {
+ NetworkWidget *nw = (NetworkWidget *)ui->networkListWidget->itemWidget(ui->networkListWidget->item(r));
+ if (networks.count(nw->networkId()) > 0) {
+ alreadyDisplayed.insert(nw->networkId());
+ std::vector<std::string> &l = networks[nw->networkId()];
+ nw->setNetworkName(l[3]);
+ nw->setStatus(l[4],l[5]);
+ nw->setNetworkType(l[6]);
+ nw->setNetworkDeviceName(l[7]);
+ nw->setIps(l[8]);
+ }
+ }
+ for(std::map< std::string,std::vector<std::string> >::iterator nwdata(networks.begin());nwdata!=networks.end();++nwdata) {
+ if (alreadyDisplayed.count(nwdata->first) == 0) {
+ std::vector<std::string> &l = nwdata->second;
+ NetworkWidget *nw = new NetworkWidget((QWidget *)0,nwdata->first);
+ nw->setNetworkName(l[3]);
+ nw->setStatus(l[4],l[5]);
+ nw->setNetworkType(l[6]);
+ nw->setNetworkDeviceName(l[7]);
+ nw->setIps(l[8]);
+ QListWidgetItem *item = new QListWidgetItem();
+ item->setSizeHint(nw->sizeHint());
+ ui->networkListWidget->addItem(item);
+ ui->networkListWidget->setItemWidget(item,nw);
+ }
}
}
} else if (hdr[1] == "listpeers") {
@@ -196,7 +207,7 @@ void MainWindow::customEvent(QEvent *event)
if (this->myAddress.size())
ui->addressButton->setText(this->myAddress);
- else ui->addressButton->setText("??????????");
+ else ui->addressButton->setText(" ");
QString st(this->myStatus);
st += ", v";
diff --git a/ZeroTierUI/mainwindow.h b/ZeroTierUI/mainwindow.h
index 2a9f4de2..f4ca51b4 100644
--- a/ZeroTierUI/mainwindow.h
+++ b/ZeroTierUI/mainwindow.h
@@ -5,6 +5,10 @@
#include <QEvent>
#include <QString>
+#include <map>
+#include <vector>
+#include <string>
+
#include "../node/Node.hpp"
#include "../node/Utils.hpp"
@@ -56,6 +60,7 @@ private:
QString myVersion;
unsigned int numPeers;
unsigned int cyclesSinceResponseFromService;
+ std::map< std::string,std::vector<std::string> > networks;
};
#endif // MAINWINDOW_H
diff --git a/ZeroTierUI/mainwindow.ui b/ZeroTierUI/mainwindow.ui
index 5bfd01b3..306e4523 100644
--- a/ZeroTierUI/mainwindow.ui
+++ b/ZeroTierUI/mainwindow.ui
@@ -135,7 +135,7 @@ QPushButton:pressed {
s</string>
</property>
<property name="text">
- <string>##########</string>
+ <string> </string>
</property>
<property name="flat">
<bool>true</bool>
diff --git a/ZeroTierUI/networkwidget.cpp b/ZeroTierUI/networkwidget.cpp
index ce182c11..cd0900f3 100644
--- a/ZeroTierUI/networkwidget.cpp
+++ b/ZeroTierUI/networkwidget.cpp
@@ -106,8 +106,8 @@ const std::string &NetworkWidget::networkId()
void NetworkWidget::on_leaveNetworkButton_clicked()
{
if (QMessageBox::question(this,"Leave Network?",QString("Are you sure you want to leave network '") + networkIdStr.c_str() + "'?",QMessageBox::No,QMessageBox::Yes) == QMessageBox::Yes) {
- zeroTierClient->send((QString("leave ") + networkIdStr.c_str()).toStdString());
this->setEnabled(false);
+ zeroTierClient->send((QString("leave ") + networkIdStr.c_str()).toStdString());
}
}