2 #include <node_buffer.h>
4 #include <handle_wrap.h>
5 #include <stream_wrap.h>
14 using v8::HandleScope;
15 using v8::FunctionTemplate;
25 assert(!args.Holder().IsEmpty()); \
26 assert(args.Holder()->InternalFieldCount() > 0); \
28 static_cast<TTYWrap*>(args.Holder()->GetPointerFromInternalField(0)); \
31 err.code = UV_EBADF; \
33 return scope.Close(Integer::New(-1)); \
37 class TTYWrap : StreamWrap {
39 static void Initialize(Handle<Object> target) {
40 StreamWrap::Initialize(target);
44 Local<FunctionTemplate> t = FunctionTemplate::New(New);
45 t->SetClassName(String::NewSymbol("TTY"));
47 t->InstanceTemplate()->SetInternalFieldCount(1);
49 NODE_SET_PROTOTYPE_METHOD(t, "close", HandleWrap::Close);
50 NODE_SET_PROTOTYPE_METHOD(t, "unref", HandleWrap::Unref);
52 NODE_SET_PROTOTYPE_METHOD(t, "readStart", StreamWrap::ReadStart);
53 NODE_SET_PROTOTYPE_METHOD(t, "readStop", StreamWrap::ReadStop);
54 NODE_SET_PROTOTYPE_METHOD(t, "write", StreamWrap::Write);
56 NODE_SET_PROTOTYPE_METHOD(t, "getWindowSize", TTYWrap::GetWindowSize);
57 NODE_SET_PROTOTYPE_METHOD(t, "setRawMode", SetRawMode);
59 NODE_SET_METHOD(target, "isTTY", IsTTY);
60 NODE_SET_METHOD(target, "guessHandleType", GuessHandleType);
62 target->Set(String::NewSymbol("TTY"), t->GetFunction());
66 static Handle<Value> GuessHandleType(const Arguments& args) {
68 int fd = args[0]->Int32Value();
71 uv_handle_type t = uv_guess_handle(fd);
75 return scope.Close(String::New("TTY"));
78 return scope.Close(String::New("PIPE"));
81 return scope.Close(String::New("FILE"));
85 return v8::Undefined();
89 static Handle<Value> IsTTY(const Arguments& args) {
91 int fd = args[0]->Int32Value();
93 return uv_guess_handle(fd) == UV_TTY ? v8::True() : v8::False();
96 static Handle<Value> GetWindowSize(const Arguments& args) {
102 int r = uv_tty_get_winsize(&wrap->handle_, &width, &height);
105 SetErrno(uv_last_error(uv_default_loop()));
106 return v8::Undefined();
109 Local<v8::Array> a = v8::Array::New(2);
110 a->Set(0, Integer::New(width));
111 a->Set(1, Integer::New(height));
113 return scope.Close(a);
116 static Handle<Value> SetRawMode(const Arguments& args) {
121 int r = uv_tty_set_mode(&wrap->handle_, args[0]->IsTrue());
124 SetErrno(uv_last_error(uv_default_loop()));
127 return scope.Close(Integer::New(r));
130 static Handle<Value> New(const Arguments& args) {
133 // This constructor should not be exposed to public javascript.
134 // Therefore we assert that we are not trying to call this as a
136 assert(args.IsConstructCall());
138 int fd = args[0]->Int32Value();
141 TTYWrap* wrap = new TTYWrap(args.This(), fd, args[1]->IsTrue());
143 wrap->UpdateWriteQueueSize();
145 return scope.Close(args.This());
148 TTYWrap(Handle<Object> object, int fd, bool readable)
149 : StreamWrap(object, (uv_stream_t*)&handle_) {
150 uv_tty_init(uv_default_loop(), &handle_, fd, readable);
158 NODE_MODULE(node_tty_wrap, node::TTYWrap::Initialize);