Index: remoting/protocol/pseudotcp_adapter.cc |
diff --git a/remoting/protocol/pseudotcp_adapter.cc b/remoting/protocol/pseudotcp_adapter.cc |
index 796db24299f8185d9958f4acb8922d851036719b..11f01fd552ec38ee42a237162893145e204b89fb 100644 |
--- a/remoting/protocol/pseudotcp_adapter.cc |
+++ b/remoting/protocol/pseudotcp_adapter.cc |
@@ -13,6 +13,7 @@ |
#include "net/base/io_buffer.h" |
#include "net/base/net_errors.h" |
#include "net/base/net_util.h" |
+#include "remoting/protocol/p2p_datagram_socket.h" |
using cricket::PseudoTcp; |
@@ -27,16 +28,14 @@ namespace protocol { |
class PseudoTcpAdapter::Core : public cricket::IPseudoTcpNotify, |
public base::RefCounted<Core> { |
public: |
- explicit Core(scoped_ptr<net::Socket> socket); |
+ explicit Core(scoped_ptr<P2PDatagramSocket> socket); |
// Functions used to implement net::StreamSocket. |
- int Read(net::IOBuffer* buffer, int buffer_size, |
+ int Read(const scoped_refptr<net::IOBuffer>& buffer, int buffer_size, |
const net::CompletionCallback& callback); |
- int Write(net::IOBuffer* buffer, int buffer_size, |
+ int Write(const scoped_refptr<net::IOBuffer>& buffer, int buffer_size, |
const net::CompletionCallback& callback); |
int Connect(const net::CompletionCallback& callback); |
- void Disconnect(); |
- bool IsConnected() const; |
// cricket::IPseudoTcpNotify interface. |
// These notifications are triggered from NotifyPacket. |
@@ -85,7 +84,7 @@ class PseudoTcpAdapter::Core : public cricket::IPseudoTcpNotify, |
net::CompletionCallback write_callback_; |
cricket::PseudoTcp pseudo_tcp_; |
- scoped_ptr<net::Socket> socket_; |
+ scoped_ptr<P2PDatagramSocket> socket_; |
scoped_refptr<net::IOBuffer> read_buffer_; |
int read_buffer_size_; |
@@ -113,7 +112,7 @@ class PseudoTcpAdapter::Core : public cricket::IPseudoTcpNotify, |
}; |
-PseudoTcpAdapter::Core::Core(scoped_ptr<net::Socket> socket) |
+PseudoTcpAdapter::Core::Core(scoped_ptr<P2PDatagramSocket> socket) |
: pseudo_tcp_(this, 0), |
socket_(socket.Pass()), |
write_waits_for_send_(false), |
@@ -126,7 +125,8 @@ PseudoTcpAdapter::Core::Core(scoped_ptr<net::Socket> socket) |
PseudoTcpAdapter::Core::~Core() { |
} |
-int PseudoTcpAdapter::Core::Read(net::IOBuffer* buffer, int buffer_size, |
+int PseudoTcpAdapter::Core::Read(const scoped_refptr<net::IOBuffer>& buffer, |
+ int buffer_size, |
const net::CompletionCallback& callback) { |
DCHECK(read_callback_.is_null()); |
@@ -150,7 +150,8 @@ int PseudoTcpAdapter::Core::Read(net::IOBuffer* buffer, int buffer_size, |
return result; |
} |
-int PseudoTcpAdapter::Core::Write(net::IOBuffer* buffer, int buffer_size, |
+int PseudoTcpAdapter::Core::Write(const scoped_refptr<net::IOBuffer>& buffer, |
+ int buffer_size, |
const net::CompletionCallback& callback) { |
DCHECK(write_callback_.is_null()); |
@@ -209,28 +210,6 @@ int PseudoTcpAdapter::Core::Connect(const net::CompletionCallback& callback) { |
return net::ERR_IO_PENDING; |
} |
-void PseudoTcpAdapter::Core::Disconnect() { |
- // Don't dispatch outstanding callbacks, as mandated by net::StreamSocket. |
- read_callback_.Reset(); |
- read_buffer_ = NULL; |
- write_callback_.Reset(); |
- write_buffer_ = NULL; |
- connect_callback_.Reset(); |
- |
- // TODO(wez): Connect should succeed if called after Disconnect, which |
- // PseudoTcp doesn't support, so we need to teardown the internal PseudoTcp |
- // and create a new one in Connect. |
- // TODO(wez): Close sets a shutdown flag inside PseudoTcp but has no other |
- // effect. This should be addressed in PseudoTcp, really. |
- // In the meantime we can fake OnTcpClosed notification and tear down the |
- // PseudoTcp. |
- pseudo_tcp_.Close(true); |
-} |
- |
-bool PseudoTcpAdapter::Core::IsConnected() const { |
- return pseudo_tcp_.State() == PseudoTcp::TCP_ESTABLISHED; |
-} |
- |
void PseudoTcpAdapter::Core::OnTcpOpen(PseudoTcp* tcp) { |
DCHECK(tcp == &pseudo_tcp_); |
@@ -341,6 +320,13 @@ void PseudoTcpAdapter::Core::SetWriteWaitsForSend(bool write_waits_for_send) { |
} |
void PseudoTcpAdapter::Core::DeleteSocket() { |
+ // Don't dispatch outstanding callbacks when the socket is deleted. |
+ read_callback_.Reset(); |
+ read_buffer_ = NULL; |
+ write_callback_.Reset(); |
+ write_buffer_ = NULL; |
+ connect_callback_.Reset(); |
+ |
socket_.reset(); |
} |
@@ -362,8 +348,8 @@ cricket::IPseudoTcpNotify::WriteResult PseudoTcpAdapter::Core::TcpWritePacket( |
// Our underlying socket is datagram-oriented, which means it should either |
// send exactly as many bytes as we requested, or fail. |
int result; |
- if (socket_.get()) { |
- result = socket_->Write( |
+ if (socket_) { |
+ result = socket_->Send( |
write_buffer.get(), len, |
base::Bind(&PseudoTcpAdapter::Core::OnWritten, base::Unretained(this))); |
} else { |
@@ -386,10 +372,9 @@ void PseudoTcpAdapter::Core::DoReadFromSocket() { |
socket_read_buffer_ = new net::IOBuffer(kReadBufferSize); |
int result = 1; |
- while (socket_.get() && result > 0) { |
- result = socket_->Read( |
- socket_read_buffer_.get(), |
- kReadBufferSize, |
+ while (socket_ && result > 0) { |
+ result = socket_->Recv( |
+ socket_read_buffer_.get(), kReadBufferSize, |
base::Bind(&PseudoTcpAdapter::Core::OnRead, base::Unretained(this))); |
if (result != net::ERR_IO_PENDING) |
HandleReadResults(result); |
@@ -461,26 +446,26 @@ void PseudoTcpAdapter::Core::CheckWriteComplete() { |
} |
} |
-// Public interface implemention. |
+// Public interface implementation. |
-PseudoTcpAdapter::PseudoTcpAdapter(scoped_ptr<net::Socket> socket) |
+PseudoTcpAdapter::PseudoTcpAdapter(scoped_ptr<P2PDatagramSocket> socket) |
: core_(new Core(socket.Pass())) { |
} |
PseudoTcpAdapter::~PseudoTcpAdapter() { |
- Disconnect(); |
- |
// Make sure that the underlying socket is destroyed before PseudoTcp. |
core_->DeleteSocket(); |
} |
-int PseudoTcpAdapter::Read(net::IOBuffer* buffer, int buffer_size, |
+int PseudoTcpAdapter::Read(const scoped_refptr<net::IOBuffer>& buffer, |
+ int buffer_size, |
const net::CompletionCallback& callback) { |
DCHECK(CalledOnValidThread()); |
return core_->Read(buffer, buffer_size, callback); |
} |
-int PseudoTcpAdapter::Write(net::IOBuffer* buffer, int buffer_size, |
+int PseudoTcpAdapter::Write(const scoped_refptr<net::IOBuffer>& buffer, |
+ int buffer_size, |
const net::CompletionCallback& callback) { |
DCHECK(CalledOnValidThread()); |
return core_->Write(buffer, buffer_size, callback); |
@@ -488,106 +473,21 @@ int PseudoTcpAdapter::Write(net::IOBuffer* buffer, int buffer_size, |
int PseudoTcpAdapter::SetReceiveBufferSize(int32 size) { |
DCHECK(CalledOnValidThread()); |
- |
core_->SetReceiveBufferSize(size); |
return net::OK; |
} |
int PseudoTcpAdapter::SetSendBufferSize(int32 size) { |
DCHECK(CalledOnValidThread()); |
- |
core_->SetSendBufferSize(size); |
return net::OK; |
} |
int PseudoTcpAdapter::Connect(const net::CompletionCallback& callback) { |
DCHECK(CalledOnValidThread()); |
- |
- // net::StreamSocket requires that Connect return OK if already connected. |
- if (IsConnected()) |
- return net::OK; |
- |
return core_->Connect(callback); |
} |
-void PseudoTcpAdapter::Disconnect() { |
- DCHECK(CalledOnValidThread()); |
- core_->Disconnect(); |
-} |
- |
-bool PseudoTcpAdapter::IsConnected() const { |
- return core_->IsConnected(); |
-} |
- |
-bool PseudoTcpAdapter::IsConnectedAndIdle() const { |
- DCHECK(CalledOnValidThread()); |
- NOTIMPLEMENTED(); |
- return false; |
-} |
- |
-int PseudoTcpAdapter::GetPeerAddress(net::IPEndPoint* address) const { |
- DCHECK(CalledOnValidThread()); |
- |
- // We don't have a meaningful peer address, but we can't return an |
- // error, so we return a INADDR_ANY instead. |
- net::IPAddressNumber ip_address(net::kIPv4AddressSize); |
- *address = net::IPEndPoint(ip_address, 0); |
- return net::OK; |
-} |
- |
-int PseudoTcpAdapter::GetLocalAddress(net::IPEndPoint* address) const { |
- DCHECK(CalledOnValidThread()); |
- NOTIMPLEMENTED(); |
- return net::ERR_FAILED; |
-} |
- |
-const net::BoundNetLog& PseudoTcpAdapter::NetLog() const { |
- DCHECK(CalledOnValidThread()); |
- return net_log_; |
-} |
- |
-void PseudoTcpAdapter::SetSubresourceSpeculation() { |
- DCHECK(CalledOnValidThread()); |
- NOTIMPLEMENTED(); |
-} |
- |
-void PseudoTcpAdapter::SetOmniboxSpeculation() { |
- DCHECK(CalledOnValidThread()); |
- NOTIMPLEMENTED(); |
-} |
- |
-bool PseudoTcpAdapter::WasEverUsed() const { |
- DCHECK(CalledOnValidThread()); |
- NOTIMPLEMENTED(); |
- return true; |
-} |
- |
-bool PseudoTcpAdapter::UsingTCPFastOpen() const { |
- DCHECK(CalledOnValidThread()); |
- return false; |
-} |
- |
-bool PseudoTcpAdapter::WasNpnNegotiated() const { |
- DCHECK(CalledOnValidThread()); |
- return false; |
-} |
- |
-net::NextProto PseudoTcpAdapter::GetNegotiatedProtocol() const { |
- DCHECK(CalledOnValidThread()); |
- return net::kProtoUnknown; |
-} |
- |
-bool PseudoTcpAdapter::GetSSLInfo(net::SSLInfo* ssl_info) { |
- DCHECK(CalledOnValidThread()); |
- return false; |
-} |
- |
-void PseudoTcpAdapter::GetConnectionAttempts( |
- net::ConnectionAttempts* out) const { |
- DCHECK(CalledOnValidThread()); |
- out->clear(); |
-} |
- |
void PseudoTcpAdapter::SetAckDelay(int delay_ms) { |
DCHECK(CalledOnValidThread()); |
core_->SetAckDelay(delay_ms); |