| Index: content/renderer/p2p/ipc_socket_factory.cc
|
| diff --git a/content/renderer/p2p/ipc_socket_factory.cc b/content/renderer/p2p/ipc_socket_factory.cc
|
| index 703732ec3ca0cd14461c3d958c56367d8dbacfe3..4a1bb849b67800859fa924f2236391816d34ba18 100644
|
| --- a/content/renderer/p2p/ipc_socket_factory.cc
|
| +++ b/content/renderer/p2p/ipc_socket_factory.cc
|
| @@ -29,13 +29,13 @@ class IpcPacketSocket : public talk_base::AsyncPacketSocket,
|
| const talk_base::SocketAddress& remote_address);
|
|
|
| // talk_base::AsyncPacketSocket interface.
|
| - virtual bool GetLocalAddress(talk_base::SocketAddress* address) const;
|
| + virtual talk_base::SocketAddress GetLocalAddress() const;
|
| virtual talk_base::SocketAddress GetRemoteAddress() const;
|
| virtual int Send(const void *pv, size_t cb);
|
| virtual int SendTo(const void *pv, size_t cb,
|
| const talk_base::SocketAddress& addr);
|
| virtual int Close();
|
| - virtual talk_base::Socket::ConnState GetState() const;
|
| + virtual State GetState() const;
|
| virtual int GetOption(talk_base::Socket::Option opt, int* value);
|
| virtual int SetOption(talk_base::Socket::Option opt, int value);
|
| virtual int GetError() const;
|
| @@ -50,18 +50,20 @@ class IpcPacketSocket : public talk_base::AsyncPacketSocket,
|
| const std::vector<char>& data) OVERRIDE;
|
|
|
| private:
|
| - enum State {
|
| - STATE_UNINITIALIZED,
|
| - STATE_OPENING,
|
| - STATE_OPEN,
|
| - STATE_CLOSED,
|
| - STATE_ERROR,
|
| + enum InternalState {
|
| + IS_UNINITIALIZED,
|
| + IS_OPENING,
|
| + IS_OPEN,
|
| + IS_CLOSED,
|
| + IS_ERROR,
|
| };
|
|
|
| void InitAcceptedTcp(P2PSocketClient* client,
|
| const talk_base::SocketAddress& local_address,
|
| const talk_base::SocketAddress& remote_address);
|
|
|
| + P2PSocketType type_;
|
| +
|
| // Message loop on which this socket was created and being used.
|
| MessageLoop* message_loop_;
|
|
|
| @@ -72,15 +74,14 @@ class IpcPacketSocket : public talk_base::AsyncPacketSocket,
|
| // renderer side doesn't know the address until it receives OnOpen()
|
| // event from the browser.
|
| talk_base::SocketAddress local_address_;
|
| - bool address_initialized_;
|
|
|
| // Remote address for client TCP connections.
|
| talk_base::SocketAddress remote_address_;
|
|
|
| // Current state of the object.
|
| - State state_;
|
| + InternalState state_;
|
|
|
| - // Current error code. Valid when state_ == STATE_ERROR.
|
| + // Current error code. Valid when state_ == IS_ERROR.
|
| int error_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(IpcPacketSocket);
|
| @@ -88,13 +89,12 @@ class IpcPacketSocket : public talk_base::AsyncPacketSocket,
|
|
|
| IpcPacketSocket::IpcPacketSocket()
|
| : message_loop_(MessageLoop::current()),
|
| - address_initialized_(false),
|
| - state_(STATE_UNINITIALIZED), error_(0) {
|
| + state_(IS_UNINITIALIZED), error_(0) {
|
| }
|
|
|
| IpcPacketSocket::~IpcPacketSocket() {
|
| - if (state_ == STATE_OPENING || state_ == STATE_OPEN ||
|
| - state_ == STATE_ERROR) {
|
| + if (state_ == IS_OPENING || state_ == IS_OPEN ||
|
| + state_ == IS_ERROR) {
|
| Close();
|
| }
|
| }
|
| @@ -103,12 +103,13 @@ bool IpcPacketSocket::Init(P2PSocketType type, P2PSocketClient* client,
|
| const talk_base::SocketAddress& local_address,
|
| const talk_base::SocketAddress& remote_address) {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| - DCHECK_EQ(state_, STATE_UNINITIALIZED);
|
| + DCHECK_EQ(state_, IS_UNINITIALIZED);
|
|
|
| + type_ = type;
|
| client_ = client;
|
| local_address_ = local_address;
|
| remote_address_ = remote_address;
|
| - state_ = STATE_OPENING;
|
| + state_ = IS_OPENING;
|
|
|
| net::IPEndPoint local_endpoint;
|
| if (!jingle_glue::SocketAddressToIPEndPoint(local_address, &local_endpoint)) {
|
| @@ -132,29 +133,23 @@ void IpcPacketSocket::InitAcceptedTcp(
|
| const talk_base::SocketAddress& local_address,
|
| const talk_base::SocketAddress& remote_address) {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| - DCHECK_EQ(state_, STATE_UNINITIALIZED);
|
| + DCHECK_EQ(state_, IS_UNINITIALIZED);
|
|
|
| client_ = client;
|
| local_address_ = local_address;
|
| remote_address_ = remote_address;
|
| - state_ = STATE_OPEN;
|
| + state_ = IS_OPEN;
|
| client_->set_delegate(this);
|
| }
|
|
|
| // talk_base::AsyncPacketSocket interface.
|
| -bool IpcPacketSocket::GetLocalAddress(talk_base::SocketAddress* address) const {
|
| +talk_base::SocketAddress IpcPacketSocket::GetLocalAddress() const {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| -
|
| - if (!address_initialized_)
|
| - return false;
|
| -
|
| - *address = local_address_;
|
| - return true;
|
| + return local_address_;
|
| }
|
|
|
| talk_base::SocketAddress IpcPacketSocket::GetRemoteAddress() const {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| -
|
| return remote_address_;
|
| }
|
|
|
| @@ -168,16 +163,16 @@ int IpcPacketSocket::SendTo(const void *data, size_t data_size,
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
|
|
| switch (state_) {
|
| - case STATE_UNINITIALIZED:
|
| + case IS_UNINITIALIZED:
|
| NOTREACHED();
|
| return EWOULDBLOCK;
|
| - case STATE_OPENING:
|
| + case IS_OPENING:
|
| return EWOULDBLOCK;
|
| - case STATE_CLOSED:
|
| + case IS_CLOSED:
|
| return ENOTCONN;
|
| - case STATE_ERROR:
|
| + case IS_ERROR:
|
| return error_;
|
| - case STATE_OPEN:
|
| + case IS_OPEN:
|
| // Continue sending the packet.
|
| break;
|
| }
|
| @@ -201,32 +196,36 @@ int IpcPacketSocket::Close() {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
|
|
| client_->Close();
|
| - state_ = STATE_CLOSED;
|
| + state_ = IS_CLOSED;
|
|
|
| return 0;
|
| }
|
|
|
| -talk_base::Socket::ConnState IpcPacketSocket::GetState() const {
|
| +talk_base::AsyncPacketSocket::State IpcPacketSocket::GetState() const {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
|
|
| switch (state_) {
|
| - case STATE_UNINITIALIZED:
|
| + case IS_UNINITIALIZED:
|
| NOTREACHED();
|
| - return talk_base::Socket::CS_CONNECTING;
|
| + return STATE_CLOSED;
|
|
|
| - case STATE_OPENING:
|
| - return talk_base::Socket::CS_CONNECTING;
|
| + case IS_OPENING:
|
| + return STATE_BINDING;
|
|
|
| - case STATE_OPEN:
|
| - return talk_base::Socket::CS_CONNECTED;
|
| + case IS_OPEN:
|
| + if (type_ == P2P_SOCKET_TCP_CLIENT) {
|
| + return STATE_CONNECTED;
|
| + } else {
|
| + return STATE_BOUND;
|
| + }
|
|
|
| - case STATE_CLOSED:
|
| - case STATE_ERROR:
|
| - return talk_base::Socket::CS_CLOSED;
|
| + case IS_CLOSED:
|
| + case IS_ERROR:
|
| + return STATE_CLOSED;
|
| }
|
|
|
| NOTREACHED();
|
| - return talk_base::Socket::CS_CLOSED;
|
| + return STATE_CLOSED;
|
| }
|
|
|
| int IpcPacketSocket::GetOption(talk_base::Socket::Option opt, int* value) {
|
| @@ -262,8 +261,9 @@ void IpcPacketSocket::OnOpen(const net::IPEndPoint& address) {
|
| return;
|
| }
|
| SignalAddressReady(this, local_address_);
|
| - address_initialized_ = true;
|
| - state_ = STATE_OPEN;
|
| + if (type_ == P2P_SOCKET_TCP_CLIENT)
|
| + SignalConnect(this);
|
| + state_ = IS_OPEN;
|
| }
|
|
|
| void IpcPacketSocket::OnIncomingTcpConnection(
|
| @@ -284,7 +284,7 @@ void IpcPacketSocket::OnIncomingTcpConnection(
|
|
|
| void IpcPacketSocket::OnError() {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| - state_ = STATE_ERROR;
|
| + state_ = IS_ERROR;
|
| error_ = ECONNABORTED;
|
| }
|
|
|
|
|