[shill] Add support for setting properties.

This CL adds a framework for supporting RPC-exposed properties in Shill.
It also plumbs the code for setting properties on Service objects to prove
the approach.  Device and Manager settings will follow.

BUG=chromium-os:16343
TEST=build shill, run unit tests.

Change-Id: I55869453d6039e688f1a49be9dfb1ba1315efe0a
Reviewed-on: http://gerrit.chromium.org/gerrit/3004
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Chris Masone <cmasone@chromium.org>
diff --git a/wifi_service.cc b/wifi_service.cc
index a12b111..614c67e 100644
--- a/wifi_service.cc
+++ b/wifi_service.cc
@@ -7,6 +7,7 @@
 #include <string>
 
 #include <base/logging.h>
+#include <chromeos/dbus/service_constants.h>
 
 #include "shill/control_interface.h"
 #include "shill/device.h"
@@ -31,8 +32,23 @@
       task_factory_(this),
       wifi_(device),
       ssid_(ssid),
-      mode_(mode),
-      key_management_(key_management) {
+      mode_(mode) {
+  eap_.key_management = key_management;
+
+  // TODO(cmasone): Figure out if mode_ should be a string or what
+  // RegisterString(flimflam::kModeProperty, &mode_);
+  RegisterString(flimflam::kPassphraseProperty, &passphrase_);
+  RegisterBool(flimflam::kPassphraseRequiredProperty, &need_passphrase_);
+  RegisterConstString(flimflam::kSecurityProperty, &security_);
+
+  RegisterConstString(flimflam::kWifiAuthMode, &auth_mode_);
+  RegisterConstBool(flimflam::kWifiHiddenSsid, &hidden_ssid_);
+  RegisterConstUint16(flimflam::kWifiFrequency, &frequency_);
+  RegisterConstUint16(flimflam::kWifiPhyMode, &physical_mode_);
+  RegisterConstUint16(flimflam::kWifiHexSsid, &hex_ssid_);
+
+  RegisterConstUint8(flimflam::kSignalStrengthProperty, &strength_);
+  RegisterConstString(flimflam::kTypeProperty, &type_);
 }
 
 WiFiService::~WiFiService() {
@@ -48,6 +64,16 @@
       task_factory_.NewRunnableMethod(&WiFiService::RealConnect));
 }
 
+void WiFiService::Disconnect() {
+  // TODO(quiche) RemoveNetwork from supplicant
+  // XXX remove from favorite networks list?
+}
+
+bool WiFiService::Contains(const string &property) {
+  return (Service::Contains(property) ||
+          uint16_properties_.find(property) != uint16_properties_.end());
+}
+
 void WiFiService::RealConnect() {
   std::map<string, DBus::Variant> add_network_args;
   DBus::MessageIter mi;
@@ -56,7 +82,7 @@
   add_network_args[kSupplicantPropertyNetworkMode].writer().
       append_uint32(mode_);
   add_network_args[kSupplicantPropertyKeyMode].writer().
-      append_string(key_management_.c_str());
+      append_string(eap_.key_management.c_str());
   // TODO(quiche): figure out why we can't use operator<< without the
   // temporary variable.
   mi = add_network_args[kSupplicantPropertySSID].writer();
@@ -68,9 +94,4 @@
   // XXX add to favorite networks list?
 }
 
-void WiFiService::Disconnect() {
-  // TODO(quiche) RemoveNetwork from supplicant
-  // XXX remove from favorite networks list?
-}
-
 }  // namespace shill