Make ServiceRegistry (which implements) ApplicationConnection just wrap a ServiceProviderImpl. At this point, I could make ApplicationConnection not an interface, and just rename ServiceRegistry to ApplicationConnection (basically). I won't bother, because I plan on deleting ApplicationConnection/ServiceRegistry ASAP. I also added a ServiceProviderImpl getter to ApplicationConnection. My plan of action is: * Make everyone currently using ApplicationConnection just use stuff via the getter. (In particular, this means converting all the current uses of ApplicationConnection::AddService<I>()/InterfaceFactory<I>.) * At that point, replacing ApplicationConnection with just ServiceProviderImpl will be easy. R=vardhan@google.com Review URL: https://codereview.chromium.org/1977033002 .
diff --git a/mojo/public/cpp/application/application_connection.h b/mojo/public/cpp/application/application_connection.h index 8979d0c..e665cd4 100644 --- a/mojo/public/cpp/application/application_connection.h +++ b/mojo/public/cpp/application/application_connection.h
@@ -8,6 +8,7 @@ #include <string> #include "mojo/public/cpp/application/lib/interface_factory_connector.h" +#include "mojo/public/cpp/application/service_provider_impl.h" #include "mojo/public/interfaces/application/service_provider.mojom.h" namespace mojo { @@ -50,6 +51,8 @@ Interface::Name_); } + virtual ServiceProviderImpl& GetServiceProviderImpl() = 0; + virtual const ConnectionContext& GetConnectionContext() const = 0; // Returns the URL that was used by the source application to establish a
diff --git a/mojo/public/cpp/application/lib/service_provider_impl.cc b/mojo/public/cpp/application/lib/service_provider_impl.cc index 70821e5..a3245b4 100644 --- a/mojo/public/cpp/application/lib/service_provider_impl.cc +++ b/mojo/public/cpp/application/lib/service_provider_impl.cc
@@ -16,9 +16,10 @@ ServiceProviderImpl::ServiceProviderImpl( const ConnectionContext& connection_context, InterfaceRequest<ServiceProvider> service_provider_request) - : connection_context_(connection_context), - binding_(this, service_provider_request.Pass()), - fallback_service_provider_(nullptr) {} + : binding_(this), fallback_service_provider_(nullptr) { + if (service_provider_request.is_pending()) + Bind(connection_context, service_provider_request.Pass()); +} ServiceProviderImpl::~ServiceProviderImpl() {}
diff --git a/mojo/public/cpp/application/lib/service_registry.cc b/mojo/public/cpp/application/lib/service_registry.cc index d48f161..74372d3 100644 --- a/mojo/public/cpp/application/lib/service_registry.cc +++ b/mojo/public/cpp/application/lib/service_registry.cc
@@ -10,46 +10,41 @@ namespace mojo { namespace internal { -ServiceRegistry::ServiceRegistry() : local_binding_(this) {} +ServiceRegistry::ServiceRegistry() {} ServiceRegistry::ServiceRegistry( const ConnectionContext& connection_context, InterfaceRequest<ServiceProvider> local_services) - : connection_context_(connection_context), local_binding_(this) { - if (local_services.is_pending()) - local_binding_.Bind(local_services.Pass()); -} + : service_provider_impl_(connection_context, local_services.Pass()) {} ServiceRegistry::~ServiceRegistry() {} void ServiceRegistry::SetServiceConnectorForName( ServiceConnector* service_connector, const std::string& interface_name) { - service_connector_registry_.SetServiceConnectorForName( + service_provider_impl_.AddServiceForName( std::unique_ptr<ServiceConnector>(service_connector), interface_name); } void ServiceRegistry::RemoveServiceConnectorForName( const std::string& interface_name) { - service_connector_registry_.RemoveServiceConnectorForName(interface_name); + service_provider_impl_.RemoveServiceForName(interface_name); +} + +ServiceProviderImpl& ServiceRegistry::GetServiceProviderImpl() { + return service_provider_impl_; } const ConnectionContext& ServiceRegistry::GetConnectionContext() const { - return connection_context_; + return service_provider_impl_.connection_context(); } const std::string& ServiceRegistry::GetConnectionURL() { - return connection_context_.connection_url; + return service_provider_impl_.connection_context().connection_url; } const std::string& ServiceRegistry::GetRemoteApplicationURL() { - return connection_context_.remote_url; -} - -void ServiceRegistry::ConnectToService(const String& service_name, - ScopedMessagePipeHandle client_handle) { - service_connector_registry_.ConnectToService(connection_context_, - service_name, &client_handle); + return service_provider_impl_.connection_context().remote_url; } } // namespace internal
diff --git a/mojo/public/cpp/application/lib/service_registry.h b/mojo/public/cpp/application/lib/service_registry.h index 1389d37..26027f4 100644 --- a/mojo/public/cpp/application/lib/service_registry.h +++ b/mojo/public/cpp/application/lib/service_registry.h
@@ -8,10 +8,7 @@ #include <string> #include "mojo/public/cpp/application/application_connection.h" -#include "mojo/public/cpp/application/connection_context.h" -#include "mojo/public/cpp/application/lib/service_connector_registry.h" -#include "mojo/public/cpp/bindings/binding.h" -#include "mojo/public/interfaces/application/service_provider.mojom.h" +#include "mojo/public/cpp/application/service_provider_impl.h" namespace mojo { namespace internal { @@ -19,7 +16,7 @@ // A ServiceRegistry represents each half of a connection between two // applications, allowing customization of which services are published to the // other. -class ServiceRegistry : public ServiceProvider, public ApplicationConnection { +class ServiceRegistry : public ApplicationConnection { public: ServiceRegistry(); ServiceRegistry(const ConnectionContext& connection_context, @@ -29,6 +26,7 @@ // ApplicationConnection overrides. void SetServiceConnectorForName(ServiceConnector* service_connector, const std::string& interface_name) override; + ServiceProviderImpl& GetServiceProviderImpl() override; const ConnectionContext& GetConnectionContext() const override; const std::string& GetConnectionURL() override; const std::string& GetRemoteApplicationURL() override; @@ -36,13 +34,7 @@ void RemoveServiceConnectorForName(const std::string& interface_name); private: - // ServiceProvider method. - void ConnectToService(const String& service_name, - ScopedMessagePipeHandle client_handle) override; - - ConnectionContext connection_context_; - Binding<ServiceProvider> local_binding_; - ServiceConnectorRegistry service_connector_registry_; + ServiceProviderImpl service_provider_impl_; MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceRegistry); };
diff --git a/mojo/public/cpp/application/service_provider_impl.h b/mojo/public/cpp/application/service_provider_impl.h index 54adac7..77a7644 100644 --- a/mojo/public/cpp/application/service_provider_impl.h +++ b/mojo/public/cpp/application/service_provider_impl.h
@@ -35,7 +35,8 @@ ServiceProviderImpl(); // Constructs this service provider implementation, binding it to the given - // interface request. + // interface request. Note: If |service_provider_request| is not valid + // ("pending"), then the object will be put into an unbound state. explicit ServiceProviderImpl( const ConnectionContext& connection_context, InterfaceRequest<ServiceProvider> service_provider_request);
diff --git a/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc b/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc index 2483fc3..f676767 100644 --- a/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc +++ b/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc
@@ -338,6 +338,16 @@ EXPECT_FALSE(was_run); } +TEST_F(ServiceProviderImplTest, ConstructRequestNotPending) { + ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING, + "https://example.com/remote.mojo", + "https://example.com/me.mojo"), + InterfaceRequest<ServiceProvider>()); + EXPECT_EQ(ConnectionContext::Type::UNKNOWN, impl.connection_context().type); + EXPECT_EQ(std::string(), impl.connection_context().remote_url); + EXPECT_EQ(std::string(), impl.connection_context().connection_url); +} + // TODO(vtl): Explicitly test |AddServiceForName()|? } // namespace