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://www.mrpt.org/                                |
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                  * \ingroup mrpt_base_grp
00047                   */
00048                 class BASE_IMPEXP CMessage
00049                 {
00050                 public:
00051                         /** An identifier of the message type.
00052                           */
00053                         uint32_t                                                type;
00054 
00055                         /** The contents of the message (memory is automatically handled by the std::vector object)
00056                           */
00057                         std::vector<unsigned char>      content;
00058 
00059                         /** A method for serializing a MRPT's object into the content.
00060                           *  Any modification to data in "content" after this will corrupt the object serialization.
00061                           *  Member "type" is unmodified in this method.
00062                           */
00063                         void  serializeObject( CSerializable *obj );
00064 
00065                         /** A method that parse the data in the message into an existing object.
00066                           *  Note that the class of the object must be known and must match the one of the serialized object.
00067                           * \except std::exception On corrupt data, unknown serialized objects, unknown serialized object version, non-matching classes,...
00068                           */
00069                         void  deserializeIntoExistingObject( CSerializable *obj );
00070 
00071                         /** A method that parse the data in the message into a new object of (a priori) unknown class.
00072                           *  The pointer will contain on return a copy of the reconstructed object. Deleting this object when
00073                           *   no longer required is the responsability of the user. Note that previous contents of the pointer
00074                           *   will be ignored (it should be NULL).
00075                           * \except std::exception On corrupt data, unknown serialized objects, unknown serialized object version,...
00076                           */
00077                         void  deserializeIntoNewObject( CSerializablePtr &obj );
00078 
00079                         /** Sets the contents of the message from a string
00080                           * \sa getContentAsString
00081                           */
00082                         void  setContentFromString( const std::string &str );
00083 
00084                         /** Gets the contents of the message as a string
00085                           * \sa setContentFromString
00086                           */
00087                         void  getContentAsString( std::string &str );
00088 
00089                         /** Sets the contents of the message from a "void*" (the pointer itself becomes the message) - This is intended for inter-thread comms only.
00090                           * \sa getContentAsPointer
00091                           */
00092                         void  setContentFromPointer( void * ptr );
00093 
00094                         /** Gets the contents of the message as a "void*" (the pointer itself is the message) - This is intended for inter-thread comms only.
00095                           * \sa setContentFromPointer
00096                           */
00097                         void * getContentAsPointer() const;
00098 
00099                         /** 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.
00100                           * \sa getContentAsStruct
00101                           */
00102                         template <class T>
00103                         void  setContentFromStruct( const T &data )
00104                         {
00105                                 content.resize( sizeof(data) );
00106                                 T * ptr = reinterpret_cast< T* >( &content[0] );
00107                                 *ptr = data;
00108                         }
00109 
00110                         /** 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.
00111                           * \sa setContentFromStruct
00112                           */
00113                         template <class T>
00114                         void getContentAsStruct( T &data ) const
00115                         {
00116                                 MRPT_START
00117                                 ASSERT_(content.size() == sizeof(data) );
00118                                 data = * reinterpret_cast< T* >( &content[0] );
00119                                 MRPT_END
00120                         }
00121 
00122 
00123                 }; // End of class
00124 
00125         } // End of namespace
00126 } // End of namespace
00127 
00128 #endif



Page generated by Doxygen 1.7.5 for MRPT 0.9.5 SVN: at Thu Oct 13 21:25:36 UTC 2011