shill: Purge service/wifi_service state on Unload

Clear relevant state from Service and WiFiService when manager
notifies the service that it is no longer backed by a Profile.

BUG=chromium-os:22947
TEST=New unit tests

Change-Id: I048d2692fade5b883332e727be39f86caf4ed7f0
Reviewed-on: https://gerrit.chromium.org/gerrit/13880
Commit-Ready: Paul Stewart <pstew@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/wifi_service.cc b/wifi_service.cc
index dd9d1c7..ca55a06 100644
--- a/wifi_service.cc
+++ b/wifi_service.cc
@@ -87,19 +87,14 @@
     // XXX needs_passpharse_ = false ?
   } else if (security_ == flimflam::kSecurityPsk) {
     SetEAPKeyManagement("WPA-PSK");
-    need_passphrase_ = true;
   } else if (security_ == flimflam::kSecurityRsn) {
     SetEAPKeyManagement("WPA-PSK");
-    need_passphrase_ = true;
   } else if (security_ == flimflam::kSecurityWpa) {
     SetEAPKeyManagement("WPA-PSK");
-    need_passphrase_ = true;
   } else if (security_ == flimflam::kSecurityWep) {
     SetEAPKeyManagement("NONE");
-    need_passphrase_ = true;
   } else if (security_ == flimflam::kSecurityNone) {
     SetEAPKeyManagement("NONE");
-    need_passphrase_ = false;
   } else {
     LOG(ERROR) << "unsupported security method " << security_;
   }
@@ -201,7 +196,6 @@
 
   if (error->IsSuccess()) {
     passphrase_ = passphrase;
-    need_passphrase_ = false;
   }
 
   UpdateConnectable();
@@ -277,6 +271,13 @@
   return true;
 }
 
+void WiFiService::Unload() {
+  Service::Unload();
+  hidden_ssid_ = false;
+  passphrase_ = "";
+  UpdateConnectable();
+}
+
 bool WiFiService::IsSecurityMatch(const string &security) const {
   return GetSecurityClass(security) == GetSecurityClass(security_);
 }
@@ -394,16 +395,17 @@
 void WiFiService::UpdateConnectable() {
   if (security_ == flimflam::kSecurityNone) {
     DCHECK(passphrase_.empty());
-    set_connectable(true);
+    need_passphrase_ = false;
   } else if (security_ == flimflam::kSecurityWep ||
       security_ == flimflam::kSecurityWpa ||
       security_ == flimflam::kSecurityPsk ||
       security_ == flimflam::kSecurityRsn) {
-    set_connectable(!passphrase_.empty());
+    need_passphrase_ = passphrase_.empty();
   } else {
     // TODO(quiche): Handle connectability for 802.1x. (crosbug.com/23466)
-    set_connectable(false);
+    need_passphrase_ = true;
   }
+  set_connectable(!need_passphrase_);
 }
 
 // static