More cleanup: Get rid of ServiceConnectorRegistry.

Just move its stuff (which isn't very complicated) directly into
ServiceProviderImpl.

Also simplify ServiceConnector a bit.

R=vardhan@google.com

Review URL: https://codereview.chromium.org/1984463002 .
diff --git a/mojo/public/cpp/application/BUILD.gn b/mojo/public/cpp/application/BUILD.gn
index cbf41ac..b2d0620 100644
--- a/mojo/public/cpp/application/BUILD.gn
+++ b/mojo/public/cpp/application/BUILD.gn
@@ -13,8 +13,6 @@
     "connection_context.h",
     "lib/application_delegate.cc",
     "lib/application_impl.cc",
-    "lib/service_connector_registry.cc",
-    "lib/service_connector_registry.h",
     "lib/service_provider_impl.cc",
     "service_connector.h",
     "service_provider_impl.h",
diff --git a/mojo/public/cpp/application/lib/service_connector_registry.cc b/mojo/public/cpp/application/lib/service_connector_registry.cc
deleted file mode 100644
index 2698b71..0000000
--- a/mojo/public/cpp/application/lib/service_connector_registry.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/application/lib/service_connector_registry.h"
-
-#include <utility>
-
-#include "mojo/public/cpp/application/connection_context.h"
-#include "mojo/public/cpp/application/service_connector.h"
-
-namespace mojo {
-namespace internal {
-
-ServiceConnectorRegistry::ServiceConnectorRegistry() {}
-
-ServiceConnectorRegistry::~ServiceConnectorRegistry() {}
-
-void ServiceConnectorRegistry::SetServiceConnectorForName(
-    std::unique_ptr<ServiceConnector> service_connector,
-    const std::string& interface_name) {
-  name_to_service_connector_[interface_name] = std::move(service_connector);
-}
-
-void ServiceConnectorRegistry::RemoveServiceConnectorForName(
-    const std::string& interface_name) {
-  NameToServiceConnectorMap::iterator it =
-      name_to_service_connector_.find(interface_name);
-  if (it == name_to_service_connector_.end())
-    return;
-  name_to_service_connector_.erase(it);
-}
-
-bool ServiceConnectorRegistry::ConnectToService(
-    const ConnectionContext& connection_context,
-    const std::string& interface_name,
-    ScopedMessagePipeHandle* client_handle) {
-  auto iter = name_to_service_connector_.find(interface_name);
-  if (iter != name_to_service_connector_.end()) {
-    iter->second->ConnectToService(connection_context, interface_name,
-                                   client_handle->Pass());
-    return true;
-  }
-  return false;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/application/lib/service_connector_registry.h b/mojo/public/cpp/application/lib/service_connector_registry.h
deleted file mode 100644
index 235d34d..0000000
--- a/mojo/public/cpp/application/lib/service_connector_registry.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_REGISTRY_H_
-#define MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_REGISTRY_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-
-struct ConnectionContext;
-class ServiceConnector;
-
-namespace internal {
-
-// ServiceConnectorRegistry maintains a default ServiceConnector as well as at
-// most one ServiceConnector per interface name. When ConnectToService() is
-// invoked the ServiceConnector registered by name is given the request.
-class ServiceConnectorRegistry {
- public:
-  ServiceConnectorRegistry();
-  ~ServiceConnectorRegistry();
-
-  // Returns true if non ServiceConnectors have been registered by name.
-  bool empty() const { return name_to_service_connector_.empty(); }
-
-  // Sets a ServiceConnector by name. This deletes any existing ServiceConnector
-  // of the same name.
-  void SetServiceConnectorForName(
-      std::unique_ptr<ServiceConnector> service_connector,
-      const std::string& interface_name);
-  void RemoveServiceConnectorForName(const std::string& interface_name);
-
-  // ConnectToService returns true if this registery has an entry for
-  // |interface_name|. In that case, the |client_handle| is passed along
-  // to the |ServiceConnector|. Otherwise, this function returns false and
-  // |client_handle| is untouched.
-  bool ConnectToService(const ConnectionContext& connection_context,
-                        const std::string& interface_name,
-                        ScopedMessagePipeHandle* client_handle);
-
- private:
-  using NameToServiceConnectorMap =
-      std::map<std::string, std::unique_ptr<ServiceConnector>>;
-
-  NameToServiceConnectorMap name_to_service_connector_;
-
-  MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnectorRegistry);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_REGISTRY_H_
diff --git a/mojo/public/cpp/application/lib/service_provider_impl.cc b/mojo/public/cpp/application/lib/service_provider_impl.cc
index a3245b4..b65b77a 100644
--- a/mojo/public/cpp/application/lib/service_provider_impl.cc
+++ b/mojo/public/cpp/application/lib/service_provider_impl.cc
@@ -4,8 +4,7 @@
 
 #include "mojo/public/cpp/application/service_provider_impl.h"
 
-#include "mojo/public/cpp/application/service_connector.h"
-#include "mojo/public/cpp/environment/logging.h"
+#include <utility>
 
 namespace mojo {
 
@@ -37,12 +36,26 @@
   }
 }
 
+void ServiceProviderImpl::AddServiceForName(
+    std::unique_ptr<ServiceConnector> service_connector,
+    const std::string& service_name) {
+  name_to_service_connector_[service_name] = std::move(service_connector);
+}
+
+void ServiceProviderImpl::RemoveServiceForName(
+    const std::string& service_name) {
+  auto it = name_to_service_connector_.find(service_name);
+  if (it != name_to_service_connector_.end())
+    name_to_service_connector_.erase(it);
+}
+
 void ServiceProviderImpl::ConnectToService(
     const String& service_name,
     ScopedMessagePipeHandle client_handle) {
-  bool service_found = service_connector_registry_.ConnectToService(
-      connection_context_, service_name, &client_handle);
-  if (!service_found && fallback_service_provider_) {
+  auto it = name_to_service_connector_.find(service_name);
+  if (it != name_to_service_connector_.end()) {
+    it->second->ConnectToService(connection_context_, client_handle.Pass());
+  } else if (fallback_service_provider_) {
     fallback_service_provider_->ConnectToService(service_name,
                                                  client_handle.Pass());
   }
diff --git a/mojo/public/cpp/application/service_connector.h b/mojo/public/cpp/application/service_connector.h
index 378be9e..8b919b3 100644
--- a/mojo/public/cpp/application/service_connector.h
+++ b/mojo/public/cpp/application/service_connector.h
@@ -13,15 +13,16 @@
 
 struct ConnectionContext;
 
+// |ServiceConnector| is the generic, type-unsafe interface for objects used by
+// |ServiceProviderImpl| to connect generic "interface requests" (i.e., just
+// message pipes) specified by service name to service implementations.
 class ServiceConnector {
  public:
   virtual ~ServiceConnector() {}
 
-  // Asks the ServiceConnector to connect to the specified service. If the
-  // ServiceConnector connects to the service it should take ownership of
-  // the handle in |handle|.
+  // Connects to the |ServiceConnector|'s service (if the |ServiceConnector|
+  // wishes to refuse the connection, it should simply drop |handle|).
   virtual void ConnectToService(const ConnectionContext& connection_context,
-                                const std::string& interface_name,
                                 ScopedMessagePipeHandle handle) = 0;
 };
 
diff --git a/mojo/public/cpp/application/service_provider_impl.h b/mojo/public/cpp/application/service_provider_impl.h
index 77a7644..a44d036 100644
--- a/mojo/public/cpp/application/service_provider_impl.h
+++ b/mojo/public/cpp/application/service_provider_impl.h
@@ -6,11 +6,11 @@
 #define MOJO_PUBLIC_APPLICATION_SERVICE_PROVIDER_IMPL_H_
 
 #include <functional>
+#include <map>
 #include <string>
 #include <utility>
 
 #include "mojo/public/cpp/application/connection_context.h"
-#include "mojo/public/cpp/application/lib/service_connector_registry.h"
 #include "mojo/public/cpp/application/service_connector.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/interfaces/application/service_provider.mojom.h"
@@ -53,15 +53,12 @@
   // unbound state). This may be called even if this object is already unbound.
   void Close();
 
-  // Adds a supported service with the given |name|, using the given
+  // Adds a supported service with the given |service_name|, using the given
   // |service_connector|.
   void AddServiceForName(std::unique_ptr<ServiceConnector> service_connector,
-                         const std::string& interface_name) {
-    service_connector_registry_.SetServiceConnectorForName(
-        std::move(service_connector), interface_name);
-  }
+                         const std::string& service_name);
 
-  // Adds a supported service with the given |name|, using the given
+  // Adds a supported service with the given |service_name|, using the given
   // |interface_request_handler| (see above for information about
   // |InterfaceRequestHandler<Interface>|). |interface_request_handler| should
   // remain valid for the lifetime of this object.
@@ -76,24 +73,23 @@
   //       });
   template <typename Interface>
   void AddService(InterfaceRequestHandler<Interface> interface_request_handler,
-                  const std::string& name = Interface::Name_) {
+                  const std::string& service_name = Interface::Name_) {
     AddServiceForName(
         std::unique_ptr<ServiceConnector>(new ServiceConnectorImpl<Interface>(
             std::move(interface_request_handler))),
-        name);
+        service_name);
   }
 
-  // Removes support for the service with the given |name|.
-  void RemoveServiceForName(const std::string& name) {
-    service_connector_registry_.RemoveServiceConnectorForName(name);
-  }
+  // Removes support for the service with the given |service_name|.
+  void RemoveServiceForName(const std::string& service_name);
 
   // Like |RemoveServiceForName()| (above), but designed so that it can be used
-  // like |RemoveService<Interface>()| or even |RemoveService<Interface>(name)|
-  // (to parallel |AddService<Interface>()|).
+  // like |RemoveService<Interface>()| or even
+  // |RemoveService<Interface>(service_name)| (to parallel
+  // |AddService<Interface>()|).
   template <typename Interface>
-  void RemoveService(const std::string& name = Interface::Name_) {
-    RemoveServiceForName(name);
+  void RemoveService(const std::string& service_name = Interface::Name_) {
+    RemoveServiceForName(service_name);
   }
 
   // This uses the provided |fallback_service_provider| for connection requests
@@ -124,7 +120,6 @@
     ~ServiceConnectorImpl() override {}
 
     void ConnectToService(const mojo::ConnectionContext& connection_context,
-                          const std::string& interface_name,
                           ScopedMessagePipeHandle client_handle) override {
       interface_request_handler_(
           connection_context,
@@ -144,7 +139,9 @@
   ConnectionContext connection_context_;
   Binding<ServiceProvider> binding_;
 
-  internal::ServiceConnectorRegistry service_connector_registry_;
+  std::map<std::string, std::unique_ptr<ServiceConnector>>
+      name_to_service_connector_;
+
   ServiceProvider* fallback_service_provider_;
 
   MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceProviderImpl);