Commit a27e0ea7 authored by Seblu's avatar Seblu
Browse files

etablissement d'une connexion avec le server

Amelioration du systeme d'affichage
parent 37e56cf9
Loading
Loading
Loading
Loading
+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;
}
+3 −1
Original line number Diff line number Diff line
@@ -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_;
+68 −12
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@
*/
Screen::Screen() {
  // msg init
  msg_buffer_ = 0;
  msg_win_buffer_ = 0;

  // cmd init
  *cmd_buffer_ = 0;
@@ -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
@@ -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;
@@ -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 **********************************
@@ -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_);
      }
    }
  }
@@ -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);
@@ -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;
}
+9 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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();
@@ -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_;
@@ -50,5 +57,6 @@ private:
};

Screen &operator<< (Screen &, const string &s);
Screen &operator<< (Screen &, int i);

#endif