Autoconfiguration for Linux

Change-Id: I6874628f29de327e5ece7ffddf3433cbc88de968
diff --git a/linux/main.cpp b/linux/main.cpp
index f1fc24e..867abdb 100644
--- a/linux/main.cpp
+++ b/linux/main.cpp
@@ -6,7 +6,7 @@
  */
 
 #include <QtGui/QApplication>
-#include "traymenu.h"
+#include "tray-menu.h"
 
 int main(int argc, char *argv[])
 {
diff --git a/linux/network-manager.cpp b/linux/network-manager.cpp
new file mode 100644
index 0000000..22e63d2
--- /dev/null
+++ b/linux/network-manager.cpp
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * @copyright See LICENCE for copyright and license information.
+ *
+ * @author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include "network-manager.h"
+#include <QProcess>
+
+NetworkManager::NetworkManager()
+{
+    if (!QDBusConnection::systemBus().isConnected())
+    {
+        qDebug() << "Cannot connect to the D-Bus session bus.\n";
+        return;
+    }
+
+    QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager",
+                                          "/org/freedesktop/NetworkManager",
+                                          "org.freedesktop.NetworkManager",
+                                          "StateChanged", this, SLOT(stateChanged(uint)));
+}
+
+void NetworkManager::stateChanged(uint state)
+{
+    qDebug() << "State = " << state;
+
+    if(state == NM_STATE_CONNECTED_GLOBAL)
+        autoconfigDaemon();
+}
+
+void NetworkManager::autoconfigDaemon()
+{
+    QProcess *process = new QProcess();
+    process->start(NDND_AUTOCONFIG_COMMAND);
+}
diff --git a/linux/network-manager.h b/linux/network-manager.h
new file mode 100644
index 0000000..11e5ec7
--- /dev/null
+++ b/linux/network-manager.h
@@ -0,0 +1,33 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * @copyright See LICENCE for copyright and license information.
+ *
+ * @author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include <QtDBus>
+
+#ifndef NETWORKMANAGER_H
+#define NETWORKMANAGER_H
+
+#define NDND_AUTOCONFIG_COMMAND "/usr/local/bin/ndnd-autoconfig"
+#define NM_STATE_DISCONNECTED 20
+#define NM_STATE_CONNECTING 40
+#define NM_STATE_CONNECTED_GLOBAL 70
+
+class NetworkManager : public QObject
+{
+     Q_OBJECT
+
+public:
+    NetworkManager();
+
+private:
+    void autoconfigDaemon();
+
+private slots:
+    void stateChanged(uint state);
+};
+
+
+#endif // NETWORKMANAGER_H
diff --git a/linux/tray-menu.cpp b/linux/tray-menu.cpp
index 3d96ac9..40eb98e 100644
--- a/linux/tray-menu.cpp
+++ b/linux/tray-menu.cpp
@@ -9,6 +9,7 @@
 #include "ui_traymenu.h"   //generated from traymenu.ui
 #include "quit-dialog.h"
 #include "fib-input-dialog.h"
+#include "network-manager.h"
 
 #include <QMenu>
 #include <QCloseEvent>
@@ -39,6 +40,8 @@
 
     startDaemon();
 
+    networkManager = new NetworkManager();
+
     connect(ui->openTrafficMapButton, SIGNAL(pressed()), this, SLOT(openTrafficMap()));
     connect(ui->openRoutingStatusButton, SIGNAL(pressed()), this, SLOT(openRoutingStatus()));
     connect(ui->addFibButton, SIGNAL(pressed()), this, SLOT(showFibInputDialog()));
diff --git a/linux/tray-menu.h b/linux/tray-menu.h
index 045bb09..c5dfd66 100644
--- a/linux/tray-menu.h
+++ b/linux/tray-menu.h
@@ -19,8 +19,9 @@
 #include <QStandardItemModel>
 #include <QtXml>
 
-#include "FibInputDialog.h"
-#include "QuitDialog.h"
+#include "fib-input-dialog.h"
+#include "quit-dialog.h"
+#include "network-manager.h"
 
 #define NDND_START_COMMAND "/usr/local/bin/ndndstart"
 #define NDND_STOP_COMMAND "/usr/local/bin/ndndstop"
@@ -79,6 +80,8 @@
     bool enableStartOnLogin;
     bool shutdownOnExit;
 
+    NetworkManager *networkManager;
+
 private slots:
     void trayIconClicked(QSystemTrayIcon::ActivationReason);
     void generalSettingsClicked();