// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #include "include/bin/dart_io_api.h" #include "bin/crypto.h" #include "bin/directory.h" #include "bin/eventhandler.h" #include "bin/io_natives.h" #if defined(DART_IO_SECURE_SOCKET_DISABLED) #include "bin/io_service_no_ssl.h" #else // defined(DART_IO_SECURE_SOCKET_DISABLED) #include "bin/io_service.h" #endif // defined(DART_IO_SECURE_SOCKET_DISABLED) #include "bin/platform.h" #include "bin/process.h" #if !defined(DART_IO_SECURE_SOCKET_DISABLED) #include "bin/secure_socket_filter.h" #endif #include "bin/thread.h" #include "bin/utils.h" namespace dart { namespace bin { void BootstrapDartIo() { // Bootstrap 'dart:io' event handler. TimerUtils::InitOnce(); Process::Init(); #if !defined(DART_IO_SECURE_SOCKET_DISABLED) SSLFilter::Init(); #endif EventHandler::Start(); } void CleanupDartIo() { EventHandler::Stop(); Process::TerminateExitCodeHandler(); #if !defined(DART_IO_SECURE_SOCKET_DISABLED) SSLFilter::Cleanup(); #endif Process::Cleanup(); IOService::Cleanup(); } void SetSystemTempDirectory(const char* system_temp) { Directory::SetSystemTemp(system_temp); } void SetExecutableName(const char* executable_name) { Platform::SetExecutableName(executable_name); } void SetExecutableArguments(int script_index, char** argv) { Platform::SetExecutableArguments(script_index, argv); } void GetIOEmbedderInformation(Dart_EmbedderInformation* info) { ASSERT(info != nullptr); ASSERT(info->version == DART_EMBEDDER_INFORMATION_CURRENT_VERSION); Process::GetRSSInformation(&(info->max_rss), &(info->current_rss)); } void* OpenFile(const char* name, bool write) { return DartUtils::OpenFile(name, write); } void ReadFile(uint8_t** data, intptr_t* file_len, void* stream) { DartUtils::ReadFile(data, file_len, stream); } void WriteFile(const void* buffer, intptr_t num_bytes, void* stream) { DartUtils::WriteFile(buffer, num_bytes, stream); } void CloseFile(void* stream) { DartUtils::CloseFile(stream); } bool GetEntropy(uint8_t* buffer, intptr_t length) { return Crypto::GetRandomBytes(length, buffer); } Dart_NativeFunction LookupIONative(Dart_Handle name, int argument_count, bool* auto_setup_scope) { return IONativeLookup(name, argument_count, auto_setup_scope); } void* LookupIOFfiNative(const char* name, uintptr_t argument_count) { return IOFfiNativeLookup(name, argument_count); } const uint8_t* LookupIONativeSymbol(Dart_NativeFunction nf) { return IONativeSymbol(nf); } Dart_Handle SetupDartIoLibrary(const DartIoSettings& settings) { RETURN_IF_ERROR(Builtin::TrySetNativeResolver(Builtin::kIOLibrary)); // Configure dart:_http _httpConnectionHook is provided. if (settings.http_connection_hook != nullptr) { ASSIGN_OR_RETURN(Dart_Handle http_lib, Builtin::LoadAndCheckLibrary(Builtin::kHttpLibrary)); RETURN_IF_ERROR(Dart_SetField(http_lib, DartUtils::NewString("_httpConnectionHook"), settings.http_connection_hook)); } Dart_Handle io_lib = Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary); if (settings.namespace_root != nullptr) { ASSIGN_OR_RETURN( Dart_Handle namespc_type, DartUtils::GetDartType(DartUtils::kIOLibURL, "_Namespace")); Dart_Handle args[] = {settings.namespace_root}; RETURN_IF_ERROR(args[0]); RETURN_IF_ERROR(Dart_Invoke( namespc_type, DartUtils::NewString("_setupNamespace"), 1, args)); } if (settings.disable_exit) { ASSIGN_OR_RETURN( Dart_Handle embedder_config_type, DartUtils::GetDartType(DartUtils::kIOLibURL, "_EmbedderConfig")); RETURN_IF_ERROR(embedder_config_type); RETURN_IF_ERROR(Dart_SetField( embedder_config_type, DartUtils::NewString("_mayExit"), Dart_False())); } ASSIGN_OR_RETURN(Dart_Handle platform_type, DartUtils::GetDartType(DartUtils::kIOLibURL, "_Platform")); if (settings.script_uri != nullptr) { RETURN_IF_ERROR(Dart_SetField(platform_type, DartUtils::NewString("_nativeScript"), DartUtils::NewString(settings.script_uri))); } if (settings.locale_name_callback != nullptr) { RETURN_IF_ERROR(Dart_SetField(platform_type, DartUtils::NewString("_localeClosure"), settings.locale_name_callback)); } if (settings.enable_network_profiling) { #if !defined(PRODUCT) auto dart_type = DartUtils::GetDartType(DartUtils::kIOLibURL, "_NetworkProfiling"); ASSIGN_OR_RETURN(Dart_Handle network_profiling_type, dart_type); RETURN_IF_ERROR(Dart_Invoke( network_profiling_type, DartUtils::NewString("_registerServiceExtension"), 0, nullptr)); #endif // !defined(PRODUCT) } return Dart_Invoke(io_lib, DartUtils::NewString("_setupHooks"), 0, nullptr); } } // namespace bin } // namespace dart