Index: mojo/public/cpp/application/lib/service_connector.h |
diff --git a/mojo/public/cpp/application/lib/service_connector.h b/mojo/public/cpp/application/lib/service_connector.h |
index d2de48b9b357b26518e51b15ca7626ed828273ea..aeb7de1728ddbcb88ae9b6e123d719093a43cd07 100644 |
--- a/mojo/public/cpp/application/lib/service_connector.h |
+++ b/mojo/public/cpp/application/lib/service_connector.h |
@@ -5,10 +5,8 @@ |
#ifndef MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_H_ |
#define MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_H_ |
-#include <assert.h> |
- |
-#include <vector> |
- |
+#include "mojo/public/cpp/application/interface_factory.h" |
+#include "mojo/public/cpp/bindings/interface_request.h" |
#include "mojo/public/interfaces/service_provider/service_provider.mojom.h" |
namespace mojo { |
@@ -16,59 +14,6 @@ class ApplicationConnection; |
namespace internal { |
-template <class ServiceImpl, typename Context> |
-class ServiceConnector; |
- |
-// Specialization of ServiceConnection. |
-// ServiceImpl: Subclass of InterfaceImpl<...>. |
-// Context: Type of shared context. |
-template <class ServiceImpl, typename Context> |
-class ServiceConnection : public ServiceImpl { |
- public: |
- explicit ServiceConnection(ApplicationConnection* connection) |
- : ServiceImpl(connection) {} |
- ServiceConnection(ApplicationConnection* connection, |
- Context* context) : ServiceImpl(connection, context) {} |
- |
- virtual void OnConnectionError() MOJO_OVERRIDE { |
- service_connector_->RemoveConnection(static_cast<ServiceImpl*>(this)); |
- ServiceImpl::OnConnectionError(); |
- } |
- |
-private: |
- friend class ServiceConnector<ServiceImpl, Context>; |
- |
- // Called shortly after this class is instantiated. |
- void set_service_connector( |
- ServiceConnector<ServiceImpl, Context>* connector) { |
- service_connector_ = connector; |
- } |
- |
- ServiceConnector<ServiceImpl, Context>* service_connector_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnection); |
-}; |
- |
-template <typename ServiceImpl, typename Context> |
-struct ServiceConstructor { |
- static ServiceConnection<ServiceImpl, Context>* New( |
- ApplicationConnection* connection, |
- Context* context) { |
- return new ServiceConnection<ServiceImpl, Context>( |
- connection, context); |
- } |
-}; |
- |
-template <typename ServiceImpl> |
-struct ServiceConstructor<ServiceImpl, void> { |
- public: |
- static ServiceConnection<ServiceImpl, void>* New( |
- ApplicationConnection* connection, |
- void* context) { |
- return new ServiceConnection<ServiceImpl, void>(connection); |
- } |
-}; |
- |
class ServiceConnectorBase { |
public: |
ServiceConnectorBase(const std::string& name); |
@@ -86,53 +31,22 @@ class ServiceConnectorBase { |
MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnectorBase); |
}; |
-template <class ServiceImpl, typename Context=void> |
-class ServiceConnector : public internal::ServiceConnectorBase { |
+template <typename Interface> |
+class InterfaceFactoryConnector : public ServiceConnectorBase { |
public: |
- ServiceConnector(const std::string& name, Context* context = NULL) |
- : ServiceConnectorBase(name), context_(context) {} |
- |
- virtual ~ServiceConnector() { |
- ConnectionList doomed; |
- doomed.swap(connections_); |
- for (typename ConnectionList::iterator it = doomed.begin(); |
- it != doomed.end(); ++it) { |
- delete *it; |
- } |
- assert(connections_.empty()); // No one should have added more! |
- } |
+ explicit InterfaceFactoryConnector(InterfaceFactory<Interface>* factory) |
+ : ServiceConnectorBase(Interface::Name_), factory_(factory) {} |
+ virtual ~InterfaceFactoryConnector() {} |
virtual void ConnectToService(const std::string& name, |
- ScopedMessagePipeHandle handle) MOJO_OVERRIDE { |
- ServiceConnection<ServiceImpl, Context>* impl = |
- ServiceConstructor<ServiceImpl, Context>::New(application_connection_, |
- context_); |
- impl->set_service_connector(this); |
- BindToPipe(impl, handle.Pass()); |
- |
- connections_.push_back(impl); |
- } |
- |
- void RemoveConnection(ServiceImpl* impl) { |
- // Called from ~ServiceImpl, in response to a connection error. |
- for (typename ConnectionList::iterator it = connections_.begin(); |
- it != connections_.end(); ++it) { |
- if (*it == impl) { |
- delete impl; |
- connections_.erase(it); |
- return; |
- } |
- } |
+ ScopedMessagePipeHandle client_handle) { |
+ factory_->Create(application_connection_, |
+ MakeRequest<Interface>(client_handle.Pass())); |
} |
- Context* context() const { return context_; } |
- |
private: |
- typedef std::vector<ServiceImpl*> ConnectionList; |
- ConnectionList connections_; |
- Context* context_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnector); |
+ InterfaceFactory<Interface>* factory_; |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(InterfaceFactoryConnector); |
}; |
} // namespace internal |