public int read()

in nailgun-server/src/main/java/com/facebook/nailgun/NGWin32NamedPipeSocket.java [114:146]


    public int read(byte[] b, int off, int len) throws IOException {
      Memory readBuffer = new Memory(len);

      WinBase.OVERLAPPED olap = new WinBase.OVERLAPPED();
      olap.hEvent = readerWaitable;
      olap.write();

      boolean immediate = API.ReadFile(handle, readBuffer, len, null, olap.getPointer());
      if (!immediate) {
        int lastError = API.GetLastError();
        if (lastError != WinError.ERROR_IO_PENDING) {
          throw new IOException("ReadFile() failed: " + lastError);
        }
      }

      IntByReference r = new IntByReference();
      if (!API.GetOverlappedResult(handle, olap.getPointer(), r, true)) {
        int lastError = API.GetLastError();
        throw new IOException("GetOverlappedResult() failed for read operation: " + lastError);
      }
      int actualLen = r.getValue();
      if (requireStrictLength && (actualLen != len)) {
        throw new IOException(
            "ReadFile() read less bytes than requested: expected "
                + len
                + " bytes, but read "
                + actualLen
                + " bytes");
      }
      byte[] byteArray = readBuffer.getByteArray(0, actualLen);
      System.arraycopy(byteArray, 0, b, off, actualLen);
      return actualLen;
    }