Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "bin/socket.h" | 5 #include "bin/socket.h" |
| 6 #include "bin/dartutils.h" | 6 #include "bin/dartutils.h" |
| 7 #include "bin/thread.h" | 7 #include "bin/thread.h" |
| 8 #include "bin/utils.h" | 8 #include "bin/utils.h" |
| 9 | 9 |
| 10 #include "platform/globals.h" | 10 #include "platform/globals.h" |
| 11 #include "platform/thread.h" | 11 #include "platform/thread.h" |
| 12 #include "platform/utils.h" | 12 #include "platform/utils.h" |
| 13 | 13 |
| 14 #include "include/dart_api.h" | 14 #include "include/dart_api.h" |
| 15 | 15 |
| 16 static const int kSocketIdNativeField = 0; | |
| 17 | |
| 16 dart::Mutex Socket::mutex_; | 18 dart::Mutex Socket::mutex_; |
| 17 int Socket::service_ports_size_ = 0; | 19 int Socket::service_ports_size_ = 0; |
| 18 Dart_Port* Socket::service_ports_ = NULL; | 20 Dart_Port* Socket::service_ports_ = NULL; |
| 19 int Socket::service_ports_index_ = 0; | 21 int Socket::service_ports_index_ = 0; |
| 20 | 22 |
| 21 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { | 23 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { |
| 22 Dart_EnterScope(); | 24 Dart_EnterScope(); |
| 23 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); | 25 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 24 const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); | 26 const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
| 25 int64_t port = 0; | 27 int64_t port = 0; |
| 26 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { | 28 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { |
| 27 intptr_t socket = Socket::CreateConnect(host, port); | 29 intptr_t socket = Socket::CreateConnect(host, port); |
| 28 if (socket >= 0) { | 30 if (socket >= 0) { |
| 29 DartUtils::SetIntegerField(socket_obj, DartUtils::kIdFieldName, socket); | 31 Socket::SetSocketIdNativeField(socket_obj, socket); |
| 30 Dart_SetReturnValue(args, Dart_True()); | 32 Dart_SetReturnValue(args, Dart_True()); |
| 31 } else { | 33 } else { |
| 32 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 34 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 33 } | 35 } |
| 34 } else { | 36 } else { |
| 35 OSError os_error(-1, "Invalid argument", OSError::kUnknown); | 37 OSError os_error(-1, "Invalid argument", OSError::kUnknown); |
| 36 Dart_Handle err = DartUtils::NewDartOSError(&os_error); | 38 Dart_Handle err = DartUtils::NewDartOSError(&os_error); |
| 37 if (Dart_IsError(err)) Dart_PropagateError(err); | 39 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 38 Dart_SetReturnValue(args, err); | 40 Dart_SetReturnValue(args, err); |
| 39 } | 41 } |
| 40 Dart_ExitScope(); | 42 Dart_ExitScope(); |
| 41 } | 43 } |
| 42 | 44 |
| 43 | 45 |
| 44 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { | 46 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { |
| 45 Dart_EnterScope(); | 47 Dart_EnterScope(); |
| 46 int64_t socket = DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), | 48 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 47 DartUtils::kIdFieldName); | 49 intptr_t socket = 0; |
|
Søren Gjesse
2012/09/21 06:47:06
Why do you initialize to 0?
Mads Ager (google)
2012/09/21 08:18:25
Just to make sure that we have some initialization
| |
| 50 Socket::GetSocketIdNativeField(socket_obj, &socket); | |
| 48 intptr_t available = Socket::Available(socket); | 51 intptr_t available = Socket::Available(socket); |
| 49 if (available >= 0) { | 52 if (available >= 0) { |
| 50 Dart_SetReturnValue(args, Dart_NewInteger(available)); | 53 Dart_SetReturnValue(args, Dart_NewInteger(available)); |
| 51 } else { | 54 } else { |
| 52 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 55 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 53 } | 56 } |
| 54 Dart_ExitScope(); | 57 Dart_ExitScope(); |
| 55 } | 58 } |
| 56 | 59 |
| 57 | 60 |
| 58 void FUNCTION_NAME(Socket_ReadList)(Dart_NativeArguments args) { | 61 void FUNCTION_NAME(Socket_ReadList)(Dart_NativeArguments args) { |
| 59 Dart_EnterScope(); | 62 Dart_EnterScope(); |
| 60 intptr_t socket = | 63 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 61 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), | 64 intptr_t socket = 0; |
| 62 DartUtils::kIdFieldName); | 65 Socket::GetSocketIdNativeField(socket_obj, &socket); |
| 63 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 66 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
| 64 int64_t offset = 0; | 67 int64_t offset = 0; |
| 65 int64_t length = 0; | 68 int64_t length = 0; |
| 66 Dart_Handle offset_obj = Dart_GetNativeArgument(args, 2); | 69 Dart_Handle offset_obj = Dart_GetNativeArgument(args, 2); |
| 67 Dart_Handle length_obj = Dart_GetNativeArgument(args, 3); | 70 Dart_Handle length_obj = Dart_GetNativeArgument(args, 3); |
| 68 if (Dart_IsList(buffer_obj) && | 71 if (Dart_IsList(buffer_obj) && |
| 69 DartUtils::GetInt64Value(offset_obj, &offset) && | 72 DartUtils::GetInt64Value(offset_obj, &offset) && |
| 70 DartUtils::GetInt64Value(length_obj, &length)) { | 73 DartUtils::GetInt64Value(length_obj, &length)) { |
| 71 intptr_t buffer_len = 0; | 74 intptr_t buffer_len = 0; |
| 72 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len); | 75 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 99 if (Dart_IsError(err)) Dart_PropagateError(err); | 102 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 100 Dart_SetReturnValue(args, err); | 103 Dart_SetReturnValue(args, err); |
| 101 } | 104 } |
| 102 | 105 |
| 103 Dart_ExitScope(); | 106 Dart_ExitScope(); |
| 104 } | 107 } |
| 105 | 108 |
| 106 | 109 |
| 107 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { | 110 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { |
| 108 Dart_EnterScope(); | 111 Dart_EnterScope(); |
| 109 intptr_t socket = | 112 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 110 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), | 113 intptr_t socket = 0; |
| 111 DartUtils::kIdFieldName); | 114 Socket::GetSocketIdNativeField(socket_obj, &socket); |
| 112 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 115 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
| 113 ASSERT(Dart_IsList(buffer_obj)); | 116 ASSERT(Dart_IsList(buffer_obj)); |
| 114 intptr_t offset = | 117 intptr_t offset = |
| 115 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2)); | 118 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2)); |
| 116 intptr_t length = | 119 intptr_t length = |
| 117 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); | 120 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); |
| 118 intptr_t buffer_len = 0; | 121 intptr_t buffer_len = 0; |
| 119 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len); | 122 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len); |
| 120 if (Dart_IsError(result)) { | 123 if (Dart_IsError(result)) { |
| 121 Dart_PropagateError(result); | 124 Dart_PropagateError(result); |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 152 Dart_SetReturnValue(args, Dart_NewInteger(total_bytes_written)); | 155 Dart_SetReturnValue(args, Dart_NewInteger(total_bytes_written)); |
| 153 } else { | 156 } else { |
| 154 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 157 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 155 } | 158 } |
| 156 Dart_ExitScope(); | 159 Dart_ExitScope(); |
| 157 } | 160 } |
| 158 | 161 |
| 159 | 162 |
| 160 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { | 163 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { |
| 161 Dart_EnterScope(); | 164 Dart_EnterScope(); |
| 162 intptr_t socket = | 165 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 163 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), | 166 intptr_t socket = 0; |
| 164 DartUtils::kIdFieldName); | 167 Socket::GetSocketIdNativeField(socket_obj, &socket); |
| 165 OSError os_error; | 168 OSError os_error; |
| 166 intptr_t port = Socket::GetPort(socket); | 169 intptr_t port = Socket::GetPort(socket); |
| 167 if (port > 0) { | 170 if (port > 0) { |
| 168 Dart_SetReturnValue(args, Dart_NewInteger(port)); | 171 Dart_SetReturnValue(args, Dart_NewInteger(port)); |
| 169 } else { | 172 } else { |
| 170 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 173 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 171 } | 174 } |
| 172 Dart_ExitScope(); | 175 Dart_ExitScope(); |
| 173 } | 176 } |
| 174 | 177 |
| 175 | 178 |
| 176 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { | 179 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { |
| 177 Dart_EnterScope(); | 180 Dart_EnterScope(); |
| 178 intptr_t socket = | 181 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 179 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), | 182 intptr_t socket = 0; |
| 180 DartUtils::kIdFieldName); | 183 Socket::GetSocketIdNativeField(socket_obj, &socket); |
| 181 OSError os_error; | 184 OSError os_error; |
| 182 intptr_t port = 0; | 185 intptr_t port = 0; |
| 183 char host[INET_ADDRSTRLEN]; | 186 char host[INET_ADDRSTRLEN]; |
| 184 if (Socket::GetRemotePeer(socket, host, &port)) { | 187 if (Socket::GetRemotePeer(socket, host, &port)) { |
| 185 Dart_Handle list = Dart_NewList(2); | 188 Dart_Handle list = Dart_NewList(2); |
| 186 Dart_ListSetAt(list, 0, Dart_NewString(host)); | 189 Dart_ListSetAt(list, 0, Dart_NewString(host)); |
| 187 Dart_ListSetAt(list, 1, Dart_NewInteger(port)); | 190 Dart_ListSetAt(list, 1, Dart_NewInteger(port)); |
| 188 Dart_SetReturnValue(args, list); | 191 Dart_SetReturnValue(args, list); |
| 189 } else { | 192 } else { |
| 190 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 193 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 191 } | 194 } |
| 192 Dart_ExitScope(); | 195 Dart_ExitScope(); |
| 193 } | 196 } |
| 194 | 197 |
| 195 | 198 |
| 196 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) { | 199 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) { |
| 197 Dart_EnterScope(); | 200 Dart_EnterScope(); |
| 198 intptr_t socket = | 201 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 199 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), | 202 intptr_t socket = 0; |
| 200 DartUtils::kIdFieldName); | 203 Socket::GetSocketIdNativeField(socket_obj, &socket); |
| 201 OSError os_error; | 204 OSError os_error; |
| 202 Socket::GetError(socket, &os_error); | 205 Socket::GetError(socket, &os_error); |
| 203 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 206 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 204 Dart_ExitScope(); | 207 Dart_ExitScope(); |
| 205 } | 208 } |
| 206 | 209 |
| 207 | 210 |
| 208 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { | 211 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { |
| 209 Dart_EnterScope(); | 212 Dart_EnterScope(); |
| 210 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); | 213 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 211 intptr_t num = | 214 intptr_t num = |
| 212 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); | 215 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); |
| 213 ASSERT(num == 0 || num == 1 || num == 2); | 216 ASSERT(num == 0 || num == 1 || num == 2); |
| 214 intptr_t socket = Socket::GetStdioHandle(num); | 217 intptr_t socket = Socket::GetStdioHandle(num); |
| 215 DartUtils::SetIntegerField( | 218 Socket::SetSocketIdNativeField(socket_obj, socket); |
| 216 socket_obj, DartUtils::kIdFieldName, socket); | |
| 217 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); | 219 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); |
| 218 Dart_ExitScope(); | 220 Dart_ExitScope(); |
| 219 } | 221 } |
| 220 | 222 |
| 221 | 223 |
| 222 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { | 224 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { |
| 223 Dart_EnterScope(); | 225 Dart_EnterScope(); |
| 224 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); | 226 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 225 Dart_Handle bind_address_obj = Dart_GetNativeArgument(args, 1); | 227 Dart_Handle bind_address_obj = Dart_GetNativeArgument(args, 1); |
| 226 Dart_Handle port_obj = Dart_GetNativeArgument(args, 2); | 228 Dart_Handle port_obj = Dart_GetNativeArgument(args, 2); |
| 227 Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3); | 229 Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3); |
| 228 int64_t port = 0; | 230 int64_t port = 0; |
| 229 int64_t backlog = 0; | 231 int64_t backlog = 0; |
| 230 if (Dart_IsString(bind_address_obj) && | 232 if (Dart_IsString(bind_address_obj) && |
| 231 DartUtils::GetInt64Value(port_obj, &port) && | 233 DartUtils::GetInt64Value(port_obj, &port) && |
| 232 DartUtils::GetInt64Value(backlog_obj, &backlog)) { | 234 DartUtils::GetInt64Value(backlog_obj, &backlog)) { |
| 233 const char* bind_address = DartUtils::GetStringValue(bind_address_obj); | 235 const char* bind_address = DartUtils::GetStringValue(bind_address_obj); |
| 234 intptr_t socket = | 236 intptr_t socket = |
| 235 ServerSocket::CreateBindListen(bind_address, port, backlog); | 237 ServerSocket::CreateBindListen(bind_address, port, backlog); |
| 236 if (socket >= 0) { | 238 if (socket >= 0) { |
| 237 DartUtils::SetIntegerField( | 239 Socket::SetSocketIdNativeField(socket_obj, socket); |
| 238 socket_obj, DartUtils::kIdFieldName, socket); | |
| 239 Dart_SetReturnValue(args, Dart_True()); | 240 Dart_SetReturnValue(args, Dart_True()); |
| 240 } else { | 241 } else { |
| 241 if (socket == -5) { | 242 if (socket == -5) { |
| 242 OSError os_error(-1, "Invalid host", OSError::kUnknown); | 243 OSError os_error(-1, "Invalid host", OSError::kUnknown); |
| 243 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 244 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 244 } else { | 245 } else { |
| 245 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 246 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 246 } | 247 } |
| 247 } | 248 } |
| 248 } else { | 249 } else { |
| 249 OSError os_error(-1, "Invalid argument", OSError::kUnknown); | 250 OSError os_error(-1, "Invalid argument", OSError::kUnknown); |
| 250 Dart_Handle err = DartUtils::NewDartOSError(&os_error); | 251 Dart_Handle err = DartUtils::NewDartOSError(&os_error); |
| 251 if (Dart_IsError(err)) Dart_PropagateError(err); | 252 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 252 Dart_SetReturnValue(args, err); | 253 Dart_SetReturnValue(args, err); |
| 253 } | 254 } |
| 254 Dart_ExitScope(); | 255 Dart_ExitScope(); |
| 255 } | 256 } |
| 256 | 257 |
| 257 | 258 |
| 258 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { | 259 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { |
| 259 Dart_EnterScope(); | 260 Dart_EnterScope(); |
| 260 intptr_t socket = | 261 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 261 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), | 262 intptr_t socket = 0; |
| 262 DartUtils::kIdFieldName); | 263 Socket::GetSocketIdNativeField(socket_obj, &socket); |
| 263 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 1); | 264 Dart_Handle result_socket_obj = Dart_GetNativeArgument(args, 1); |
| 264 intptr_t new_socket = ServerSocket::Accept(socket); | 265 intptr_t new_socket = ServerSocket::Accept(socket); |
| 265 if (new_socket >= 0) { | 266 if (new_socket >= 0) { |
| 266 DartUtils::SetIntegerField( | 267 Socket::SetSocketIdNativeField(result_socket_obj, new_socket); |
| 267 socket_obj, DartUtils::kIdFieldName, new_socket); | |
| 268 Dart_SetReturnValue(args, Dart_True()); | 268 Dart_SetReturnValue(args, Dart_True()); |
| 269 } else if (new_socket == ServerSocket::kTemporaryFailure) { | 269 } else if (new_socket == ServerSocket::kTemporaryFailure) { |
| 270 Dart_SetReturnValue(args, Dart_False()); | 270 Dart_SetReturnValue(args, Dart_False()); |
| 271 } else { | 271 } else { |
| 272 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 272 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 273 } | 273 } |
| 274 Dart_ExitScope(); | 274 Dart_ExitScope(); |
| 275 } | 275 } |
| 276 | 276 |
| 277 | 277 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 346 Dart_EnterScope(); | 346 Dart_EnterScope(); |
| 347 Dart_SetReturnValue(args, Dart_Null()); | 347 Dart_SetReturnValue(args, Dart_Null()); |
| 348 Dart_Port service_port = Socket::GetServicePort(); | 348 Dart_Port service_port = Socket::GetServicePort(); |
| 349 if (service_port != ILLEGAL_PORT) { | 349 if (service_port != ILLEGAL_PORT) { |
| 350 // Return a send port for the service port. | 350 // Return a send port for the service port. |
| 351 Dart_Handle send_port = Dart_NewSendPort(service_port); | 351 Dart_Handle send_port = Dart_NewSendPort(service_port); |
| 352 Dart_SetReturnValue(args, send_port); | 352 Dart_SetReturnValue(args, send_port); |
| 353 } | 353 } |
| 354 Dart_ExitScope(); | 354 Dart_ExitScope(); |
| 355 } | 355 } |
| 356 | |
| 357 | |
| 358 Dart_Handle Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) { | |
| 359 return Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); | |
| 360 } | |
| 361 | |
| 362 | |
| 363 Dart_Handle Socket::GetSocketIdNativeField(Dart_Handle socket, intptr_t* id) { | |
| 364 return Dart_GetNativeInstanceField(socket, kSocketIdNativeField, id); | |
| 365 } | |
| OLD | NEW |