Nexus: Clean up supplicant events, protocol, and continue plumbing

    - Create SupplicantEvent classes for events
    - New SupplicantEventFactory for creating events
    - Extract Controller -> NetworkManager callbacks into IControllerHandler
    - Move ScanResult handling from Supplicant -> WifiController
    - Plumb more 'onConnected()' code
    - Instead of re-creating NetworkList every-time, merge in
      new entries
    - Extract SupplicantListener -> Supplicant callbacks into
      ISupplicantEventHandler
    - Move SupplicantListener callback handling to WifiController
    - Add unlocked version of lookupNetwork()
    - Save supplicant config after setting a WifiNetwork variable
    - Move property registration from WifiNetwork -> Supplicant
    - Change wifi enable broadcast messages
    - Add 3 new events: 'onAssociating', 'onAssociated', 'onConnectionTimeout'
    - Add support for handling KeyManagement

Signed-off-by: San Mehat <san@google.com>
diff --git a/nexus/WifiNetwork.cpp b/nexus/WifiNetwork.cpp
index 818b91d..7059bd0 100644
--- a/nexus/WifiNetwork.cpp
+++ b/nexus/WifiNetwork.cpp
@@ -76,7 +76,7 @@
     mDefaultKeyIndex = -1;
     mPriority = -1;
     mHiddenSsid = NULL;
-    mAllowedKeyManagement = 0;
+    mAllowedKeyManagement = KeyManagementMask::UNKNOWN;
     mAllowedProtocols = 0;
     mAllowedAuthAlgorithms = 0;
     mAllowedPairwiseCiphers = 0;
@@ -94,8 +94,6 @@
     asprintf(&tmp2, "wifi.net.%d", mNetid);
     mIfaceCfg = new InterfaceConfig(tmp2);
     free(tmp2);
-
-    registerProperties();
     free(tmp);
 }
 
@@ -121,8 +119,6 @@
     asprintf(&tmp2, "wifi.net.%d", mNetid);
     mIfaceCfg = new InterfaceConfig(tmp2);
     free(tmp2);
-
-    registerProperties();
 }
 
 WifiNetwork *WifiNetwork::clone() {
@@ -153,7 +149,6 @@
 }
 
 WifiNetwork::~WifiNetwork() {
-    unregisterProperties();
     if (mSsid)
         free(mSsid);
     if (mBssid)
@@ -203,7 +198,26 @@
 
     len = sizeof(buffer);
     if (mSuppl->getNetworkVar(mNetid, "key_mgmt", buffer, len)) {
-        // TODO
+        if (!strcmp(buffer, "NONE"))
+            setAllowedKeyManagement(KeyManagementMask::NONE);
+        else if (index(buffer, ' ')) {
+            char *next = buffer;
+            char *token;
+            uint32_t mask = 0;
+
+            while((token = strsep(&next, " "))) {
+                if (!strcmp(token, "WPA-PSK"))
+                    mask |= KeyManagementMask::WPA_PSK;
+                else if (!strcmp(token, "WPA-EAP"))
+                    mask |= KeyManagementMask::WPA_EAP;
+                else if (!strcmp(token, "IEE8021X"))
+                    mask |= KeyManagementMask::IEEE8021X;
+                else
+                    LOGW("Unsupported key management scheme '%s'" , token);
+            }
+            setAllowedKeyManagement(mask);
+        } else
+            LOGE("Unsupported key management '%s'", buffer);
     }
 
     len = sizeof(buffer);
@@ -273,7 +287,7 @@
 
         while((v_token = strsep(&v_next, " "))) {
             if (!strcasecmp(v_token, "NONE")) {
-                mask = 0;
+                mask = KeyManagementMask::NONE;
                 none = true;
             } else if (!none) {
                 if (!strcasecmp(v_token, "WPA_PSK"))
@@ -363,7 +377,29 @@
         snprintf(buffer, maxsize, "%d", getDefaultKeyIndex());
     else if (!strcasecmp(fc, "pri"))
         snprintf(buffer, maxsize, "%d", getPriority());
-    else if (!strcasecmp(fc, "hiddenssid")) {
+    else if (!strcasecmp(fc, "AllowedKeyManagement")) {
+        if (getAllowedKeyManagement() == KeyManagementMask::NONE) 
+            strncpy(buffer, "NONE", maxsize);
+        else {
+            char tmp[80] = { '\0' };
+
+            if (getAllowedKeyManagement() & KeyManagementMask::WPA_PSK)
+                strcat(tmp, "WPA_PSK ");
+            if (getAllowedKeyManagement() & KeyManagementMask::WPA_EAP)
+                strcat(tmp, "WPA_EAP ");
+            if (getAllowedKeyManagement() & KeyManagementMask::IEEE8021X)
+                strcat(tmp, "IEEE8021X");
+            if (tmp[0] == '\0') {
+                strncpy(buffer, "(internal error)", maxsize);
+                errno = ENOENT;
+                return NULL;
+            }
+            if (tmp[strlen(tmp)] == ' ')
+                tmp[strlen(tmp)] = '\0';
+
+            strncpy(buffer, tmp, maxsize);
+        }
+    } else if (!strcasecmp(fc, "hiddenssid")) {
         strncpy(buffer,
                 getHiddenSsid() ? getHiddenSsid() : "none",
                 maxsize);