blob: 5d48ac658aebbc6b2e890e6d6206c228c808b85c [file] [log] [blame]
// 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.
#include "mojo/public/cpp/bindings/message_dispatcher.h"
#include <algorithm>
#include "base/logging.h"
namespace mojo {
MessageDispatcher::MessageDispatcher(MessageReceiver* sink) : sink_(sink) {}
MessageDispatcher::MessageDispatcher(MessageDispatcher&& other) {
*this = std::move(other);
}
MessageDispatcher& MessageDispatcher::operator=(MessageDispatcher&& other) {
std::swap(sink_, other.sink_);
validator_ = std::move(other.validator_);
filter_ = std::move(other.filter_);
return *this;
}
MessageDispatcher::~MessageDispatcher() {}
void MessageDispatcher::SetSink(MessageReceiver* sink) {
DCHECK(!sink_);
sink_ = sink;
}
bool MessageDispatcher::Accept(Message* message) {
DCHECK(sink_);
if (validator_) {
if (!validator_->Accept(message))
return false;
}
if (!filter_)
return sink_->Accept(message);
base::WeakPtr<MessageDispatcher> weak_self = weak_factory_.GetWeakPtr();
if (!filter_->WillDispatch(message))
return false;
bool result = sink_->Accept(message);
if (!weak_self)
return result;
filter_->DidDispatchOrReject(message, result);
return result;
}
void MessageDispatcher::SetValidator(
std::unique_ptr<MessageReceiver> validator) {
DCHECK(!validator_);
validator_ = std::move(validator);
}
void MessageDispatcher::SetFilter(std::unique_ptr<MessageFilter> filter) {
DCHECK(!filter_);
filter_ = std::move(filter);
}
} // namespace mojo