shill: wifi: Implement FindService

Implement FindService so that WiFi::GetService can return an
already exisiting service if one exists.  We consider services
that we haven't found in WiFi::GetService to be hidden unless
the caller specifies otherwise.

BUG=chromium-os:22074
TEST=New Unit Test

Change-Id: If5a41509c0f58c5bdb4a01d550922bb778d0d259
Reviewed-on: https://gerrit.chromium.org/gerrit/11458
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
Commit-Ready: Paul Stewart <pstew@chromium.org>
Reviewed-by: Gaurav Shah <gauravsh@chromium.org>
diff --git a/wifi_service.cc b/wifi_service.cc
index a189698..9f61866 100644
--- a/wifi_service.cc
+++ b/wifi_service.cc
@@ -187,6 +187,10 @@
   return true;
 }
 
+bool WiFiService::IsSecurityMatch(const string &security) const {
+  return GetSecurityClass(security) == GetSecurityClass(security_);
+}
+
 // private methods
 void WiFiService::ConnectTask() {
   std::map<string, DBus::Variant> params;
@@ -338,6 +342,7 @@
   }
 }
 
+// static
 bool WiFiService::SanitizeSSID(string *ssid) {
   CHECK(ssid);
 
@@ -355,15 +360,20 @@
   return changed;
 }
 
-string WiFiService::GetGenericStorageIdentifier() const {
-  if (security_ == flimflam::kSecurityRsn ||
-      security_ == flimflam::kSecurityWpa) {
-    return GetStorageIdentifierForSecurity(flimflam::kSecurityPsk);
+// static
+string WiFiService::GetSecurityClass(const string &security) {
+  if (security == flimflam::kSecurityRsn ||
+      security == flimflam::kSecurityWpa) {
+    return flimflam::kSecurityPsk;
   } else {
-    return GetStorageIdentifierForSecurity(security_);
+    return security;
   }
 }
 
+string WiFiService::GetGenericStorageIdentifier() const {
+  return GetStorageIdentifierForSecurity(GetSecurityClass(security_));
+}
+
 string WiFiService::GetSpecificStorageIdentifier() const {
   return GetStorageIdentifierForSecurity(security_);
 }