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