[email protected] | d7c6cc2 | 2012-02-05 05:19:27 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 2 | // 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 | |||||
sergeyu | 89d088b | 2015-12-24 00:22:44 | [diff] [blame] | 7 | #include <utility> |
8 | |||||
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 9 | #include "base/bind.h" |
sergeyu | 786463e | 2016-02-04 18:46:10 | [diff] [blame] | 10 | #include "remoting/base/compound_buffer.h" |
11 | #include "remoting/protocol/message_channel_factory.h" | ||||
12 | #include "remoting/protocol/message_pipe.h" | ||||
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 13 | |
14 | namespace remoting { | ||||
15 | namespace protocol { | ||||
16 | |||||
sergeyu | 360f5bae | 2016-07-22 18:54:45 | [diff] [blame] | 17 | ChannelDispatcherBase::ChannelDispatcherBase(const std::string& channel_name) |
sergeyu | 786463e | 2016-02-04 18:46:10 | [diff] [blame] | 18 | : channel_name_(channel_name) {} |
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 19 | |
20 | ChannelDispatcherBase::~ChannelDispatcherBase() { | ||||
[email protected] | 3e9187d0 | 2012-08-18 04:17:23 | [diff] [blame] | 21 | if (channel_factory_) |
22 | channel_factory_->CancelChannelCreation(channel_name_); | ||||
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 23 | } |
24 | |||||
sergeyu | 786463e | 2016-02-04 18:46:10 | [diff] [blame] | 25 | void ChannelDispatcherBase::Init(MessageChannelFactory* channel_factory, |
sergeyu | 203832d | 2015-01-10 21:44:09 | [diff] [blame] | 26 | EventHandler* event_handler) { |
sergeyu | 38e73d4 | 2015-12-18 06:50:04 | [diff] [blame] | 27 | channel_factory_ = channel_factory; |
sergeyu | 203832d | 2015-01-10 21:44:09 | [diff] [blame] | 28 | event_handler_ = event_handler; |
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 29 | |
sergeyu | a29e163 | 2014-09-09 06:05:38 | [diff] [blame] | 30 | channel_factory_->CreateChannel(channel_name_, base::Bind( |
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 31 | &ChannelDispatcherBase::OnChannelReady, base::Unretained(this))); |
32 | } | ||||
33 | |||||
sergeyu | d059c46 | 2016-07-20 19:34:10 | [diff] [blame] | 34 | void 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] | d7c6cc2 | 2012-02-05 05:19:27 | [diff] [blame] | 40 | void ChannelDispatcherBase::OnChannelReady( |
dcheng | 0765c49 | 2016-04-06 22:41:53 | [diff] [blame] | 41 | std::unique_ptr<MessagePipe> message_pipe) { |
sergeyu | c5f104b | 2015-01-09 19:33:24 | [diff] [blame] | 42 | channel_factory_ = nullptr; |
sergeyu | 786463e | 2016-02-04 18:46:10 | [diff] [blame] | 43 | message_pipe_ = std::move(message_pipe); |
sergeyu | d059c46 | 2016-07-20 19:34:10 | [diff] [blame] | 44 | message_pipe_->Start(this); |
sergeyu | cc40af91 | 2016-07-22 03:49:19 | [diff] [blame] | 45 | } |
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 46 | |
sergeyu | cc40af91 | 2016-07-22 03:49:19 | [diff] [blame] | 47 | void ChannelDispatcherBase::OnMessagePipeOpen() { |
48 | DCHECK(!is_connected_); | ||||
49 | is_connected_ = true; | ||||
sergeyu | 203832d | 2015-01-10 21:44:09 | [diff] [blame] | 50 | event_handler_->OnChannelInitialized(this); |
51 | } | ||||
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 52 | |
sergeyu | d059c46 | 2016-07-20 19:34:10 | [diff] [blame] | 53 | void ChannelDispatcherBase::OnMessageReceived( |
54 | std::unique_ptr<CompoundBuffer> message) { | ||||
55 | OnIncomingMessage(std::move(message)); | ||||
56 | } | ||||
57 | |||||
58 | void ChannelDispatcherBase::OnMessagePipeClosed() { | ||||
sergeyu | cc40af91 | 2016-07-22 03:49:19 | [diff] [blame] | 59 | is_connected_ = false; |
sergeyu | 360f5bae | 2016-07-22 18:54:45 | [diff] [blame] | 60 | message_pipe_.reset(); |
sergeyu | d059c46 | 2016-07-20 19:34:10 | [diff] [blame] | 61 | event_handler_->OnChannelClosed(this); |
62 | } | ||||
63 | |||||
[email protected] | 2e8b52c | 2011-11-22 00:07:13 | [diff] [blame] | 64 | } // namespace protocol |
65 | } // namespace remoting |