blob: 4d4703b7a5e307c1a6c65ad8a00c07957312d07b [file] [log] [blame]
// Copyright 2015 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 "blimp/net/blimp_message_multiplexer.h"
#include "base/logging.h"
#include "blimp/common/proto/blimp_message.pb.h"
#include "blimp/net/blimp_message_processor.h"
namespace blimp {
namespace {
class MultiplexedSender : public BlimpMessageProcessor {
public:
MultiplexedSender(base::WeakPtr<BlimpMessageProcessor> output_processor,
BlimpMessage::Type type);
~MultiplexedSender() override;
// BlimpMessageProcessor implementation.
// |message.type|, if set, must match the sender's type.
void ProcessMessage(scoped_ptr<BlimpMessage> message,
const net::CompletionCallback& callback) override;
private:
base::WeakPtr<BlimpMessageProcessor> output_processor_;
BlimpMessage::Type type_;
DISALLOW_COPY_AND_ASSIGN(MultiplexedSender);
};
MultiplexedSender::MultiplexedSender(
base::WeakPtr<BlimpMessageProcessor> output_processor,
BlimpMessage::Type type)
: output_processor_(output_processor), type_(type) {}
MultiplexedSender::~MultiplexedSender() {}
void MultiplexedSender::ProcessMessage(
scoped_ptr<BlimpMessage> message,
const net::CompletionCallback& callback) {
if (message->has_type()) {
DCHECK_EQ(type_, message->type());
} else {
message->set_type(type_);
}
output_processor_->ProcessMessage(std::move(message), callback);
}
} // namespace
BlimpMessageMultiplexer::BlimpMessageMultiplexer(
BlimpMessageProcessor* output_processor)
: output_weak_factory_(output_processor) {}
BlimpMessageMultiplexer::~BlimpMessageMultiplexer() {}
scoped_ptr<BlimpMessageProcessor> BlimpMessageMultiplexer::CreateSenderForType(
BlimpMessage::Type type) {
return make_scoped_ptr(
new MultiplexedSender(output_weak_factory_.GetWeakPtr(), type));
}
} // namespace blimp