From 0e6511695ac0b3ffa124d965e80229ff6a3c5294 Mon Sep 17 00:00:00 2001 From: dufourj Date: Sun, 1 May 2005 17:43:58 +0000 Subject: Ajout de la classe de SocketReader qui permet de lire des données depuis un client connecté au serveur --- 2005/i/robert/src/Makefile.defs | 4 +- 2005/i/robert/src/data/data_buffer.hh | 3 +- 2005/i/robert/src/image/Makefile.defs | 4 +- 2005/i/robert/src/image/socket_reader.cc | 68 ++++++++++++++++++++++++++++++++ 2005/i/robert/src/image/socket_reader.hh | 51 ++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 2005/i/robert/src/image/socket_reader.cc create mode 100644 2005/i/robert/src/image/socket_reader.hh (limited to '2005/i/robert/src') diff --git a/2005/i/robert/src/Makefile.defs b/2005/i/robert/src/Makefile.defs index 75023f4..3b14d48 100644 --- a/2005/i/robert/src/Makefile.defs +++ b/2005/i/robert/src/Makefile.defs @@ -23,8 +23,8 @@ CXXFLAGS += -fmessage-length=0 # cause de la génération des règles. SUBDIRS = utils utils/meta \ log serial timer \ - config data image scheduler \ - proto asserv video4linux socket \ + config data socket image scheduler \ + proto asserv video4linux \ ovision/see ovision/ui \ motor es ai geometry diff --git a/2005/i/robert/src/data/data_buffer.hh b/2005/i/robert/src/data/data_buffer.hh index 5e6b55d..3d2201d 100644 --- a/2005/i/robert/src/data/data_buffer.hh +++ b/2005/i/robert/src/data/data_buffer.hh @@ -37,7 +37,8 @@ class DataBuffer : public DataInput, public DataOutput /// Type de données possible du buffer. enum dataType_e { NoType, - Image + Image, + AskImage }; private: /// Buffer de données. diff --git a/2005/i/robert/src/image/Makefile.defs b/2005/i/robert/src/image/Makefile.defs index b0e7f74..bd5ad79 100644 --- a/2005/i/robert/src/image/Makefile.defs +++ b/2005/i/robert/src/image/Makefile.defs @@ -1,7 +1,7 @@ PROGRAMS += test_image -image_OBJECTS = image.o raw_reader.o +image_OBJECTS = image.o raw_reader.o socket_reader.o -test_image_OBJECTS = test_image.o $(image_OBJECTS) +test_image_OBJECTS = test_image.o $(image_OBJECTS) $(data_OBJECTS) $(net_OBJECTS) test_image: $(test_image_OBJECTS) diff --git a/2005/i/robert/src/image/socket_reader.cc b/2005/i/robert/src/image/socket_reader.cc new file mode 100644 index 0000000..ea52a19 --- /dev/null +++ b/2005/i/robert/src/image/socket_reader.cc @@ -0,0 +1,68 @@ +// socket_reader.cc +// robert - programme du robot 2005. {{{ +// +// Copyright (C) 2005 Dufour Jérémy +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Contact : +// Web: %WEB% +// Email: +// }}} +#include "socket_reader.hh" + +#include "socket/server_socket.hh" +#include "socket/socket_text.hh" +#include "socket/address.hh" +#include "data/data_buffer.hh" + +#include + +/// Constructeur, les paramètres doivent être précisés car non présents +/// dans le binaire. +SocketReader::SocketReader (DataInput &data, int width, int height, + Image::PixelFormat pixelFormat, int port) + : data_ (data), width_ (width), height_ (height), + pixelFormat_ (pixelFormat) +{ + ServerSocket ss (port); + Address a; + socketText_ = new SocketText (ss, a); + socketText_->nonblock (); +} + +/// Récupère les paramètres de l'image. +void +SocketReader::getParam (int &width, int &height, + Image::PixelFormat &pixelFormat) +{ + width = width_; + height = height_; + pixelFormat = pixelFormat_; +} + +/// Lit une image, lance une exception en cas d'erreur. +void +SocketReader::read (uint8_t *buf, unsigned size) +{ + DataBuffer db; + while (!socketText_->recv ()); + *socketText_ >> db; + if (db.type () != DataBuffer::Image) + throw std::runtime_error ("Echec de la transmission"); + if (db.size () != size) + throw std::runtime_error ("Erreur de taille de message demandé"); + db.read (buf, size); +} diff --git a/2005/i/robert/src/image/socket_reader.hh b/2005/i/robert/src/image/socket_reader.hh new file mode 100644 index 0000000..44ba337 --- /dev/null +++ b/2005/i/robert/src/image/socket_reader.hh @@ -0,0 +1,51 @@ +#ifndef socket_reader_hh +#define socket_reader_hh +// socket_reader.hh +// robert - programme du robot 2005. {{{ +// +// Copyright (C) 2005 Dufour Jérémy +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Contact : +// Web: %WEB% +// Email: +// }}} + +#include "image_reader.hh" + +class SocketText; +class DataInput; + +/// Classe qui fonctionne comme RawReader mais sur un socket. +class SocketReader : public ImageReader +{ + DataInput &data_; + int width_, height_; + Image::PixelFormat pixelFormat_; + SocketText *socketText_; + public: + /// Constructeur, les paramètres doivent être précisés car non présents + /// dans le binaire. + SocketReader (DataInput &data, int width, int height, + Image::PixelFormat pixelFormat, int port); + /// Récupère les paramètres de l'image. + void getParam (int &width, int &height, + Image::PixelFormat &pixelFormat); + /// Lit une image, lance une exception en cas d'erreur. + void read (uint8_t *buf, unsigned size); +}; + +#endif // socket_reader_hh -- cgit v1.2.3