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

Unified Diff: jingle/glue/channel_socket_adapter.cc

Issue 8831001: base::Bind: Convert Socket::Write. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix alignment. Created 9 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « jingle/glue/channel_socket_adapter.h ('k') | jingle/glue/pseudotcp_adapter.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: jingle/glue/channel_socket_adapter.cc
diff --git a/jingle/glue/channel_socket_adapter.cc b/jingle/glue/channel_socket_adapter.cc
index 3e22a35194223f819209141f5f293f6198fae949..39b3eb45c86dff880f54d3ce59e4432068d30ee9 100644
--- a/jingle/glue/channel_socket_adapter.cc
+++ b/jingle/glue/channel_socket_adapter.cc
@@ -19,7 +19,7 @@ TransportChannelSocketAdapter::TransportChannelSocketAdapter(
: message_loop_(MessageLoop::current()),
channel_(channel),
old_read_callback_(NULL),
- write_callback_(NULL),
+ old_write_callback_(NULL),
closed_error_code_(net::OK) {
DCHECK(channel_);
@@ -73,11 +73,47 @@ int TransportChannelSocketAdapter::Read(
}
int TransportChannelSocketAdapter::Write(
- net::IOBuffer* buffer, int buffer_size, net::OldCompletionCallback* callback) {
+ net::IOBuffer* buffer, int buffer_size,
+ net::OldCompletionCallback* callback) {
DCHECK_EQ(MessageLoop::current(), message_loop_);
DCHECK(buffer);
DCHECK(callback);
- CHECK(!write_callback_);
+ CHECK(!old_write_callback_ && write_callback_.is_null());
+
+ if (!channel_) {
+ DCHECK(closed_error_code_ != net::OK);
+ return closed_error_code_;
+ }
+
+ int result;
+ if (channel_->writable()) {
+ result = channel_->SendPacket(buffer->data(), buffer_size);
+ if (result < 0) {
+ result = net::MapSystemError(channel_->GetError());
+
+ // If the underlying socket returns IO pending where it shouldn't we
+ // pretend the packet is dropped and return as succeeded because no
+ // writeable callback will happen.
+ if (result == net::ERR_IO_PENDING)
+ result = net::OK;
+ }
+ } else {
+ // Channel is not writable yet.
+ result = net::ERR_IO_PENDING;
+ old_write_callback_ = callback;
+ write_buffer_ = buffer;
+ write_buffer_size_ = buffer_size;
+ }
+
+ return result;
+}
+int TransportChannelSocketAdapter::Write(
+ net::IOBuffer* buffer, int buffer_size,
+ const net::CompletionCallback& callback) {
+ DCHECK_EQ(MessageLoop::current(), message_loop_);
+ DCHECK(buffer);
+ DCHECK(!callback.is_null());
+ CHECK(!old_write_callback_ && write_callback_.is_null());
if (!channel_) {
DCHECK(closed_error_code_ != net::OK);
@@ -141,11 +177,16 @@ void TransportChannelSocketAdapter::Close(int error_code) {
callback.Run(error_code);
}
- if (write_callback_) {
- net::OldCompletionCallback* callback = write_callback_;
- write_callback_ = NULL;
+ if (old_write_callback_) {
+ net::OldCompletionCallback* callback = old_write_callback_;
+ old_write_callback_ = NULL;
write_buffer_ = NULL;
callback->Run(error_code);
+ } else if (!write_callback_.is_null()) {
+ net::CompletionCallback callback = write_callback_;
+ write_callback_.Reset();
+ write_buffer_ = NULL;
+ callback.Run(error_code);
}
}
@@ -186,17 +227,24 @@ void TransportChannelSocketAdapter::OnWritableState(
cricket::TransportChannel* channel) {
DCHECK_EQ(MessageLoop::current(), message_loop_);
// Try to send the packet if there is a pending write.
- if (write_callback_) {
+ if (old_write_callback_ || !write_callback_.is_null()) {
int result = channel_->SendPacket(write_buffer_->data(),
write_buffer_size_);
if (result < 0)
result = net::MapSystemError(channel_->GetError());
if (result != net::ERR_IO_PENDING) {
- net::OldCompletionCallback* callback = write_callback_;
- write_callback_ = NULL;
- write_buffer_ = NULL;
- callback->Run(result);
+ if (old_write_callback_) {
+ net::OldCompletionCallback* callback = old_write_callback_;
+ old_write_callback_ = NULL;
+ write_buffer_ = NULL;
+ callback->Run(result);
+ } else {
+ net::CompletionCallback callback = write_callback_;
+ write_callback_.Reset();
+ write_buffer_ = NULL;
+ callback.Run(result);
+ }
}
}
}
« no previous file with comments | « jingle/glue/channel_socket_adapter.h ('k') | jingle/glue/pseudotcp_adapter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698