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.byte_written); | |
44 io_buffer_write_ = new net::WrappedIOBuffer( | |
jeremya
2012/05/17 01:09:06
Why does io_buffer_write_ need to be stored in a m
Peng
2012/05/17 02:42:22
Because WriteImpl() & TCPClientSocket::Write() tak
| |
45 request.io_buffer->data() + request.byte_written); | |
46 int result = WriteImpl( | |
47 io_buffer_write_.get(), | |
48 request.byte_count - request.byte_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; | |
jeremya
2012/05/17 01:09:06
Is this leaking?
Peng
2012/05/17 02:42:22
It is a scoped_refptr<net::IOBuffer>. So it is not
| |
57 | |
58 WriteRequest& request = write_queue_.front(); | |
59 | |
60 if (result >= 0) { | |
jeremya
2012/05/17 01:09:06
What does result == 0 mean?
Peng
2012/05/17 02:42:22
I remember Linux allows call write() with a zero s
| |
61 request.byte_written += result; | |
62 if (request.byte_written < request.byte_count) { | |
63 WriteData(); | |
64 return; | |
65 } | |
66 DCHECK(request.byte_written == request.byte_count); | |
67 result = request.byte_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 |