[shill] Make wifi classes store mode as a string

Also, use flimflam nomenclature (managed,adhoc).

BUG=chromium-os:17744
TEST=unit

Change-Id: If4722525065f58a82b65bdd6adab34d97408bd67
Reviewed-on: http://gerrit.chromium.org/gerrit/6399
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Tested-by: Chris Masone <cmasone@chromium.org>
diff --git a/wifi.cc b/wifi.cc
index ca88281..8b444bb 100644
--- a/wifi.cc
+++ b/wifi.cc
@@ -170,7 +170,7 @@
   DBus::Path network_path;
 
   add_network_args[kSupplicantPropertyNetworkMode].writer().
-      append_uint32(service.mode());
+      append_uint32(WiFiEndpoint::ModeStringToUint(service.mode()));
   add_network_args[kSupplicantPropertyKeyMode].writer().
       append_string(service.key_management().c_str());
   // TODO(quiche): figure out why we can't use operator<< without the
diff --git a/wifi_endpoint.cc b/wifi_endpoint.cc
index 2fd2999..300c258 100644
--- a/wifi_endpoint.cc
+++ b/wifi_endpoint.cc
@@ -2,10 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "shill/wifi_endpoint.h"
+
+#include <base/logging.h>
 #include <base/stringprintf.h>
 #include <base/string_number_conversions.h>
-
-#include "shill/wifi_endpoint.h"
+#include <chromeos/dbus/service_constants.h>
 
 using std::string;
 
@@ -36,10 +38,10 @@
       operator std::vector<uint8_t>();
   signal_strength_ =
       properties.find(kSupplicantPropertySignal)->second;
