shill: implement Manager.GetService (error-case only)

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

this gives us enough to pass the autotest for
network_WiFiManager/000_SSID_Length_Limit.

Change-Id: Ib0305e707d2203327d846be3e0b206033d6a884a
Reviewed-on: http://gerrit.chromium.org/gerrit/7567
Commit-Ready: mukesh agrawal <quiche@chromium.org>
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Tested-by: mukesh agrawal <quiche@chromium.org>
diff --git a/manager.cc b/manager.cc
index 996c291..3b109e2 100644
--- a/manager.cc
+++ b/manager.cc
@@ -7,6 +7,7 @@
 #include <time.h>
 #include <stdio.h>
 
+#include <map>
 #include <string>
 #include <vector>
 
@@ -29,12 +30,17 @@
 #include "shill/resolver.h"
 #include "shill/shill_event.h"
 #include "shill/service.h"
+#include "shill/wifi.h"
+#include "shill/wifi_service.h"
 
 using std::string;
 using std::vector;
 
 namespace shill {
 
+// static
+const char Manager::kManagerErrorNoDevice[] = "no wifi devices available";
+
 Manager::Manager(ControlInterface *control_interface,
                  EventDispatcher *dispatcher,
                  GLib *glib,
@@ -304,6 +310,21 @@
 }
 
 // called via RPC (e.g., from ManagerDBusAdaptor)
+WiFiServiceRefPtr Manager::GetWifiService(const KeyValueStore &args,
+                                          Error *error) {
+  std::vector<DeviceRefPtr> wifi_devices;
+  FilterByTechnology(Device::kWifi, &wifi_devices);
+  if (wifi_devices.empty()) {
+    error->Populate(Error::kInvalidArguments, kManagerErrorNoDevice);
+    return NULL;
+  } else {
+    WiFi *wifi = dynamic_cast<WiFi *>(wifi_devices.front().get());
+    CHECK(wifi);
+    return wifi->GetService(args, error);
+  }
+}
+
+// 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;