OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <memory> | 5 #include <memory> |
6 | 6 |
7 #include "base/at_exit.h" | 7 #include "base/at_exit.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
12 #include "mojo/public/cpp/bindings/binding_set.h" | 12 #include "mojo/public/cpp/bindings/binding_set.h" |
13 #include "services/service_manager/public/c/main.h" | 13 #include "services/service_manager/public/c/main.h" |
| 14 #include "services/service_manager/public/cpp/binder_registry.h" |
14 #include "services/service_manager/public/cpp/interface_factory.h" | 15 #include "services/service_manager/public/cpp/interface_factory.h" |
15 #include "services/service_manager/public/cpp/interface_registry.h" | |
16 #include "services/service_manager/public/cpp/service.h" | 16 #include "services/service_manager/public/cpp/service.h" |
17 #include "services/service_manager/public/cpp/service_context.h" | 17 #include "services/service_manager/public/cpp/service_context.h" |
18 #include "services/service_manager/public/cpp/service_runner.h" | 18 #include "services/service_manager/public/cpp/service_runner.h" |
19 #include "services/service_manager/public/interfaces/service_factory.mojom.h" | 19 #include "services/service_manager/public/interfaces/service_factory.mojom.h" |
20 #include "services/service_manager/public/interfaces/service_manager.mojom.h" | 20 #include "services/service_manager/public/interfaces/service_manager.mojom.h" |
21 | 21 |
22 namespace { | 22 namespace { |
23 | 23 |
24 class Singleton : public service_manager::Service { | 24 class Singleton : public service_manager::Service { |
25 public: | 25 public: |
26 explicit Singleton() {} | 26 explicit Singleton() {} |
27 ~Singleton() override {} | 27 ~Singleton() override {} |
28 | 28 |
29 private: | 29 private: |
30 // service_manager::Service: | 30 // service_manager::Service: |
31 bool OnConnect(const service_manager::ServiceInfo& remote_info, | 31 void OnBindInterface(const service_manager::ServiceInfo& source_info, |
32 service_manager::InterfaceRegistry* registry) override { | 32 const std::string& interface_name, |
33 return false; | 33 mojo::ScopedMessagePipeHandle interface_pipe) override {} |
34 } | |
35 | 34 |
36 DISALLOW_COPY_AND_ASSIGN(Singleton); | 35 DISALLOW_COPY_AND_ASSIGN(Singleton); |
37 }; | 36 }; |
38 | 37 |
39 class Embedder : public service_manager::Service, | 38 class Embedder : public service_manager::Service, |
40 public service_manager::InterfaceFactory< | 39 public service_manager::InterfaceFactory< |
41 service_manager::mojom::ServiceFactory>, | 40 service_manager::mojom::ServiceFactory>, |
42 public service_manager::mojom::ServiceFactory { | 41 public service_manager::mojom::ServiceFactory { |
43 public: | 42 public: |
44 Embedder() {} | 43 Embedder() { |
| 44 registry_.AddInterface<service_manager::mojom::ServiceFactory>(this); |
| 45 } |
45 ~Embedder() override {} | 46 ~Embedder() override {} |
46 | 47 |
47 private: | 48 private: |
48 // service_manager::Service: | 49 // service_manager::Service: |
49 bool OnConnect(const service_manager::ServiceInfo& remote_info, | 50 void OnBindInterface(const service_manager::ServiceInfo& source_info, |
50 service_manager::InterfaceRegistry* registry) override { | 51 const std::string& interface_name, |
51 registry->AddInterface<service_manager::mojom::ServiceFactory>(this); | 52 mojo::ScopedMessagePipeHandle interface_pipe) override { |
52 return true; | 53 registry_.BindInterface(source_info.identity, interface_name, |
| 54 std::move(interface_pipe)); |
53 } | 55 } |
54 | 56 |
55 bool OnServiceManagerConnectionLost() override { | 57 bool OnServiceManagerConnectionLost() override { |
56 base::MessageLoop::current()->QuitWhenIdle(); | 58 base::MessageLoop::current()->QuitWhenIdle(); |
57 return true; | 59 return true; |
58 } | 60 } |
59 | 61 |
60 // service_manager::InterfaceFactory<ServiceFactory>: | 62 // service_manager::InterfaceFactory<ServiceFactory>: |
61 void Create(const service_manager::Identity& remote_identity, | 63 void Create(const service_manager::Identity& remote_identity, |
62 service_manager::mojom::ServiceFactoryRequest request) override { | 64 service_manager::mojom::ServiceFactoryRequest request) override { |
63 service_factory_bindings_.AddBinding(this, std::move(request)); | 65 service_factory_bindings_.AddBinding(this, std::move(request)); |
64 } | 66 } |
65 | 67 |
66 // mojom::ServiceFactory: | 68 // mojom::ServiceFactory: |
67 void CreateService(service_manager::mojom::ServiceRequest request, | 69 void CreateService(service_manager::mojom::ServiceRequest request, |
68 const std::string& name) override { | 70 const std::string& name) override { |
69 if (name == "service_manager_unittest_singleton") { | 71 if (name == "service_manager_unittest_singleton") { |
70 context_.reset(new service_manager::ServiceContext( | 72 context_.reset(new service_manager::ServiceContext( |
71 base::MakeUnique<Singleton>(), std::move(request))); | 73 base::MakeUnique<Singleton>(), std::move(request))); |
72 } | 74 } |
73 } | 75 } |
74 | 76 |
75 std::unique_ptr<service_manager::ServiceContext> context_; | 77 std::unique_ptr<service_manager::ServiceContext> context_; |
| 78 service_manager::BinderRegistry registry_; |
76 mojo::BindingSet<service_manager::mojom::ServiceFactory> | 79 mojo::BindingSet<service_manager::mojom::ServiceFactory> |
77 service_factory_bindings_; | 80 service_factory_bindings_; |
78 | 81 |
79 DISALLOW_COPY_AND_ASSIGN(Embedder); | 82 DISALLOW_COPY_AND_ASSIGN(Embedder); |
80 }; | 83 }; |
81 | 84 |
82 } // namespace | 85 } // namespace |
83 | 86 |
84 MojoResult ServiceMain(MojoHandle service_request_handle) { | 87 MojoResult ServiceMain(MojoHandle service_request_handle) { |
85 service_manager::ServiceRunner runner(new Embedder); | 88 service_manager::ServiceRunner runner(new Embedder); |
86 return runner.Run(service_request_handle); | 89 return runner.Run(service_request_handle); |
87 } | 90 } |
OLD | NEW |