| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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/io_buffer.h" | 5 #include "bin/io_buffer.h" |
| 6 #include "bin/socket.h" | 6 #include "bin/socket.h" |
| 7 #include "bin/dartutils.h" | 7 #include "bin/dartutils.h" |
| 8 #include "bin/thread.h" | 8 #include "bin/thread.h" |
| 9 #include "bin/utils.h" | 9 #include "bin/utils.h" |
| 10 | 10 |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 if (Dart_IsError(err)) Dart_PropagateError(err); | 346 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 347 Dart_SetReturnValue(args, Dart_True()); | 347 Dart_SetReturnValue(args, Dart_True()); |
| 348 } else if (new_socket == ServerSocket::kTemporaryFailure) { | 348 } else if (new_socket == ServerSocket::kTemporaryFailure) { |
| 349 Dart_SetReturnValue(args, Dart_False()); | 349 Dart_SetReturnValue(args, Dart_False()); |
| 350 } else { | 350 } else { |
| 351 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 351 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 352 } | 352 } |
| 353 } | 353 } |
| 354 | 354 |
| 355 | 355 |
| 356 static CObject* LookupRequest(const CObjectArray& request) { | 356 CObject* Socket::LookupRequest(const CObjectArray& request) { |
| 357 if (request.Length() == 3 && | 357 if (request.Length() == 2 && |
| 358 request[1]->IsString() && | 358 request[0]->IsString() && |
| 359 request[2]->IsInt32()) { | 359 request[1]->IsInt32()) { |
| 360 CObjectString host(request[1]); | 360 CObjectString host(request[0]); |
| 361 CObjectInt32 type(request[2]); | 361 CObjectInt32 type(request[1]); |
| 362 CObject* result = NULL; | 362 CObject* result = NULL; |
| 363 OSError* os_error = NULL; | 363 OSError* os_error = NULL; |
| 364 AddressList<SocketAddress>* addresses = | 364 AddressList<SocketAddress>* addresses = |
| 365 Socket::LookupAddress(host.CString(), type.Value(), &os_error); | 365 Socket::LookupAddress(host.CString(), type.Value(), &os_error); |
| 366 if (addresses != NULL) { | 366 if (addresses != NULL) { |
| 367 CObjectArray* array = new CObjectArray( | 367 CObjectArray* array = new CObjectArray( |
| 368 CObject::NewArray(addresses->count() + 1)); | 368 CObject::NewArray(addresses->count() + 1)); |
| 369 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); | 369 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); |
| 370 for (intptr_t i = 0; i < addresses->count(); i++) { | 370 for (intptr_t i = 0; i < addresses->count(); i++) { |
| 371 SocketAddress* addr = addresses->GetAt(i); | 371 SocketAddress* addr = addresses->GetAt(i); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 394 } else { | 394 } else { |
| 395 result = CObject::NewOSError(os_error); | 395 result = CObject::NewOSError(os_error); |
| 396 delete os_error; | 396 delete os_error; |
| 397 } | 397 } |
| 398 return result; | 398 return result; |
| 399 } | 399 } |
| 400 return CObject::IllegalArgumentError(); | 400 return CObject::IllegalArgumentError(); |
| 401 } | 401 } |
| 402 | 402 |
| 403 | 403 |
| 404 static CObject* ReverseLookupRequest(const CObjectArray& request) { | 404 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) { |
| 405 if (request.Length() == 2 && | 405 if (request.Length() == 1 && |
| 406 request[1]->IsTypedData()) { | 406 request[0]->IsTypedData()) { |
| 407 CObjectUint8Array addr_object(request[1]); | 407 CObjectUint8Array addr_object(request[0]); |
| 408 RawAddr addr; | 408 RawAddr addr; |
| 409 memmove(reinterpret_cast<void *>(&addr), | 409 memmove(reinterpret_cast<void *>(&addr), |
| 410 addr_object.Buffer(), | 410 addr_object.Buffer(), |
| 411 addr_object.Length()); | 411 addr_object.Length()); |
| 412 OSError* os_error = NULL; | 412 OSError* os_error = NULL; |
| 413 const intptr_t kMaxHostLength = 1025; | 413 const intptr_t kMaxHostLength = 1025; |
| 414 char host[kMaxHostLength]; | 414 char host[kMaxHostLength]; |
| 415 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) { | 415 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) { |
| 416 return new CObjectString(CObject::NewString(host)); | 416 return new CObjectString(CObject::NewString(host)); |
| 417 } else { | 417 } else { |
| 418 CObject* result = CObject::NewOSError(os_error); | 418 CObject* result = CObject::NewOSError(os_error); |
| 419 delete os_error; | 419 delete os_error; |
| 420 return result; | 420 return result; |
| 421 } | 421 } |
| 422 } | 422 } |
| 423 return CObject::IllegalArgumentError(); | 423 return CObject::IllegalArgumentError(); |
| 424 } | 424 } |
| 425 | 425 |
| 426 | 426 |
| 427 | 427 |
| 428 static CObject* ListInterfacesRequest(const CObjectArray& request) { | 428 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) { |
| 429 if (request.Length() == 2 && | 429 if (request.Length() == 1 && |
| 430 request[1]->IsInt32()) { | 430 request[0]->IsInt32()) { |
| 431 CObjectInt32 type(request[1]); | 431 CObjectInt32 type(request[0]); |
| 432 CObject* result = NULL; | 432 CObject* result = NULL; |
| 433 OSError* os_error = NULL; | 433 OSError* os_error = NULL; |
| 434 AddressList<InterfaceSocketAddress>* addresses = Socket::ListInterfaces( | 434 AddressList<InterfaceSocketAddress>* addresses = Socket::ListInterfaces( |
| 435 type.Value(), &os_error); | 435 type.Value(), &os_error); |
| 436 if (addresses != NULL) { | 436 if (addresses != NULL) { |
| 437 CObjectArray* array = new CObjectArray( | 437 CObjectArray* array = new CObjectArray( |
| 438 CObject::NewArray(addresses->count() + 1)); | 438 CObject::NewArray(addresses->count() + 1)); |
| 439 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); | 439 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); |
| 440 for (intptr_t i = 0; i < addresses->count(); i++) { | 440 for (intptr_t i = 0; i < addresses->count(); i++) { |
| 441 InterfaceSocketAddress* interface = addresses->GetAt(i); | 441 InterfaceSocketAddress* interface = addresses->GetAt(i); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 469 } else { | 469 } else { |
| 470 result = CObject::NewOSError(os_error); | 470 result = CObject::NewOSError(os_error); |
| 471 delete os_error; | 471 delete os_error; |
| 472 } | 472 } |
| 473 return result; | 473 return result; |
| 474 } | 474 } |
| 475 return CObject::IllegalArgumentError(); | 475 return CObject::IllegalArgumentError(); |
| 476 } | 476 } |
| 477 | 477 |
| 478 | 478 |
| 479 void SocketService(Dart_Port dest_port_id, | |
| 480 Dart_Port reply_port_id, | |
| 481 Dart_CObject* message) { | |
| 482 CObject* response = CObject::IllegalArgumentError(); | |
| 483 CObjectArray request(message); | |
| 484 if (message->type == Dart_CObject_kArray) { | |
| 485 if (request.Length() > 1 && request[0]->IsInt32()) { | |
| 486 CObjectInt32 request_type(request[0]); | |
| 487 switch (request_type.Value()) { | |
| 488 case Socket::kLookupRequest: | |
| 489 response = LookupRequest(request); | |
| 490 break; | |
| 491 case Socket::kListInterfacesRequest: | |
| 492 response = ListInterfacesRequest(request); | |
| 493 break; | |
| 494 case Socket::kReverseLookupRequest: | |
| 495 response = ReverseLookupRequest(request); | |
| 496 break; | |
| 497 default: | |
| 498 UNREACHABLE(); | |
| 499 } | |
| 500 } | |
| 501 } | |
| 502 | |
| 503 Dart_PostCObject(reply_port_id, response->AsApiCObject()); | |
| 504 } | |
| 505 | |
| 506 | |
| 507 Dart_Port Socket::GetServicePort() { | |
| 508 MutexLocker lock(mutex_); | |
| 509 if (service_ports_size_ == 0) { | |
| 510 ASSERT(service_ports_ == NULL); | |
| 511 service_ports_size_ = 16; | |
| 512 service_ports_ = new Dart_Port[service_ports_size_]; | |
| 513 service_ports_index_ = 0; | |
| 514 for (int i = 0; i < service_ports_size_; i++) { | |
| 515 service_ports_[i] = ILLEGAL_PORT; | |
| 516 } | |
| 517 } | |
| 518 | |
| 519 Dart_Port result = service_ports_[service_ports_index_]; | |
| 520 if (result == ILLEGAL_PORT) { | |
| 521 result = Dart_NewNativePort("SocketService", | |
| 522 SocketService, | |
| 523 true); | |
| 524 ASSERT(result != ILLEGAL_PORT); | |
| 525 service_ports_[service_ports_index_] = result; | |
| 526 } | |
| 527 service_ports_index_ = (service_ports_index_ + 1) % service_ports_size_; | |
| 528 return result; | |
| 529 } | |
| 530 | |
| 531 | |
| 532 void FUNCTION_NAME(Socket_NewServicePort)(Dart_NativeArguments args) { | |
| 533 Dart_SetReturnValue(args, Dart_Null()); | |
| 534 Dart_Port service_port = Socket::GetServicePort(); | |
| 535 if (service_port != ILLEGAL_PORT) { | |
| 536 // Return a send port for the service port. | |
| 537 Dart_Handle send_port = Dart_NewSendPort(service_port); | |
| 538 Dart_SetReturnValue(args, send_port); | |
| 539 } | |
| 540 } | |
| 541 | |
| 542 | |
| 543 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { | 479 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { |
| 544 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); | 480 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| 545 intptr_t socket = 0; | 481 intptr_t socket = 0; |
| 546 bool result = false; | 482 bool result = false; |
| 547 Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket); | 483 Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket); |
| 548 if (Dart_IsError(err)) Dart_PropagateError(err); | 484 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 549 Dart_Handle option_obj = Dart_GetNativeArgument(args, 1); | 485 Dart_Handle option_obj = Dart_GetNativeArgument(args, 1); |
| 550 int64_t option; | 486 int64_t option; |
| 551 err = Dart_IntegerToInt64(option_obj, &option); | 487 err = Dart_IntegerToInt64(option_obj, &option); |
| 552 if (Dart_IsError(err)) Dart_PropagateError(err); | 488 if (Dart_IsError(err)) Dart_PropagateError(err); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 569 return Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); | 505 return Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); |
| 570 } | 506 } |
| 571 | 507 |
| 572 | 508 |
| 573 Dart_Handle Socket::GetSocketIdNativeField(Dart_Handle socket, intptr_t* id) { | 509 Dart_Handle Socket::GetSocketIdNativeField(Dart_Handle socket, intptr_t* id) { |
| 574 return Dart_GetNativeInstanceField(socket, kSocketIdNativeField, id); | 510 return Dart_GetNativeInstanceField(socket, kSocketIdNativeField, id); |
| 575 } | 511 } |
| 576 | 512 |
| 577 } // namespace bin | 513 } // namespace bin |
| 578 } // namespace dart | 514 } // namespace dart |
| OLD | NEW |