1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2014 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/lib/filter_chain.h"
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <algorithm>
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/logging.h"
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo {
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace internal {
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezFilterChain::FilterChain(MessageReceiver* sink) : sink_(sink) {
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezFilterChain::FilterChain(FilterChain&& other) : sink_(other.sink_) {
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  other.sink_ = nullptr;
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  filters_.swap(other.filters_);
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezFilterChain& FilterChain::operator=(FilterChain&& other) {
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  std::swap(sink_, other.sink_);
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  filters_.swap(other.filters_);
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  return *this;
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezFilterChain::~FilterChain() {
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  for (std::vector<MessageFilter*>::iterator iter = filters_.begin();
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez       iter != filters_.end();
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez       ++iter) {
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    delete *iter;
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid FilterChain::SetSink(MessageReceiver* sink) {
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  DCHECK(!sink_);
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  sink_ = sink;
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  if (!filters_.empty())
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    filters_.back()->set_sink(sink);
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezMessageReceiver* FilterChain::GetHead() {
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  DCHECK(sink_);
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  return filters_.empty() ? sink_ : filters_.front();
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace internal
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace mojo
50