7 #include <msp/core/except.h>
21 Console::Console(unsigned n)
24 throw InvalidParameterValue("Invalid parameter for Console::Console");
26 mode = (n==0 ? M_READ : M_WRITE);
31 case 0: handle = GetStdHandle(STD_INPUT_HANDLE); break;
32 case 1: handle = GetStdHandle(STD_OUTPUT_HANDLE); break;
33 case 2: handle = GetStdHandle(STD_ERROR_HANDLE); break;
39 tcgetattr(handle, &orig_attr);
50 tcsetattr(handle, TCSADRAIN, &orig_attr);
54 void Console::set_block(bool b)
57 // XXX Dunno how to do this in win32
60 int flags = fcntl(0, F_GETFL);
61 flags = (flags&~O_NONBLOCK) | (b?0:O_NONBLOCK);
62 fcntl(0, F_SETFL, flags);
66 void Console::set_local_echo(bool e)
69 throw InvalidState("Local echo can only be set on input console");
73 GetConsoleMode(handle, &m);
74 SetConsoleMode(handle, (m&~ENABLE_ECHO_INPUT) | (e?ENABLE_ECHO_INPUT:0));
78 t.c_lflag = (t.c_lflag&~ECHO) | (e?ECHO:0);
79 tcsetattr(0, TCSADRAIN, &t);
83 void Console::set_line_buffer(bool l)
86 throw InvalidState("Line buffering can only be set on input console");
90 GetConsoleMode(handle, &m);
91 SetConsoleMode(handle, (m&~ENABLE_LINE_INPUT) | (l?ENABLE_LINE_INPUT:0));
93 // XXX ICANON does more than just set line buffering, may need a bit more thought
96 t.c_lflag = (t.c_lflag&~ICANON) | (l?ICANON:0);
97 tcsetattr(0, TCSADRAIN, &t);
101 void Console::get_size(unsigned &rows, unsigned &cols)
104 throw InvalidState("Size can only be queried from an output console");
107 // XXX Figure out how to do this
112 ioctl(handle, TIOCGWINSZ, &wsz);
118 unsigned Console::do_write(const char *buf, unsigned len)
121 throw InvalidState("Console is not writable");
125 if(!WriteFile(handle, buf, len, &ret, 0))
126 throw SystemError("Writing to console failed", GetLastError());
128 int ret = ::write(handle, buf, len);
130 throw SystemError("Writing to console failed", errno);
136 unsigned Console::do_read(char *buf, unsigned len)
139 throw InvalidState("Console is not readable");
143 if(!ReadFile(handle, buf, len, &ret, 0))
144 throw SystemError("Reading from console failed", GetLastError());
146 int ret = ::read(handle, buf, len);
152 throw SystemError("Reading from console failed", errno);
161 Handle Console::get_event_handle()
166 Console &Console::instance(unsigned n)
168 static Console in(0);
169 static Console out(1);
170 static Console err(2);
179 throw InvalidParameterValue("Unknown Console instance requested");
182 Console &cin = Console::instance(0);
183 Console &cout = Console::instance(1);
184 Console &cerr = Console::instance(2);