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/manager.cc b/manager.cc
index 1b8810f..19aadbd 100644
--- a/manager.cc
+++ b/manager.cc
@@ -177,6 +177,13 @@
       return;
   }
   services_.push_back(to_manage);
+
+  vector<string> service_paths;
+  for (it = services_.begin(); it != services_.end(); ++it) {
+    service_paths.push_back((*it)->GetRpcIdentifier());
+  }
+  adaptor_->EmitRpcIdentifierArrayChanged(flimflam::kServicesProperty,
+                                          service_paths);
 }
 
 void Manager::DeregisterService(const ServiceConstRefPtr &to_forget) {
@@ -284,4 +291,24 @@
   return ActiveProfile()->GetFriendlyName();
 }
 
+// called via RPC (e.g., from ManagerDBusAdaptor)
+void Manager::RequestScan(const std::string &technology, Error *error) {
+  if (technology == flimflam::kTypeWifi || technology == "") {
+    vector<DeviceRefPtr> wifi_devices;
+    FilterByTechnology(Device::kWifi, &wifi_devices);
+
+    for (vector<DeviceRefPtr>::iterator it = wifi_devices.begin();
+         it != wifi_devices.end();
+         ++it) {
+      (*it)->Scan();
+    }
+  } else {
+    // TODO(quiche): support scanning for other technologies?
+    const string kMessage = "Unrecognized technology " + technology;
+    LOG(ERROR) << kMessage;
+    CHECK(error);
+    error->Populate(Error::kInvalidArguments, kMessage);
+  }
+}
+
 }  // namespace shill