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

Unified Diff: runtime/bin/socket.cc

Issue 14083007: Add new InternetAddress class with a static lookup function (including IPv6 results). (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 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: runtime/bin/socket.cc
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 3a35ea2d6c02434c2f36425d1c11cddbbe185088..091f819f7cd2e88833e905c5f6a9e134db615d6a 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -24,10 +24,22 @@ int Socket::service_ports_index_ = 0;
void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
Dart_EnterScope();
Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
- const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ int type = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
+ Dart_Handle host_obj = Dart_GetNativeArgument(args, 2);
+ Dart_TypedData_Type data_type;
+ uint8_t* data = NULL;
+ intptr_t len;
+ Dart_Handle result = Dart_TypedDataAcquireData(
+ host_obj, &data_type, reinterpret_cast<void**>(&data), &len);
int64_t port = 0;
- if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) {
- intptr_t socket = Socket::CreateConnect(host, port);
+ if (!Dart_IsError(result) &&
+ DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 3), &port)) {
+ intptr_t socket = Socket::CreateConnect(
+ type == 1 ? SocketAddress::IPv6 : SocketAddress::IPv4,
+ data,
+ len,
+ port);
+ Dart_TypedDataReleaseData(host_obj);
if (socket >= 0) {
Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket);
if (Dart_IsError(err)) Dart_PropagateError(err);
@@ -310,17 +322,27 @@ void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) {
void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
Dart_EnterScope();
Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
- Dart_Handle bind_address_obj = Dart_GetNativeArgument(args, 1);
- Dart_Handle port_obj = Dart_GetNativeArgument(args, 2);
- Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3);
+ int type = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
+ Dart_Handle host_obj = Dart_GetNativeArgument(args, 2);
+ Dart_TypedData_Type data_type;
+ uint8_t* data = NULL;
+ intptr_t len;
+ Dart_Handle result = Dart_TypedDataAcquireData(
+ host_obj, &data_type, reinterpret_cast<void**>(&data), &len);
+ Dart_Handle port_obj = Dart_GetNativeArgument(args, 3);
+ Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 4);
int64_t port = 0;
int64_t backlog = 0;
- if (Dart_IsString(bind_address_obj) &&
+ if (!Dart_IsError(result) &&
DartUtils::GetInt64Value(port_obj, &port) &&
DartUtils::GetInt64Value(backlog_obj, &backlog)) {
- const char* bind_address = DartUtils::GetStringValue(bind_address_obj);
- intptr_t socket =
- ServerSocket::CreateBindListen(bind_address, port, backlog);
+ intptr_t socket = ServerSocket::CreateBindListen(
+ type == 1 ? SocketAddress::IPv6 : SocketAddress::IPv4,
+ data,
+ len,
+ port,
+ backlog);
+ Dart_TypedDataReleaseData(host_obj);
if (socket >= 0) {
Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket);
if (Dart_IsError(err)) Dart_PropagateError(err);
@@ -370,11 +392,33 @@ static CObject* LookupRequest(const CObjectArray& request) {
CObjectString host(request[1]);
CObject* result = NULL;
OSError* os_error = NULL;
- const char* ip_address =
- Socket::LookupIPv4Address(host.CString(), &os_error);
- if (ip_address != NULL) {
- result = new CObjectString(CObject::NewString(ip_address));
- free(const_cast<char*>(ip_address));
+ SocketAddresses* addresses =
+ Socket::LookupAddress(host.CString(), &os_error);
+ if (addresses != NULL) {
+ CObjectArray* array = new CObjectArray(
+ CObject::NewArray(addresses->count));
+ for (intptr_t i = 0; i < addresses->count; i++) {
+ CObjectArray* entry = new CObjectArray(CObject::NewArray(3));
+
+ CObjectInt32* type = new CObjectInt32(CObject::NewInt32(
+ static_cast<int>(addresses->addresses[i]->type)));
+ entry->SetAt(0, type);
+
+ CObjectString* as_string = new CObjectString(CObject::NewString(
+ addresses->addresses[i]->as_string));
+ entry->SetAt(1, as_string);
+
+ CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array(
+ addresses->addresses[i]->length));
+ memmove(data->Buffer(),
+ addresses->addresses[i]->data,
+ addresses->addresses[i]->length);
+
+ entry->SetAt(2, data);
+ array->SetAt(i, entry);
+ }
+ result = array;
+ delete addresses;
} else {
result = CObject::NewOSError(os_error);
delete os_error;

Powered by Google App Engine
This is Rietveld 408576698