1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MOJO_COMMON_WEAK_BINDING_SET_H_
6 #define MOJO_COMMON_WEAK_BINDING_SET_H_
11 #include "base/memory/weak_ptr.h"
12 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"
16 template <typename Interface
>
19 // Use this class to manage a set of weak pointers to bindings each of which is
20 // owned by the pipe they are bound to.
21 template <typename Interface
>
22 class WeakBindingSet
: public ErrorHandler
{
24 WeakBindingSet() : error_handler_(nullptr) {}
25 ~WeakBindingSet() { CloseAllBindings(); }
27 void set_error_handler(ErrorHandler
* error_handler
) {
28 error_handler_
= error_handler
;
31 void AddBinding(Interface
* impl
, InterfaceRequest
<Interface
> request
) {
32 auto binding
= new WeakBinding
<Interface
>(impl
, request
.Pass());
33 binding
->set_error_handler(this);
34 bindings_
.push_back(binding
->GetWeakPtr());
37 void CloseAllBindings() {
38 for (const auto& it
: bindings_
) {
46 // ErrorHandler implementation.
47 void OnConnectionError() override
{
48 // Clear any deleted bindings.
50 std::remove_if(bindings_
.begin(), bindings_
.end(),
51 [](const base::WeakPtr
<WeakBinding
<Interface
>>& p
) {
52 return p
.get() == nullptr;
57 error_handler_
->OnConnectionError();
60 ErrorHandler
* error_handler_
;
61 std::vector
<base::WeakPtr
<WeakBinding
<Interface
>>> bindings_
;
63 DISALLOW_COPY_AND_ASSIGN(WeakBindingSet
);
66 template <typename Interface
>
67 class WeakBinding
: public ErrorHandler
{
69 WeakBinding(Interface
* impl
, InterfaceRequest
<Interface
> request
)
70 : binding_(impl
, request
.Pass()),
71 error_handler_(nullptr),
72 weak_ptr_factory_(this) {
73 binding_
.set_error_handler(this);
76 ~WeakBinding() override
{}
78 void set_error_handler(ErrorHandler
* error_handler
) {
79 error_handler_
= error_handler
;
82 base::WeakPtr
<WeakBinding
> GetWeakPtr() {
83 return weak_ptr_factory_
.GetWeakPtr();
86 void Close() { binding_
.Close(); }
88 // ErrorHandler implementation.
89 void OnConnectionError() override
{
90 ErrorHandler
* error_handler
= error_handler_
;
93 error_handler
->OnConnectionError();
97 mojo::Binding
<Interface
> binding_
;
98 ErrorHandler
* error_handler_
;
99 base::WeakPtrFactory
<WeakBinding
> weak_ptr_factory_
;
101 DISALLOW_COPY_AND_ASSIGN(WeakBinding
);
106 #endif // MOJO_COMMON_WEAK_BINDING_SET_H_