// 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_COMMON_WEAK_BINDING_SET_H_ #define MOJO_COMMON_WEAK_BINDING_SET_H_ #include #include #include "base/memory/weak_ptr.h" #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" namespace mojo { template class WeakBinding; // Use this class to manage a set of weak pointers to bindings each of which is // owned by the pipe they are bound to. template class WeakBindingSet : public ErrorHandler { public: WeakBindingSet() : error_handler_(nullptr) {} ~WeakBindingSet() { CloseAllBindings(); } void set_error_handler(ErrorHandler* error_handler) { error_handler_ = error_handler; } void AddBinding(Interface* impl, InterfaceRequest request) { auto binding = new WeakBinding(impl, request.Pass()); binding->set_error_handler(this); bindings_.push_back(binding->GetWeakPtr()); } void CloseAllBindings() { for (const auto& it : bindings_) { if (it) it->Close(); } bindings_.clear(); } private: // ErrorHandler implementation. void OnConnectionError() override { // Clear any deleted bindings. bindings_.erase( std::remove_if(bindings_.begin(), bindings_.end(), [](const base::WeakPtr>& p) { return p.get() == nullptr; }), bindings_.end()); if (error_handler_) error_handler_->OnConnectionError(); } ErrorHandler* error_handler_; std::vector>> bindings_; DISALLOW_COPY_AND_ASSIGN(WeakBindingSet); }; template class WeakBinding : public ErrorHandler { public: WeakBinding(Interface* impl, InterfaceRequest request) : binding_(impl, request.Pass()), error_handler_(nullptr), weak_ptr_factory_(this) { binding_.set_error_handler(this); } ~WeakBinding() override {} void set_error_handler(ErrorHandler* error_handler) { error_handler_ = error_handler; } base::WeakPtr GetWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); } void Close() { binding_.Close(); } // ErrorHandler implementation. void OnConnectionError() override { ErrorHandler* error_handler = error_handler_; delete this; if (error_handler) error_handler->OnConnectionError(); } private: mojo::Binding binding_; ErrorHandler* error_handler_; base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(WeakBinding); }; } // namespace mojo #endif // MOJO_COMMON_WEAK_BINDING_SET_H_