| Index: mojo/public/shell/service.h
|
| diff --git a/mojo/public/shell/service.h b/mojo/public/shell/service.h
|
| deleted file mode 100644
|
| index 100b7987b195005d2da735ff5f32d63302ccfe41..0000000000000000000000000000000000000000
|
| --- a/mojo/public/shell/service.h
|
| +++ /dev/null
|
| @@ -1,184 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef MOJO_PUBLIC_SHELL_SERVICE_H_
|
| -#define MOJO_PUBLIC_SHELL_SERVICE_H_
|
| -
|
| -#include <vector>
|
| -
|
| -#include "mojo/public/bindings/error_handler.h"
|
| -#include "mojo/public/bindings/remote_ptr.h"
|
| -#include "mojo/public/cpp/system/core.h"
|
| -#include "mojo/public/shell/shell.mojom.h"
|
| -
|
| -// Utility classes for creating ShellClients that vend service instances.
|
| -// To use define a class that implements your specific server api, e.g. FooImpl
|
| -// to implement a service named Foo. That class must define an empty constructor
|
| -// and the Initialize() method.
|
| -// class FooImpl : public Foo {
|
| -// public:
|
| -// FooImpl();
|
| -// void Initialize(ServiceFactory<FooImpl>* service_factory,
|
| -// ScopedMessagePipeHandle client_handle
|
| -// private:
|
| -// ServiceFactory<FooImpl>* service_factory_;
|
| -// RemotePtr<FooPeer> client_;
|
| -// };
|
| -//
|
| -//
|
| -// To simplify further FooImpl can use the Service<> template.
|
| -// class FooImpl : public Service<Foo, FooImpl> {
|
| -// public:
|
| -// FooImpl();
|
| -// ...
|
| -// <Foo implementation>
|
| -// };
|
| -//
|
| -// Instances of FooImpl will be created by a specialized ServiceFactory
|
| -//
|
| -// ServiceFactory<FooImpl>
|
| -//
|
| -// Optionally the classes can be specializeed with a shared context
|
| -// class ServiceFactory<FooImpl, MyContext>
|
| -// and
|
| -// class FooImpl : public Service<Foo, FooImpl, MyContext>
|
| -//
|
| -// foo_factory = new ServiceFactory<FooImpl, MyContext>(my_context);
|
| -// instances of FooImpl can call context() and retrieve the value of my_context.
|
| -//
|
| -// Lastly create an Application instance that collects all the ServiceFactories.
|
| -//
|
| -// Application app(shell_handle);
|
| -// app.AddServiceFactory(new ServiceFactory<FooImpl>);
|
| -//
|
| -//
|
| -// Specialization of ServiceFactory.
|
| -// ServiceImpl: Implementation of Service interface.
|
| -// Context: Optional type of shared context.v
|
| -//
|
| -//
|
| -namespace mojo {
|
| -
|
| -namespace internal {
|
| -class ServiceFactoryBase {
|
| - public:
|
| - class Owner : public ShellClient {
|
| - public:
|
| - Owner(ScopedShellHandle shell_handle);
|
| - ~Owner();
|
| - Shell* shell() { return shell_.get(); }
|
| - virtual void AddServiceFactory(
|
| - internal::ServiceFactoryBase* service_factory) = 0;
|
| - virtual void RemoveServiceFactory(
|
| - internal::ServiceFactoryBase* service_factory) = 0;
|
| -
|
| - protected:
|
| - void set_service_factory_owner(ServiceFactoryBase* service_factory,
|
| - Owner* owner) {
|
| - service_factory->owner_ = owner;
|
| - }
|
| - RemotePtr<Shell> shell_;
|
| - };
|
| - ServiceFactoryBase() : owner_(NULL) {}
|
| - virtual ~ServiceFactoryBase();
|
| - Shell* shell() { return owner_->shell(); }
|
| - virtual void AcceptConnection(const std::string& url,
|
| - ScopedMessagePipeHandle client_handle) = 0;
|
| -
|
| - protected:
|
| - Owner* owner_;
|
| -};
|
| -} // namespace internal
|
| -
|
| -template <class ServiceImpl, typename Context=void>
|
| -class ServiceFactory : public internal::ServiceFactoryBase {
|
| - public:
|
| - ServiceFactory(Context* context = NULL) : context_(context) {}
|
| -
|
| - virtual ~ServiceFactory() {
|
| - for (typename ServiceList::iterator it = services_.begin();
|
| - it != services_.end(); ++it) {
|
| - delete *it;
|
| - }
|
| - }
|
| -
|
| - virtual void AcceptConnection(const std::string& url,
|
| - ScopedMessagePipeHandle client_handle)
|
| - MOJO_OVERRIDE {
|
| - ServiceImpl* service = new ServiceImpl();
|
| - service->Initialize(this, client_handle.Pass());
|
| - services_.push_back(service);
|
| - }
|
| -
|
| - void RemoveService(ServiceImpl* service) {
|
| - for (typename ServiceList::iterator it = services_.begin();
|
| - it != services_.end(); ++it) {
|
| - if (*it == service) {
|
| - services_.erase(it);
|
| - delete service;
|
| - if (services_.empty())
|
| - owner_->RemoveServiceFactory(this);
|
| - return;
|
| - }
|
| - }
|
| - }
|
| -
|
| - Context* context() const { return context_; }
|
| -
|
| - private:
|
| - typedef std::vector<ServiceImpl*> ServiceList;
|
| - ServiceList services_;
|
| - Context* context_;
|
| -};
|
| -
|
| -// Specialization of ServiceFactory.
|
| -// ServiceInterface: Service interface.
|
| -// ServiceImpl: Implementation of Service interface.
|
| -// Context: Optional type of shared context.
|
| -template <class ServiceInterface, class ServiceImpl, typename Context=void>
|
| -class Service : public ServiceInterface {
|
| - public:
|
| - virtual ~Service() {}
|
| -
|
| - protected:
|
| - Service() : reaper_(this), service_factory_(NULL) {}
|
| -
|
| - void Initialize(ServiceFactory<ServiceImpl, Context>* service_factory,
|
| - ScopedMessagePipeHandle client_handle) {
|
| - service_factory_ = service_factory;
|
| - client_.reset(
|
| - MakeScopedHandle(
|
| - InterfaceHandle<typename ServiceInterface::_Peer>(
|
| - client_handle.release().value())).Pass(),
|
| - this,
|
| - &reaper_);
|
| - }
|
| -
|
| - Shell* shell() { return service_factory_->shell(); }
|
| - Context* context() const { return service_factory_->context(); }
|
| - typename ServiceInterface::_Peer* client() { return client_.get(); }
|
| -
|
| - private:
|
| - // The Reaper class allows us to handle errors on the client proxy without
|
| - // polluting the name space of the Service<> class.
|
| - class Reaper : public ErrorHandler {
|
| - public:
|
| - Reaper(Service<ServiceInterface, ServiceImpl, Context>* service)
|
| - : service_(service) {}
|
| - virtual void OnError() {
|
| - service_->service_factory_->RemoveService(
|
| - static_cast<ServiceImpl*>(service_));
|
| - }
|
| - private:
|
| - Service<ServiceInterface, ServiceImpl, Context>* service_;
|
| - };
|
| - friend class ServiceFactory<ServiceImpl, Context>;
|
| - Reaper reaper_;
|
| - ServiceFactory<ServiceImpl, Context>* service_factory_;
|
| - RemotePtr<typename ServiceInterface::_Peer> client_;
|
| -};
|
| -
|
| -} // namespace mojo
|
| -
|
| -#endif // MOJO_PUBLIC_SHELL_SERVICE_H_
|
|
|