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

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

Issue 10134008: Add bind(), recvFrom(), sendTo() for UDP socket. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Reenable api tests Created 8 years, 8 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
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 "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/io_buffer.h" 10 #include "net/base/io_buffer.h"
10 #include "net/base/ip_endpoint.h" 11 #include "net/base/ip_endpoint.h"
11 #include "net/base/net_errors.h" 12 #include "net/base/net_errors.h"
12 #include "net/socket/socket.h" 13 #include "net/socket/socket.h"
13 14
14 namespace extensions { 15 namespace extensions {
15 16
16 Socket::Socket(const std::string& address, int port, 17 Socket::Socket(APIResourceEventNotifier* event_notifier)
17 APIResourceEventNotifier* event_notifier)
18 : APIResource(APIResource::SocketResource, event_notifier), 18 : APIResource(APIResource::SocketResource, event_notifier),
19 address_(address),
20 port_(port),
21 is_connected_(false) { 19 is_connected_(false) {
22 } 20 }
23 21
24 Socket::~Socket() { 22 Socket::~Socket() {
25 // Derived destructors should make sure the socket has been closed. 23 // Derived destructors should make sure the socket has been closed.
26 DCHECK(!is_connected_); 24 DCHECK(!is_connected_);
27 } 25 }
28 26
29 void Socket::OnDataRead(scoped_refptr<net::IOBuffer> io_buffer, int result) { 27 void Socket::OnDataRead(scoped_refptr<net::IOBuffer> io_buffer,
28 net::IPEndPoint* address,
29 int result) {
30 // OnDataRead will take ownership of data_value. 30 // OnDataRead will take ownership of data_value.
31 ListValue* data_value = new ListValue(); 31 ListValue* data_value = new ListValue();
32 if (result >= 0) { 32 if (result >= 0) {
33 size_t bytes_size = static_cast<size_t>(result); 33 size_t bytes_size = static_cast<size_t>(result);
34 const char* io_buffer_start = io_buffer->data(); 34 const char* io_buffer_start = io_buffer->data();
35 for (size_t i = 0; i < bytes_size; ++i) { 35 for (size_t i = 0; i < bytes_size; ++i) {
36 data_value->Set(i, Value::CreateIntegerValue(io_buffer_start[i])); 36 data_value->Set(i, Value::CreateIntegerValue(io_buffer_start[i]));
37 } 37 }
38 } 38 }
39 event_notifier()->OnDataRead(result, data_value); 39
40 std::string ip_address_str;
41 int port = 0;
42 if (address)
43 IPEndPointToStringAndPort(*address, &ip_address_str, &port);
44 event_notifier()->OnDataRead(result, data_value, ip_address_str, port);
40 } 45 }
41 46
42 void Socket::OnWriteComplete(int result) { 47 void Socket::OnWriteComplete(int result) {
43 event_notifier()->OnWriteComplete(result); 48 event_notifier()->OnWriteComplete(result);
44 } 49 }
45 50
46 int Socket::Read(scoped_refptr<net::IOBuffer> io_buffer, int io_buffer_len) { 51 // static
47 return socket()->Read( 52 bool Socket::StringAndPortToIPEndPoint(const std::string& ip_address_str,
48 io_buffer.get(), 53 int port,
49 io_buffer_len, 54 net::IPEndPoint* ip_end_point) {
50 base::Bind(&Socket::OnDataRead, base::Unretained(this), io_buffer)); 55 DCHECK(ip_end_point);
56 net::IPAddressNumber ip_number;
57 if (!net::ParseIPLiteralToNumber(ip_address_str, &ip_number))
58 return false;
59
60 *ip_end_point = net::IPEndPoint(ip_number, port);
61 return true;
51 } 62 }
52 63
53 int Socket::Write(scoped_refptr<net::IOBuffer> io_buffer, int byte_count) { 64 bool Socket::StringAndPortToAddressList(const std::string& ip_address_str,
54 return socket()->Write( 65 int port,
55 io_buffer.get(), byte_count, 66 net::AddressList* address_list) {
56 base::Bind(&Socket::OnWriteComplete, base::Unretained(this))); 67 DCHECK(address_list);
68 net::IPAddressNumber ip_number;
69 if (!net::ParseIPLiteralToNumber(ip_address_str, &ip_number))
70 return false;
71
72 *address_list = net::AddressList::CreateFromIPAddress(ip_number, port);
73 return true;
74 }
75
76 void Socket::IPEndPointToStringAndPort(const net::IPEndPoint& address,
77 std::string* ip_address_str,
78 int* port) {
79 DCHECK(ip_address_str);
80 DCHECK(port);
81 struct sockaddr_storage addr;
82 size_t addr_len = sizeof(addr);
83 if (address.ToSockAddr(reinterpret_cast<struct sockaddr*>(&addr),
84 &addr_len)) {
85 *ip_address_str = net::NetAddressToString(
86 reinterpret_cast<struct sockaddr*>(&addr), addr_len);
87 *port = address.port();
88 } else {
89 *ip_address_str = "";
90 *port = 0;
91 }
57 } 92 }
58 93
59 } // namespace extensions 94 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698