blob: fd8f21e8c9c964e97b6c549888d3e484e92a4d21 [file] [log] [blame]
[email protected]d7c6cc22012-02-05 05:19:271// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]2e8b52c2011-11-22 00:07:132// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/protocol/channel_dispatcher_base.h"
6
sergeyu89d088b2015-12-24 00:22:447#include <utility>
8
[email protected]2e8b52c2011-11-22 00:07:139#include "base/bind.h"
sergeyu786463e2016-02-04 18:46:1010#include "remoting/base/compound_buffer.h"
11#include "remoting/protocol/message_channel_factory.h"
12#include "remoting/protocol/message_pipe.h"
[email protected]2e8b52c2011-11-22 00:07:1313
14namespace remoting {
15namespace protocol {
16
sergeyu360f5bae2016-07-22 18:54:4517ChannelDispatcherBase::ChannelDispatcherBase(const std::string& channel_name)
sergeyu786463e2016-02-04 18:46:1018 : channel_name_(channel_name) {}
[email protected]2e8b52c2011-11-22 00:07:1319
20ChannelDispatcherBase::~ChannelDispatcherBase() {
[email protected]3e9187d02012-08-18 04:17:2321 if (channel_factory_)
22 channel_factory_->CancelChannelCreation(channel_name_);
[email protected]2e8b52c2011-11-22 00:07:1323}
24
sergeyu786463e2016-02-04 18:46:1025void ChannelDispatcherBase::Init(MessageChannelFactory* channel_factory,
sergeyu203832d2015-01-10 21:44:0926 EventHandler* event_handler) {
sergeyu38e73d42015-12-18 06:50:0427 channel_factory_ = channel_factory;
sergeyu203832d2015-01-10 21:44:0928 event_handler_ = event_handler;
[email protected]2e8b52c2011-11-22 00:07:1329
sergeyua29e1632014-09-09 06:05:3830 channel_factory_->CreateChannel(channel_name_, base::Bind(
[email protected]2e8b52c2011-11-22 00:07:1331 &ChannelDispatcherBase::OnChannelReady, base::Unretained(this)));
32}
33
sergeyud059c462016-07-20 19:34:1034void ChannelDispatcherBase::Init(std::unique_ptr<MessagePipe> message_pipe,
35 EventHandler* event_handler) {
36 event_handler_ = event_handler;
37 OnChannelReady(std::move(message_pipe));
38}
39
[email protected]d7c6cc22012-02-05 05:19:2740void ChannelDispatcherBase::OnChannelReady(
dcheng0765c492016-04-06 22:41:5341 std::unique_ptr<MessagePipe> message_pipe) {
sergeyuc5f104b2015-01-09 19:33:2442 channel_factory_ = nullptr;
sergeyu786463e2016-02-04 18:46:1043 message_pipe_ = std::move(message_pipe);
sergeyud059c462016-07-20 19:34:1044 message_pipe_->Start(this);
sergeyucc40af912016-07-22 03:49:1945}
[email protected]2e8b52c2011-11-22 00:07:1346
sergeyucc40af912016-07-22 03:49:1947void ChannelDispatcherBase::OnMessagePipeOpen() {
48 DCHECK(!is_connected_);
49 is_connected_ = true;
sergeyu203832d2015-01-10 21:44:0950 event_handler_->OnChannelInitialized(this);
51}
[email protected]2e8b52c2011-11-22 00:07:1352
sergeyud059c462016-07-20 19:34:1053void ChannelDispatcherBase::OnMessageReceived(
54 std::unique_ptr<CompoundBuffer> message) {
55 OnIncomingMessage(std::move(message));
56}
57
58void ChannelDispatcherBase::OnMessagePipeClosed() {
sergeyucc40af912016-07-22 03:49:1959 is_connected_ = false;
sergeyu360f5bae2016-07-22 18:54:4560 message_pipe_.reset();
sergeyud059c462016-07-20 19:34:1061 event_handler_->OnChannelClosed(this);
62}
63
[email protected]2e8b52c2011-11-22 00:07:1364} // namespace protocol
65} // namespace remoting