Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Tools/MessageQueue/InMessage.h

Go to the documentation of this file.
00001 /**
00002 * @file InMessage.h
00003 *
00004 * Declaration of class InMessageQueue, InBinaryMessage, InTextMessage,
00005 * InConfigMessage, InMessage and MessageHandler.
00006 *
00007 * Include that file for the definition of classes that derive from MessageHandler.
00008 *
00009 * @author Martin Lötzsch
00010 */
00011 
00012 #ifndef __InMessage_h_
00013 #define __InMessage_h_
00014 
00015 #include "Tools/Streams/InStreams.h"
00016 #include "Platform/MessageQueueBase.h"
00017 
00018 /**
00019 * @class InMessageQueue.
00020 *
00021 * A PhysicalInStream that reads the data from a MessageQueue.
00022 */
00023 class InMessageQueue : public PhysicalInStream
00024 {
00025 private:
00026   /** The queue where the data are read from */
00027   MessageQueueBase* queue; 
00028   
00029 public:
00030   /** Default constructor */
00031   InMessageQueue();
00032   
00033   
00034   /**
00035   * The function states whether the stream actually exists.
00036   * @return Does the file exist?
00037   */
00038   virtual bool exists() const;
00039   
00040   /**
00041   * The function states whether the end of the file has been reached.
00042   * @return End of file reached?
00043   */
00044   virtual bool getEof() const;
00045   
00046 protected:
00047 /**
00048 * opens the stream.
00049 * @param q A pointer to the message queue base
00050   */
00051   void open(MessageQueueBase* q);
00052   
00053   /**
00054   * The function reads a number of bytes from the stream.
00055   * @param p The address the data is written to. Note that p
00056   *          must point to a memory area that is at least
00057   *          "size" bytes large.
00058   * @param size The number of bytes to be read.
00059   */
00060   virtual void readFromStream(void* p,int size);
00061 };
00062 
00063 /** 
00064 * @class InBinaryMessage
00065 *
00066 * A binary stream from a message queue.
00067 */
00068 class InBinaryMessage : public InStream<InMessageQueue,InBinary>
00069 {
00070 public:
00071 /** 
00072 * Constructor 
00073 * @param q A pointer to the message queue base
00074   */
00075   InBinaryMessage(MessageQueueBase* q);
00076 };
00077 
00078 /** 
00079 * @class InTextMessage
00080 *
00081 * A text stream from a message queue.
00082 */
00083 class InTextMessage : public InStream<InMessageQueue,InText>
00084 {
00085 public:
00086 /** 
00087 * Constructor 
00088 * @param q A pointer to the message queue base
00089   */
00090   InTextMessage(MessageQueueBase* q);
00091 
00092   /** 
00093   * Reads the complete stream into a character buffer rechanging the escaped characters.
00094   * @param buf The buffer to fill. Note that buf must point
00095   *              to a memory area that is large enough to carry 
00096   *              the whole string.
00097   */
00098   void readAll(char* buf);
00099 };
00100 
00101 /** 
00102 * @class InConfigMessage
00103 *
00104 * A config-file-style text stream from a message queue.
00105 */
00106 class InConfigMessage : public InStream<InMessageQueue,InConfig>
00107 {
00108 public:
00109 /** 
00110 * Constructor 
00111 * @param q A pointer to the message queue base
00112   */
00113   InConfigMessage(MessageQueueBase* q);
00114 };
00115 
00116 /**
00117 * @class InMessage
00118 *
00119 * An Interface for reading single messages from a MessageQueue that is used by 
00120 * MessageHandler derivates. 
00121 *
00122 * Use the bin, text or config member for formated reading from a message queue. 
00123 */
00124 class InMessage
00125 {
00126 private:
00127 /** 
00128 * The message queue where the messages are read from. Note that the selection which message is 
00129 * read is not done by InMessageQueue but by MessageQueue itself.
00130   */
00131   MessageQueueBase& queue;
00132   
00133 public:
00134   /** An interface for reading binary messages from the queue */ 
00135   InBinaryMessage bin;
00136   
00137   /** An interface for reading text messages from the queue */ 
00138   InTextMessage text;
00139   
00140   /** An interface for reading config-file-style text messages from the queue */ 
00141   InConfigMessage config;
00142   
00143   /** 
00144   * Constructor
00145   * @param queue A reference to a MessageQueueBase
00146   */
00147   InMessage(MessageQueueBase& queue);
00148 
00149   /** returns the time stamp of the current message */
00150   unsigned long getTimeStamp() const;
00151 
00152   /** returns the message id of the current message */
00153   MessageID getMessageID() const;
00154 
00155   /** returns the message size of the current message */
00156   int getMessageSize() const;
00157 
00158   /** returns the team color of the robot that sent this message. Can be undefined. */
00159   Player::teamColor getTeamColor() const;
00160 
00161   /** returns the player number of the robot that sent this message. Can be undefined. */
00162   Player::playerNumber getPlayerNumber() const;
00163 
00164   /** 
00165   * returns the robot number of the robot that sent this message. 
00166   * @return 0: red1, 3:red4, 4:blue1, 7:blue4, 8:undefined */
00167   int getRobotNumber() const;
00168 
00169   /** 
00170   * returns whether the message was sent from a physical robot.
00171   * This is true, when the message was sent from the Aperios/OpenR platform,
00172   * otherwise false.
00173   */
00174   bool getMessageWasSentFromAPhysicalRobot() const;
00175 
00176   /** sets the read position to 0 so that the message can be read again */
00177   void resetReadPosition();
00178 
00179 protected:
00180   /** 
00181   * Gives a direct read access to the message.
00182   * @return The adress of the first byte of the message.
00183   */
00184   const char* getData() const;
00185 
00186   /** gives the class MessageQueue access to protected members */
00187   friend class MessageQueue;
00188 
00189   /** gives the operator that copies a InMessage to another queue access to protected members */
00190   friend void operator >> (InMessage& message, MessageQueue& queue);
00191 
00192   /** Gives the stream operator access to protected members */
00193   friend Out& operator<<(Out& stream, const MessageQueue& messageQueue);
00194 };
00195 
00196 /**
00197 * @class MessageHandler
00198 *
00199 * Responsible for distribution of incoming messages.
00200 * Derive any class that shall receive messages from MessageHandler and implement the 
00201 * handleMessage() function. 
00202 *
00203 * The MessageQueue needs a reference to a MessageHandler to distribute incoming messages.
00204 */
00205 class MessageHandler
00206 {
00207 public:
00208   /** 
00209   * Called from a MessageQueue to distribute messages.
00210   * Use message.getMessageID to decide if the message is relavant for 
00211   * the MesssageHandler derivate.
00212   * Use message.bin, message.text or message.config as In streams to get the data from.
00213   * @param message The message that can be read.
00214   * @return true if the message was read (handled).
00215   */
00216   virtual bool handleMessage(InMessage& message) = 0;
00217 };
00218 
00219 #endif //__InMessage_h_
00220 
00221 /*
00222 * Change Log:
00223 *
00224 * $Log: InMessage.h,v $
00225 * Revision 1.1.1.1  2004/05/22 17:37:15  cvsadm
00226 * created new repository GT2004_WM
00227 *
00228 * Revision 1.3  2003/12/06 23:39:07  loetzsch
00229 * added getRobotNumber()
00230 *
00231 * Revision 1.2  2003/12/06 23:23:55  loetzsch
00232 * messages in a MessageQueue now contain
00233 * - the team color of the robot which sent the message
00234 * - the player number of the robot which sent the message
00235 * - if the message was sent from a physical robot or not
00236 *
00237 * Revision 1.1  2003/10/07 10:13:24  cvsadm
00238 * Created GT2004 (M.J.)
00239 *
00240 * Revision 1.1.1.1  2003/07/02 09:40:28  cvsadm
00241 * created new repository for the competitions in Padova from the 
00242 * tamara CVS (Tuesday 2:00 pm)
00243 *
00244 * removed unused solutions
00245 *
00246 * Revision 1.2  2002/09/10 17:52:58  loetzsch
00247 * corrected comment
00248 *
00249 * Revision 1.1  2002/09/10 15:53:59  cvsadm
00250 * Created new project GT2003 (M.L.)
00251 * - Cleaned up the /Src/DataTypes directory
00252 * - Removed challenge related source code
00253 * - Removed processing of incoming audio data
00254 * - Renamed AcousticMessage to SoundRequest
00255 *
00256 * Revision 1.1  2002/07/23 13:47:14  loetzsch
00257 * - new streaming classes
00258 * - new debug message handling
00259 * - exchanged StaticQueue by MessageQueue
00260 *
00261 */

Generated on Thu Sep 23 19:57:39 2004 for GT2004 by doxygen 1.3.6