OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/client/chromoting_client.h" | 5 #include "remoting/client/chromoting_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "remoting/base/capabilities.h" |
8 #include "remoting/client/audio_decode_scheduler.h" | 9 #include "remoting/client/audio_decode_scheduler.h" |
9 #include "remoting/client/audio_player.h" | 10 #include "remoting/client/audio_player.h" |
10 #include "remoting/client/client_context.h" | 11 #include "remoting/client/client_context.h" |
11 #include "remoting/client/client_user_interface.h" | 12 #include "remoting/client/client_user_interface.h" |
12 #include "remoting/client/rectangle_update_decoder.h" | 13 #include "remoting/client/rectangle_update_decoder.h" |
13 #include "remoting/proto/audio.pb.h" | 14 #include "remoting/proto/audio.pb.h" |
14 #include "remoting/proto/video.pb.h" | 15 #include "remoting/proto/video.pb.h" |
15 #include "remoting/protocol/authentication_method.h" | 16 #include "remoting/protocol/authentication_method.h" |
16 #include "remoting/protocol/connection_to_host.h" | 17 #include "remoting/protocol/connection_to_host.h" |
| 18 #include "remoting/protocol/host_stub.h" |
17 #include "remoting/protocol/negotiating_client_authenticator.h" | 19 #include "remoting/protocol/negotiating_client_authenticator.h" |
18 #include "remoting/protocol/session_config.h" | 20 #include "remoting/protocol/session_config.h" |
19 #include "remoting/protocol/transport.h" | 21 #include "remoting/protocol/transport.h" |
20 | 22 |
21 namespace remoting { | 23 namespace remoting { |
22 | 24 |
23 using protocol::AuthenticationMethod; | 25 using protocol::AuthenticationMethod; |
24 | 26 |
25 ChromotingClient::ChromotingClient( | 27 ChromotingClient::ChromotingClient( |
26 const ClientConfig& config, | 28 const ClientConfig& config, |
27 ClientContext* client_context, | 29 ClientContext* client_context, |
28 protocol::ConnectionToHost* connection, | 30 protocol::ConnectionToHost* connection, |
29 ClientUserInterface* user_interface, | 31 ClientUserInterface* user_interface, |
30 scoped_refptr<FrameConsumerProxy> frame_consumer, | 32 scoped_refptr<FrameConsumerProxy> frame_consumer, |
31 scoped_ptr<AudioPlayer> audio_player) | 33 scoped_ptr<AudioPlayer> audio_player) |
32 : config_(config), | 34 : config_(config), |
33 task_runner_(client_context->main_task_runner()), | 35 task_runner_(client_context->main_task_runner()), |
34 connection_(connection), | 36 connection_(connection), |
35 user_interface_(user_interface), | 37 user_interface_(user_interface), |
| 38 host_capabilities_received_(false), |
36 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 39 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
37 rectangle_decoder_ = | 40 rectangle_decoder_ = |
38 new RectangleUpdateDecoder(client_context->main_task_runner(), | 41 new RectangleUpdateDecoder(client_context->main_task_runner(), |
39 client_context->decode_task_runner(), | 42 client_context->decode_task_runner(), |
40 frame_consumer); | 43 frame_consumer); |
41 audio_decode_scheduler_.reset(new AudioDecodeScheduler( | 44 audio_decode_scheduler_.reset(new AudioDecodeScheduler( |
42 client_context->main_task_runner(), | 45 client_context->main_task_runner(), |
43 client_context->audio_decode_task_runner(), | 46 client_context->audio_decode_task_runner(), |
44 audio_player.Pass())); | 47 audio_player.Pass())); |
45 } | 48 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 | 84 |
82 void ChromotingClient::OnDisconnected(const base::Closure& shutdown_task) { | 85 void ChromotingClient::OnDisconnected(const base::Closure& shutdown_task) { |
83 shutdown_task.Run(); | 86 shutdown_task.Run(); |
84 } | 87 } |
85 | 88 |
86 ChromotingStats* ChromotingClient::GetStats() { | 89 ChromotingStats* ChromotingClient::GetStats() { |
87 DCHECK(task_runner_->BelongsToCurrentThread()); | 90 DCHECK(task_runner_->BelongsToCurrentThread()); |
88 return rectangle_decoder_->GetStats(); | 91 return rectangle_decoder_->GetStats(); |
89 } | 92 } |
90 | 93 |
| 94 void ChromotingClient::SetCapabilities( |
| 95 const protocol::Capabilities& capabilities) { |
| 96 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 97 |
| 98 // Only accept the first |protocol::Capabilities| message. |
| 99 if (host_capabilities_received_) { |
| 100 LOG(WARNING) << "protocol::Capabilities has been received already."; |
| 101 return; |
| 102 } |
| 103 |
| 104 host_capabilities_received_ = true; |
| 105 if (capabilities.has_capabilities()) |
| 106 host_capabilities_ = capabilities.capabilities(); |
| 107 |
| 108 VLOG(1) << "Host capabilities: " << host_capabilities_; |
| 109 |
| 110 // Calculate the set of capabilities enabled by both client and host and pass |
| 111 // it to the webapp. |
| 112 user_interface_->SetCapabilities( |
| 113 IntersectCapabilities(config_.capabilities, host_capabilities_)); |
| 114 } |
| 115 |
91 void ChromotingClient::InjectClipboardEvent( | 116 void ChromotingClient::InjectClipboardEvent( |
92 const protocol::ClipboardEvent& event) { | 117 const protocol::ClipboardEvent& event) { |
93 DCHECK(task_runner_->BelongsToCurrentThread()); | 118 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 119 |
94 user_interface_->GetClipboardStub()->InjectClipboardEvent(event); | 120 user_interface_->GetClipboardStub()->InjectClipboardEvent(event); |
95 } | 121 } |
96 | 122 |
97 void ChromotingClient::SetCursorShape( | 123 void ChromotingClient::SetCursorShape( |
98 const protocol::CursorShapeInfo& cursor_shape) { | 124 const protocol::CursorShapeInfo& cursor_shape) { |
| 125 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 126 |
99 user_interface_->GetCursorShapeStub()->SetCursorShape(cursor_shape); | 127 user_interface_->GetCursorShapeStub()->SetCursorShape(cursor_shape); |
100 } | 128 } |
101 | 129 |
102 void ChromotingClient::OnConnectionState( | 130 void ChromotingClient::OnConnectionState( |
103 protocol::ConnectionToHost::State state, | 131 protocol::ConnectionToHost::State state, |
104 protocol::ErrorCode error) { | 132 protocol::ErrorCode error) { |
105 DCHECK(task_runner_->BelongsToCurrentThread()); | 133 DCHECK(task_runner_->BelongsToCurrentThread()); |
106 VLOG(1) << "ChromotingClient::OnConnectionState(" << state << ")"; | 134 VLOG(1) << "ChromotingClient::OnConnectionState(" << state << ")"; |
107 if (state == protocol::ConnectionToHost::AUTHENTICATED) | 135 if (state == protocol::ConnectionToHost::AUTHENTICATED) |
108 Initialize(); | 136 Initialize(); |
109 user_interface_->OnConnectionState(state, error); | 137 user_interface_->OnConnectionState(state, error); |
110 } | 138 } |
111 | 139 |
112 void ChromotingClient::OnConnectionReady(bool ready) { | 140 void ChromotingClient::OnConnectionReady(bool ready) { |
113 VLOG(1) << "ChromotingClient::OnConnectionReady(" << ready << ")"; | 141 VLOG(1) << "ChromotingClient::OnConnectionReady(" << ready << ")"; |
114 user_interface_->OnConnectionReady(ready); | 142 user_interface_->OnConnectionReady(ready); |
115 } | 143 } |
116 | 144 |
117 void ChromotingClient::Initialize() { | 145 void ChromotingClient::Initialize() { |
118 DCHECK(task_runner_->BelongsToCurrentThread()); | 146 DCHECK(task_runner_->BelongsToCurrentThread()); |
119 | 147 |
120 // Initialize the decoder. | 148 // Initialize the decoder. |
121 rectangle_decoder_->Initialize(connection_->config()); | 149 rectangle_decoder_->Initialize(connection_->config()); |
122 if (connection_->config().is_audio_enabled()) | 150 if (connection_->config().is_audio_enabled()) |
123 audio_decode_scheduler_->Initialize(connection_->config()); | 151 audio_decode_scheduler_->Initialize(connection_->config()); |
| 152 |
| 153 // Negotiate capabilities with the host. |
| 154 if (connection_->config().SupportsCapabilities()) { |
| 155 VLOG(1) << "Client capabilities: " << config_.capabilities; |
| 156 |
| 157 protocol::Capabilities capabilities; |
| 158 capabilities.set_capabilities(config_.capabilities); |
| 159 connection_->host_stub()->SetCapabilities(capabilities); |
| 160 } else { |
| 161 VLOG(1) << "The host does not support any capabilities."; |
| 162 |
| 163 host_capabilities_received_ = true; |
| 164 user_interface_->SetCapabilities(host_capabilities_); |
| 165 } |
124 } | 166 } |
125 | 167 |
126 } // namespace remoting | 168 } // namespace remoting |
OLD | NEW |