// Copyright (c) 2013, 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.

import 'dart:_js_helper' show patch;

@patch
class _Directory {
  @patch
  static _current() {
    throw new UnsupportedError("Directory._current");
  }

  @patch
  static _setCurrent(path) {
    throw new UnsupportedError("Directory_SetCurrent");
  }

  @patch
  static _createTemp(String path) {
    throw new UnsupportedError("Directory._createTemp");
  }

  @patch
  static String _systemTemp() {
    throw new UnsupportedError("Directory._systemTemp");
  }

  @patch
  static _exists(String path) {
    throw new UnsupportedError("Directory._exists");
  }

  @patch
  static _create(String path) {
    throw new UnsupportedError("Directory._create");
  }

  @patch
  static _deleteNative(String path, bool recursive) {
    throw new UnsupportedError("Directory._deleteNative");
  }

  @patch
  static _rename(String path, String newPath) {
    throw new UnsupportedError("Directory._rename");
  }

  @patch
  static void _fillWithDirectoryListing(List<FileSystemEntity> list,
      String path, bool recursive, bool followLinks) {
    throw new UnsupportedError("Directory._fillWithDirectoryListing");
  }
}

@patch
class _AsyncDirectoryListerOps {
  @patch
  factory _AsyncDirectoryListerOps(int pointer) {
    throw new UnsupportedError("Directory._list");
  }
}

@patch
class _EventHandler {
  @patch
  static void _sendData(Object sender, SendPort sendPort, int data) {
    throw new UnsupportedError("EventHandler._sendData");
  }
}

@patch
class FileStat {
  @patch
  static _statSync(String path) {
    throw new UnsupportedError("FileStat.stat");
  }
}

@patch
class FileSystemEntity {
  @patch
  static _getType(String path, bool followLinks) {
    throw new UnsupportedError("FileSystemEntity._getType");
  }

  @patch
  static _identical(String path1, String path2) {
    throw new UnsupportedError("FileSystemEntity._identical");
  }

  @patch
  static _resolveSymbolicLinks(String path) {
    throw new UnsupportedError("FileSystemEntity._resolveSymbolicLinks");
  }
}

@patch
class _File {
  @patch
  static _exists(String path) {
    throw new UnsupportedError("File._exists");
  }

  @patch
  static _create(String path) {
    throw new UnsupportedError("File._create");
  }

  @patch
  static _createLink(String path, String target) {
    throw new UnsupportedError("File._createLink");
  }

  @patch
  static _linkTarget(String path) {
    throw new UnsupportedError("File._linkTarget");
  }

  @patch
  static _deleteNative(String path) {
    throw new UnsupportedError("File._deleteNative");
  }

  @patch
  static _deleteLinkNative(String path) {
    throw new UnsupportedError("File._deleteLinkNative");
  }

  @patch
  static _rename(String oldPath, String newPath) {
    throw new UnsupportedError("File._rename");
  }

  @patch
  static _renameLink(String oldPath, String newPath) {
    throw new UnsupportedError("File._renameLink");
  }

  @patch
  static _copy(String oldPath, String newPath) {
    throw new UnsupportedError("File._copy");
  }

  @patch
  static _lengthFromPath(String path) {
    throw new UnsupportedError("File._lengthFromPath");
  }

  @patch
  static _lastModified(String path) {
    throw new UnsupportedError("File._lastModified");
  }

  @patch
  static _lastAccessed(String path) {
    throw new UnsupportedError("File._lastAccessed");
  }

  @patch
  static _setLastModified(String path, int millis) {
    throw new UnsupportedError("File._setLastModified");
  }

  @patch
  static _setLastAccessed(String path, int millis) {
    throw new UnsupportedError("File._setLastAccessed");
  }

  @patch
  static _open(String path, int mode) {
    throw new UnsupportedError("File._open");
  }

  @patch
  static int _openStdio(int fd) {
    throw new UnsupportedError("File._openStdio");
  }
}

@patch
class _RandomAccessFileOps {
  @patch
  factory _RandomAccessFileOps(int pointer) {
    throw new UnsupportedError("RandomAccessFile");
  }
}

@patch
class _IOCrypto {
  @patch
  static Uint8List getRandomBytes(int count) {
    throw new UnsupportedError("_IOCrypto.getRandomBytes");
  }
}

@patch
class _Platform {
  @patch
  static int _numberOfProcessors() {
    throw new UnsupportedError("Platform._numberOfProcessors");
  }

  @patch
  static String _pathSeparator() {
    throw new UnsupportedError("Platform._pathSeparator");
  }

  @patch
  static String _operatingSystem() {
    throw new UnsupportedError("Platform._operatingSystem");
  }

