shill: Implement more of Profile DBus interface

Return a DBus path from Manager.GetActiveProfile().
Implement the "Profiles" property on the manager Manager.
Fix the "Entries" property on the Profile to only report group
identifiers that correspond to technologies (not ipconfig,
devices, etc).
Fix the "Services" Profile property, to only appear as a property
of the active profile.

BUG=chromium-os:25538, chromium-os:23702
TEST=Manual: Running "list-profiles" from the flimflam test suite now
works correctly.

Change-Id: I3120fe54f02662822186ac033fab0b3566449705
Reviewed-on: https://gerrit.chromium.org/gerrit/14904
Commit-Ready: Paul Stewart <pstew@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/profile.cc b/profile.cc
index 4390d23..8ff5ff0 100644
--- a/profile.cc
+++ b/profile.cc
@@ -211,17 +211,27 @@
 }
 
 vector<string> Profile::EnumerateAvailableServices(Error *error) {
-  // TOOD(quiche): This list should be based on the information we
-  // have about services, rather than the Manager's service
-  // list. (crosbug.com/23702)
-  return manager_->EnumerateAvailableServices(error);
+  // We should return the Manager's service list if this is the active profile.
+  if (manager_->IsActiveProfile(this)) {
+    return manager_->EnumerateAvailableServices(error);
+  } else {
+    return vector<string>();
+  }
 }
 
 vector<string> Profile::EnumerateEntries(Error */*error*/) {
-  // TODO(someone): Determine if we care about this wasteful copying; consider
-  // making GetGroups return a vector.
   set<string> groups(storage_->GetGroups());
-  return vector<string>(groups.begin(), groups.end());
+  vector<string> service_groups;
+
+  // Filter this list down to only entries that correspond
+  // to a technology.  (wifi_*, etc)
+  for (set<string>::iterator it = groups.begin();
+       it != groups.end(); ++it) {
+    if (Technology::IdentifierFromStorageGroup(*it) != Technology::kUnknown)
+      service_groups.push_back(*it);
+  }
+
+  return service_groups;
 }
 
 void Profile::HelpRegisterDerivedStrings(