// 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
