OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "remoting/base/tracer.h" | 8 #include "remoting/base/tracer.h" |
9 #include "remoting/client/chromoting_view.h" | 9 #include "remoting/client/chromoting_view.h" |
10 #include "remoting/client/client_context.h" | 10 #include "remoting/client/client_context.h" |
11 #include "remoting/client/input_handler.h" | 11 #include "remoting/client/input_handler.h" |
12 #include "remoting/client/rectangle_update_decoder.h" | 12 #include "remoting/client/rectangle_update_decoder.h" |
13 #include "remoting/proto/internal.pb.h" | 13 #include "remoting/proto/internal.pb.h" |
14 #include "remoting/protocol/connection_to_host.h" | 14 #include "remoting/protocol/connection_to_host.h" |
| 15 #include "remoting/protocol/session_config.h" |
15 | 16 |
16 namespace remoting { | 17 namespace remoting { |
17 | 18 |
18 ChromotingClient::ChromotingClient(const ClientConfig& config, | 19 ChromotingClient::ChromotingClient(const ClientConfig& config, |
19 ClientContext* context, | 20 ClientContext* context, |
20 protocol::ConnectionToHost* connection, | 21 protocol::ConnectionToHost* connection, |
21 ChromotingView* view, | 22 ChromotingView* view, |
22 RectangleUpdateDecoder* rectangle_decoder, | 23 RectangleUpdateDecoder* rectangle_decoder, |
23 InputHandler* input_handler, | 24 InputHandler* input_handler, |
24 CancelableTask* client_done) | 25 CancelableTask* client_done) |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 message_loop()->PostTask( | 88 message_loop()->PostTask( |
88 FROM_HERE, | 89 FROM_HERE, |
89 NewRunnableMethod(this, &ChromotingClient::SetViewport, | 90 NewRunnableMethod(this, &ChromotingClient::SetViewport, |
90 x, y, width, height)); | 91 x, y, width, height)); |
91 return; | 92 return; |
92 } | 93 } |
93 | 94 |
94 view_->SetViewport(x, y, width, height); | 95 view_->SetViewport(x, y, width, height); |
95 } | 96 } |
96 | 97 |
97 void ChromotingClient::HandleMessage(protocol::ConnectionToHost* conn, | |
98 ChromotingHostMessage* msg) { | |
99 if (message_loop() != MessageLoop::current()) { | |
100 message_loop()->PostTask( | |
101 FROM_HERE, | |
102 NewRunnableMethod(this, &ChromotingClient::HandleMessage, | |
103 conn, msg)); | |
104 return; | |
105 } | |
106 | |
107 // TODO(ajwong): Consider creating a macro similar to the IPC message | |
108 // mappings. Also reconsider the lifetime of the message object. | |
109 if (msg->has_init_client()) { | |
110 ScopedTracer tracer("Handle Init Client"); | |
111 InitClient(msg->init_client()); | |
112 delete msg; | |
113 } else { | |
114 NOTREACHED() << "Unknown message received"; | |
115 } | |
116 } | |
117 | |
118 void ChromotingClient::ProcessVideoPacket(const VideoPacket* packet, | 98 void ChromotingClient::ProcessVideoPacket(const VideoPacket* packet, |
119 Task* done) { | 99 Task* done) { |
120 if (message_loop() != MessageLoop::current()) { | 100 if (message_loop() != MessageLoop::current()) { |
121 message_loop()->PostTask( | 101 message_loop()->PostTask( |
122 FROM_HERE, | 102 FROM_HERE, |
123 NewRunnableMethod(this, &ChromotingClient::ProcessVideoPacket, | 103 NewRunnableMethod(this, &ChromotingClient::ProcessVideoPacket, |
124 packet, done)); | 104 packet, done)); |
125 return; | 105 return; |
126 } | 106 } |
127 | 107 |
128 received_packets_.push_back(QueuedVideoPacket(packet, done)); | 108 received_packets_.push_back(QueuedVideoPacket(packet, done)); |
129 if (!packet_being_processed_) | 109 if (!packet_being_processed_) |
130 DispatchPacket(); | 110 DispatchPacket(); |
131 } | 111 } |
132 | 112 |
133 void ChromotingClient::DispatchPacket() { | 113 void ChromotingClient::DispatchPacket() { |
134 DCHECK_EQ(message_loop(), MessageLoop::current()); | 114 DCHECK_EQ(message_loop(), MessageLoop::current()); |
135 CHECK(!packet_being_processed_); | 115 CHECK(!packet_being_processed_); |
136 | 116 |
137 if (received_packets_.empty()) { | 117 if (received_packets_.empty()) { |
138 // Nothing to do! | 118 // Nothing to do! |
139 return; | 119 return; |
140 } | 120 } |
141 | 121 |
142 const VideoPacket* packet = received_packets_.front().packet; | 122 const VideoPacket* packet = received_packets_.front().packet; |
143 packet_being_processed_ = true; | 123 packet_being_processed_ = true; |
144 | 124 |
145 ScopedTracer tracer("Handle video packet"); | 125 ScopedTracer tracer("Handle video packet"); |
146 rectangle_decoder_->DecodePacket( | 126 rectangle_decoder_->DecodePacket( |
147 *packet, NewTracedMethod(this, &ChromotingClient::OnPacketDone)); | 127 packet, NewTracedMethod(this, &ChromotingClient::OnPacketDone)); |
148 } | 128 } |
149 | 129 |
150 void ChromotingClient::OnConnectionOpened(protocol::ConnectionToHost* conn) { | 130 void ChromotingClient::OnConnectionOpened(protocol::ConnectionToHost* conn) { |
151 VLOG(1) << "ChromotingClient::OnConnectionOpened"; | 131 VLOG(1) << "ChromotingClient::OnConnectionOpened"; |
152 SetConnectionState(CONNECTED); | 132 SetConnectionState(CONNECTED); |
| 133 Initialize(); |
153 } | 134 } |
154 | 135 |
155 void ChromotingClient::OnConnectionClosed(protocol::ConnectionToHost* conn) { | 136 void ChromotingClient::OnConnectionClosed(protocol::ConnectionToHost* conn) { |
156 VLOG(1) << "ChromotingClient::OnConnectionClosed"; | 137 VLOG(1) << "ChromotingClient::OnConnectionClosed"; |
157 SetConnectionState(DISCONNECTED); | 138 SetConnectionState(DISCONNECTED); |
158 } | 139 } |
159 | 140 |
160 void ChromotingClient::OnConnectionFailed(protocol::ConnectionToHost* conn) { | 141 void ChromotingClient::OnConnectionFailed(protocol::ConnectionToHost* conn) { |
161 VLOG(1) << "ChromotingClient::OnConnectionFailed"; | 142 VLOG(1) << "ChromotingClient::OnConnectionFailed"; |
162 SetConnectionState(FAILED); | 143 SetConnectionState(FAILED); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 | 175 |
195 received_packets_.front().done->Run(); | 176 received_packets_.front().done->Run(); |
196 delete received_packets_.front().done; | 177 delete received_packets_.front().done; |
197 received_packets_.pop_front(); | 178 received_packets_.pop_front(); |
198 | 179 |
199 packet_being_processed_ = false; | 180 packet_being_processed_ = false; |
200 | 181 |
201 DispatchPacket(); | 182 DispatchPacket(); |
202 } | 183 } |
203 | 184 |
204 void ChromotingClient::InitClient(const InitClientMessage& init_client) { | 185 void ChromotingClient::Initialize() { |
205 DCHECK_EQ(message_loop(), MessageLoop::current()); | 186 if (message_loop() != MessageLoop::current()) { |
206 TraceContext::tracer()->PrintString("Init received"); | 187 message_loop()->PostTask( |
| 188 FROM_HERE, |
| 189 NewTracedMethod(this, &ChromotingClient::Initialize)); |
| 190 return; |
| 191 } |
| 192 |
| 193 TraceContext::tracer()->PrintString("Initializing client."); |
| 194 |
| 195 const protocol::SessionConfig* config = connection_->config(); |
207 | 196 |
208 // Resize the window. | 197 // Resize the window. |
209 int width = init_client.width(); | 198 int width = config->initial_resolution().width; |
210 int height = init_client.height(); | 199 int height = config->initial_resolution().height; |
211 VLOG(1) << "Init client received geometry: " << width << "x" << height; | 200 VLOG(1) << "Initial screen geometry: " << width << "x" << height; |
212 | 201 |
213 // TODO(ajwong): What to do here? Does the decoder actually need to request | 202 // TODO(ajwong): What to do here? Does the decoder actually need to request |
214 // the right frame size? This is mainly an optimization right? | 203 // the right frame size? This is mainly an optimization right? |
215 // rectangle_decoder_->SetOutputFrameSize(width, height); | 204 // rectangle_decoder_->SetOutputFrameSize(width, height); |
216 view_->SetViewport(0, 0, width, height); | 205 view_->SetViewport(0, 0, width, height); |
217 | 206 |
| 207 // Initialize the decoder. |
| 208 rectangle_decoder_->Initialize(config); |
| 209 |
218 // Schedule the input handler to process the event queue. | 210 // Schedule the input handler to process the event queue. |
219 input_handler_->Initialize(); | 211 input_handler_->Initialize(); |
220 } | 212 } |
221 | 213 |
222 } // namespace remoting | 214 } // namespace remoting |
OLD | NEW |