// Copyright (c) 2012, 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 "platform/globals.h"
#if defined(TARGET_OS_ANDROID)

#include <errno.h>  // NOLINT
#include <netdb.h>  // NOLINT
#include <sys/time.h>  // NOLINT

#include "bin/utils.h"
#include "platform/assert.h"


namespace dart {
namespace bin {

OSError::OSError() : sub_system_(kSystem), code_(0), message_(NULL) {
  set_sub_system(kSystem);
  set_code(errno);
  const int kBufferSize = 1024;
  char error_message[kBufferSize];
  strerror_r(errno, error_message, kBufferSize);
  SetMessage(error_message);
}


void OSError::SetCodeAndMessage(SubSystem sub_system, int code) {
  set_sub_system(sub_system);
  set_code(code);
  if (sub_system == kSystem) {
    const int kBufferSize = 1024;
    char error_message[kBufferSize];
    strerror_r(code, error_message, kBufferSize);
    SetMessage(error_message);
  } else if (sub_system == kGetAddressInfo) {
    SetMessage(gai_strerror(code));
  } else {
    UNREACHABLE();
  }
}

const char* StringUtils::ConsoleStringToUtf8(const char* str) {
  return str;
}

const char* StringUtils::Utf8ToConsoleString(const char* utf8) {
  return utf8;
}

char* StringUtils::ConsoleStringToUtf8(char* str) {
  return str;
}

char* StringUtils::Utf8ToConsoleString(char* utf8) {
  return utf8;
}

wchar_t* StringUtils::Utf8ToWide(char* utf8) {
  UNIMPLEMENTED();
  return NULL;
}

const wchar_t* StringUtils::Utf8ToWide(const char* utf8) {
  UNIMPLEMENTED();
  return NULL;
}

char* StringUtils::WideToUtf8(wchar_t* str) {
  UNIMPLEMENTED();
  return NULL;
}

const char* StringUtils::WideToUtf8(const wchar_t* str) {
  UNIMPLEMENTED();
  return NULL;
}

wchar_t** ShellUtils::GetUnicodeArgv(int* argc) {
  return NULL;
}

void ShellUtils::FreeUnicodeArgv(wchar_t** argv) {
}

int64_t TimerUtils::GetCurrentTimeMilliseconds() {
  return GetCurrentTimeMicros() / 1000;
}

int64_t TimerUtils::GetCurrentTimeMicros() {
  struct timeval tv;
  if (gettimeofday(&tv, NULL) < 0) {
    UNREACHABLE();
    return 0;
  }
  return (static_cast<int64_t>(tv.tv_sec) * 1000000) + tv.tv_usec;
}

void TimerUtils::Sleep(int64_t millis) {
  usleep(millis * 1000);
}

}  // namespace bin
}  // namespace dart

#endif  // defined(TARGET_OS_ANDROID)
