Main MRPT website > C++ reference
MRPT logo

CMessage.h

Go to the documentation of this file.
00001 /* +---------------------------------------------------------------------------+
00002    |          The Mobile Robot Programming Toolkit (MRPT) C++ library          |
00003    |                                                                           |
00004    |                   http://mrpt.sourceforge.net/                            |
00005    |                                                                           |
00006    |   Copyright (C) 2005-2011  University of Malaga                           |
00007    |                                                                           |
00008    |    This software was written by the Machine Perception and Intelligent    |
00009    |      Robotics Lab, University of Malaga (Spain).                          |
00010    |    Contact: Jose-Luis Blanco  <jlblanco@ctima.uma.es>                     |
00011    |                                                                           |
00012    |  This file is part of the MRPT project.                                   |
00013    |                                                                           |
00014    |     MRPT is free software: you can redistribute it and/or modify          |
00015    |     it under the terms of the GNU General Public License as published by  |
00016    |     the Free Software Foundation, either version 3 of the License, or     |
00017    |     (at your option) any later version.                                   |
00018    |                                                                           |
00019    |   MRPT is distributed in the hope that it will be useful,                 |
00020    |     but WITHOUT ANY WARRANTY; without even the implied warranty of        |
00021    |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
00022    |     GNU General Public License for more details.                          |
00023    |                                                                           |
00024    |     You should have received a copy of the GNU General Public License     |
00025    |     along with MRPT.  If not, see <http://www.gnu.org/licenses/>.         |
00026    |                                                                           |
00027    +---------------------------------------------------------------------------+ */
00028 #ifndef  CMessage_H
00029 #define  CMessage_H
00030 
00031 #include <mrpt/utils/utils_defs.h>
00032 #include <mrpt/utils/CSerializable.h>
00033 
00034 /*---------------------------------------------------------------
00035         Class
00036   ---------------------------------------------------------------*/
00037 namespace mrpt
00038 {
00039         namespace utils
00040         {
00041                 /** A class that contain generic messages, that can be sent and received from a "CClientTCPSocket" object.
00042                   *  A message consists of a "header" (or type), and a "body" (or content).
00043                   *  Apart from arbitrary data, specific methods are provided for easing the serialization of MRPT's "CSerializable" objects.
00044                   *  This class is also used for passing data to hardware interfaces (see )
00045                   * \sa CClientTCPSocket
00046                   */
00047                 class BASE_IMPEXP CMessage
00048                 {
00049                 public:
00050                         /** An identifier of the message type.
00051                           */
00052                         uint32_t                                                type;
00053 
00054                         /** The contents of the message (memory is automatically handled by the std::vector object)
00055                           */
00056                         std::vector<unsigned char>      content;
00057 
00058                         /** A method for serializing a MRPT's object into the content.
00059                           *  Any modification to data in "content" after this will corrupt the object serialization.
00060                           *  Member "type" is unmodified in this method.
00061                           */
00062                         void  serializeObject( CSerializable *obj );
00063 
00064                         /** A method that parse the data in the message into an existing object.
00065                           *  Note that the class of the object must be known and must match the one of the serialized object.
00066                           * \except std::exception On corrupt data, unknown serialized objects, unknown serialized object version, non-matching classes,...
00067                           */
00068                         void  deserializeIntoExistingObject( CSerializable *obj );
00069 
00070                         /** A method that parse the data in the message into a new object of (a priori) unknown class.
00071                           *  The pointer will contain on return a copy of the reconstructed object. Deleting this object when
00072                           *   no longer required is the responsability of the user. Note that previous contents of the pointer
00073                           *   will be ignored (it should be NULL).
00074                           * \except std::exception On corrupt data, unknown serialized objects, unknown serialized object version,...
00075                           */
00076                         void  deserializeIntoNewObject( CSerializablePtr &obj );
00077 
00078                         /** Sets the contents of the message from a string
00079                           * \sa getContentAsString
00080                           */
00081                         void  setContentFromString( const std::string &str );
00082 
00083                         /** Gets the contents of the message as a string
00084                           * \sa setContentFromString
00085                           */
00086                         void  getContentAsString( std::string &str );
00087 
00088                         /** Sets the contents of the message from a "void*" (the pointer itself becomes the message) - This is intended for inter-thread comms only.
00089                           * \sa getContentAsPointer
00090                           */
00091                         void  setContentFromPointer( void * ptr );
00092 
00093                         /** Gets the contents of the message as a "void*" (the pointer itself is the message) - This is intended for inter-thread comms only.
00094                           * \sa setContentFromPointer
00095                           */
00096                         void * getContentAsPointer() const;
00097 
00098                         /** Sets the contents of the message from an arbitary structure - This is intended for inter-thread comms only, the message will be not cross-platform.
00099                           * \sa getContentAsStruct
00100                           */
00101                         template <class T>
00102                         void  setContentFromStruct( const T &data )
00103                         {
00104                                 content.resize( sizeof(data) );
00105                                 T * ptr = reinterpret_cast< T* >( &content[0] );
00106                                 *ptr = data;
00107                         }
00108 
00109                         /** Gets the contents of the message as an arbitary structure - This is intended for inter-thread comms only, the message will be not cross-platform.
00110                           * \sa setContentFromStruct
00111                           */
00112                         template <class T>
00113                         void getContentAsStruct( T &data ) const
00114                         {
00115                                 MRPT_START
00116                                 ASSERT_(content.size() == sizeof(data) );
00117                                 data = * reinterpret_cast< T* >( &content[0] );
00118                                 MRPT_END
00119                         }
00120 
00121 
00122                 }; // End of class
00123 
00124         } // End of namespace
00125 } // End of namespace
00126 
00127 #endif



Page generated by Doxygen 1.7.3 for MRPT 0.9.4 SVN: at Sat Mar 26 06:16:28 UTC 2011