shill: implement manager.RequestScan (for WiFi only)

BUG=chromium-os:19831
TEST=unittests, WiFiManager/000_SSID_Length_Limit

note that 000_SSID_Length_Limit does not pass yet,
because we don't do IP configuration yet. but it
does get scan results.

Change-Id: I8993b3c646eda705271d1f7ad7d7341c692ae06b
Reviewed-on: http://gerrit.chromium.org/gerrit/7407
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Tested-by: mukesh agrawal <quiche@chromium.org>
diff --git a/dbus_adaptor.cc b/dbus_adaptor.cc
index d84ee0a..96672d7 100644
--- a/dbus_adaptor.cc
+++ b/dbus_adaptor.cc
@@ -21,6 +21,8 @@
 namespace shill {
 
 // static
+const char DBusAdaptor::kPathArraySig[] = "ao";
+// static
 const char DBusAdaptor::kStringmapSig[] = "a{ss}";
 // static
 const char DBusAdaptor::kStringmapsSig[] = "aa{ss}";
@@ -166,6 +168,19 @@
 }
 
 // static
+::DBus::Variant DBusAdaptor::PathArrayToVariant(
+    const vector< ::DBus::Path> &value) {
+  ::DBus::MessageIter writer;
+  ::DBus::Variant v;
+
+  // TODO(quiche): figure out why we can't use operator<< without the
+  // temporary variable.
+  writer = v.writer();
+  writer << value;
+  return v;
+}
+
+// static
 ::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
   ::DBus::Variant v;
   v.writer().append_string(value.c_str());
@@ -245,6 +260,11 @@
 }
 
 // static
+bool DBusAdaptor::IsPathArray(::DBus::Signature signature) {
+  return signature == DBusAdaptor::kPathArraySig;
+}
+
+// static
 bool DBusAdaptor::IsString(::DBus::Signature signature) {
   return signature == ::DBus::type<string>::sig();
 }