int uv_read_start(uv_stream_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { int err; if (handle->flags & UV_HANDLE_READING) { return UV_EALREADY; } if (!(handle->flags & UV_HANDLE_READABLE)) { return UV_ENOTCONN; } err = ERROR_INVALID_PARAMETER; switch (handle->type) { case UV_TCP: err = uv_tcp_read_start((uv_tcp_t*)handle, alloc_cb, read_cb); break; case UV_NAMED_PIPE: err = uv_pipe_read_start((uv_pipe_t*)handle, alloc_cb, read_cb); break; case UV_TTY: err = uv_tty_read_start((uv_tty_t*) handle, alloc_cb, read_cb); break; default: assert(0); } return uv_translate_sys_error(err); }
int uv_tty_set_mode(uv_tty_t* tty, int mode) { DWORD flags = 0; unsigned char was_reading; uv_alloc_cb alloc_cb; uv_read_cb read_cb; if (!(tty->flags & UV_HANDLE_TTY_READABLE)) { uv__set_artificial_error(tty->loop, UV_EINVAL); return -1; } if (!!mode == !!(tty->flags & UV_HANDLE_TTY_RAW)) { return 0; } if (tty->original_console_mode & ENABLE_QUICK_EDIT_MODE) { flags = ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS; } if (mode) { /* Raw input */ flags |= ENABLE_WINDOW_INPUT; } else { /* Line-buffered mode. */ flags |= ENABLE_ECHO_INPUT | ENABLE_INSERT_MODE | ENABLE_LINE_INPUT | ENABLE_EXTENDED_FLAGS | ENABLE_PROCESSED_INPUT; } if (!SetConsoleMode(tty->handle, flags)) { uv__set_sys_error(tty->loop, GetLastError()); return -1; } /* If currently reading, stop, and restart reading. */ if (tty->flags & UV_HANDLE_READING) { was_reading = 1; alloc_cb = tty->alloc_cb; read_cb = tty->read_cb; if (was_reading && uv_tty_read_stop(tty) != 0) { return -1; } } else { was_reading = 0; } /* Update flag. */ tty->flags &= ~UV_HANDLE_TTY_RAW; tty->flags |= mode ? UV_HANDLE_TTY_RAW : 0; /* If we just stopped reading, restart. */ if (was_reading && uv_tty_read_start(tty, alloc_cb, read_cb) != 0) { return -1; } return 0; }
int uv_read_start(uv_stream_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { if (handle->flags & UV_HANDLE_READING) { uv__set_sys_error(handle->loop, UV_EALREADY); return -1; } if (!(handle->flags & UV_HANDLE_READABLE)) { uv__set_artificial_error(handle->loop, UV_ENOTCONN); return -1; } switch (handle->type) { case UV_TCP: return uv_tcp_read_start((uv_tcp_t*)handle, alloc_cb, read_cb); case UV_NAMED_PIPE: return uv_pipe_read_start((uv_pipe_t*)handle, alloc_cb, read_cb); case UV_TTY: return uv_tty_read_start((uv_tty_t*) handle, alloc_cb, read_cb); default: assert(0); return -1; } }