-  network_mode_ = parse_mode(
+  network_mode_ = ParseMode(
       properties.find(kSupplicantPropertyMode)->second);
 
-  if (network_mode_ < 0) {
+  if (network_mode_.empty()) {
     // XXX log error?
   }
 
@@ -53,6 +55,18 @@
 
 WiFiEndpoint::~WiFiEndpoint() {}
 
+// static
+uint32_t WiFiEndpoint::ModeStringToUint(const std::string &mode_string) {
+  if (mode_string == flimflam::kModeManaged)
+    return kSupplicantNetworkModeInfrastructureInt;
+  else if (mode_string == flimflam::kModeAdhoc)
+    return kSupplicantNetworkModeAdHocInt;
+  else
+    NOTIMPLEMENTED() << "Shill dos not support " << mode_string
+                     << " mode at this time.";
+  return 0;
+}
+
 const std::vector<uint8_t> &WiFiEndpoint::ssid() const {
   return ssid_;
 }
@@ -77,22 +91,22 @@
   return signal_strength_;
 }
 
-uint32_t WiFiEndpoint::network_mode() const {
-  if (network_mode_ < 0)
-    return 0;
-  else
+const string &WiFiEndpoint::network_mode() const {
     return network_mode_;
 }
 
-int32_t WiFiEndpoint::parse_mode(const std::string &mode_string) {
+// static
+const char *WiFiEndpoint::ParseMode(const std::string &mode_string) {
   if (mode_string == kSupplicantNetworkModeInfrastructure) {
-    return kSupplicantNetworkModeInfrastructureInt;
+    return flimflam::kModeManaged;
   } else if (mode_string == kSupplicantNetworkModeAdHoc) {
-    return kSupplicantNetworkModeAdHocInt;
+    return flimflam::kModeAdhoc;
   } else if (mode_string == kSupplicantNetworkModeAccessPoint) {
-    return kSupplicantNetworkModeAccessPointInt;
+    NOTREACHED() << "Shill does not support AP mode at this time.";
+    return NULL;
   } else {
-    return -1;
+    NOTREACHED() << "Unknown WiFi endpoint mode!";
+    return NULL;
   }
 }
 
diff --git a/wifi_endpoint.h b/wifi_endpoint.h
index 0bc86b5..17bf60b 100644
--- a/wifi_endpoint.h
+++ b/wifi_endpoint.h
@@ -21,13 +21,18 @@
  public:
   WiFiEndpoint(const std::map<std::string, ::DBus::Variant> &properties);
   virtual ~WiFiEndpoint();
+
+  // Maps mode strings from flimflam's nomenclature, as defined
+  // in chromeos/dbus/service_constants.h, to uints used by supplicant
+  static uint32_t ModeStringToUint(const std::string &mode_string);
+
   const std::vector<uint8_t> &ssid() const;
   const std::string &ssid_string() const;
   const std::string &ssid_hex() const;
   const std::string &bssid_string() const;
   const std::string &bssid_hex() const;
   int16_t signal_strength() const;
-  uint32_t network_mode() const;
+  const std::string &network_mode() const;
 
  private:
   static const uint32_t kSupplicantNetworkModeInfrastructureInt;
@@ -42,7 +47,9 @@
   static const char kSupplicantNetworkModeAdHoc[];
   static const char kSupplicantNetworkModeAccessPoint[];
 
-  static int32_t parse_mode(const std::string &mode_string);
+  // Maps mode strings from supplicant into flimflam's nomenclature, as defined
+  // in chromeos/dbus/service_constants.h
+  static const char *ParseMode(const std::string &mode_string);
 
   std::vector<uint8_t> ssid_;
   std::vector<uint8_t> bssid_;
@@ -51,7 +58,7 @@
   std::string bssid_string_;
   std::string bssid_hex_;
   int16_t signal_strength_;
-  int32_t network_mode_;
+  std::string network_mode_;
 
   DISALLOW_COPY_AND_ASSIGN(WiFiEndpoint);
 };
diff --git a/wifi_service.cc b/wifi_service.cc
index 64747cc..4bded51 100644
--- a/wifi_service.cc
+++ b/wifi_service.cc
@@ -23,17 +23,16 @@
                          Manager *manager,
                          const WiFiRefPtr &device,
                          const std::vector<uint8_t> ssid,
-                         uint32_t mode,
+                         const std::string &mode,
                          const std::string &key_management)
     : Service(control_interface, dispatcher, manager),
+      mode_(mode),
       task_factory_(this),
       wifi_(device),
-      ssid_(ssid),
-      mode_(mode) {
+      ssid_(ssid) {
   eap_.key_management = key_management;
 
-  // TODO(cmasone): Figure out if mode_ should be a string or what
-  // store_.RegisterString(flimflam::kModeProperty, &mode_);
+  store_.RegisterConstString(flimflam::kModeProperty, &mode_);
   store_.RegisterString(flimflam::kPassphraseProperty, &passphrase_);
   store_.RegisterBool(flimflam::kPassphraseRequiredProperty, &need_passphrase_);
   store_.RegisterConstString(flimflam::kSecurityProperty, &security_);
@@ -65,11 +64,11 @@
   // XXX remove from favorite networks list?
 }
 
-uint32_t WiFiService::mode() const {
+const string &WiFiService::mode() const {
   return mode_;
 }
 
-const std::string &WiFiService::key_management() const {
+const string &WiFiService::key_management() const {
   return eap_.key_management;
 }
 
diff --git a/wifi_service.h b/wifi_service.h
index e785a3f..bb89453 100644
--- a/wifi_service.h
+++ b/wifi_service.h
@@ -26,12 +26,12 @@
               Manager *manager,
               const WiFiRefPtr &device,
               const std::vector<uint8_t> ssid,
-              uint32_t mode,
+              const std::string &mode,
               const std::string &key_management);
   ~WiFiService();
   void Connect();
   void Disconnect();
-  uint32_t mode() const;
+  const std::string &mode() const;
   const std::string &key_management() const;
   const std::vector<uint8_t> &ssid() const;
 
@@ -51,6 +51,7 @@
   const std::string type_;
   // TODO(cmasone): see if the below can be pulled from the endpoint associated
   // with this service instead.
+  const std::string mode_;
   std::string auth_mode_;
   bool hidden_ssid_;
   uint16 frequency_;
@@ -60,7 +61,6 @@
   ScopedRunnableMethodFactory<WiFiService> task_factory_;
   WiFiRefPtr wifi_;
   const std::vector<uint8_t> ssid_;
-  const uint32_t mode_;
   DISALLOW_COPY_AND_ASSIGN(WiFiService);
 };