| Index: runtime/bin/file_support.cc
|
| diff --git a/runtime/bin/file_support.cc b/runtime/bin/file_support.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0ad5edcce25ede6116e30df73f7389cd7dda2c05
|
| --- /dev/null
|
| +++ b/runtime/bin/file_support.cc
|
| @@ -0,0 +1,109 @@
|
| +// Copyright (c) 2016, 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 "bin/file.h"
|
| +
|
| +#include "bin/builtin.h"
|
| +#include "bin/dartutils.h"
|
| +#include "bin/embedded_dart_io.h"
|
| +#include "bin/io_buffer.h"
|
| +#include "bin/utils.h"
|
| +
|
| +#include "include/dart_api.h"
|
| +#include "include/dart_tools_api.h"
|
| +
|
| +namespace dart {
|
| +namespace bin {
|
| +
|
| +// Are we capturing output from stdout for the VM service?
|
| +static bool capture_stdout = false;
|
| +
|
| +// Are we capturing output from stderr for the VM service?
|
| +static bool capture_stderr = false;
|
| +
|
| +void SetCaptureStdout(bool value) {
|
| + capture_stdout = value;
|
| +}
|
| +
|
| +
|
| +void SetCaptureStderr(bool value) {
|
| + capture_stderr = value;
|
| +}
|
| +
|
| +
|
| +bool ShouldCaptureStdout() {
|
| + return capture_stdout;
|
| +}
|
| +
|
| +
|
| +bool ShouldCaptureStderr() {
|
| + return capture_stderr;
|
| +}
|
| +
|
| +
|
| +bool File::ReadFully(void* buffer, int64_t num_bytes) {
|
| + int64_t remaining = num_bytes;
|
| + char* current_buffer = reinterpret_cast<char*>(buffer);
|
| + while (remaining > 0) {
|
| + int64_t bytes_read = Read(current_buffer, remaining);
|
| + if (bytes_read <= 0) {
|
| + return false;
|
| + }
|
| + remaining -= bytes_read; // Reduce the number of remaining bytes.
|
| + current_buffer += bytes_read; // Move the buffer forward.
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +
|
| +bool File::WriteFully(const void* buffer, int64_t num_bytes) {
|
| + int64_t remaining = num_bytes;
|
| + const char* current_buffer = reinterpret_cast<const char*>(buffer);
|
| + while (remaining > 0) {
|
| + int64_t bytes_written = Write(current_buffer, remaining);
|
| + if (bytes_written < 0) {
|
| + return false;
|
| + }
|
| + remaining -= bytes_written; // Reduce the number of remaining bytes.
|
| + current_buffer += bytes_written; // Move the buffer forward.
|
| + }
|
| + if (capture_stdout || capture_stderr) {
|
| + intptr_t fd = GetFD();
|
| + if ((fd == STDOUT_FILENO) && capture_stdout) {
|
| + Dart_ServiceSendDataEvent("Stdout", "WriteEvent",
|
| + reinterpret_cast<const uint8_t*>(buffer),
|
| + num_bytes);
|
| + } else if ((fd == STDERR_FILENO) && capture_stderr) {
|
| + Dart_ServiceSendDataEvent("Stderr", "WriteEvent",
|
| + reinterpret_cast<const uint8_t*>(buffer),
|
| + num_bytes);
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +
|
| +File::FileOpenMode File::DartModeToFileMode(DartFileOpenMode mode) {
|
| + ASSERT((mode == File::kDartRead) ||
|
| + (mode == File::kDartWrite) ||
|
| + (mode == File::kDartAppend) ||
|
| + (mode == File::kDartWriteOnly) ||
|
| + (mode == File::kDartWriteOnlyAppend));
|
| + if (mode == File::kDartWrite) {
|
| + return File::kWriteTruncate;
|
| + }
|
| + if (mode == File::kDartAppend) {
|
| + return File::kWrite;
|
| + }
|
| + if (mode == File::kDartWriteOnly) {
|
| + return File::kWriteOnlyTruncate;
|
| + }
|
| + if (mode == File::kDartWriteOnlyAppend) {
|
| + return File::kWriteOnly;
|
| + }
|
| + return File::kRead;
|
| +}
|
| +
|
| +} // namespace bin
|
| +} // namespace dart
|
|
|