| 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
 | 
| 
 |