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

Unified 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: wip 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/socket/socket.cc
diff --git a/chrome/browser/extensions/api/socket/socket.cc b/chrome/browser/extensions/api/socket/socket.cc
index 60e57b7b1b867d9be7e4cc9f7c0c32b4b704c64b..8f5d81c4aad0deb3c3c632fe09a8c5ed37550273 100644
--- a/chrome/browser/extensions/api/socket/socket.cc
+++ b/chrome/browser/extensions/api/socket/socket.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "chrome/browser/extensions/api/api_resource_event_notifier.h"
+#include "net/base/address_list.h"
#include "net/base/io_buffer.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_errors.h"
@@ -13,11 +14,8 @@
namespace extensions {
-Socket::Socket(const std::string& address, int port,
- APIResourceEventNotifier* event_notifier)
+Socket::Socket(APIResourceEventNotifier* event_notifier)
: APIResource(APIResource::SocketResource, event_notifier),
- address_(address),
- port_(port),
is_connected_(false) {
}
@@ -26,7 +24,9 @@ Socket::~Socket() {
DCHECK(!is_connected_);
}
-void Socket::OnDataRead(scoped_refptr<net::IOBuffer> io_buffer, int result) {
+void Socket::OnDataRead(scoped_refptr<net::IOBuffer> io_buffer,
+ net::IPEndPoint* address,
+ int result) {
// OnDataRead will take ownership of data_value.
ListValue* data_value = new ListValue();
if (result >= 0) {
@@ -36,24 +36,60 @@ void Socket::OnDataRead(scoped_refptr<net::IOBuffer> io_buffer, int result) {
data_value->Set(i, Value::CreateIntegerValue(io_buffer_start[i]));
}
}
- event_notifier()->OnDataRead(result, data_value);
+
+ std::string ip_address_str;
+ int port = 0;
miket_OOO 2012/04/23 22:23:40 I checked and TCP/UDP port 0 is indeed reserved an
Peng 2012/04/24 15:07:14 http://msdn.microsoft.com/en-us/library/windows/de
+ if (address)
+ IPEndPointToStringAndPort(*address, &ip_address_str, &port);
+ event_notifier()->OnDataRead(result, data_value, ip_address_str, port);
}
void Socket::OnWriteComplete(int result) {
event_notifier()->OnWriteComplete(result);
}
-int Socket::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
+bool Socket::StringAndPortToIPEndPoint(const std::string& ip_address_str,
+ int port,
+ net::IPEndPoint* ip_end_point) {
+ DCHECK(ip_end_point);
+ net::IPAddressNumber ip_number;
+ if (!net::ParseIPLiteralToNumber(ip_address_str, &ip_number))
+ return false;
+
+ *ip_end_point = net::IPEndPoint(ip_number, port);
+ return true;
+}
+
+bool Socket::StringAndPortToAddressList(const std::string& ip_address_str,
+ int port,
+ net::AddressList* address_list) {
+ DCHECK(address_list);
+ net::IPAddressNumber ip_number;
+ if (!net::ParseIPLiteralToNumber(ip_address_str, &ip_number))
+ return false;
+
+ *address_list = net::AddressList::CreateFromIPAddress(ip_number, port);
+ return true;
}
-int Socket::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)));
+bool Socket::IPEndPointToStringAndPort(const net::IPEndPoint& address,
+ std::string* ip_address_str,
+ int* port) {
+ DCHECK(ip_address_str);
+ DCHECK(port);
+ struct sockaddr_storage addr;
+ size_t addr_len = sizeof(addr);
+ if (address.ToSockAddr(reinterpret_cast<struct sockaddr*>(&addr),
+ &addr_len)) {
miket_OOO 2012/04/23 22:23:40 indent
Peng 2012/04/24 15:07:14 Done.
+ *ip_address_str = net::NetAddressToString(
+ reinterpret_cast<struct sockaddr*>(&addr), addr_len);
+ *port = address.port();
+ } else {
+ *ip_address_str = "";
+ *port = 0;
miket_OOO 2012/04/23 22:23:40 Should you return false in this case? If not, can
Peng 2012/04/24 15:07:14 Done.
+ }
+ return true;
}
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698