| 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/host/client_connection.h" | 5 #include "remoting/host/client_connection.h" |
| 6 | 6 |
| 7 #include "google/protobuf/message.h" | 7 #include "google/protobuf/message.h" |
| 8 #include "media/base/data_buffer.h" | 8 #include "media/base/data_buffer.h" |
| 9 #include "remoting/base/protocol_decoder.h" | 9 #include "remoting/base/protocol_decoder.h" |
| 10 #include "remoting/base/protocol_util.h" | 10 #include "remoting/base/protocol_util.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 } | 31 } |
| 32 | 32 |
| 33 ClientConnection::~ClientConnection() { | 33 ClientConnection::~ClientConnection() { |
| 34 // TODO(hclam): When we shut down the viewer we may have to close the | 34 // TODO(hclam): When we shut down the viewer we may have to close the |
| 35 // jingle channel. | 35 // jingle channel. |
| 36 } | 36 } |
| 37 | 37 |
| 38 void ClientConnection::SendInitClientMessage(int width, int height) { | 38 void ClientConnection::SendInitClientMessage(int width, int height) { |
| 39 DCHECK_EQ(loop_, MessageLoop::current()); | 39 DCHECK_EQ(loop_, MessageLoop::current()); |
| 40 DCHECK(!update_stream_size_); | 40 DCHECK(!update_stream_size_); |
| 41 DCHECK(channel_.get()); | 41 |
| 42 // If we are disconnected then return. |
| 43 if (!channel_) |
| 44 return; |
| 42 | 45 |
| 43 HostMessage msg; | 46 HostMessage msg; |
| 44 msg.mutable_init_client()->set_width(width); | 47 msg.mutable_init_client()->set_width(width); |
| 45 msg.mutable_init_client()->set_height(height); | 48 msg.mutable_init_client()->set_height(height); |
| 46 DCHECK(msg.IsInitialized()); | 49 DCHECK(msg.IsInitialized()); |
| 47 channel_->Write(SerializeAndFrameMessage(msg)); | 50 channel_->Write(SerializeAndFrameMessage(msg)); |
| 48 } | 51 } |
| 49 | 52 |
| 50 void ClientConnection::SendBeginUpdateStreamMessage() { | 53 void ClientConnection::SendBeginUpdateStreamMessage() { |
| 51 DCHECK_EQ(loop_, MessageLoop::current()); | 54 DCHECK_EQ(loop_, MessageLoop::current()); |
| 52 DCHECK(channel_.get()); | 55 |
| 56 // If we are disconnected then return. |
| 57 if (!channel_) |
| 58 return; |
| 53 | 59 |
| 54 HostMessage msg; | 60 HostMessage msg; |
| 55 msg.mutable_begin_update_stream(); | 61 msg.mutable_begin_update_stream(); |
| 56 DCHECK(msg.IsInitialized()); | 62 DCHECK(msg.IsInitialized()); |
| 57 | 63 |
| 58 scoped_refptr<DataBuffer> data = SerializeAndFrameMessage(msg); | 64 scoped_refptr<DataBuffer> data = SerializeAndFrameMessage(msg); |
| 59 DCHECK(!update_stream_size_); | 65 DCHECK(!update_stream_size_); |
| 60 update_stream_size_ += data->GetDataSize(); | 66 update_stream_size_ += data->GetDataSize(); |
| 61 channel_->Write(data); | 67 channel_->Write(data); |
| 62 } | 68 } |
| 63 | 69 |
| 64 void ClientConnection::SendUpdateStreamPacketMessage( | 70 void ClientConnection::SendUpdateStreamPacketMessage( |
| 65 const UpdateStreamPacketHeader* header, | 71 const UpdateStreamPacketHeader* header, |
| 66 scoped_refptr<DataBuffer> data) { | 72 scoped_refptr<DataBuffer> data) { |
| 67 DCHECK_EQ(loop_, MessageLoop::current()); | 73 DCHECK_EQ(loop_, MessageLoop::current()); |
| 68 DCHECK(channel_.get()); | 74 |
| 75 // If we are disconnected then return. |
| 76 if (!channel_) |
| 77 return; |
| 69 | 78 |
| 70 HostMessage msg; | 79 HostMessage msg; |
| 71 msg.mutable_update_stream_packet()->mutable_header()->CopyFrom(*header); | 80 msg.mutable_update_stream_packet()->mutable_header()->CopyFrom(*header); |
| 72 // TODO(hclam): This introduce one memory copy. Eliminate it. | 81 // TODO(hclam): This introduce one memory copy. Eliminate it. |
| 73 msg.mutable_update_stream_packet()->set_data( | 82 msg.mutable_update_stream_packet()->set_data( |
| 74 data->GetData(), data->GetDataSize()); | 83 data->GetData(), data->GetDataSize()); |
| 75 DCHECK(msg.IsInitialized()); | 84 DCHECK(msg.IsInitialized()); |
| 76 | 85 |
| 77 scoped_refptr<DataBuffer> encoded_data = SerializeAndFrameMessage(msg); | 86 scoped_refptr<DataBuffer> encoded_data = SerializeAndFrameMessage(msg); |
| 78 update_stream_size_ += data->GetDataSize(); | 87 update_stream_size_ += data->GetDataSize(); |
| 79 channel_->Write(encoded_data); | 88 channel_->Write(encoded_data); |
| 80 } | 89 } |
| 81 | 90 |
| 82 void ClientConnection::SendEndUpdateStreamMessage() { | 91 void ClientConnection::SendEndUpdateStreamMessage() { |
| 83 DCHECK_EQ(loop_, MessageLoop::current()); | 92 DCHECK_EQ(loop_, MessageLoop::current()); |
| 84 DCHECK(channel_.get()); | 93 |
| 94 // If we are disconnected then return. |
| 95 if (!channel_) |
| 96 return; |
| 85 | 97 |
| 86 HostMessage msg; | 98 HostMessage msg; |
| 87 msg.mutable_end_update_stream(); | 99 msg.mutable_end_update_stream(); |
| 88 DCHECK(msg.IsInitialized()); | 100 DCHECK(msg.IsInitialized()); |
| 89 | 101 |
| 90 scoped_refptr<DataBuffer> data = SerializeAndFrameMessage(msg); | 102 scoped_refptr<DataBuffer> data = SerializeAndFrameMessage(msg); |
| 91 update_stream_size_ += data->GetDataSize(); | 103 update_stream_size_ += data->GetDataSize(); |
| 92 channel_->Write(data); | 104 channel_->Write(data); |
| 93 | 105 |
| 94 // Here's some logic to help finding the average update stream size. | 106 // Here's some logic to help finding the average update stream size. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 109 return 0; | 121 return 0; |
| 110 int average_size = size_in_queue_ / size_queue_.size(); | 122 int average_size = size_in_queue_ / size_queue_.size(); |
| 111 if (!average_size) | 123 if (!average_size) |
| 112 return 0; | 124 return 0; |
| 113 return channel_->write_buffer_size() / average_size; | 125 return channel_->write_buffer_size() / average_size; |
| 114 } | 126 } |
| 115 | 127 |
| 116 void ClientConnection::Disconnect() { | 128 void ClientConnection::Disconnect() { |
| 117 DCHECK_EQ(loop_, MessageLoop::current()); | 129 DCHECK_EQ(loop_, MessageLoop::current()); |
| 118 | 130 |
| 119 DCHECK(channel_.get()); | 131 // If there is a channel then close it and release the reference. |
| 120 channel_->Close(); | 132 if (channel_) { |
| 133 channel_->Close(); |
| 134 channel_ = NULL; |
| 135 } |
| 121 } | 136 } |
| 122 | 137 |
| 123 void ClientConnection::OnStateChange(JingleChannel* channel, | 138 void ClientConnection::OnStateChange(JingleChannel* channel, |
| 124 JingleChannel::State state) { | 139 JingleChannel::State state) { |
| 125 DCHECK(channel); | 140 DCHECK(channel); |
| 126 loop_->PostTask(FROM_HERE, | 141 loop_->PostTask(FROM_HERE, |
| 127 NewRunnableMethod(this, &ClientConnection::StateChangeTask, state)); | 142 NewRunnableMethod(this, &ClientConnection::StateChangeTask, state)); |
| 128 } | 143 } |
| 129 | 144 |
| 130 void ClientConnection::OnPacketReceived(JingleChannel* channel, | 145 void ClientConnection::OnPacketReceived(JingleChannel* channel, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 DCHECK(decoder_.get()); | 179 DCHECK(decoder_.get()); |
| 165 ClientMessageList list; | 180 ClientMessageList list; |
| 166 decoder_->ParseClientMessages(data, &list); | 181 decoder_->ParseClientMessages(data, &list); |
| 167 | 182 |
| 168 // Then submit the messages to the handler. | 183 // Then submit the messages to the handler. |
| 169 DCHECK(handler_); | 184 DCHECK(handler_); |
| 170 handler_->HandleMessages(this, &list); | 185 handler_->HandleMessages(this, &list); |
| 171 } | 186 } |
| 172 | 187 |
| 173 } // namespace remoting | 188 } // namespace remoting |
| OLD | NEW |