  @patch
  static _localHostname() {
    throw new UnsupportedError("Platform._localHostname");
  }

  @patch
  static _executable() {
    throw new UnsupportedError("Platform._executable");
  }

  @patch
  static _resolvedExecutable() {
    throw new UnsupportedError("Platform._resolvedExecutable");
  }

  @patch
  static List<String> _executableArguments() {
    throw new UnsupportedError("Platform._executableArguments");
  }

  @patch
  static String _packageRoot() {
    throw new UnsupportedError("Platform._packageRoot");
  }

  @patch
  static String _packageConfig() {
    throw new UnsupportedError("Platform._packageConfig");
  }

  @patch
  static _environment() {
    throw new UnsupportedError("Platform._environment");
  }

  @patch
  static String _version() {
    throw new UnsupportedError("Platform._version");
  }

  @patch
  static _ansiSupported() {
    throw new UnsupportedError("Platform._ansiSupported");
  }
}

@patch
class _ProcessUtils {
  @patch
  static void _exit(int status) {
    throw new UnsupportedError("ProcessUtils._exit");
  }

  @patch
  static void _setExitCode(int status) {
    throw new UnsupportedError("ProcessUtils._setExitCode");
  }

  @patch
  static int _getExitCode() {
    throw new UnsupportedError("ProcessUtils._getExitCode");
  }

  @patch
  static void _sleep(int millis) {
    throw new UnsupportedError("ProcessUtils._sleep");
  }

  @patch
  static int _pid(Process process) {
    throw new UnsupportedError("ProcessUtils._pid");
  }

  @patch
  static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
    throw new UnsupportedError("ProcessUtils._watchSignal");
  }
}

@patch
class Process {
  @patch
  static Future<Process> start(String executable, List<String> arguments,
      {String workingDirectory,
      Map<String, String> environment,
      bool includeParentEnvironment: true,
      bool runInShell: false,
      ProcessStartMode mode: ProcessStartMode.NORMAL}) {
    throw new UnsupportedError("Process.start");
  }

  @patch
  static Future<ProcessResult> run(String executable, List<String> arguments,
      {String workingDirectory,
      Map<String, String> environment,
      bool includeParentEnvironment: true,
      bool runInShell: false,
      Encoding stdoutEncoding: SYSTEM_ENCODING,
      Encoding stderrEncoding: SYSTEM_ENCODING}) {
    throw new UnsupportedError("Process.run");
  }

  @patch
  static ProcessResult runSync(String executable, List<String> arguments,
      {String workingDirectory,
      Map<String, String> environment,
      bool includeParentEnvironment: true,
      bool runInShell: false,
      Encoding stdoutEncoding: SYSTEM_ENCODING,
      Encoding stderrEncoding: SYSTEM_ENCODING}) {
    throw new UnsupportedError("Process.runSync");
  }

  @patch
  static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]) {
    throw new UnsupportedError("Process.killPid");
  }
}

@patch
class InternetAddress {
  @patch
  static InternetAddress get LOOPBACK_IP_V4 {
    throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V4");
  }

  @patch
  static InternetAddress get LOOPBACK_IP_V6 {
    throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V6");
  }

  @patch
  static InternetAddress get ANY_IP_V4 {
    throw new UnsupportedError("InternetAddress.ANY_IP_V4");
  }

  @patch
  static InternetAddress get ANY_IP_V6 {
    throw new UnsupportedError("InternetAddress.ANY_IP_V6");
  }

  @patch
  factory InternetAddress(String address) {
    throw new UnsupportedError("InternetAddress");
  }
  @patch
  static Future<List<InternetAddress>> lookup(String host,
      {InternetAddressType type: InternetAddressType.ANY}) {
    throw new UnsupportedError("InternetAddress.lookup");
  }

  @patch
  static InternetAddress _cloneWithNewHost(
      InternetAddress address, String host) {
    throw new UnsupportedError("InternetAddress._cloneWithNewHost");
  }
}

@patch
class NetworkInterface {
  @patch
  static bool get listSupported {
    throw new UnsupportedError("NetworkInterface.listSupported");
  }

  @patch
  static Future<List<NetworkInterface>> list(
      {bool includeLoopback: false,
      bool includeLinkLocal: false,
      InternetAddressType type: InternetAddressType.ANY}) {
    throw new UnsupportedError("NetworkInterface.list");
  }
}

@patch
class RawServerSocket {
  @patch
  static Future<RawServerSocket> bind(address, int port,
      {int backlog: 0, bool v6Only: false, bool shared: false}) {
    throw new UnsupportedError("RawServerSocket.bind");
  }
}

