DhcpcdQt::~DhcpcdQt()
{
- /* This will have already been destroyed,
- * but the reference may not be. */
- ssidMenu = NULL;
+ if (ssidMenu) {
+ ssidMenu->setVisible(false);
+ ssidMenu->deleteLater();
+ }
if (con != NULL) {
dhcpcd_close(con);
free(lastStatus);
- qDeleteAll(*wis);
+ for (auto &wi : *wis)
+ wi->deleteLater();
delete wis;
-
}
DHCPCD_CONNECTION *DhcpcdQt::getConnection()
trayIcon->setToolTip(tr("Not connected to dhcpcd"));
/* Close down everything */
if (notifier) {
- delete notifier;
+ notifier->setEnabled(false);
+ notifier->deleteLater();
notifier = NULL;
}
if (ssidMenu) {
- delete ssidMenu;
+ ssidMenu->deleteLater();
ssidMenu = NULL;
}
+ preferencesAction->setEnabled(false);
if (preferences) {
- delete preferences;
+ preferences->deleteLater();
preferences = NULL;
}
- preferencesAction->setEnabled(false);
} else {
bool refresh;
qCritical("No fd for WPA");
if (wi) {
wis->removeOne(wi);
- delete wi;
+ wi->deleteLater();
}
return;
}
qCritical("No interface for WPA");
if (wi) {
wis->removeOne(wi);
- delete wi;
+ wi->deleteLater();
}
return;
}
scans = dhcpcd_wi_scans(i);
if (wi == NULL) {
wi = new DhcpcdWi(this, wpa);
- wis->append(wi);
- wi->setScans(scans);
+ if (wi->open()) {
+ wis->append(wi);
+ wi->setScans(scans);
+ } else
+ wi->deleteLater();
} else
processScans(wi, scans);
DhcpcdWi *wi = findWi(wpa);
if (wi) {
wis->removeOne(wi);
- delete wi;
+ wi->deleteLater();
}
}
}
dhcpcd_wpa_start(con);
if (retryOpenTimer) {
- delete retryOpenTimer;
+ retryOpenTimer->stop();
+ retryOpenTimer->deleteLater();
retryOpenTimer = NULL;
}
preferencesAction->setEnabled(dhcpcd_privileged(con));
}
-void DhcpcdQt::dispatch() {
-
- if (dhcpcd_get_fd(con) == -1) {
- qWarning("dhcpcd connection lost");
- return;
- }
+void DhcpcdQt::dispatch()
+{
dhcpcd_dispatch(con);
}
return getIcon("status", "network-transmit-receive");
}
+void DhcpcdQt::menuDeleted(QMenu *menu)
+{
+
+ if (ssidMenu == menu)
+ ssidMenu = NULL;
+}
+
void DhcpcdQt::createSsidMenu()
{
if (ssidMenu) {
- delete ssidMenu;
+ ssidMenu->deleteLater();
ssidMenu = NULL;
}
if (wis->size() == 0)
menu = NULL;
scans = NULL;
- int fd = dhcpcd_wpa_get_fd(wpa);
- notifier = new QSocketNotifier(fd, QSocketNotifier::Read);
- connect(notifier, SIGNAL(activated(int)), this, SLOT(dispatch()));
- retryOpenTimer = NULL;
+ notifier = NULL;
+ pingTimer = NULL;
}
DhcpcdWi::~DhcpcdWi()
{
if (menu) {
- delete menu;
+ dhcpcdQt->menuDeleted(menu);
+ menu->setVisible(false);
+ menu->deleteLater();
menu = NULL;
}
if (notifier) {
- delete notifier;
+ notifier->setEnabled(false);
+ notifier->deleteLater();
notifier = NULL;
}
+ if (pingTimer) {
+ pingTimer->stop();
+ pingTimer->deleteLater();
+ pingTimer = NULL;
+ }
+
dhcpcd_wi_scans_free(scans);
}
return menu;
}
-void DhcpcdWi::wpaOpen()
+bool DhcpcdWi::open()
{
int fd = dhcpcd_wpa_open(wpa);
- static int last_error;
if (fd == -1) {
- if (errno != last_error) {
- last_error = errno;
- qCritical("%s: dhcpcd_wpa_open: %s",
- dhcpcd_wpa_if(wpa)->ifname,
- strerror(last_error));
- }
- return;
+ qCritical("%s: dhcpcd_wpa_open: %s",
+ dhcpcd_wpa_if(wpa)->ifname,
+ strerror(errno));
+ dhcpcd_wpa_close(wpa);
+ return false;
}
notifier = new QSocketNotifier(fd, QSocketNotifier::Read);
connect(notifier, SIGNAL(activated(int)), this, SLOT(dispatch()));
- if (retryOpenTimer) {
- delete retryOpenTimer;
- retryOpenTimer = NULL;
- }
+ pingTimer = new QTimer(this);
+ connect(pingTimer, SIGNAL(timeout()), this, SLOT(ping()));
+ pingTimer->start(DHCPCD_WPA_PING);
+ return true;
}
void DhcpcdWi::dispatch()
{
- if (dhcpcd_wpa_get_fd(wpa) == -1) {
- delete notifier;
- notifier = NULL;
- DHCPCD_IF *i = dhcpcd_wpa_if(wpa);
- if (i == NULL ||
- strcmp(i->reason, "DEPARTED") == 0 ||
- strcmp(i->reason, "STOPPED") == 0)
- return;
- qWarning("%s: %s",
- i->ifname,
- qPrintable(tr("dhcpcd WPA connection lost")));
- if (retryOpenTimer == NULL) {
- retryOpenTimer = new QTimer(this);
- connect(retryOpenTimer, SIGNAL(timeout()),
- this, SLOT(wpaOpen()));
- retryOpenTimer->start(DHCPCD_RETRYOPEN);
- }
- return;
- }
-
dhcpcd_wpa_dispatch(wpa);
}
+void DhcpcdWi::ping()
+{
+
+ if (!dhcpcd_wpa_ping(wpa))
+ dhcpcd_wpa_close(wpa);
+}
+
void DhcpcdWi::connectSsid(DHCPCD_WI_SCAN *scan)
{
DHCPCD_WI_SCAN s;
DhcpcdWi(DhcpcdQt *dhcpcdQt, DHCPCD_WPA *wpa);
~DhcpcdWi();
DHCPCD_WPA *getWpa();
+ bool open();
DHCPCD_WI_SCAN *getScans();
bool setScans(DHCPCD_WI_SCAN *scans);
private slots:
void dispatch();
- void wpaOpen();
+ void ping();
void connectSsid(DHCPCD_WI_SCAN *scan);
private:
DHCPCD_WI_SCAN *scans;
QSocketNotifier *notifier;
- QTimer *retryOpenTimer;
+ QTimer *pingTimer;
QMenu *menu;
void createMenuItem(QMenu *menu, DHCPCD_WI_SCAN *scan,