OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "jingle/glue/channel_socket_adapter.h" | 5 #include "remoting/protocol/channel_socket_adapter.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/message_loop/message_loop.h" | |
12 #include "net/base/io_buffer.h" | 11 #include "net/base/io_buffer.h" |
13 #include "net/base/net_errors.h" | 12 #include "net/base/net_errors.h" |
14 #include "third_party/webrtc/p2p/base/transportchannel.h" | 13 #include "third_party/webrtc/p2p/base/transportchannel.h" |
15 | 14 |
16 namespace jingle_glue { | 15 namespace remoting { |
| 16 namespace protocol { |
17 | 17 |
18 TransportChannelSocketAdapter::TransportChannelSocketAdapter( | 18 TransportChannelSocketAdapter::TransportChannelSocketAdapter( |
19 cricket::TransportChannel* channel) | 19 cricket::TransportChannel* channel) |
20 : message_loop_(base::MessageLoop::current()), | 20 : channel_(channel), |
21 channel_(channel), | |
22 closed_error_code_(net::OK) { | 21 closed_error_code_(net::OK) { |
23 DCHECK(channel_); | 22 DCHECK(channel_); |
24 | 23 |
25 channel_->SignalReadPacket.connect( | 24 channel_->SignalReadPacket.connect( |
26 this, &TransportChannelSocketAdapter::OnNewPacket); | 25 this, &TransportChannelSocketAdapter::OnNewPacket); |
27 channel_->SignalWritableState.connect( | 26 channel_->SignalWritableState.connect( |
28 this, &TransportChannelSocketAdapter::OnWritableState); | 27 this, &TransportChannelSocketAdapter::OnWritableState); |
29 channel_->SignalDestroyed.connect( | 28 channel_->SignalDestroyed.connect( |
30 this, &TransportChannelSocketAdapter::OnChannelDestroyed); | 29 this, &TransportChannelSocketAdapter::OnChannelDestroyed); |
31 } | 30 } |
32 | 31 |
33 TransportChannelSocketAdapter::~TransportChannelSocketAdapter() { | 32 TransportChannelSocketAdapter::~TransportChannelSocketAdapter() { |
34 if (!destruction_callback_.is_null()) | 33 if (!destruction_callback_.is_null()) |
35 destruction_callback_.Run(); | 34 destruction_callback_.Run(); |
36 } | 35 } |
37 | 36 |
38 void TransportChannelSocketAdapter::SetOnDestroyedCallback( | 37 void TransportChannelSocketAdapter::SetOnDestroyedCallback( |
39 const base::Closure& callback) { | 38 const base::Closure& callback) { |
40 destruction_callback_ = callback; | 39 destruction_callback_ = callback; |
41 } | 40 } |
42 | 41 |
43 int TransportChannelSocketAdapter::Read( | 42 int TransportChannelSocketAdapter::Read( |
44 net::IOBuffer* buf, | 43 net::IOBuffer* buf, |
45 int buffer_size, | 44 int buffer_size, |
46 const net::CompletionCallback& callback) { | 45 const net::CompletionCallback& callback) { |
47 DCHECK_EQ(base::MessageLoop::current(), message_loop_); | 46 DCHECK(thread_checker_.CalledOnValidThread()); |
48 DCHECK(buf); | 47 DCHECK(buf); |
49 DCHECK(!callback.is_null()); | 48 DCHECK(!callback.is_null()); |
50 CHECK(read_callback_.is_null()); | 49 CHECK(read_callback_.is_null()); |
51 | 50 |
52 if (!channel_) { | 51 if (!channel_) { |
53 DCHECK(closed_error_code_ != net::OK); | 52 DCHECK(closed_error_code_ != net::OK); |
54 return closed_error_code_; | 53 return closed_error_code_; |
55 } | 54 } |
56 | 55 |
57 read_callback_ = callback; | 56 read_callback_ = callback; |
58 read_buffer_ = buf; | 57 read_buffer_ = buf; |
59 read_buffer_size_ = buffer_size; | 58 read_buffer_size_ = buffer_size; |
60 | 59 |
61 return net::ERR_IO_PENDING; | 60 return net::ERR_IO_PENDING; |
62 } | 61 } |
63 | 62 |
64 int TransportChannelSocketAdapter::Write( | 63 int TransportChannelSocketAdapter::Write( |
65 net::IOBuffer* buffer, | 64 net::IOBuffer* buffer, |
66 int buffer_size, | 65 int buffer_size, |
67 const net::CompletionCallback& callback) { | 66 const net::CompletionCallback& callback) { |
68 DCHECK_EQ(base::MessageLoop::current(), message_loop_); | 67 DCHECK(thread_checker_.CalledOnValidThread()); |
69 DCHECK(buffer); | 68 DCHECK(buffer); |
70 DCHECK(!callback.is_null()); | 69 DCHECK(!callback.is_null()); |
71 CHECK(write_callback_.is_null()); | 70 CHECK(write_callback_.is_null()); |
72 | 71 |
73 if (!channel_) { | 72 if (!channel_) { |
74 DCHECK(closed_error_code_ != net::OK); | 73 DCHECK(closed_error_code_ != net::OK); |
75 return closed_error_code_; | 74 return closed_error_code_; |
76 } | 75 } |
77 | 76 |
78 int result; | 77 int result; |
(...skipping 14 matching lines...) Expand all Loading... |
93 result = net::ERR_IO_PENDING; | 92 result = net::ERR_IO_PENDING; |
94 write_callback_ = callback; | 93 write_callback_ = callback; |
95 write_buffer_ = buffer; | 94 write_buffer_ = buffer; |
96 write_buffer_size_ = buffer_size; | 95 write_buffer_size_ = buffer_size; |
97 } | 96 } |
98 | 97 |
99 return result; | 98 return result; |
100 } | 99 } |
101 | 100 |
102 int TransportChannelSocketAdapter::SetReceiveBufferSize(int32 size) { | 101 int TransportChannelSocketAdapter::SetReceiveBufferSize(int32 size) { |
103 DCHECK_EQ(base::MessageLoop::current(), message_loop_); | 102 DCHECK(thread_checker_.CalledOnValidThread()); |
104 return (channel_->SetOption(rtc::Socket::OPT_RCVBUF, size) == 0) ? | 103 return (channel_->SetOption(rtc::Socket::OPT_RCVBUF, size) == 0) ? |
105 net::OK : net::ERR_SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR; | 104 net::OK : net::ERR_SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR; |
106 } | 105 } |
107 | 106 |
108 int TransportChannelSocketAdapter::SetSendBufferSize(int32 size) { | 107 int TransportChannelSocketAdapter::SetSendBufferSize(int32 size) { |
109 DCHECK_EQ(base::MessageLoop::current(), message_loop_); | 108 DCHECK(thread_checker_.CalledOnValidThread()); |
110 return (channel_->SetOption(rtc::Socket::OPT_SNDBUF, size) == 0) ? | 109 return (channel_->SetOption(rtc::Socket::OPT_SNDBUF, size) == 0) ? |
111 net::OK : net::ERR_SOCKET_SET_SEND_BUFFER_SIZE_ERROR; | 110 net::OK : net::ERR_SOCKET_SET_SEND_BUFFER_SIZE_ERROR; |
112 } | 111 } |
113 | 112 |
114 void TransportChannelSocketAdapter::Close(int error_code) { | 113 void TransportChannelSocketAdapter::Close(int error_code) { |
115 DCHECK_EQ(base::MessageLoop::current(), message_loop_); | 114 DCHECK(thread_checker_.CalledOnValidThread()); |
116 | 115 |
117 if (!channel_) // Already closed. | 116 if (!channel_) // Already closed. |
118 return; | 117 return; |
119 | 118 |
120 DCHECK(error_code != net::OK); | 119 DCHECK(error_code != net::OK); |
121 closed_error_code_ = error_code; | 120 closed_error_code_ = error_code; |
122 channel_->SignalReadPacket.disconnect(this); | 121 channel_->SignalReadPacket.disconnect(this); |
123 channel_->SignalDestroyed.disconnect(this); | 122 channel_->SignalDestroyed.disconnect(this); |
124 channel_ = NULL; | 123 channel_ = NULL; |
125 | 124 |
(...skipping 11 matching lines...) Expand all Loading... |
137 callback.Run(error_code); | 136 callback.Run(error_code); |
138 } | 137 } |
139 } | 138 } |
140 | 139 |
141 void TransportChannelSocketAdapter::OnNewPacket( | 140 void TransportChannelSocketAdapter::OnNewPacket( |
142 cricket::TransportChannel* channel, | 141 cricket::TransportChannel* channel, |
143 const char* data, | 142 const char* data, |
144 size_t data_size, | 143 size_t data_size, |
145 const rtc::PacketTime& packet_time, | 144 const rtc::PacketTime& packet_time, |
146 int flags) { | 145 int flags) { |
147 DCHECK_EQ(base::MessageLoop::current(), message_loop_); | 146 DCHECK(thread_checker_.CalledOnValidThread()); |
148 DCHECK_EQ(channel, channel_); | 147 DCHECK_EQ(channel, channel_); |
149 if (!read_callback_.is_null()) { | 148 if (!read_callback_.is_null()) { |
150 DCHECK(read_buffer_.get()); | 149 DCHECK(read_buffer_.get()); |
151 CHECK_LT(data_size, static_cast<size_t>(std::numeric_limits<int>::max())); | 150 CHECK_LT(data_size, static_cast<size_t>(std::numeric_limits<int>::max())); |
152 | 151 |
153 if (read_buffer_size_ < static_cast<int>(data_size)) { | 152 if (read_buffer_size_ < static_cast<int>(data_size)) { |
154 LOG(WARNING) << "Data buffer is smaller than the received packet. " | 153 LOG(WARNING) << "Data buffer is smaller than the received packet. " |
155 << "Dropping the data that doesn't fit."; | 154 << "Dropping the data that doesn't fit."; |
156 data_size = read_buffer_size_; | 155 data_size = read_buffer_size_; |
157 } | 156 } |
158 | 157 |
159 memcpy(read_buffer_->data(), data, data_size); | 158 memcpy(read_buffer_->data(), data, data_size); |
160 | 159 |
161 net::CompletionCallback callback = read_callback_; | 160 net::CompletionCallback callback = read_callback_; |
162 read_callback_.Reset(); | 161 read_callback_.Reset(); |
163 read_buffer_ = NULL; | 162 read_buffer_ = NULL; |
164 | 163 |
165 callback.Run(data_size); | 164 callback.Run(data_size); |
166 } else { | 165 } else { |
167 LOG(WARNING) | 166 LOG(WARNING) |
168 << "Data was received without a callback. Dropping the packet."; | 167 << "Data was received without a callback. Dropping the packet."; |
169 } | 168 } |
170 } | 169 } |
171 | 170 |
172 void TransportChannelSocketAdapter::OnWritableState( | 171 void TransportChannelSocketAdapter::OnWritableState( |
173 cricket::TransportChannel* channel) { | 172 cricket::TransportChannel* channel) { |
174 DCHECK_EQ(base::MessageLoop::current(), message_loop_); | 173 DCHECK(thread_checker_.CalledOnValidThread()); |
175 // Try to send the packet if there is a pending write. | 174 // Try to send the packet if there is a pending write. |
176 if (!write_callback_.is_null()) { | 175 if (!write_callback_.is_null()) { |
177 rtc::PacketOptions options; | 176 rtc::PacketOptions options; |
178 int result = channel_->SendPacket(write_buffer_->data(), | 177 int result = channel_->SendPacket(write_buffer_->data(), |
179 write_buffer_size_, | 178 write_buffer_size_, |
180 options); | 179 options); |
181 if (result < 0) | 180 if (result < 0) |
182 result = net::MapSystemError(channel_->GetError()); | 181 result = net::MapSystemError(channel_->GetError()); |
183 | 182 |
184 if (result != net::ERR_IO_PENDING) { | 183 if (result != net::ERR_IO_PENDING) { |
185 net::CompletionCallback callback = write_callback_; | 184 net::CompletionCallback callback = write_callback_; |
186 write_callback_.Reset(); | 185 write_callback_.Reset(); |
187 write_buffer_ = NULL; | 186 write_buffer_ = NULL; |
188 callback.Run(result); | 187 callback.Run(result); |
189 } | 188 } |
190 } | 189 } |
191 } | 190 } |
192 | 191 |
193 void TransportChannelSocketAdapter::OnChannelDestroyed( | 192 void TransportChannelSocketAdapter::OnChannelDestroyed( |
194 cricket::TransportChannel* channel) { | 193 cricket::TransportChannel* channel) { |
195 DCHECK_EQ(base::MessageLoop::current(), message_loop_); | 194 DCHECK(thread_checker_.CalledOnValidThread()); |
196 DCHECK_EQ(channel, channel_); | 195 DCHECK_EQ(channel, channel_); |
197 Close(net::ERR_CONNECTION_ABORTED); | 196 Close(net::ERR_CONNECTION_ABORTED); |
198 } | 197 } |
199 | 198 |
200 } // namespace jingle_glue | 199 } // namespace protocol |
| 200 } // namespace remoting |
OLD | NEW |