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

@patch
class _Directory {
  @patch
  static _current() native "Directory_Current";
  @patch
  static _setCurrent(path) native "Directory_SetCurrent";
  @patch
  static _createTemp(String path) native "Directory_CreateTemp";
  @patch
  static String _systemTemp() native "Directory_SystemTemp";
  @patch
  static _exists(String path) native "Directory_Exists";
  @patch
  static _create(String path) native "Directory_Create";
  @patch
  static _deleteNative(String path, bool recursive) native "Directory_Delete";
  @patch
  static _rename(String path, String newPath) native "Directory_Rename";
  @patch
  static void _fillWithDirectoryListing(
      List<FileSystemEntity> list,
      String path,
      bool recursive,
      bool followLinks) native "Directory_FillWithDirectoryListing";
}

@patch
class _AsyncDirectoryListerOps {
  @patch
  factory _AsyncDirectoryListerOps(int pointer) =>
      new _AsyncDirectoryListerOpsImpl(pointer);
}

class _AsyncDirectoryListerOpsImpl extends NativeFieldWrapperClass1
    implements _AsyncDirectoryListerOps {
  _AsyncDirectoryListerOpsImpl._();

  factory _AsyncDirectoryListerOpsImpl(int pointer) =>
      new _AsyncDirectoryListerOpsImpl._().._setPointer(pointer);

  void _setPointer(int pointer)
      native "Directory_SetAsyncDirectoryListerPointer";
  int getPointer() native "Directory_GetAsyncDirectoryListerPointer";
}
