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/protocol/channel_multiplexer.h" | 5 #include "remoting/protocol/channel_multiplexer.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 ChannelMultiplexer::MuxChannel::~MuxChannel() { | 207 ChannelMultiplexer::MuxChannel::~MuxChannel() { |
208 // Socket must be destroyed before the channel. | 208 // Socket must be destroyed before the channel. |
209 DCHECK(!socket_); | 209 DCHECK(!socket_); |
210 STLDeleteElements(&pending_packets_); | 210 STLDeleteElements(&pending_packets_); |
211 } | 211 } |
212 | 212 |
213 scoped_ptr<net::StreamSocket> ChannelMultiplexer::MuxChannel::CreateSocket() { | 213 scoped_ptr<net::StreamSocket> ChannelMultiplexer::MuxChannel::CreateSocket() { |
214 DCHECK(!socket_); // Can't create more than one socket per channel. | 214 DCHECK(!socket_); // Can't create more than one socket per channel. |
215 scoped_ptr<MuxSocket> result(new MuxSocket(this)); | 215 scoped_ptr<MuxSocket> result(new MuxSocket(this)); |
216 socket_ = result.get(); | 216 socket_ = result.get(); |
217 return result.PassAs<net::StreamSocket>(); | 217 return result.Pass(); |
218 } | 218 } |
219 | 219 |
220 void ChannelMultiplexer::MuxChannel::OnIncomingPacket( | 220 void ChannelMultiplexer::MuxChannel::OnIncomingPacket( |
221 scoped_ptr<MultiplexPacket> packet, | 221 scoped_ptr<MultiplexPacket> packet, |
222 const base::Closure& done_task) { | 222 const base::Closure& done_task) { |
223 DCHECK_EQ(packet->channel_id(), receive_id_); | 223 DCHECK_EQ(packet->channel_id(), receive_id_); |
224 if (packet->data().size() > 0) { | 224 if (packet->data().size() > 0) { |
225 pending_packets_.push_back(new PendingPacket(packet.Pass(), done_task)); | 225 pending_packets_.push_back(new PendingPacket(packet.Pass(), done_task)); |
226 if (socket_) { | 226 if (socket_) { |
227 // Notify the socket that we have more data. | 227 // Notify the socket that we have more data. |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 } | 371 } |
372 | 372 |
373 void ChannelMultiplexer::CreateChannel(const std::string& name, | 373 void ChannelMultiplexer::CreateChannel(const std::string& name, |
374 const ChannelCreatedCallback& callback) { | 374 const ChannelCreatedCallback& callback) { |
375 if (base_channel_.get()) { | 375 if (base_channel_.get()) { |
376 // Already have |base_channel_|. Create new multiplexed channel | 376 // Already have |base_channel_|. Create new multiplexed channel |
377 // synchronously. | 377 // synchronously. |
378 callback.Run(GetOrCreateChannel(name)->CreateSocket()); | 378 callback.Run(GetOrCreateChannel(name)->CreateSocket()); |
379 } else if (!base_channel_.get() && !base_channel_factory_) { | 379 } else if (!base_channel_.get() && !base_channel_factory_) { |
380 // Fail synchronously if we failed to create |base_channel_|. | 380 // Fail synchronously if we failed to create |base_channel_|. |
381 callback.Run(scoped_ptr<net::StreamSocket>()); | 381 callback.Run(nullptr); |
382 } else { | 382 } else { |
383 // Still waiting for the |base_channel_|. | 383 // Still waiting for the |base_channel_|. |
384 pending_channels_.push_back(PendingChannel(name, callback)); | 384 pending_channels_.push_back(PendingChannel(name, callback)); |
385 | 385 |
386 // If this is the first multiplexed channel then create the base channel. | 386 // If this is the first multiplexed channel then create the base channel. |
387 if (pending_channels_.size() == 1U) { | 387 if (pending_channels_.size() == 1U) { |
388 base_channel_factory_->CreateChannel( | 388 base_channel_factory_->CreateChannel( |
389 base_channel_name_, | 389 base_channel_name_, |
390 base::Bind(&ChannelMultiplexer::OnBaseChannelReady, | 390 base::Bind(&ChannelMultiplexer::OnBaseChannelReady, |
391 base::Unretained(this))); | 391 base::Unretained(this))); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 channel->OnIncomingPacket(packet.Pass(), done_task); | 503 channel->OnIncomingPacket(packet.Pass(), done_task); |
504 } | 504 } |
505 | 505 |
506 bool ChannelMultiplexer::DoWrite(scoped_ptr<MultiplexPacket> packet, | 506 bool ChannelMultiplexer::DoWrite(scoped_ptr<MultiplexPacket> packet, |
507 const base::Closure& done_task) { | 507 const base::Closure& done_task) { |
508 return writer_.Write(SerializeAndFrameMessage(*packet), done_task); | 508 return writer_.Write(SerializeAndFrameMessage(*packet), done_task); |
509 } | 509 } |
510 | 510 |
511 } // namespace protocol | 511 } // namespace protocol |
512 } // namespace remoting | 512 } // namespace remoting |
OLD | NEW |