Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Side by Side Diff: jingle/glue/channel_socket_adapter.cc

Issue 14307021: jingle: Use base::MessageLoop. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « no previous file | jingle/glue/channel_socket_adapter_unittest.cc » ('j') | jingle/glue/task_pump_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698