15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef MOJO_PUBLIC_CPP_APPLICATION_INTERFACE_FACTORY_IMPL_H_
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MOJO_PUBLIC_CPP_APPLICATION_INTERFACE_FACTORY_IMPL_H_
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/interface_factory.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace mojo {
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use this class to allocate and bind instances of Impl to interface requests.
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The lifetime of the constructed Impl is bound to the pipe.
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <typename Impl,
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          typename Interface = typename Impl::ImplementedInterface>
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class InterfaceFactoryImpl : public InterfaceFactory<Interface> {
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~InterfaceFactoryImpl() {}
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void Create(ApplicationConnection* connection,
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      InterfaceRequest<Interface> request) MOJO_OVERRIDE {
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BindToRequest(new Impl(), &request);
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use this class to allocate and bind instances of Impl constructed with a
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// context parameter to interface requests. The lifetime of the constructed
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Impl is bound to the pipe.
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <typename Impl,
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          typename Context,
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          typename Interface = typename Impl::ImplementedInterface>
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class InterfaceFactoryImplWithContext : public InterfaceFactory<Interface> {
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit InterfaceFactoryImplWithContext(Context* context)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      : context_(context) {}
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~InterfaceFactoryImplWithContext() {}
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void Create(ApplicationConnection* connection,
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      InterfaceRequest<Interface> request) MOJO_OVERRIDE {
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BindToRequest(new Impl(context_), &request);
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Context* context_;
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace mojo
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // MOJO_PUBLIC_CPP_APPLICATION_INTERFACE_FACTORY_IMPL_H_
50