summaryrefslogtreecommitdiff
path: root/i/marvin/src/socket/socket_databuffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'i/marvin/src/socket/socket_databuffer.cc')
-rw-r--r--i/marvin/src/socket/socket_databuffer.cc70
1 files changed, 42 insertions, 28 deletions
diff --git a/i/marvin/src/socket/socket_databuffer.cc b/i/marvin/src/socket/socket_databuffer.cc
index 241b8f3..1b4258c 100644
--- a/i/marvin/src/socket/socket_databuffer.cc
+++ b/i/marvin/src/socket/socket_databuffer.cc
@@ -21,63 +21,77 @@
// Web: http://perso.efrei.fr/~haller/
// Email: <nicolas@boiteameuh.org>
// }}}
-#include "socket_databuffer.h"
+#include "socket_databuffer.hh"
+
+#include <stdexcept>
+#include <iostream>
// Constructeur
SocketDataBuffer::SocketDataBuffer(void)
- :SocketClient(), isReceiving_(false), dbSize_(0) // TODO Ça sert à quelque chose où il le fait implicitement?
+ :SocketClient(), dbSize_(0) // TODO Ça sert à quelque chose où il le fait implicitement?
{
}
// Constructeur accept
SocketDataBuffer::SocketDataBuffer(SocketServer & socketServer)
- :SocketClient(socketServer), isReceiving_(false), dbSize_(0)
+ :SocketClient(socketServer), dbSize_(0)
{
}
// Récupère un DataBuffer
+// false en valeur de retour avec bloquant = true est un motif de licenciement
bool
SocketDataBuffer::read(DataBuffer & dbReaded, bool bloquant)
{
- bool dbRecu;
- if (!isReceiving_)
+ std::string strReceive;
+ do
{
- // 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
+ SocketClient::read(strReceive, bloquant);
+ strBuffer_.append(strReceive);
+ // On regarde si on a assez de donnée pour regarder si on a une en-tête
+ if(strBuffer_.size() > sizeof(unsigned))
{
- dbSize_ &= buffer_[0] << 24;
- dbSize_ &= buffer_[1] << 16;
- dbSize_ &= buffer_[2] << 8;
- dbSize_ &= buffer_[3];
+ dbSize_ = 0;
+ dbSize_ = static_cast<unsigned>(strBuffer_[0]) << 24
+ | static_cast<unsigned>(strBuffer_[1]) << 16
+ | static_cast<unsigned>(strBuffer_[2]) << 8
+ | static_cast<unsigned>(strBuffer_[3]);
+ // On regarde si on a suffisemment de données pour constituer le DB
+ if(dbSize_ <= strBuffer_.size() - 4)
+ {
+ dbBuffer_.write(reinterpret_cast<const uint8_t *>(strBuffer_.c_str() + 4)
+ , dbSize_);
+ dbReaded.swap(dbBuffer_);
+ dbBuffer_.clear();
+ strBuffer_.erase(0, dbSize_ + 4);
+ return true;
+ }
}
- TODO
-
-
+ }while(bloquant);
+ return false;
}
// Ecrit un DB dans le socket
void
-SocketDataBuffer::write(const DataBuffer & db)
+SocketDataBuffer::write(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<const char *>(&dbSize)), sizeof(unsigned));
+ char entete[4];
+ entete[0] = static_cast<char> (dbSize >> 24);
+ entete[1] = static_cast<char> (dbSize >> 16);
+ entete[2] = static_cast<char> (dbSize >> 8);
+ entete[3] = static_cast<char> (dbSize);
+
+ SocketClient::write(std::string(entete,4));
// 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");
+ throw std::runtime_error("ERREUR DE CODAGE dans SocketDataBuffer"
+ "::Write");
// On envoie le tout et on nettoie l'allocation
- write(std::string(static_cast<const char *>(donnees), dbSize));
+ SocketClient::write(std::string(reinterpret_cast<const char *>(donnees),
+ dbSize));
delete [] donnees;
}