// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

part of core;

class _MojoHandleNatives {
  static int register(MojoEventStream eventStream) native "MojoHandle_Register";
  static int close(int handle) native "MojoHandle_Close";
  static List wait(
      int handle, int signals, int deadline) native "MojoHandle_Wait";
  static List waitMany(List<int> handles, List<int> signals,
      int deadline) native "MojoHandle_WaitMany";
}

class MojoHandle {
  static const int INVALID = 0;
  static const int DEADLINE_INDEFINITE = -1;

  int h;

  MojoHandle(this.h);

  MojoResult close() {
    int result = _MojoHandleNatives.close(h);
    h = INVALID;
    return new MojoResult(result);
  }

  MojoWaitResult wait(int signals, int deadline) {
    List result = _MojoHandleNatives.wait(h, signals, deadline);
    return new MojoWaitResult(new MojoResult(result[0]), result[1]);
  }

  bool _ready(MojoHandleSignals signal) {
    MojoWaitResult mwr = wait(signal.value, 0);
    switch (mwr.result) {
      case MojoResult.OK:
        return true;
      case MojoResult.DEADLINE_EXCEEDED:
      case MojoResult.CANCELLED:
      case MojoResult.INVALID_ARGUMENT:
      case MojoResult.FAILED_PRECONDITION:
        return false;
      default:
        // Should be unreachable.
        throw "Unexpected result $res for wait on $h";
    }
  }

  bool get readyRead => _ready(MojoHandleSignals.PEER_CLOSED_READABLE);
  bool get readyWrite => _ready(MojoHandleSignals.WRITABLE);

  static MojoWaitManyResult waitMany(
      List<int> handles, List<int> signals, int deadline) {
    List result = _MojoHandleNatives.waitMany(handles, signals, deadline);
    return new MojoWaitManyResult(
        new MojoResult(result[0]), result[1], result[2]);
  }

  static MojoResult register(MojoEventStream eventStream) {
    return new MojoResult(_MojoHandleNatives.register(eventStream));
  }

  bool get isValid => (h != INVALID);

  String toString() {
    if (!isValid) {
      return "MojoHandle(INVALID)";
    }
    var mwr = wait(MojoHandleSignals.kAll, 0);
    return "MojoHandle(h: $h, status: $mwr)";
  }

  bool operator ==(MojoHandle other) {
    return h == other.h;
  }
}
