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