Loading slc/trunk/src/connection.cc +59 −0 Original line number Diff line number Diff line #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <errno.h> #include "slc.hh" #include "options.hh" #include "connection.hh" #include "screen.hh" #include "error.hh" Connection::Connection() : socket_(0) {} void Connection::start() { // make connection connect_(O.server.c_str(), O.port); // send login info // send pass info return; } void Connection::stop() { return; } void Connection::connect_(const char *addr, int port) { struct sockaddr_in daddr; struct hostent *h; // Check no existing connexion assert(socket_ == 0); // retrieve remote host info h = gethostbyname(addr); if (h == 0) throw Error(ERR_NET, (string) "gethostbyname(" + addr + "): " + hstrerror(h_errno)); // create socket socket_ = socket(PF_INET, SOCK_STREAM, 0); if (socket_ == -1) throw Error(ERR_NET, (string) "socket: " + strerror(errno)); daddr.sin_family = AF_INET; daddr.sin_port = htons(port); daddr.sin_addr = *((struct in_addr *) h->h_addr); memset(daddr.sin_zero, '\0', sizeof daddr.sin_zero); S << "Connecting to " << h->h_name << " (" << inet_ntoa(*(struct in_addr*)h->h_addr) << ") on port " << port << "...\n"; // connect if (connect(socket_, (struct sockaddr *) &daddr, sizeof daddr) == -1) throw Error(ERR_NET, strerror(errno)); S << "Connected to " << h->h_name << " (" << inet_ntoa(*(struct in_addr*)h->h_addr) << ") on port " << port << "...\n"; } void Connection::disconnect_() { if (socket_ == 0) return; socket_ = 0; } slc/trunk/src/connection.hh +3 −1 Original line number Diff line number Diff line Loading @@ -3,13 +3,15 @@ class Connection { public: Connection(); void start(); void stop(); void send(const string &data); void send(const char* buf, size_t len); string recvln(); private: void connect_(); void connect_(const char *addr, int port); void disconnect_(); private: int socket_; Loading slc/trunk/src/screen.cc +68 −12 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ */ Screen::Screen() { // msg init msg_buffer_ = 0; msg_win_buffer_ = 0; // cmd init *cmd_buffer_ = 0; Loading Loading @@ -68,7 +68,7 @@ void Screen::create_windows() { if (msg_) delwin(msg_); msg_ = newwin(LINES - 3, COLS, 0, 0); msg_buffer_ = (char *) realloc(msg_buffer_, COLS -2 + 1); msg_win_buffer_ = (char *) realloc(msg_win_buffer_, COLS -2 + 1); msg_draw(); // cmd window Loading Loading @@ -189,10 +189,12 @@ void Screen::eventsloop() { break; // --------------------------- KEY RETURN -------------------------------- case KEY_RETURN: // check non empty buffer if (*cmd_buffer_ == 0) break; // save in history H.add(cmd_buffer_); // print to msg msg_print(cmd_buffer_); msg_println(cmd_buffer_); // purge buffer *cmd_buffer_ = 0; cmd_buf_off_ = 0; Loading Loading @@ -231,15 +233,57 @@ void Screen::eventsloop() { } /*! ** Print a message in msg window ** Print a message in msg window (on one line) ** ** @param s message to print */ void Screen::msg_println(const string &s) { msg_buffer_ << s; msg_print("\n"); } /*! ** Print a number in msg window (on one line) ** ** @param s message to print */ void Screen::msg_println(int i) { msg_buffer_ << i; msg_print("\n"); } /*! ** Print @param s into msg window (no refresh) */ void Screen::msg_print(const string &s) { msg_add(s); size_t offset = 0; size_t last = 0; msg_buffer_ << s; const string &buf = msg_buffer_.str(); // add line by line while ((offset = buf.find('\n', last)) != string::npos) { msg_add(buf.substr(last, offset - last)); last = offset + 1; } // update screen if (last > 0) { msg_buffer_.str(""); msg_draw(); cmd_draw(); } } /*! ** Print @param i into msg window (no refresh) */ void Screen::msg_print(int i) { msg_buffer_ << i; } /* ********************************************************************************* ************************************** PRIVATE ********************************** Loading Loading @@ -308,10 +352,10 @@ void Screen::msg_draw() { // compute string offset for this line const size_t print_offset = (i == 1) ? 0 : COLS - 2 + ((i - 2) * (COLS - 4)); // copy line into a buffer strncpy(msg_buffer_, (*line).c_str() + print_offset, COLS - ((i == 1) ? 2 : 4)); msg_buffer_[COLS - ((i == 1) ? 2 : 4)] = 0; strncpy(msg_win_buffer_, (*line).c_str() + print_offset, COLS - ((i == 1) ? 2 : 4)); msg_win_buffer_[COLS - ((i == 1) ? 2 : 4)] = 0; // print line into screen mvwprintw(msg_, free_lines--, 1, (i == 1) ? "%s" : "> %s", msg_buffer_); mvwprintw(msg_, free_lines--, 1, (i == 1) ? "%s" : "> %s", msg_win_buffer_); } } } Loading Loading @@ -374,9 +418,8 @@ bool Screen::del_char(char *string, ssize_t offset, size_t buf_len) { ** Add msg @param s to msg list */ void Screen::msg_add(const string &s) { assert(strchr(s.c_str(), '\n') == 0); if (s.empty()) return; assert(s.find('\n') == string::npos); if (msg_table_.size() >= O.history_size) msg_table_.resize(O.history_size); msg_table_.push_front(s); Loading Loading @@ -467,3 +510,16 @@ Screen &operator<< (Screen &scr, const string &s) { scr.msg_print(s); return scr; } /*! ** This is a sugar to print msg on msg window ** ** @param scr A Screen ** @param i string to print ** ** @return @param scr */ Screen &operator<< (Screen &scr, int i) { scr.msg_print(i); return scr; } slc/trunk/src/screen.hh +9 −1 Original line number Diff line number Diff line Loading @@ -2,11 +2,14 @@ # define SCREEN_HH_ # include <ncurses.h> # include <sstream> # include <deque> #define KEY_RETURN 10 #define KEY_EOF 4 typedef std::stringstream sstream; class Screen { public: typedef std::deque<string> t_lines; Loading @@ -17,7 +20,10 @@ public: void login(); void dialog(); void eventsloop(); void msg_println(const string &s); void msg_println(int i); void msg_print(const string &s); void msg_print(int i); private: void create_windows(); Loading @@ -38,7 +44,8 @@ private: // msg window WINDOW *msg_; t_lines msg_table_; char *msg_buffer_; sstream msg_buffer_; char *msg_win_buffer_; // cmd window WINDOW *cmd_; Loading @@ -50,5 +57,6 @@ private: }; Screen &operator<< (Screen &, const string &s); Screen &operator<< (Screen &, int i); #endif Loading
slc/trunk/src/connection.cc +59 −0 Original line number Diff line number Diff line #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <errno.h> #include "slc.hh" #include "options.hh" #include "connection.hh" #include "screen.hh" #include "error.hh" Connection::Connection() : socket_(0) {} void Connection::start() { // make connection connect_(O.server.c_str(), O.port); // send login info // send pass info return; } void Connection::stop() { return; } void Connection::connect_(const char *addr, int port) { struct sockaddr_in daddr; struct hostent *h; // Check no existing connexion assert(socket_ == 0); // retrieve remote host info h = gethostbyname(addr); if (h == 0) throw Error(ERR_NET, (string) "gethostbyname(" + addr + "): " + hstrerror(h_errno)); // create socket socket_ = socket(PF_INET, SOCK_STREAM, 0); if (socket_ == -1) throw Error(ERR_NET, (string) "socket: " + strerror(errno)); daddr.sin_family = AF_INET; daddr.sin_port = htons(port); daddr.sin_addr = *((struct in_addr *) h->h_addr); memset(daddr.sin_zero, '\0', sizeof daddr.sin_zero); S << "Connecting to " << h->h_name << " (" << inet_ntoa(*(struct in_addr*)h->h_addr) << ") on port " << port << "...\n"; // connect if (connect(socket_, (struct sockaddr *) &daddr, sizeof daddr) == -1) throw Error(ERR_NET, strerror(errno)); S << "Connected to " << h->h_name << " (" << inet_ntoa(*(struct in_addr*)h->h_addr) << ") on port " << port << "...\n"; } void Connection::disconnect_() { if (socket_ == 0) return; socket_ = 0; }
slc/trunk/src/connection.hh +3 −1 Original line number Diff line number Diff line Loading @@ -3,13 +3,15 @@ class Connection { public: Connection(); void start(); void stop(); void send(const string &data); void send(const char* buf, size_t len); string recvln(); private: void connect_(); void connect_(const char *addr, int port); void disconnect_(); private: int socket_; Loading
slc/trunk/src/screen.cc +68 −12 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ */ Screen::Screen() { // msg init msg_buffer_ = 0; msg_win_buffer_ = 0; // cmd init *cmd_buffer_ = 0; Loading Loading @@ -68,7 +68,7 @@ void Screen::create_windows() { if (msg_) delwin(msg_); msg_ = newwin(LINES - 3, COLS, 0, 0); msg_buffer_ = (char *) realloc(msg_buffer_, COLS -2 + 1); msg_win_buffer_ = (char *) realloc(msg_win_buffer_, COLS -2 + 1); msg_draw(); // cmd window Loading Loading @@ -189,10 +189,12 @@ void Screen::eventsloop() { break; // --------------------------- KEY RETURN -------------------------------- case KEY_RETURN: // check non empty buffer if (*cmd_buffer_ == 0) break; // save in history H.add(cmd_buffer_); // print to msg msg_print(cmd_buffer_); msg_println(cmd_buffer_); // purge buffer *cmd_buffer_ = 0; cmd_buf_off_ = 0; Loading Loading @@ -231,15 +233,57 @@ void Screen::eventsloop() { } /*! ** Print a message in msg window ** Print a message in msg window (on one line) ** ** @param s message to print */ void Screen::msg_println(const string &s) { msg_buffer_ << s; msg_print("\n"); } /*! ** Print a number in msg window (on one line) ** ** @param s message to print */ void Screen::msg_println(int i) { msg_buffer_ << i; msg_print("\n"); } /*! ** Print @param s into msg window (no refresh) */ void Screen::msg_print(const string &s) { msg_add(s); size_t offset = 0; size_t last = 0; msg_buffer_ << s; const string &buf = msg_buffer_.str(); // add line by line while ((offset = buf.find('\n', last)) != string::npos) { msg_add(buf.substr(last, offset - last)); last = offset + 1; } // update screen if (last > 0) { msg_buffer_.str(""); msg_draw(); cmd_draw(); } } /*! ** Print @param i into msg window (no refresh) */ void Screen::msg_print(int i) { msg_buffer_ << i; } /* ********************************************************************************* ************************************** PRIVATE ********************************** Loading Loading @@ -308,10 +352,10 @@ void Screen::msg_draw() { // compute string offset for this line const size_t print_offset = (i == 1) ? 0 : COLS - 2 + ((i - 2) * (COLS - 4)); // copy line into a buffer strncpy(msg_buffer_, (*line).c_str() + print_offset, COLS - ((i == 1) ? 2 : 4)); msg_buffer_[COLS - ((i == 1) ? 2 : 4)] = 0; strncpy(msg_win_buffer_, (*line).c_str() + print_offset, COLS - ((i == 1) ? 2 : 4)); msg_win_buffer_[COLS - ((i == 1) ? 2 : 4)] = 0; // print line into screen mvwprintw(msg_, free_lines--, 1, (i == 1) ? "%s" : "> %s", msg_buffer_); mvwprintw(msg_, free_lines--, 1, (i == 1) ? "%s" : "> %s", msg_win_buffer_); } } } Loading Loading @@ -374,9 +418,8 @@ bool Screen::del_char(char *string, ssize_t offset, size_t buf_len) { ** Add msg @param s to msg list */ void Screen::msg_add(const string &s) { assert(strchr(s.c_str(), '\n') == 0); if (s.empty()) return; assert(s.find('\n') == string::npos); if (msg_table_.size() >= O.history_size) msg_table_.resize(O.history_size); msg_table_.push_front(s); Loading Loading @@ -467,3 +510,16 @@ Screen &operator<< (Screen &scr, const string &s) { scr.msg_print(s); return scr; } /*! ** This is a sugar to print msg on msg window ** ** @param scr A Screen ** @param i string to print ** ** @return @param scr */ Screen &operator<< (Screen &scr, int i) { scr.msg_print(i); return scr; }
slc/trunk/src/screen.hh +9 −1 Original line number Diff line number Diff line Loading @@ -2,11 +2,14 @@ # define SCREEN_HH_ # include <ncurses.h> # include <sstream> # include <deque> #define KEY_RETURN 10 #define KEY_EOF 4 typedef std::stringstream sstream; class Screen { public: typedef std::deque<string> t_lines; Loading @@ -17,7 +20,10 @@ public: void login(); void dialog(); void eventsloop(); void msg_println(const string &s); void msg_println(int i); void msg_print(const string &s); void msg_print(int i); private: void create_windows(); Loading @@ -38,7 +44,8 @@ private: // msg window WINDOW *msg_; t_lines msg_table_; char *msg_buffer_; sstream msg_buffer_; char *msg_win_buffer_; // cmd window WINDOW *cmd_; Loading @@ -50,5 +57,6 @@ private: }; Screen &operator<< (Screen &, const string &s); Screen &operator<< (Screen &, int i); #endif