[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/dbus_adaptor.cc b/dbus_adaptor.cc
index 9b57ba2..748832c 100644
--- a/dbus_adaptor.cc
+++ b/dbus_adaptor.cc
@@ -35,6 +35,10 @@
                                  const string &name,
                                  const ::DBus::Variant &value,
                                  ::DBus::Error &error) {
+  if (!store->Contains(name)) {
+    Error(Error::kInvalidProperty, name + " is invalid.").ToDBusError(&error);
+    return false;
+  }
   bool set = false;
   Error e(Error::kInvalidArguments, "Could not write " + name);
 
@@ -46,6 +50,8 @@
     set = store->SetInt16Property(name, value.reader().get_int16(), &e);
   else if (DBusAdaptor::IsInt32(value.signature()))
     set = store->SetInt32Property(name, value.reader().get_int32(), &e);
+  else if (DBusAdaptor::IsPath(value.signature()))
+    set = store->SetStringProperty(name, value.reader().get_path(), &e);
   else if (DBusAdaptor::IsString(value.signature()))
     set = store->SetStringProperty(name, value.reader().get_string(), &e);
   else if (DBusAdaptor::IsStringmap(value.signature()))
@@ -95,6 +101,13 @@
 }
 
 // static
+::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
+  ::DBus::Variant v;
+  v.writer().append_path(value.c_str());
+  return v;
+}
+
+// static
 ::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
   ::DBus::Variant v;
   v.writer().append_string(value.c_str());
@@ -153,6 +166,11 @@
 }
 
 // static
+bool DBusAdaptor::IsPath(::DBus::Signature signature) {
+  return signature == ::DBus::type< ::DBus::Path >::sig();
+}
+
+// static
 bool DBusAdaptor::IsString(::DBus::Signature signature) {
   return signature == ::DBus::type<string>::sig();
 }