OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/api/socket/socket.h" | 5 #include "chrome/browser/extensions/api/socket/socket.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "chrome/browser/extensions/api/api_resource_event_notifier.h" | 8 #include "chrome/browser/extensions/api/api_resource_event_notifier.h" |
9 #include "net/base/address_list.h" | 9 #include "net/base/address_list.h" |
10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
11 #include "net/base/ip_endpoint.h" | 11 #include "net/base/ip_endpoint.h" |
12 #include "net/base/net_errors.h" | 12 #include "net/base/net_errors.h" |
13 #include "net/socket/socket.h" | 13 #include "net/socket/socket.h" |
14 | 14 |
15 namespace extensions { | 15 namespace extensions { |
16 | 16 |
17 Socket::Socket(APIResourceEventNotifier* event_notifier) | 17 Socket::Socket(APIResourceEventNotifier* event_notifier) |
18 : APIResource(APIResource::SocketResource, event_notifier), | 18 : APIResource(APIResource::SocketResource, event_notifier), |
19 port_(0), | 19 port_(0), |
20 is_connected_(false) { | 20 is_connected_(false) { |
21 } | 21 } |
22 | 22 |
23 Socket::~Socket() { | 23 Socket::~Socket() { |
24 // Derived destructors should make sure the socket has been closed. | 24 // Derived destructors should make sure the socket has been closed. |
25 DCHECK(!is_connected_); | 25 DCHECK(!is_connected_); |
26 } | 26 } |
27 | 27 |
| 28 void Socket::Write(scoped_refptr<net::IOBuffer> io_buffer, |
| 29 int byte_count, |
| 30 const CompletionCallback& callback) { |
| 31 DCHECK(!callback.is_null()); |
| 32 write_queue_.push(WriteRequest(io_buffer, byte_count, callback)); |
| 33 WriteData(); |
| 34 } |
| 35 |
| 36 void Socket::WriteData() { |
| 37 // IO is pending. |
| 38 if (io_buffer_write_.get()) |
| 39 return; |
| 40 |
| 41 WriteRequest& request = write_queue_.front(); |
| 42 |
| 43 DCHECK(request.byte_count > request.bytes_written); |
| 44 io_buffer_write_ = new net::WrappedIOBuffer( |
| 45 request.io_buffer->data() + request.bytes_written); |
| 46 int result = WriteImpl( |
| 47 io_buffer_write_.get(), |
| 48 request.byte_count - request.bytes_written, |
| 49 base::Bind(&Socket::OnWriteComplete, base::Unretained(this))); |
| 50 |
| 51 if (result != net::ERR_IO_PENDING) |
| 52 OnWriteComplete(result); |
| 53 } |
| 54 |
| 55 void Socket::OnWriteComplete(int result) { |
| 56 io_buffer_write_ = NULL; |
| 57 |
| 58 WriteRequest& request = write_queue_.front(); |
| 59 |
| 60 if (result >= 0) { |
| 61 request.bytes_written += result; |
| 62 if (request.bytes_written < request.byte_count) { |
| 63 WriteData(); |
| 64 return; |
| 65 } |
| 66 DCHECK(request.bytes_written == request.byte_count); |
| 67 result = request.bytes_written; |
| 68 } |
| 69 |
| 70 request.callback.Run(result); |
| 71 write_queue_.pop(); |
| 72 |
| 73 if (!write_queue_.empty()) |
| 74 WriteData(); |
| 75 } |
| 76 |
28 // static | 77 // static |
29 bool Socket::StringAndPortToIPEndPoint(const std::string& ip_address_str, | 78 bool Socket::StringAndPortToIPEndPoint(const std::string& ip_address_str, |
30 int port, | 79 int port, |
31 net::IPEndPoint* ip_end_point) { | 80 net::IPEndPoint* ip_end_point) { |
32 DCHECK(ip_end_point); | 81 DCHECK(ip_end_point); |
33 net::IPAddressNumber ip_number; | 82 net::IPAddressNumber ip_number; |
34 if (!net::ParseIPLiteralToNumber(ip_address_str, &ip_number)) | 83 if (!net::ParseIPLiteralToNumber(ip_address_str, &ip_number)) |
35 return false; | 84 return false; |
36 | 85 |
37 *ip_end_point = net::IPEndPoint(ip_number, port); | 86 *ip_end_point = net::IPEndPoint(ip_number, port); |
(...skipping 19 matching lines...) Expand all Loading... |
57 DCHECK(port); | 106 DCHECK(port); |
58 *ip_address_str = address.ToStringWithoutPort(); | 107 *ip_address_str = address.ToStringWithoutPort(); |
59 if (ip_address_str->empty()) { | 108 if (ip_address_str->empty()) { |
60 *port = 0; | 109 *port = 0; |
61 } else { | 110 } else { |
62 *port = address.port(); | 111 *port = address.port(); |
63 } | 112 } |
64 } | 113 } |
65 | 114 |
66 } // namespace extensions | 115 } // namespace extensions |
OLD | NEW |