diff options
Diffstat (limited to 'chrome/browser/extensions/api/socket/tcp_socket.cc')
-rw-r--r-- | chrome/browser/extensions/api/socket/tcp_socket.cc | 70 |
1 files changed, 48 insertions, 22 deletions
diff --git a/chrome/browser/extensions/api/socket/tcp_socket.cc b/chrome/browser/extensions/api/socket/tcp_socket.cc index 8989fd2..4e211bf 100644 --- a/chrome/browser/extensions/api/socket/tcp_socket.cc +++ b/chrome/browser/extensions/api/socket/tcp_socket.cc @@ -14,32 +14,22 @@ namespace extensions { -TCPSocket::TCPSocket(const std::string& address, int port, - APIResourceEventNotifier* event_notifier) - : Socket(address, port, event_notifier) { - net::IPAddressNumber ip_number; - if (net::ParseIPLiteralToNumber(address, &ip_number)) { - net::AddressList address_list = - net::AddressList::CreateFromIPAddress(ip_number, port); - socket_.reset(new net::TCPClientSocket(address_list, NULL, - net::NetLog::Source())); - } +TCPSocket::TCPSocket(APIResourceEventNotifier* event_notifier) + : Socket(event_notifier) { } // For testing. TCPSocket::TCPSocket(net::TCPClientSocket* tcp_client_socket, - const std::string& address, int port, APIResourceEventNotifier* event_notifier) - : Socket(address, port, event_notifier), + : Socket(event_notifier), socket_(tcp_client_socket) { } // static TCPSocket* TCPSocket::CreateSocketForTesting( net::TCPClientSocket* tcp_client_socket, - const std::string& address, int port, APIResourceEventNotifier* event_notifier) { - return new TCPSocket(tcp_client_socket, address, port, event_notifier); + return new TCPSocket(tcp_client_socket, event_notifier); } TCPSocket::~TCPSocket() { @@ -48,18 +38,22 @@ TCPSocket::~TCPSocket() { } } -bool TCPSocket::IsValid() { - return socket_ != NULL; -} +int TCPSocket::Connect(const std::string& address, int port) { + if (is_connected_) + return net::ERR_CONNECTION_FAILED; -net::Socket* TCPSocket::socket() { - return socket_.get(); -} + net::AddressList address_list; + if (!StringAndPortToAddressList(address, port, &address_list)) + return net::ERR_INVALID_ARGUMENT; + + socket_.reset(new net::TCPClientSocket(address_list, NULL, + net::NetLog::Source())); -int TCPSocket::Connect() { int result = socket_->Connect(base::Bind( &TCPSocket::OnConnect, base::Unretained(this))); - is_connected_ = result == net::OK; + if (result == net::OK) { + is_connected_ = true; + } return result; } @@ -68,6 +62,38 @@ void TCPSocket::Disconnect() { socket_->Disconnect(); } +int TCPSocket::Bind(const std::string& address, int port) { + // TODO(penghuang): Supports bind for tcp? + return net::ERR_FAILED; +} + +int TCPSocket::Read(scoped_refptr<net::IOBuffer> io_buffer, int io_buffer_len) { + return socket_->Read( + io_buffer.get(), + io_buffer_len, + base::Bind(&Socket::OnDataRead, base::Unretained(this), io_buffer, + static_cast<net::IPEndPoint*>(NULL))); +} + +int TCPSocket::Write(scoped_refptr<net::IOBuffer> io_buffer, int byte_count) { + return socket_->Write( + io_buffer.get(), byte_count, + base::Bind(&Socket::OnWriteComplete, base::Unretained(this))); +} + +int TCPSocket::RecvFrom(scoped_refptr<net::IOBuffer> io_buffer, + int io_buffer_len, + net::IPEndPoint* address) { + return net::ERR_FAILED; +} + +int TCPSocket::SendTo(scoped_refptr<net::IOBuffer> io_buffer, + int byte_count, + const std::string& address, + int port) { + return net::ERR_FAILED; +} + void TCPSocket::OnConnect(int result) { is_connected_ = result == net::OK; event_notifier()->OnConnectComplete(result); |