diff options
Diffstat (limited to 'chrome/browser/extensions/api/socket/udp_socket.cc')
-rw-r--r-- | chrome/browser/extensions/api/socket/udp_socket.cc | 94 |
1 files changed, 60 insertions, 34 deletions
diff --git a/chrome/browser/extensions/api/socket/udp_socket.cc b/chrome/browser/extensions/api/socket/udp_socket.cc index 467df66..7c72b42 100644 --- a/chrome/browser/extensions/api/socket/udp_socket.cc +++ b/chrome/browser/extensions/api/socket/udp_socket.cc @@ -13,29 +13,12 @@ namespace extensions { -UDPSocket::UDPSocket(const std::string& address, int port, - APIResourceEventNotifier* event_notifier) - : Socket(address, port, event_notifier), - socket_(new net::UDPClientSocket(net::DatagramSocket::DEFAULT_BIND, - net::RandIntCallback(), - NULL, - net::NetLog::Source())) { -} - -// For testing. -UDPSocket::UDPSocket(net::DatagramClientSocket* datagram_client_socket, - const std::string& address, int port, - APIResourceEventNotifier* event_notifier) - : Socket(address, port, event_notifier), - socket_(datagram_client_socket) { -} - -// static -UDPSocket* UDPSocket::CreateSocketForTesting( - net::DatagramClientSocket* datagram_client_socket, - const std::string& address, int port, - APIResourceEventNotifier* event_notifier) { - return new UDPSocket(datagram_client_socket, address, port, event_notifier); +UDPSocket::UDPSocket(APIResourceEventNotifier* event_notifier) + : Socket(event_notifier), + socket_(new net::UDPSocket(net::DatagramSocket::DEFAULT_BIND, + net::RandIntCallback(), + NULL, + net::NetLog::Source())) { } UDPSocket::~UDPSocket() { @@ -44,21 +27,25 @@ UDPSocket::~UDPSocket() { } } -bool UDPSocket::IsValid() { - return socket_ != NULL; -} +int UDPSocket::Connect(const std::string& address, int port) { + if (is_connected_) + return net::ERR_CONNECTION_FAILED; -net::Socket* UDPSocket::socket() { - return socket_.get(); + net::IPEndPoint ip_end_point; + if (!StringAndPortToIPEndPoint(address, port, &ip_end_point)) + return net::ERR_INVALID_ARGUMENT; + + int result = socket_->Connect(ip_end_point); + is_connected_ = (result == net::OK); + return result; } -int UDPSocket::Connect() { - net::IPAddressNumber ip_number; - if (!net::ParseIPLiteralToNumber(address_, &ip_number)) +int UDPSocket::Bind(const std::string& address, int port) { + net::IPEndPoint ip_end_point; + if (!StringAndPortToIPEndPoint(address, port, &ip_end_point)) return net::ERR_INVALID_ARGUMENT; - int result = socket_->Connect(net::IPEndPoint(ip_number, port_)); - is_connected_ = result == net::OK; - return result; + + return socket_->Bind(ip_end_point); } void UDPSocket::Disconnect() { @@ -66,4 +53,43 @@ void UDPSocket::Disconnect() { socket_->Close(); } +int UDPSocket::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 UDPSocket::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 UDPSocket::RecvFrom(scoped_refptr<net::IOBuffer> io_buffer, + int io_buffer_len, + net::IPEndPoint* address) { + return socket_->RecvFrom( + io_buffer.get(), + io_buffer_len, + address, + base::Bind(&Socket::OnDataRead, base::Unretained(this), io_buffer, + address)); +} + +int UDPSocket::SendTo(scoped_refptr<net::IOBuffer> io_buffer, + int byte_count, + const std::string& address, + int port) { + net::IPEndPoint ip_end_point; + if (!StringAndPortToIPEndPoint(address, port, &ip_end_point)) + return net::ERR_INVALID_ARGUMENT; + return socket_->SendTo( + io_buffer.get(), + byte_count, + ip_end_point, + base::Bind(&Socket::OnWriteComplete, base::Unretained(this))); +} + } // namespace extensions |