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. 4 5#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_FILTER_CHAIN_H_ 6#define MOJO_PUBLIC_CPP_BINDINGS_LIB_FILTER_CHAIN_H_ 7 8#include <utility> 9#include <vector> 10 11#include "base/macros.h" 12#include "mojo/public/cpp/bindings/message.h" 13#include "mojo/public/cpp/bindings/message_filter.h" 14 15namespace mojo { 16namespace internal { 17 18class FilterChain { 19 public: 20 // Doesn't take ownership of |sink|. Therefore |sink| has to stay alive while 21 // this object is alive. 22 explicit FilterChain(MessageReceiver* sink = nullptr); 23 24 FilterChain(FilterChain&& other); 25 FilterChain& operator=(FilterChain&& other); 26 ~FilterChain(); 27 28 template <typename FilterType, typename... Args> 29 inline void Append(Args&&... args); 30 31 // Doesn't take ownership of |sink|. Therefore |sink| has to stay alive while 32 // this object is alive. 33 void SetSink(MessageReceiver* sink); 34 35 // Returns a receiver to accept messages. Messages flow through all filters in 36 // the same order as they were appended to the chain. If all filters allow a 37 // message to pass, it will be forwarded to |sink_|. 38 // The returned value is invalidated when this object goes away. 39 MessageReceiver* GetHead(); 40 41 private: 42 // Owned by this object. 43 // TODO(dcheng): Use unique_ptr. 44 std::vector<MessageFilter*> filters_; 45 46 MessageReceiver* sink_; 47 48 DISALLOW_COPY_AND_ASSIGN(FilterChain); 49}; 50 51template <typename FilterType, typename... Args> 52inline void FilterChain::Append(Args&&... args) { 53 FilterType* filter = new FilterType(std::forward<Args>(args)..., sink_); 54 if (!filters_.empty()) 55 filters_.back()->set_sink(filter); 56 filters_.push_back(filter); 57} 58 59template <> 60inline void FilterChain::Append<PassThroughFilter>() { 61} 62 63} // namespace internal 64} // namespace mojo 65 66#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_FILTER_CHAIN_H_ 67