@patch
class ServerSocket {
  @patch
  static Future<ServerSocket> bind(address, int port,
      {int backlog: 0, bool v6Only: false, bool shared: false}) {
    throw new UnsupportedError("ServerSocket.bind");
  }
}

@patch
class RawSocket {
  @patch
  static Future<RawSocket> connect(host, int port, {sourceAddress}) {
    throw new UnsupportedError("RawSocket constructor");
  }
}

@patch
class Socket {
  @patch
  static Future<Socket> connect(host, int port, {sourceAddress}) {
    throw new UnsupportedError("Socket constructor");
  }
}

@patch
class SecureSocket {
  @patch
  factory SecureSocket._(RawSecureSocket rawSocket) {
    throw new UnsupportedError("SecureSocket constructor");
  }
}

@patch
class SecurityContext {
  @patch
  factory SecurityContext() {
    throw new UnsupportedError("SecurityContext constructor");
  }

  @patch
  static SecurityContext get defaultContext {
    throw new UnsupportedError("default SecurityContext getter");
  }

  @patch
  static bool get alpnSupported {
    throw new UnsupportedError("SecurityContext alpnSupported getter");
  }
}

@patch
class X509Certificate {
  @patch
  factory X509Certificate._() {
    throw new UnsupportedError("X509Certificate constructor");
  }
}

@patch
class RawDatagramSocket {
  @patch
  static Future<RawDatagramSocket> bind(host, int port,
      {bool reuseAddress: true}) {
    throw new UnsupportedError("RawDatagramSocket.bind");
  }
}

@patch
class _SecureFilter {
  @patch
  factory _SecureFilter() {
    throw new UnsupportedError("_SecureFilter._SecureFilter");
  }
}

@patch
class _StdIOUtils {
  @patch
  static Stdin _getStdioInputStream() {
    throw new UnsupportedError("StdIOUtils._getStdioInputStream");
  }

  @patch
  static _getStdioOutputStream(int fd) {
    throw new UnsupportedError("StdIOUtils._getStdioOutputStream");
  }

  @patch
  static int _socketType(Socket socket) {
    throw new UnsupportedError("StdIOUtils._socketType");
  }

  @patch
  static _getStdioHandleType(int fd) {
    throw new UnsupportedError("StdIOUtils._getStdioHandleType");
  }
}

@patch
class _WindowsCodePageDecoder {
  @patch
  static String _decodeBytes(List<int> bytes) {
    throw new UnsupportedError("_WindowsCodePageDecoder._decodeBytes");
  }
}

@patch
class _WindowsCodePageEncoder {
  @patch
  static List<int> _encodeString(String string) {
    throw new UnsupportedError("_WindowsCodePageEncoder._encodeString");
  }
}

@patch
class _Filter {
  @patch
  static _Filter _newZLibDeflateFilter(bool gzip, int level, int windowBits,
      int memLevel, int strategy, List<int> dictionary, bool raw) {
    throw new UnsupportedError("_newZLibDeflateFilter");
  }

  @patch
  static _Filter _newZLibInflateFilter(
      int windowBits, List<int> dictionary, bool raw) {
    throw new UnsupportedError("_newZLibInflateFilter");
  }
}

@patch
class Stdin {
  @patch
  int readByteSync() {
    throw new UnsupportedError("Stdin.readByteSync");
  }

  @patch
  bool get echoMode {
    throw new UnsupportedError("Stdin.echoMode");
  }

  @patch
  void set echoMode(bool enabled) {
    throw new UnsupportedError("Stdin.echoMode");
  }

  @patch
  bool get lineMode {
    throw new UnsupportedError("Stdin.lineMode");
  }

  @patch
  void set lineMode(bool enabled) {
    throw new UnsupportedError("Stdin.lineMode");
  }
}

@patch
class Stdout {
  @patch
  bool _hasTerminal(int fd) {
    throw new UnsupportedError("Stdout.hasTerminal");
  }

  @patch
  int _terminalColumns(int fd) {
    throw new UnsupportedError("Stdout.terminalColumns");
  }

  @patch
  int _terminalLines(int fd) {
    throw new UnsupportedError("Stdout.terminalLines");
  }
}

@patch
class _FileSystemWatcher {
  @patch
  static Stream<FileSystemEvent> _watch(
      String path, int events, bool recursive) {
    throw new UnsupportedError("_FileSystemWatcher.watch");
  }

  @patch
  static bool get isSupported {
    throw new UnsupportedError("_FileSystemWatcher.isSupported");
  }
}

@patch
class _IOService {
  @patch
  static Future _dispatch(int request, List data) {
    throw new UnsupportedError("_IOService._dispatch");
  }
}
