nexus: Refactor some of the create/remove network path and add code for
       retrieving network lists from supplicant
nexus: Rework properties
nexus: Implement wifi network enable/disable and add some error checking
nexus: Add some TODOs
nexus: Whitespace cleanup
nexus: Add bindings between controllers and network interfaces
nexus: Add properties for InterfaceConfig
nexus: Fix a few conversion bugs in InterfaceConfig

Signed-off-by: San Mehat <san@google.com>
diff --git a/nexus/VpnController.cpp b/nexus/VpnController.cpp
index d3bc216..1246703 100644
--- a/nexus/VpnController.cpp
+++ b/nexus/VpnController.cpp
@@ -16,55 +16,61 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <stdlib.h>
 #include <errno.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
+#include "PropertyManager.h"
 #include "VpnController.h"
 
-VpnController::VpnController() :
-               Controller("VPN", "vpn") {
-    registerProperty("gateway");
+VpnController::VpnController(PropertyManager *propmngr) :
+               Controller("VPN", propmngr) {
+    mEnabled = false;
+    propmngr->registerProperty("vpn.enabled", this);
+    propmngr->registerProperty("vpn.gateway", this);
 }
 
 int VpnController::start() {
-    errno = ENOSYS;
-    return -1;
+    return 0;
 }
 
 int VpnController::stop() {
-    errno = ENOSYS;
-    return -1;
+    return 0;
 }
 
-int VpnController::enable() {
-    errno = ENOSYS;
-    return -1;
-}
+int VpnController::set(const char *name, const char *value) {
+    if (!strcmp(name, "vpn.enabled")) {
+        int en = atoi(value);
+        int rc;
 
-int VpnController::disable() {
-    errno = ENOSYS;
-    return -1;
-}
+        if (en == mEnabled)
+            return 0;
+        rc = (en ? enable() : disable());
 
-int VpnController::setProperty(const char *name, char *value) {
-    if (!strcmp(name, "gateway")) {
+        if (!rc)
+            mEnabled = en;
+        return rc;
+    } if (!strcmp(name, "vpn.gateway")) {
         if (!inet_aton(value, &mVpnGateway)) {
             errno = EINVAL;
             return -1;
         }
         return 0;
-    } 
+    }
 
-    return Controller::setProperty(name, value);
+    return Controller::set(name, value);
 }
 
-const char *VpnController::getProperty(const char *name, char *buffer, size_t maxsize) {
-    if (!strcmp(name, "gateway")) {
+const char *VpnController::get(const char *name, char *buffer, size_t maxsize) {
+    if (!strcmp(name, "vpn.enabled")) {
+        snprintf(buffer, maxsize, "%d", mEnabled);
+        return buffer;
+    } if (!strcmp(name, "vpn.gateway")) {
         snprintf(buffer, maxsize, "%s", inet_ntoa(mVpnGateway));
         return buffer;
     }
 
-    return Controller::getProperty(name, buffer, maxsize);
+    return Controller::get(name, buffer, maxsize);
 }