From c1f05dce8df57d06ac04d7a7490216fad787f054 Mon Sep 17 00:00:00 2001 From: haller Date: Wed, 19 Apr 2006 05:05:30 +0000 Subject: * Correction du commentaire avec le \0 qui fait chier Doxygen et Kermit * Avancement du SocketDataBuffer --- i/marvin/src/socket/socket_databuffer.cc | 58 ++++++++++++++++++++++++++++++++ i/marvin/src/socket/socket_databuffer.hh | 7 ++++ i/simulotron/src/gs/gs_message.hh | 3 +- 3 files changed, 67 insertions(+), 1 deletion(-) (limited to 'i') diff --git a/i/marvin/src/socket/socket_databuffer.cc b/i/marvin/src/socket/socket_databuffer.cc index 8267ddd..241b8f3 100644 --- a/i/marvin/src/socket/socket_databuffer.cc +++ b/i/marvin/src/socket/socket_databuffer.cc @@ -23,3 +23,61 @@ // }}} #include "socket_databuffer.h" +// Constructeur +SocketDataBuffer::SocketDataBuffer(void) + :SocketClient(), isReceiving_(false), dbSize_(0) // TODO Ça sert à quelque chose où il le fait implicitement? +{ +} + +// Constructeur accept +SocketDataBuffer::SocketDataBuffer(SocketServer & socketServer) + :SocketClient(socketServer), isReceiving_(false), dbSize_(0) +{ +} + +// Récupère un DataBuffer +bool +SocketDataBuffer::read(DataBuffer & dbReaded, bool bloquant) +{ + bool dbRecu; + if (!isReceiving_) + { + // On récupère les données du socket + dbRecu = read(buffer_, bloquant); + if(!dbRecu) + return false; + // On extrait la taille de la DB si possible + if(buffer_.size() < 4) + { + isReceiving_ = true; + return false; + } + else + { + dbSize_ &= buffer_[0] << 24; + dbSize_ &= buffer_[1] << 16; + dbSize_ &= buffer_[2] << 8; + dbSize_ &= buffer_[3]; + } + TODO + + +} + +// Ecrit un DB dans le socket +void +SocketDataBuffer::write(const DataBuffer & db) +{ + // On met une en-tête de 4 octects déterminant la taille de la DB + unsigned dbSize = db.size(); + write(std::string(static_cast(&dbSize)), sizeof(unsigned)); + // On récupère les données de la dataBuffer + uint8_t * donnees = new uint8_t[dbSize]; + db.read(donnees, dbSize); + if (db.size() != 0) + throw std::runtime_exception("ERREUR DE CODAGE dans SocketDataBuffer" + "::Write"); + // On envoie le tout et on nettoie l'allocation + write(std::string(static_cast(donnees), dbSize)); + delete [] donnees; +} diff --git a/i/marvin/src/socket/socket_databuffer.hh b/i/marvin/src/socket/socket_databuffer.hh index 01f239b..e28c8cd 100644 --- a/i/marvin/src/socket/socket_databuffer.hh +++ b/i/marvin/src/socket/socket_databuffer.hh @@ -28,6 +28,13 @@ /// TCP/IP class SocketDataBuffer : public SocketClient { + private: + /// En cours de reception d'un DB + bool isReceiving_; + /// Taille de la DB à recevoir + unsigned dbSize_; + /// Tampon provisoire + std::string buffer_; public: /// Constructeur SocketDataBuffer(void); diff --git a/i/simulotron/src/gs/gs_message.hh b/i/simulotron/src/gs/gs_message.hh index b970571..be0bc80 100644 --- a/i/simulotron/src/gs/gs_message.hh +++ b/i/simulotron/src/gs/gs_message.hh @@ -44,7 +44,8 @@ class GSMessage const std::string & getGS (void) const; /// Récupération de données de la gs void readGS (void * data, size_t size); - /// Récupère des données sous la forme d'une string terminé par un \0 + /// Récupère des données sous la forme d'une string terminé par un + /// charactère de fin de chaine void getString (std::string & str); /// Récupère des données sous forme d'une string de taille fixe void getString (std::string & str, size_t size); -- cgit v1.2.3