Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(850)

Side by Side Diff: extensions/browser/api/socket/socket.cc

Issue 183893041: Move sockets APIs out of src/chrome (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "extensions/browser/api/socket/socket.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "chrome/browser/extensions/api/api_resource_manager.h" 9 #include "chrome/browser/extensions/api/api_resource_manager.h"
10 #include "net/base/address_list.h" 10 #include "net/base/address_list.h"
11 #include "net/base/io_buffer.h" 11 #include "net/base/io_buffer.h"
12 #include "net/base/ip_endpoint.h" 12 #include "net/base/ip_endpoint.h"
13 #include "net/base/net_errors.h" 13 #include "net/base/net_errors.h"
14 #include "net/socket/socket.h" 14 #include "net/socket/socket.h"
15 15
16 namespace extensions { 16 namespace extensions {
17 17
18 const char kSocketTypeNotSupported[] = "Socket type does not support this API"; 18 const char kSocketTypeNotSupported[] = "Socket type does not support this API";
19 19
20 static base::LazyInstance< 20 static base::LazyInstance<
21 BrowserContextKeyedAPIFactory<ApiResourceManager<Socket> > > g_factory = 21 BrowserContextKeyedAPIFactory<ApiResourceManager<Socket> > > g_factory =
22 LAZY_INSTANCE_INITIALIZER; 22 LAZY_INSTANCE_INITIALIZER;
23 23
24 // static 24 // static
25 template <> 25 template <>
26 BrowserContextKeyedAPIFactory<ApiResourceManager<Socket> >* 26 BrowserContextKeyedAPIFactory<ApiResourceManager<Socket> >*
27 ApiResourceManager<Socket>::GetFactoryInstance() { 27 ApiResourceManager<Socket>::GetFactoryInstance() {
28 return g_factory.Pointer(); 28 return g_factory.Pointer();
29 } 29 }
30 30
31 Socket::Socket(const std::string& owner_extension_id) 31 Socket::Socket(const std::string& owner_extension_id)
32 : ApiResource(owner_extension_id), is_connected_(false) { 32 : ApiResource(owner_extension_id), is_connected_(false) {}
33 }
34 33
35 Socket::~Socket() { 34 Socket::~Socket() {
36 // Derived destructors should make sure the socket has been closed. 35 // Derived destructors should make sure the socket has been closed.
37 DCHECK(!is_connected_); 36 DCHECK(!is_connected_);
38 } 37 }
39 38
40 void Socket::Write(scoped_refptr<net::IOBuffer> io_buffer, 39 void Socket::Write(scoped_refptr<net::IOBuffer> io_buffer,
41 int byte_count, 40 int byte_count,
42 const CompletionCallback& callback) { 41 const CompletionCallback& callback) {
43 DCHECK(!callback.is_null()); 42 DCHECK(!callback.is_null());
44 write_queue_.push(WriteRequest(io_buffer, byte_count, callback)); 43 write_queue_.push(WriteRequest(io_buffer, byte_count, callback));
45 WriteData(); 44 WriteData();
46 } 45 }
47 46
48 void Socket::WriteData() { 47 void Socket::WriteData() {
49 // IO is pending. 48 // IO is pending.
50 if (io_buffer_write_.get()) 49 if (io_buffer_write_.get())
51 return; 50 return;
52 51
53 WriteRequest& request = write_queue_.front(); 52 WriteRequest& request = write_queue_.front();
54 53
55 DCHECK(request.byte_count >= request.bytes_written); 54 DCHECK(request.byte_count >= request.bytes_written);
56 io_buffer_write_ = new net::WrappedIOBuffer( 55 io_buffer_write_ = new net::WrappedIOBuffer(request.io_buffer->data() +
57 request.io_buffer->data() + request.bytes_written); 56 request.bytes_written);
58 int result = WriteImpl( 57 int result =
59 io_buffer_write_.get(), 58 WriteImpl(io_buffer_write_.get(),
60 request.byte_count - request.bytes_written, 59 request.byte_count - request.bytes_written,
61 base::Bind(&Socket::OnWriteComplete, base::Unretained(this))); 60 base::Bind(&Socket::OnWriteComplete, base::Unretained(this)));
62 61
63 if (result != net::ERR_IO_PENDING) 62 if (result != net::ERR_IO_PENDING)
64 OnWriteComplete(result); 63 OnWriteComplete(result);
65 } 64 }
66 65
67 void Socket::OnWriteComplete(int result) { 66 void Socket::OnWriteComplete(int result) {
68 io_buffer_write_ = NULL; 67 io_buffer_write_ = NULL;
69 68
70 WriteRequest& request = write_queue_.front(); 69 WriteRequest& request = write_queue_.front();
71 70
72 if (result >= 0) { 71 if (result >= 0) {
73 request.bytes_written += result; 72 request.bytes_written += result;
74 if (request.bytes_written < request.byte_count) { 73 if (request.bytes_written < request.byte_count) {
75 WriteData(); 74 WriteData();
76 return; 75 return;
77 } 76 }
78 DCHECK(request.bytes_written == request.byte_count); 77 DCHECK(request.bytes_written == request.byte_count);
79 result = request.bytes_written; 78 result = request.bytes_written;
80 } 79 }
81 80
82 request.callback.Run(result); 81 request.callback.Run(result);
83 write_queue_.pop(); 82 write_queue_.pop();
84 83
85 if (!write_queue_.empty()) 84 if (!write_queue_.empty())
86 WriteData(); 85 WriteData();
87 } 86 }
88 87
89 bool Socket::SetKeepAlive(bool enable, int delay) { 88 bool Socket::SetKeepAlive(bool enable, int delay) { return false; }
90 return false;
91 }
92 89
93 bool Socket::SetNoDelay(bool no_delay) { 90 bool Socket::SetNoDelay(bool no_delay) { return false; }
94 return false;
95 }
96 91
97 int Socket::Listen(const std::string& address, int port, int backlog, 92 int Socket::Listen(const std::string& address,
93 int port,
94 int backlog,
98 std::string* error_msg) { 95 std::string* error_msg) {
99 *error_msg = kSocketTypeNotSupported; 96 *error_msg = kSocketTypeNotSupported;
100 return net::ERR_FAILED; 97 return net::ERR_FAILED;
101 } 98 }
102 99
103 void Socket::Accept(const AcceptCompletionCallback& callback) { 100 void Socket::Accept(const AcceptCompletionCallback& callback) {
104 callback.Run(net::ERR_FAILED, NULL); 101 callback.Run(net::ERR_FAILED, NULL);
105 } 102 }
106 103
107 // static 104 // static
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 *port = address.port(); 138 *port = address.port();
142 } 139 }
143 } 140 }
144 141
145 Socket::WriteRequest::WriteRequest(scoped_refptr<net::IOBuffer> io_buffer, 142 Socket::WriteRequest::WriteRequest(scoped_refptr<net::IOBuffer> io_buffer,
146 int byte_count, 143 int byte_count,
147 const CompletionCallback& callback) 144 const CompletionCallback& callback)
148 : io_buffer(io_buffer), 145 : io_buffer(io_buffer),
149 byte_count(byte_count), 146 byte_count(byte_count),
150 callback(callback), 147 callback(callback),
151 bytes_written(0) { 148 bytes_written(0) {}
152 }
153 149
154 Socket::WriteRequest::~WriteRequest() { } 150 Socket::WriteRequest::~WriteRequest() {}
155 151
156 } // namespace extensions 152 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698