certi-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

certi/libCERTI CMakeLists.txt Makefile.am Messa...


From: certi-cvs
Subject: certi/libCERTI CMakeLists.txt Makefile.am Messa...
Date: Fri, 26 Oct 2007 13:00:09 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     ROUSSELOT <rousse>      07/10/26 13:00:08

Modified files:
        libCERTI       : CMakeLists.txt Makefile.am Message.hh 
Added files:
        libCERTI       : Message_R.cc Message_W.cc 
Removed files:
        libCERTI       : Message_RW.cc 

Log message:
        FR : Debut restructuration Message_RW en 2 fichiers
        EN : Begin dividing Message_RW into 2 files

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/CMakeLists.txt?cvsroot=certi&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/Makefile.am?cvsroot=certi&r1=3.32&r2=3.33
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/Message.hh?cvsroot=certi&r1=3.35&r2=3.36
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/Message_R.cc?cvsroot=certi&rev=3.1
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/Message_W.cc?cvsroot=certi&rev=3.1
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/Message_RW.cc?cvsroot=certi&r1=3.38&r2=0

Patches:
Index: CMakeLists.txt
===================================================================
RCS file: /sources/certi/certi/libCERTI/CMakeLists.txt,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- CMakeLists.txt      26 Sep 2007 14:15:21 -0000      1.8
+++ CMakeLists.txt      26 Oct 2007 13:00:06 -0000      1.9
@@ -71,7 +71,8 @@
 Clock.cc Clock.hh
 MessageBody.cc
 Message.cc
-Message_RW.cc
+Message_R.cc
+Message_W.cc
 NetworkMessage.cc
 NetworkMessage_RW.cc
 Exception.cc

Index: Makefile.am
===================================================================
RCS file: /sources/certi/certi/libCERTI/Makefile.am,v
retrieving revision 3.32
retrieving revision 3.33
diff -u -b -r3.32 -r3.33
--- Makefile.am 30 Jul 2007 07:30:21 -0000      3.32
+++ Makefile.am 26 Oct 2007 13:00:07 -0000      3.33
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 3.32 2007/07/30 07:30:21 erk Exp $
+## $Id: Makefile.am,v 3.33 2007/10/26 13:00:07 rousse Exp $
 
 if HAVE_POSIX_CLOCK
 POSIX_CLK_HEADER = PosixClock.hh
@@ -42,7 +42,8 @@
 BasicMessage.cc Dimension.cc Exception.cc Extent.cc    \
 fed.cc FederateLevelList.cc FedRegion.cc FedTime.cc GAV_aux.cc GAV.cc  \
 GSSAPIHandler.cc InteractionBroadcastList.cc Interaction.cc            \
-InteractionSet.cc LBTS.cc MessageBody.cc Message.cc Message_RW.cc      \
+InteractionSet.cc LBTS.cc MessageBody.cc Message.cc Message_R.cc       \
+Message_W.cc \
 Named.cc NetworkMessage.cc NetworkMessage_RW.cc ObjectAttribute.cc     \
 Object.cc ObjectClassAttribute.cc ObjectClassBroadcastList.cc          \
 ObjectClass.cc ObjectClassSet.cc ObjectSet.cc Parameter.cc             \

Index: Message.hh
===================================================================
RCS file: /sources/certi/certi/libCERTI/Message.hh,v
retrieving revision 3.35
retrieving revision 3.36
diff -u -b -r3.35 -r3.36
--- Message.hh  10 Aug 2007 14:45:13 -0000      3.35
+++ Message.hh  26 Oct 2007 13:00:07 -0000      3.36
@@ -240,6 +240,7 @@
         Type type ;
         TypeException exception ;
         UShort bodySize ;
+        FederationTime date ;
         MessageHeaderUnion VP ; // Variable Part
     };
 

Index: Message_R.cc
===================================================================
RCS file: Message_R.cc
diff -N Message_R.cc
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ Message_R.cc        26 Oct 2007 13:00:07 -0000      3.1
@@ -0,0 +1,828 @@
+// ----------------------------------------------------------------------------
+// CERTI - HLA RunTime Infrastructure
+// Copyright (C) 2002-2006  ONERA
+//
+// This program is free software ; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser 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
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+//
+// $Id: Message_R.cc,v 3.1 2007/10/26 13:00:07 rousse Exp $
+// ----------------------------------------------------------------------------
+
+
+#include "Message.hh"
+
+#include <cassert>
+
+using std::vector ;
+
+namespace certi {
+
+static pdCDebug D("RTIA_MSG","(LocalMESS) - ");
+static PrettyDebug G("GENDOC",__FILE__);
+
+// You can comment this out if you don't want to optimize network messages.
+#define USE_HEADER_AND_BODY
+
+void Message::trace(const char* context)
+{
+D.Mes(pdMessage,'M',this->type,context);
+}
+
+// ----------------------------------------------------------------------------
+//! Read NetworkMessage Objects from Socket objects.
+void
+Message::read(SocketUN *socket)
+    throw (NetworkError, NetworkSignal)
+{
+#ifdef USE_HEADER_AND_BODY
+
+    bool has_body = readHeader(socket);
+    if (has_body) readBody(socket);
+
+#else
+#error    
+    socket->receive((void *) this, sizeof(Message));
+#endif
+}
+
+// ----------------------------------------------------------------------------
+//! Read a Message Body from a Socket, should be called after ReadHeader.
+void
+Message::readBody(SocketUN *socket)
+{
+    assert(header.bodySize > 0);
+
+    MessageBody body(header.bodySize);
+
+    // 1. Read Body from socket.
+    socket->receive(body.getBuffer(), header.bodySize);
+        // FIXME EN: we must update the write pointer of the 
+        //           MessageBody because we have just written 
+        //           on it using direct pointer access !! (nasty usage)
+        body.addToWritePointer(header.bodySize);
+       
+    // 3. Read informations from Message Body according to message type.
+    if (header.exception != e_NO_EXCEPTION) {
+        body.readString(exceptionReason, MAX_EXCEPTION_REASON_LENGTH);
+    }
+    else {
+ 
+        // 1- Prepare Body Structure according to Message Type
+                       //D.Mes(pdMessage, 'M', header.type);
+                       this->trace("RTIG::chooseProcessingMethod ");
+
+        switch(header.type) {
+
+            // --- No Variable Part, Body not empty ---
+
+          // Body contains FederationName, FEDid
+          case CREATE_FEDERATION_EXECUTION:
+            readFederationName(body);
+            readFEDid(body) ;
+            break ;
+
+          case DESTROY_FEDERATION_EXECUTION:
+            readFederationName(body);
+            break ;
+
+          // Body contains label,tag,boolean and maybe
+          // handleArraySize,handleArray
+          case REGISTER_FEDERATION_SYNCHRONIZATION_POINT:
+            readLabel(body);
+            readTag(body);
+            boolean = body.readLongInt();
+            // boolean true means federates set exists
+            if ( boolean )
+                {
+                handleArraySize = body.readShortInt();
+                readHandleArray(body);
+                }
+            break ;
+
+          // Body contains label,tag
+          case ANNOUNCE_SYNCHRONIZATION_POINT:
+          case REQUEST_FEDERATION_RESTORE_FAILED:
+            readLabel(body);
+            readTag(body);
+            break ;
+
+          // Body contains label
+          case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:
+          case SYNCHRONIZATION_POINT_ACHIEVED:
+          case FEDERATION_SYNCHRONIZED:
+          case REQUEST_FEDERATION_RESTORE:
+          case REQUEST_FEDERATION_RESTORE_SUCCEEDED:
+            readLabel(body);
+            break ;
+
+          // Body contains federate,label
+          case INITIATE_FEDERATE_RESTORE:
+            federate = body.readShortInt();
+            readLabel(body);
+            break ;
+
+          // Body contains label
+          case INITIATE_FEDERATE_SAVE:
+            readLabel(body);
+            break ;
+
+          // Body contains label, boolean
+          case REQUEST_FEDERATION_SAVE:
+            readLabel(body);
+            // boolean true means with time (in the header)
+            boolean = body.readLongInt();
+            break ;
+
+          // Body contains objectClass
+          case UNPUBLISH_OBJECT_CLASS:
+          case UNSUBSCRIBE_OBJECT_CLASS:
+          case START_REGISTRATION_FOR_OBJECT_CLASS:
+          case STOP_REGISTRATION_FOR_OBJECT_CLASS:
+            objectClass = body.readLongInt();
+            break;
+
+          // Body contains object,attribute,tag
+          case IS_ATTRIBUTE_OWNED_BY_FEDERATE:
+          case QUERY_ATTRIBUTE_OWNERSHIP:
+            object = body.readLongInt();
+            attribute = body.readShortInt();
+            readTag(body);
+            break ;
+
+          // Body contains object,attribute,federate
+          case ATTRIBUTE_IS_NOT_OWNED:
+          case INFORM_ATTRIBUTE_OWNERSHIP:
+            object = body.readLongInt();
+            attribute = body.readShortInt();
+            federate = body.readShortInt();
+            break ;
+
+          // Body contains object,handleArraySize,HandleArray,tag
+          case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
+          case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
+          case ATTRIBUTE_OWNERSHIP_ACQUISITION:
+          case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
+            object = body.readLongInt();
+            handleArraySize = body.readShortInt();
+            readHandleArray(body);
+            readTag(body);
+            break ;
+
+          // Body contains object,handleArraySize,HandleArray
+          case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:
+          case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:
+          case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:
+          case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
+          case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
+          case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:
+          case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:
+          case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
+          case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:
+            object = body.readLongInt();
+            handleArraySize = body.readShortInt();
+            readHandleArray(body);
+            break ;
+
+          // Body contains object,region,boolean,handleArraySize,handleArray
+         case DDM_ASSOCIATE_REGION:
+           object = body.readLongInt();
+           region = body.readLongInt();
+           boolean = body.readLongInt();
+           handleArraySize = body.readShortInt();
+            readHandleArray(body);
+           break ;
+
+          // Body contains objectClass,object,tag,handleArraySize,handleArray,
+          // regions
+         case DDM_REGISTER_OBJECT:
+           objectClass = body.readLongInt();
+           object = body.readLongInt();
+           readTag(body);
+           handleArraySize = body.readShortInt();
+            readHandleArray(body);
+           readRegions(body);
+           break ;
+
+          // Body contains objectClass,region,boolean,handleArraySize,
+          // handleArray
+         case DDM_SUBSCRIBE_ATTRIBUTES:
+           objectClass = body.readLongInt();
+           region = body.readLongInt();
+           boolean = body.readLongInt();
+           handleArraySize = body.readShortInt();
+            readHandleArray(body);
+           break ;
+
+          // Body contains object,region
+         case DDM_UNASSOCIATE_REGION:
+           object = body.readLongInt();
+           region = body.readLongInt();
+           break ;
+
+          // Body contains objectClass,region
+         case DDM_UNSUBSCRIBE_ATTRIBUTES:          
+           objectClass = body.readLongInt();
+           region = body.readLongInt();
+           break ;
+
+          // Body contains interactionClass,region,boolean
+         case DDM_SUBSCRIBE_INTERACTION:
+         case DDM_UNSUBSCRIBE_INTERACTION:
+           interactionClass = body.readLongInt();
+           region = body.readLongInt();
+           boolean = body.readLongInt();
+           break ;
+           
+          case GET_ATTRIBUTE_SPACE_HANDLE:
+            objectClass = body.readLongInt();
+            attribute = body.readLongInt();
+            space = body.readLongInt();
+            break ;
+
+          // Body contains space,number,region
+          case DDM_CREATE_REGION:
+            space  = body.readLongInt();
+            number = body.readLongInt();
+            region = body.readLongInt();
+            break ;
+
+          case GET_INTERACTION_SPACE_HANDLE:
+            interactionClass = body.readLongInt();
+            space = body.readLongInt();
+            break ;
+
+            // --- MessageJ_R_Struct --
+
+          // Body contains federate,Federationname,FederateName
+          case JOIN_FEDERATION_EXECUTION:
+            federate = body.readShortInt();
+            readFederationName(body);
+            readFederateName(body);
+            break ;
+
+            // --- MessageO_I_Struct ---
+
+          // federationTime got from header
+          // Body contains objectClass,handleArraySize,HandleArray
+          case PUBLISH_OBJECT_CLASS:
+          case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTES:
+            objectClass = body.readLongInt();
+            handleArraySize = body.readShortInt();
+            readHandleArray(body);
+            break ;
+
+          // federationTime got from header
+          // Body contains objectClass,object,name
+          case REGISTER_OBJECT_INSTANCE:
+            objectClass = body.readLongInt();
+            object = body.readLongInt();
+            readName(body);
+            break ;
+
+          // FederationTime (or zero) yet got from header
+          // Body contains objectClass,handleArraySize,object,tag,HandleArray,
+          // ValueArray,ResignAction and 
+          // boolean (true with time, false without time)
+          case UPDATE_ATTRIBUTE_VALUES:
+          case REFLECT_ATTRIBUTE_VALUES:
+            objectClass = body.readLongInt();
+            handleArraySize = body.readShortInt();
+            object = body.readLongInt();
+            readTag(body);
+            readHandleArray(body);
+            readValueArray(body);
+            readResignAction(body);
+            boolean = body.readLongInt();
+            break ;
+
+          // FederationTime yet got from header
+          // Body contains objectClass,object,tag,name,label,resignAction
+          case DISCOVER_OBJECT_INSTANCE:
+            objectClass = body.readLongInt();
+            object = body.readLongInt();
+            readTag(body);
+            readName(body);
+            readLabel(body);
+            readResignAction(body);
+            break ;
+
+          // FederationTime yet put in header 
+          // Body contains objectClass,object,tag,name,label,resignAction  
+          case DELETE_OBJECT_INSTANCE:
+          case REMOVE_OBJECT_INSTANCE:
+            objectClass = body.readLongInt();
+            object = body.readLongInt();
+            readTag(body);
+            readName(body);
+            readLabel(body);
+            readResignAction(body);
+            break ;
+
+          // Body contains object 
+          case LOCAL_DELETE_OBJECT_INSTANCE:
+            break ;
+
+          // FederationTime yet got from header
+          case GET_OBJECT_CLASS_HANDLE:
+          case GET_OBJECT_CLASS_NAME:
+          case GET_ATTRIBUTE_HANDLE:
+          case GET_ATTRIBUTE_NAME:
+            // B.c. Name(and attribute)
+            objectClass = body.readLongInt();
+            readName(body);
+            attribute = body.readShortInt();
+            break ;
+
+          case GET_SPACE_HANDLE:
+          case GET_SPACE_NAME:
+            this->readName(body);
+            this->space = body.readLongInt();
+            break ;
+
+          case GET_DIMENSION_HANDLE:
+          case GET_DIMENSION_NAME:
+            this->readName(body);
+            this->dimension = body.readLongInt();
+            this->space = body.readLongInt();
+            break ;
+
+          case SEND_INTERACTION:
+          case RECEIVE_INTERACTION:
+            // B.c. Tag, HandleArray[], ValueArray[], RAction
+            // and boolean (true means SI with time, false without time)
+            interactionClass = body.readLongInt();
+            handleArraySize = body.readShortInt();
+            readTag(body);
+            readHandleArray(body);
+            readValueArray(body);
+           region = body.readLongInt();
+            readResignAction(body);
+            boolean = body.readLongInt();
+            break ;
+
+          case GET_INTERACTION_CLASS_HANDLE:
+          case GET_INTERACTION_CLASS_NAME:
+          case GET_PARAMETER_HANDLE:
+          case GET_PARAMETER_NAME:
+            // body contains Name and ParamHandle
+            interactionClass = body.readLongInt();
+            readName(body);
+            parameter = body.readShortInt();
+            break ;
+
+            // --- MessageT_O_Struct, body not empty ---
+          // Body contains handleArraySize,transport,order,object,HandleArray
+          case CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE:
+          case CHANGE_ATTRIBUTE_ORDER_TYPE:
+            handleArraySize = body.readShortInt();
+            transport = body.readLongInt();
+            order = body.readLongInt();
+            object = body.readLongInt();
+            readHandleArray(body);
+            break ;
+
+          // Body contains interactionClass,transport,order
+          case CHANGE_INTERACTION_TRANSPORTATION_TYPE:
+          case CHANGE_INTERACTION_ORDER_TYPE:
+            interactionClass = body.readLongInt();
+            transport = body.readLongInt();
+            order = body.readLongInt();
+            break;
+
+          // Body contains region,extents
+         case DDM_MODIFY_REGION:
+            region = body.readLongInt();
+           readExtents(body);
+           break ;
+
+          // Body contains region
+         case DDM_DELETE_REGION:
+            region = body.readLongInt();
+           break ;
+
+
+         case GET_OBJECT_INSTANCE_HANDLE:
+         case GET_OBJECT_INSTANCE_NAME:
+            object = body.readLongInt();
+           readName(body);
+           break;
+
+          // Body contains resignAction
+          case RESIGN_FEDERATION_EXECUTION:
+            readResignAction(body);
+            break;
+
+          // Body contains interactionClass
+          case PUBLISH_INTERACTION_CLASS:
+          case UNPUBLISH_INTERACTION_CLASS:
+          case SUBSCRIBE_INTERACTION_CLASS:
+          case UNSUBSCRIBE_INTERACTION_CLASS:
+          case TURN_INTERACTIONS_ON:
+          case TURN_INTERACTIONS_OFF:
+            interactionClass = body.readLongInt();
+            break ;
+
+          // Body contains boolean
+          case ENABLE_TIME_REGULATION:
+          case DISABLE_TIME_REGULATION:
+          case ENABLE_TIME_CONSTRAINED:
+          case DISABLE_TIME_CONSTRAINED:
+          case TICK_REQUEST:
+            boolean = body.readLongInt();
+            break ;
+
+          // Body contains object,federationName,federate,handleArraySize,
+          // handleArray
+          case REQUEST_OBJECT_ATTRIBUTE_VALUE_UPDATE:
+            object = body.readLongInt();
+            readFederationName(body);
+            federate = body.readShortInt();
+            handleArraySize = body.readShortInt();
+            readHandleArray(body);
+            break;                        
+           
+            // -- Default Handler --
+
+          default:
+            D.Out(pdExcept, "Unknown Type %d in ReadBody.", header.type);
+            throw RTIinternalError("Message: Unknown Type for Body(Read).");
+        }
+    }
+}
+
+// ----------------------------------------------------------------------------
+/*! Read a Header from a socket, and process it to read its content. Return
+  RTI_TRUE if the ReadBody Method has to be called.
+*/
+bool
+Message::readHeader(SocketUN *socket)
+{
+    // 1- Read Header from Socket
+    socket->receive((const unsigned char *) &header, sizeof(MessageHeader));
+
+    // 2- Parse Header(Static Part)
+    type = header.type ;
+    exception = header.exception ;
+    setFederationTime(header.date);
+
+    // If the message carry an exception, the Body will only contain the
+    // exception reason.
+
+    if (exception != e_NO_EXCEPTION)
+        return true ;
+
+    // 2- Parse Header according to its type(Variable Part)
+    // NULL, UAV and SendInteraction are the most common ones.
+
+    switch(type) {
+
+        // --- No Variable Part, Body not empty ---
+      // header contains type, exception, size and no more useful
+      case CREATE_FEDERATION_EXECUTION:  // Body contains FederationName,FEDid
+      case DESTROY_FEDERATION_EXECUTION: // Body contains FederationName
+      case REGISTER_FEDERATION_SYNCHRONIZATION_POINT: // Body contains Label
+                                                      // tag,boolean and maybe
+                                                      // handleArraySize,
+                                                      // handleArray
+      case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED: // Body contains label
+      case ANNOUNCE_SYNCHRONIZATION_POINT:           // Body contains label,tag
+      case SYNCHRONIZATION_POINT_ACHIEVED:               // Body contains label
+      case FEDERATION_SYNCHRONIZED:                      // Body contains label
+      case INITIATE_FEDERATE_SAVE:                       // Body contains label
+      case IS_ATTRIBUTE_OWNED_BY_FEDERATE:// B.c. object, attribute and Tag.
+      case QUERY_ATTRIBUTE_OWNERSHIP: // B.c. object and attribute.
+      case ATTRIBUTE_IS_NOT_OWNED:    //Body contains object,attribute,federate
+      case INFORM_ATTRIBUTE_OWNERSHIP://Body contains object,attribute,federate
+      case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE: // Body contains object,
+                                                       // handleArraySize,
+                                                       // handleArray
+      case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
+      case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:// Body contains 
object,
+                                                        // handleArraySize,
+                                                        // handleArray
+      case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:// Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray
+      case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:// Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray
+      case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
+      case ATTRIBUTE_OWNERSHIP_ACQUISITION:
+      case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
+      case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:// Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray
+      // Body contains object,handleArraySize,handleArray 
+      case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
+      case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:// Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray 
+      case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:// Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray
+      // Body contains object,handleArraySize,handleArray 
+      case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
+      case GET_ATTRIBUTE_SPACE_HANDLE:
+      case GET_INTERACTION_SPACE_HANDLE:
+      case DDM_CREATE_REGION:              // Body contains space,number,region
+      case REQUEST_FEDERATION_RESTORE:           // Body contains label.
+      case REQUEST_FEDERATION_RESTORE_SUCCEEDED: // Body contains label.
+      case REQUEST_FEDERATION_RESTORE_FAILED:    // Body contains label,tag
+      // Body contains object,region,boolean,handleArraySize,handleArray
+      case DDM_ASSOCIATE_REGION:
+      case DDM_UNASSOCIATE_REGION:               // Body contains object,region
+      // Body contains objectClass,region,boolean,handleArraySize,handleArray
+      case DDM_SUBSCRIBE_ATTRIBUTES:
+      case DDM_UNSUBSCRIBE_ATTRIBUTES:      // Body contains objectClass,region
+      // Body contains interactionClass,region,boolean
+      case DDM_SUBSCRIBE_INTERACTION:
+      // Body contains interactionClass,region,boolean
+      case DDM_UNSUBSCRIBE_INTERACTION:
+      // Body contains objectClass,object,tag,handleArraySize,handleArray,
+      // regions
+      case DDM_REGISTER_OBJECT:
+        break ;
+
+        // --- MessageJ_R_Struct --
+
+      // header contains type, exception, size and no more useful
+      // Body contains resignAction
+      case RESIGN_FEDERATION_EXECUTION:
+        break ;
+
+      // header contains type, exception, size and no more useful
+      // Body contains federate,label
+      case INITIATE_FEDERATE_RESTORE:
+        break ;
+
+      // header contains type, exception, size and no more useful
+      case JOIN_FEDERATION_EXECUTION: // Body contains federate,FederationName
+        break ;                       //               federateName
+
+        // --- MessageO_I_Struct, No body ---
+
+      // header contains type, exception, size and no more useful
+      // Body contains objectClass
+      case UNPUBLISH_OBJECT_CLASS:
+      case UNSUBSCRIBE_OBJECT_CLASS:
+      case START_REGISTRATION_FOR_OBJECT_CLASS:
+      case STOP_REGISTRATION_FOR_OBJECT_CLASS:
+        break ;
+
+      // header contains type, exception, size and no more useful
+      // Body contains interactionClass
+      case PUBLISH_INTERACTION_CLASS:
+      case UNPUBLISH_INTERACTION_CLASS:
+      case SUBSCRIBE_INTERACTION_CLASS:
+      case UNSUBSCRIBE_INTERACTION_CLASS:
+      case TURN_INTERACTIONS_ON:
+      case TURN_INTERACTIONS_OFF:
+        break;
+
+        // --- MessageO_I_Struct, body not Empty ---
+
+      // RFS without time will receive date=0 in the header
+      case REQUEST_FEDERATION_SAVE:
+        break ;
+
+      // FederationTime yet got from header
+      // Body contains objectClass,handleArraySize,HandleArray
+      case PUBLISH_OBJECT_CLASS:
+      case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTES:
+        break ;
+
+      // FederationTime yet got from header
+      // Body contains objectClass,object,name
+      case REGISTER_OBJECT_INSTANCE:
+        break ;
+
+      // FederationTime yet got from header 
+      // Body contains objectClass,object,tag,name,label,resignAction  
+      case DELETE_OBJECT_INSTANCE:
+      case REMOVE_OBJECT_INSTANCE:
+        break ;
+
+      // Body contains object  
+      case LOCAL_DELETE_OBJECT_INSTANCE:
+        break;
+
+      // FederationTime yet got from header
+      // Body contains objectClass,object,tag,name,label,resignAction
+      case DISCOVER_OBJECT_INSTANCE:
+        break ;
+
+      // FederationTime yet got from header
+      case GET_OBJECT_CLASS_HANDLE: // Body contains Name
+      case GET_OBJECT_CLASS_NAME: // Body contains Name
+      case GET_ATTRIBUTE_HANDLE: // B.c. Name and attribute.
+      case GET_ATTRIBUTE_NAME: // B.c. Name and attribute.
+        // objectClass = header.VP.O_I.handle ;
+        // handleArraySize = header.VP.O_I.size ;
+        // setFederationTime(header.VP.O_I.date);
+        break ;
+
+      // FederationTime (maybe zero) yet got from header
+      // Body contains objectClass,handleArraySize,object,tag,HandleArray,
+      // ValueArray,ResignAction and 
+      // boolean (true with time, false without time)
+      case UPDATE_ATTRIBUTE_VALUES:
+      case REFLECT_ATTRIBUTE_VALUES:
+        break ;
+
+      // FederationTime yet got from header
+      case SEND_INTERACTION: // B.c. Tag, HandleArray[], ValueArray[]
+      case RECEIVE_INTERACTION: // B.c. Tag, HandleArray[], ValueArray[], 
resignAction
+        // interactionClass = header.VP.O_I.handle ;
+        // handleArraySize = header.VP.O_I.size ;
+        // setFederationTime(header.VP.O_I.date );
+        break ;
+
+      // FederationTime yet got from header
+      case GET_INTERACTION_CLASS_HANDLE: // Body contains Name
+      case GET_INTERACTION_CLASS_NAME: // Body contains Name
+      case GET_PARAMETER_HANDLE: // Body contains Name and parameter
+      case GET_PARAMETER_NAME: // Body contains Name and parameter
+        // interactionClass = header.VP.O_I.handle ;
+        // handleArraySize = header.VP.O_I.size ;
+        // setFederationTime(header.VP.O_I.date );
+        break ;
+
+      case GET_SPACE_HANDLE:
+      case GET_SPACE_NAME:
+      case GET_DIMENSION_NAME:
+      case GET_DIMENSION_HANDLE:
+        this->space = header.VP.O_I.handle ;
+        handleArraySize = header.VP.O_I.size ;
+        setFederationTime(header.VP.O_I.date );
+        break ;
+
+      // Body contains interactionClass,transport,order
+      case CHANGE_INTERACTION_TRANSPORTATION_TYPE:
+      case CHANGE_INTERACTION_ORDER_TYPE:
+        break ;
+
+      // Body contains region
+      case DDM_DELETE_REGION:
+        //region = header.VP.ddm.region ;
+        break ;
+
+      // Body contains region,extents
+      case DDM_MODIFY_REGION:
+       break ; 
+       
+        // --- MessageT_O_Struct, Body not empty ---
+      // Body contains handleArraySize,transport,order,object,HandleArray
+      case CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE:
+      case CHANGE_ATTRIBUTE_ORDER_TYPE:
+        break ;
+
+        // --- TimeStruct, No Body ---
+        // case REQUEST_FEDERATION_TIME:
+
+      // FederationTime yet got from header
+      // Body is empty
+      case QUERY_LBTS:
+      case QUERY_FEDERATE_TIME:
+      case TIME_ADVANCE_REQUEST:
+      case NEXT_EVENT_REQUEST:
+      case TIME_ADVANCE_GRANT:
+        break ;
+
+      // lookahead got from header
+      // Body is empty
+      // Warning : FederationTime has been modified (needs validation)
+      case MODIFY_LOOKAHEAD:
+      case QUERY_LOOKAHEAD:
+        lookahead = header.date ;
+        fed_time.setZero();
+        break ;
+
+      // Body contains boolean
+      case ENABLE_TIME_REGULATION:
+      case DISABLE_TIME_REGULATION:
+      case ENABLE_TIME_CONSTRAINED:
+      case DISABLE_TIME_CONSTRAINED:
+      case TICK_REQUEST:
+        break ;
+
+      case GET_OBJECT_INSTANCE_HANDLE:
+      case GET_OBJECT_INSTANCE_NAME:
+       object = header.VP.O_I.handle;
+        handleArraySize = header.VP.O_I.size ;
+        setFederationTime(header.VP.O_I.date);
+        break ;
+
+      // Body contains object,federationName,federate,handleArraySize,
+      // handleArray
+      case REQUEST_OBJECT_ATTRIBUTE_VALUE_UPDATE:
+        break;        
+
+
+      // Nothing more to do. Body is empty.
+      case FEDERATE_SAVE_BEGUN:
+      case FEDERATE_SAVE_COMPLETE:
+      case FEDERATE_SAVE_NOT_COMPLETE:
+      case FEDERATION_SAVED:
+      case FEDERATION_NOT_SAVED:
+      case FEDERATE_RESTORE_COMPLETE:
+      case FEDERATE_RESTORE_NOT_COMPLETE:
+      case FEDERATION_RESTORED:
+      case FEDERATION_NOT_RESTORED:
+      case FEDERATION_RESTORE_BEGUN:
+      case ENABLE_ASYNCHRONOUS_DELIVERY:
+      case DISABLE_ASYNCHRONOUS_DELIVERY:
+        break;
+
+      default:
+        D.Out(pdExcept, "Unknown type %d in ReadHeader.", header.type);
+        throw RTIinternalError("Message: Received unknown Header type.");
+    }
+
+    // 4- Return depends on body
+    return header.bodySize != 0 ;
+}
+
+// ----------------------------------------------------------------------------
+void
+Message::readHandleArray(MessageBody &body)
+{
+    body.readBlock((char *) handleArray, handleArraySize * 
sizeof(AttributeHandle));
+}
+
+// ----------------------------------------------------------------------------
+void
+Message::readLabel(MessageBody &body)
+{
+    body.readString(label, MAX_USER_TAG_LENGTH);
+}
+
+// ----------------------------------------------------------------------------
+void
+Message::readName(MessageBody &body)
+{
+    body.readString(name, MAX_USER_TAG_LENGTH);
+}
+
+// ----------------------------------------------------------------------------
+void
+Message::readFederationName(MessageBody &body)
+{
+    body.readString(federationName, MAX_FEDERATION_NAME_LENGTH);
+}
+
+// ----------------------------------------------------------------------------
+void
+Message::readFederateName(MessageBody &body)
+{
+    body.readString(federateName, MAX_FEDERATE_NAME_LENGTH);
+}
+
+// ----------------------------------------------------------------------------
+void
+Message::readResignAction(MessageBody &)
+{
+    // BUG: Should do something.
+}
+
+// ----------------------------------------------------------------------------
+void
+Message::readTag(MessageBody &body)
+{
+    body.readString(tag, MAX_USER_TAG_LENGTH);
+}
+
+// ----------------------------------------------------------------------------
+void
+Message::readFEDid(MessageBody &body)
+{
+    body.readString(FEDid, MAX_FEDFILE_NAME_LENGTH);
+}
+// ----------------------------------------------------------------------------
+//! readValueArray.
+void
+Message::readValueArray(MessageBody &body)
+{
+// valueArray contains length and value
+// so we have to read length and then value with a readBlock
+    for (int i = 0 ; i < handleArraySize ; i ++)
+        {
+        valueArray[i].length = body.readLongInt() ;
+        body.readBlock((char *) valueArray[i].value, valueArray[i].length);
+        }
+}
+
+} // namespace certi
+
+// $Id: Message_R.cc,v 3.1 2007/10/26 13:00:07 rousse Exp $

Index: Message_W.cc
===================================================================
RCS file: Message_W.cc
diff -N Message_W.cc
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ Message_W.cc        26 Oct 2007 13:00:08 -0000      3.1
@@ -0,0 +1,857 @@
+// ----------------------------------------------------------------------------
+// CERTI - HLA RunTime Infrastructure
+// Copyright (C) 2002-2006  ONERA
+//
+// This program is free software ; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser 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
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser 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
+//
+// $Id: Message_W.cc,v 3.1 2007/10/26 13:00:08 rousse Exp $
+// ----------------------------------------------------------------------------
+
+
+#include "Message.hh"
+
+#include <cassert>
+
+using std::vector ;
+
+namespace certi {
+
+static pdCDebug D("RTIA_MSG","(LocalMESS) - ");
+static PrettyDebug G("GENDOC",__FILE__);
+
+// You can comment this out if you don't want to optimize network messages.
+#define USE_HEADER_AND_BODY
+
+// ----------------------------------------------------------------------------
+//! Write NetworkMessage Objects to Socket objects.
+void
+Message::write(SocketUN *socket)
+    throw (NetworkError, NetworkSignal)
+{
+#ifdef USE_HEADER_AND_BODY
+
+    bool result ;
+
+    result = writeHeader(socket);
+    if (result)
+        writeBody(socket);
+
+#else
+    socket->send((void *) this, sizeof(Message));
+#endif
+}
+
+// ----------------------------------------------------------------------------
+/*! Prepare and write a Body to a socket, should be called after WriteHeader.
+  The message is written onto the socket by WriteHeader if no body is
+  required, or by WriteBody is a body has been required by WriteHeader.
+*/
+void
+Message::writeBody(SocketUN *socket)
+{
+    MessageBody body ;
+
+    // 0- Copy the Header at the beginning of the Body, in order to
+    // make a single Socket->Emettre call while sending both.
+    // WARNING: As the Body size is not known yet, we will have to
+    // change it in the copy also!
+    body.writeBlock((char *) &header, sizeof(MessageHeader));
+
+    // If the message carry an exception, the Body will only contain the
+    // exception reason.
+
+    if (header.exception != e_NO_EXCEPTION) {
+        body.writeString(exceptionReason);
+    }
+    else {
+
+        // 1- Prepare Body Structure according to Message type
+        switch(header.type) {
+
+            // --- No Variable Part, Body not empty ---
+
+          case CREATE_FEDERATION_EXECUTION:
+            body.writeString(federationName);
+            body.writeString(FEDid);
+            break ;
+
+          case DESTROY_FEDERATION_EXECUTION:
+            body.writeString(federationName);
+            break ;
+
+          // Body contains label,tag,boolean and maybe
+          // handleArraySize,handleArray
+          case REGISTER_FEDERATION_SYNCHRONIZATION_POINT:
+            body.writeString(label);
+            body.writeString(tag);
+            body.writeLongInt(boolean);
+            // boolean true means federates set exists
+            if ( boolean )
+                {
+                body.writeShortInt(handleArraySize);
+                writeHandleArray(body);
+                }
+            break ;
+
+          // RFS needs label and boolean in the body and time in the header
+          case REQUEST_FEDERATION_SAVE:
+            body.writeString(label);
+            body.writeLongInt(boolean);
+            break;
+
+          // Body contains label
+          case INITIATE_FEDERATE_SAVE:           
+            body.writeString(label);
+            break;
+
+          // Body contains federate,label
+          case INITIATE_FEDERATE_RESTORE:
+            body.writeShortInt(federate);            
+            body.writeString(label);
+            break;
+
+          // Body contains label,tag
+          case ANNOUNCE_SYNCHRONIZATION_POINT:
+          case REQUEST_FEDERATION_RESTORE_FAILED:
+            body.writeString(label);
+            body.writeString(tag);
+            break ;
+
+          // Body contains label (i.e. String)
+          case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:
+          case SYNCHRONIZATION_POINT_ACHIEVED:
+          case FEDERATION_SYNCHRONIZED:
+          case REQUEST_FEDERATION_RESTORE:
+          case REQUEST_FEDERATION_RESTORE_SUCCEEDED:
+            body.writeString(label);
+            break ;
+
+          // Body contains objectClass
+          case UNPUBLISH_OBJECT_CLASS:
+          case UNSUBSCRIBE_OBJECT_CLASS:
+          case START_REGISTRATION_FOR_OBJECT_CLASS:
+          case STOP_REGISTRATION_FOR_OBJECT_CLASS:
+            body.writeLongInt(objectClass);
+            break;
+
+          // Body contains object,attribute,tag
+          case IS_ATTRIBUTE_OWNED_BY_FEDERATE:
+          case QUERY_ATTRIBUTE_OWNERSHIP:
+            body.writeLongInt(object);
+            body.writeShortInt(attribute);
+            body.writeString(tag);
+            break ;
+
+          // Body contains object,attribute,federate
+          case ATTRIBUTE_IS_NOT_OWNED:
+          case INFORM_ATTRIBUTE_OWNERSHIP:
+            body.writeLongInt(object);
+            body.writeShortInt(attribute);
+            body.writeShortInt(federate);
+            break ;
+
+          // Body contains object,handleArraySize,HandleArray,tag
+          case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
+          case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
+          case ATTRIBUTE_OWNERSHIP_ACQUISITION:
+          case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
+            body.writeLongInt(object);
+            body.writeShortInt(handleArraySize);
+            writeHandleArray(body);
+            body.writeString(tag);
+            break ;
+
+          // Body contains object,handleArraySize,HandleArray
+          case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:
+          case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:
+          case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:
+          case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
+          case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:
+          case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
+          case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:
+          case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:
+          case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
+            body.writeLongInt(object);
+            body.writeShortInt(handleArraySize);
+            writeHandleArray(body);
+            break ;
+
+          // Body contains object,federationName,federate,handleArraySize,
+          // handleArray
+          case REQUEST_OBJECT_ATTRIBUTE_VALUE_UPDATE:
+           body.writeLongInt(object);
+            body.writeString(federationName);
+            body.writeShortInt(federate);
+            body.writeShortInt(handleArraySize);
+            writeHandleArray(body);
+           break ;
+
+          // Body contains object,region,boolean,handleArraySize,handleArray   
        
+         case DDM_ASSOCIATE_REGION:
+           body.writeLongInt(object);
+           body.writeLongInt(region);
+           body.writeLongInt(boolean);
+            body.writeShortInt(handleArraySize);
+            writeHandleArray(body);
+           break ;
+
+          // Body contains objectClass,object,tag,handleArraySize,handleArray,
+          // regions
+         case DDM_REGISTER_OBJECT:
+           body.writeLongInt(objectClass);
+           body.writeLongInt(object);
+           body.writeString(tag);
+            body.writeShortInt(handleArraySize);
+            writeHandleArray(body);
+           writeRegions(body);
+           break ;
+
+          // Body contains objectClass,region,boolean,handleArraySize,
+          // handleArray
+         case DDM_SUBSCRIBE_ATTRIBUTES:
+           body.writeLongInt(objectClass);
+           body.writeLongInt(region);
+           body.writeLongInt(boolean);
+            body.writeShortInt(handleArraySize);
+            writeHandleArray(body);
+           break ;
+
+          // Body contains object,region
+         case DDM_UNASSOCIATE_REGION:
+           body.writeLongInt(object);
+           body.writeLongInt(region);
+           break ;
+
+          // Body contains objectClass,region
+         case DDM_UNSUBSCRIBE_ATTRIBUTES:
+           body.writeLongInt(objectClass);
+           body.writeLongInt(region);
+           break ;
+
+          // Body contains interactionClass,region,boolean         
+         case DDM_SUBSCRIBE_INTERACTION:
+         case DDM_UNSUBSCRIBE_INTERACTION:
+           body.writeLongInt(interactionClass);
+           body.writeLongInt(region);
+           body.writeLongInt(boolean);
+           break ;
+           
+          case GET_ATTRIBUTE_SPACE_HANDLE:
+            body.writeLongInt(objectClass);
+            body.writeLongInt(attribute);
+            body.writeLongInt(space);
+            break ;
+
+          // Body contains space,number,region
+          case DDM_CREATE_REGION:
+            body.writeLongInt(space) ;
+            body.writeLongInt(number);
+            body.writeLongInt(region);
+            break ;
+
+          case GET_INTERACTION_SPACE_HANDLE:
+            body.writeLongInt(interactionClass);
+            body.writeLongInt(space);
+            break ;
+
+            // --- MessageJ_R_Struct --
+
+          // Body contains federate,federatioName,federateName
+          case JOIN_FEDERATION_EXECUTION:
+            body.writeShortInt(federate);
+            body.writeString(federationName);
+            body.writeString(federateName);
+            break ;
+
+            // --- MessageO_I_Struct ---need FederationTime into header
+
+          // FederationTime yet put in header
+          // Body contains objectClass,handleArraySize,HandleArray
+          case PUBLISH_OBJECT_CLASS:
+          case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTES:
+            body.writeLongInt(objectClass);
+            body.writeShortInt(handleArraySize);
+            writeHandleArray(body);
+            break ;
+
+          // FederationTime yet put in header
+          // Body contains objectClass,object,name
+          case REGISTER_OBJECT_INSTANCE:
+            body.writeLongInt(objectClass);
+            body.writeLongInt(object);
+            body.writeString(name);
+            break ;
+
+          // FederationTime (or zero) yet put in header
+          // Body contains objectClass,handleArraySize,object,tag,HandleArray,
+          // ValueArray,ResignAction and 
+          // boolean (true with time, false without time)
+          case UPDATE_ATTRIBUTE_VALUES:
+          case REFLECT_ATTRIBUTE_VALUES:
+            body.writeLongInt(objectClass);
+            body.writeShortInt(handleArraySize);
+            body.writeLongInt(object);
+            body.writeString(tag);
+            writeHandleArray(body);
+            writeValueArray(body);
+            writeResignAction(body);
+            body.writeLongInt(boolean);
+            break ;
+
+          // FederationTime yet put in header
+          // Body contains objectClass,object,tag,name,label,resignAction
+          case DISCOVER_OBJECT_INSTANCE:
+            body.writeLongInt(objectClass);
+            body.writeLongInt(object);
+            body.writeString(tag);
+            body.writeString(name);
+            body.writeString(label);
+            writeResignAction(body);
+            break ;
+
+          // FederationTime yet put in header 
+          // Body contains objectClass,object,tag,name,label,resignAction  
+          case DELETE_OBJECT_INSTANCE:
+          case REMOVE_OBJECT_INSTANCE:
+            body.writeLongInt(objectClass);
+            body.writeLongInt(object);
+            body.writeString(tag);
+            body.writeString(name);
+            body.writeString(label);
+            writeResignAction(body);
+            break ;
+
+          // Body contains object  
+          case LOCAL_DELETE_OBJECT_INSTANCE:
+            body.writeLongInt(object);
+            break;
+
+          case GET_OBJECT_CLASS_HANDLE:
+          case GET_OBJECT_CLASS_NAME:
+          case GET_ATTRIBUTE_HANDLE:
+          case GET_ATTRIBUTE_NAME:
+            // B.c. name(and attribute)
+            body.writeLongInt(objectClass);
+            body.writeString(name);
+            body.writeShortInt(attribute);
+            break ;
+
+          case GET_SPACE_HANDLE:
+          case GET_SPACE_NAME:
+            body.writeString(name);
+            body.writeLongInt(space);
+            break ;
+
+          case GET_DIMENSION_HANDLE:
+          case GET_DIMENSION_NAME:
+            body.writeString(name);
+            body.writeLongInt(dimension);
+            body.writeLongInt(space);
+            break ;
+
+          // Body contains interactionClass,handleArraySize,tag,handleArray,
+          // valueArray,region,resignAction
+          // and boolean (true with time, false without time)
+          case SEND_INTERACTION:
+          case RECEIVE_INTERACTION:
+            body.writeLongInt(interactionClass);
+            body.writeShortInt(handleArraySize);
+            body.writeString(tag);
+            writeHandleArray(body);
+            writeValueArray(body);
+           body.writeLongInt(region);
+            writeResignAction(body);
+            body.writeLongInt(boolean);
+            break ;
+
+          case GET_INTERACTION_CLASS_HANDLE:
+          case GET_INTERACTION_CLASS_NAME:
+          case GET_PARAMETER_HANDLE:
+          case GET_PARAMETER_NAME:
+            // Body contains name and parameter
+            body.writeLongInt(interactionClass);
+            body.writeString(name);
+            body.writeShortInt(parameter);
+            break ;
+
+            // --- MessageT_O_Struct, Body not empty ---
+          // Body contains handleArraySize,transport,order,object,HandleArray
+          case CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE:
+          case CHANGE_ATTRIBUTE_ORDER_TYPE:
+            body.writeShortInt(handleArraySize);
+            body.writeLongInt(transport);
+            body.writeLongInt(order);           
+            body.writeLongInt(object);
+            writeHandleArray(body);
+            break ;
+
+          // Body contains interactionClass,transport,order
+          case CHANGE_INTERACTION_TRANSPORTATION_TYPE:
+          case CHANGE_INTERACTION_ORDER_TYPE:
+            body.writeLongInt(interactionClass);
+            body.writeLongInt(transport);
+            body.writeLongInt(order);  
+            break ;
+
+          // Body contains region,extents            
+         case DDM_MODIFY_REGION:
+            body.writeLongInt(region);
+           writeExtents(body);
+           break ;
+
+          // Body contains region            
+         case DDM_DELETE_REGION:
+            body.writeLongInt(region);
+           break ;
+           
+         case GET_OBJECT_INSTANCE_HANDLE:
+         case GET_OBJECT_INSTANCE_NAME :
+           body.writeLongInt(object);
+           body.writeString(name);
+           break;
+
+          // Body contains ResignAction
+          case RESIGN_FEDERATION_EXECUTION:
+            writeResignAction(body);
+            break;
+
+          // Body contains interactionClass
+          case PUBLISH_INTERACTION_CLASS:
+          case UNPUBLISH_INTERACTION_CLASS:
+          case SUBSCRIBE_INTERACTION_CLASS:
+          case UNSUBSCRIBE_INTERACTION_CLASS:
+          case TURN_INTERACTIONS_ON:
+          case TURN_INTERACTIONS_OFF:
+            body.writeLongInt(interactionClass);
+            break ;
+
+          // Body contains boolean
+          case ENABLE_TIME_REGULATION:
+          case DISABLE_TIME_REGULATION:
+          case ENABLE_TIME_CONSTRAINED:
+          case DISABLE_TIME_CONSTRAINED:
+          case TICK_REQUEST:
+            body.writeLongInt(boolean);
+            break ;
+           
+            // -- Default Handler --
+
+          default:
+            D.Out(pdExcept, "Unknown type %d in Writebody.", header.type);
+            throw RTIinternalError("Message: Unknown type for body.");
+
+        }
+    }
+
+    // 2- Set Header.bodySize
+
+    // Body Size does not include the copy of the Header!
+    header.bodySize = body.size() - sizeof(MessageHeader);
+
+    // Put the real Body Size in the copy of the Header.
+    (reinterpret_cast<MessageHeader *>(body.getBufferModeRW()))->bodySize = 
header.bodySize ;
+
+    // 3- Write Header to socket, then write Body to socket.
+    // socket->send((void *) &Header, sizeof(MessageHeader));
+    socket->send(body.getBuffer(), body.size());
+}
+
+// ----------------------------------------------------------------------------
+void
+Message::writeHandleArray(MessageBody &body)
+{
+    body.writeBlock((char *) handleArray, handleArraySize * 
sizeof(AttributeHandle));
+}
+
+// ----------------------------------------------------------------------------
+/*! Prepare and Write a Header to a Socket, and return RTI_TRUE if the
+  WriteBody method has to be called.
+  The message is written onto the socket by WriteHeader if no body is
+  required, or by WriteBody is a body has been required by WriteHeader.
+*/
+bool
+Message::writeHeader(SocketUN *socket)
+{
+    // 1- Clear Header
+    memset((void *) &header, '\0', sizeof(MessageHeader));
+
+    // 2- Fill Header(Static Part)
+    header.type = this->type ;
+    header.exception = this->exception ;
+    header.date = getFederationTime();
+
+    // If the message carry an exception, the Body will only contain the
+    // exception reason.
+
+    if (exception != e_NO_EXCEPTION) {
+        header.bodySize = 1 ;
+        return true ;
+    }
+
+    // 3- Fill Header(Variable Part)[Sorted by Variable part type]
+    // Note: Header.bodySize is not set to the actual Body size, but
+    // to zero to indicate there is no Body, or 1 if a Body is needed.
+
+    switch(this->type) {
+
+      // Header contains type,exception and size and no more usefull.
+      // Body is not empty;
+      case CREATE_FEDERATION_EXECUTION:  // Body contains federationName,FEDid
+      case DESTROY_FEDERATION_EXECUTION: // Body contains federationName
+      case REGISTER_FEDERATION_SYNCHRONIZATION_POINT: // Body contains label,
+                                                      // tag,boolean and maybe
+                                                      // handleArraySize,
+                                                      // handleArray
+      case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED: // Body contains label
+      case ANNOUNCE_SYNCHRONIZATION_POINT:           // Body contains label,tag
+      case SYNCHRONIZATION_POINT_ACHIEVED:               // Body contains Label
+      case FEDERATION_SYNCHRONIZED:                      // Body contains Label
+      case IS_ATTRIBUTE_OWNED_BY_FEDERATE:// Body contains object, attribute,
+                                          // tag.
+      case QUERY_ATTRIBUTE_OWNERSHIP:// Body contains object, attribute,tag
+      case ATTRIBUTE_IS_NOT_OWNED:    //Body contains object,attribute,federate
+      case INFORM_ATTRIBUTE_OWNERSHIP://Body contains object,attribute,federate
+      case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE: // Body contains object,
+                                                       // handleArraySize,
+                                                       // handleArray
+      case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
+      case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:// Body contains 
object,
+                                                        // handleArraySize,
+                                                        // handleArray
+      case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:// Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray
+      case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:             // Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray
+      case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE://Body contains object
+                                                         // handleArraySize,
+                                                         // handleArray
+      case ATTRIBUTE_OWNERSHIP_ACQUISITION:
+      case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
+      case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:// Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray
+      // Body contains object,handleArraySize,handleArray 
+      case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
+      case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:        // Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray 
+      case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:      // Body contains object
+                                                        // handleArraySize,
+                                                        // handleArray
+      // Body contains object,handleArraySize,handleArray 
+      case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
+      case GET_ATTRIBUTE_SPACE_HANDLE:
+      case GET_INTERACTION_SPACE_HANDLE:
+      case INITIATE_FEDERATE_SAVE:         // Body contains label
+      case DDM_CREATE_REGION:              // Body contains space,number,region
+      // Body contains object,region,boolean,handleArraySize,handleArray
+      case DDM_ASSOCIATE_REGION:
+      case DDM_UNASSOCIATE_REGION:         // Body contains object,region
+      // Body contains objectClass,region,boolean,handleArraySize,handleArray
+      case DDM_SUBSCRIBE_ATTRIBUTES:
+      case DDM_UNSUBSCRIBE_ATTRIBUTES:     // Body contains objectClass,region
+      // Body contains interactionClass,region,boolean
+      case DDM_SUBSCRIBE_INTERACTION:
+      // Body contains interactionClass,region,boolean
+      case DDM_UNSUBSCRIBE_INTERACTION:
+      // Body contains objectClass,object,tag,handleArraySize,handleArray,
+      // regions
+      case DDM_REGISTER_OBJECT:
+        header.bodySize = 1 ;
+        break ;
+
+      // Header contains type,exception,size and
+      // FederationTime (relevant or zero) depending on boolean
+      // Body exists, contains label, boolean
+      case REQUEST_FEDERATION_SAVE:
+        // RFS without time (boolean=false) don't need date
+        if ( ! boolean )
+          {
+          header.date = 0 ;
+          }
+        header.bodySize = 1 ;
+        break ;
+
+      // Header contains type,exception,size and no more useful.
+      // Body is not empty.
+      case REQUEST_FEDERATION_RESTORE:
+      case REQUEST_FEDERATION_RESTORE_SUCCEEDED:
+      case REQUEST_FEDERATION_RESTORE_FAILED:
+        header.bodySize = 1 ;
+        break ;
+
+      // Header contains type,exception,size and no more useful.
+      // Body is not empty.
+      case REQUEST_OBJECT_ATTRIBUTE_VALUE_UPDATE:
+        header.bodySize = 1 ;
+        break ;
+
+      // Header contains type,exception,size and no more useful.
+      // Body is empty.        
+      case FEDERATE_SAVE_BEGUN:
+      case FEDERATE_SAVE_COMPLETE:
+      case FEDERATE_SAVE_NOT_COMPLETE:
+      case FEDERATION_SAVED:
+      case FEDERATION_NOT_SAVED:
+      case FEDERATE_RESTORE_COMPLETE:
+      case FEDERATE_RESTORE_NOT_COMPLETE:
+      case FEDERATION_RESTORED:
+      case FEDERATION_NOT_RESTORED:
+      case FEDERATION_RESTORE_BEGUN:
+      case ENABLE_ASYNCHRONOUS_DELIVERY:
+      case DISABLE_ASYNCHRONOUS_DELIVERY:
+        header.bodySize = 0 ;
+        break ;
+
+        // --- MessageJ_R_Struct --
+
+      // Header contains type,exception,size and no more usefull.
+      // Body contains ResignAction
+      case RESIGN_FEDERATION_EXECUTION:
+        header.bodySize = 1 ;
+        break ;
+
+      // Header contains type,exception,size and no more usefull.
+      // Body contains federate,label
+      case INITIATE_FEDERATE_RESTORE:
+        header.bodySize = 1 ;
+        break ;
+
+      // Header contains type,exception,size and no more usefull.
+      // Body contains federate,federationName,federateName
+      case JOIN_FEDERATION_EXECUTION:
+        header.bodySize = 1 ;
+        break ;
+
+      // Header contains type,exception,size and no more usefull.
+      // Body contains objectClass
+      case UNPUBLISH_OBJECT_CLASS:
+      case UNSUBSCRIBE_OBJECT_CLASS:
+      case START_REGISTRATION_FOR_OBJECT_CLASS:
+      case STOP_REGISTRATION_FOR_OBJECT_CLASS:
+        header.bodySize = 1 ;
+        break ;
+
+      // Header contains type,exception,size and no more usefull.
+      // Body contains interactionClass
+      case PUBLISH_INTERACTION_CLASS:
+      case UNPUBLISH_INTERACTION_CLASS:
+      case SUBSCRIBE_INTERACTION_CLASS:
+      case UNSUBSCRIBE_INTERACTION_CLASS:
+      case TURN_INTERACTIONS_ON:
+      case TURN_INTERACTIONS_OFF:
+        header.bodySize = 1 ;
+        break ;
+
+        // --- MessageO_I_Struct, Body not Empty ---
+
+      // FederationTime yet put in header
+      // Body contains objectClass,handleArraySize,handleArray
+      case PUBLISH_OBJECT_CLASS:
+      case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTES:
+        header.bodySize = 1 ;
+        break ;
+
+      // FederationTime yet put in header
+      // Body contains objectClass,object,tag,name,label,resignAction
+      case REGISTER_OBJECT_INSTANCE:
+        header.bodySize = 1 ;
+        break ;
+
+      // FederationTime yet put in header 
+      // Body contains objectClass,object,tag,name,label,resignAction    
+      case DELETE_OBJECT_INSTANCE:
+      case REMOVE_OBJECT_INSTANCE:
+        header.bodySize = 1 ;
+        break ;
+
+      // Body contains object    
+      case LOCAL_DELETE_OBJECT_INSTANCE:
+        header.bodySize = 1 ;
+        break ;
+
+      // FederationTime yet put in header
+      // Body contains objectClass,object,tag,name,label,resignAction
+      case DISCOVER_OBJECT_INSTANCE:
+        header.bodySize = 1 ;
+        break ;
+
+      // FederationTime yet in header
+      case GET_OBJECT_CLASS_HANDLE: // Body contains name
+      case GET_OBJECT_CLASS_NAME: // Body contains name
+      case GET_ATTRIBUTE_HANDLE: // B.c. name and attribute.
+      case GET_ATTRIBUTE_NAME: // B.c. name and attribute.
+        // header.VP.O_I.handle = objectClass ;
+        // header.VP.O_I.size = handleArraySize ;
+        // header.VP.O_I.date = getFederationTime() ;
+        header.bodySize = 1 ;
+        break ;
+
+      // FederationTime yet put in header
+      // Without time (boolean=false) no time needed (then zero)
+      // Body contains objectClass,handleArraySize,object,tag,handleArray,
+      // ValueArray,resignAction,boolean
+      case UPDATE_ATTRIBUTE_VALUES:
+      case REFLECT_ATTRIBUTE_VALUES:
+        if (  !boolean )
+          {
+          header.date = 0 ;
+          }
+        header.bodySize = 1 ;
+        break ;
+
+      // FederationTime yet put in header
+      // Without time (boolean=false) no time needed (then zero)
+      // Body contains interactionClass,handleArraySize,tag,handleArray,
+      // valueArray,region,resignAction
+      // and boolean (true with time, false without time)
+      case SEND_INTERACTION:
+      case RECEIVE_INTERACTION: 
+        if ( ! boolean )
+            {
+            header.VP.O_I.date = 0 ;
+            }
+        header.bodySize = 1 ;
+        break ;
+
+      // B.c. Tag, handleArray[],
+      // ValueArray[], resignAction
+      // FederationTime yet put in header
+      case GET_INTERACTION_CLASS_HANDLE: // Body contains name
+      case GET_INTERACTION_CLASS_NAME: // Body contains name
+      case GET_PARAMETER_HANDLE: // Body contains name and parameter
+      case GET_PARAMETER_NAME: // Body contains name and parameter
+        // header.VP.O_I.handle = interactionClass ;
+        // header.VP.O_I.size = handleArraySize ;
+        // header.VP.O_I.date = getFederationTime() ;
+        header.bodySize = 1 ;
+        break ;
+
+      case GET_SPACE_HANDLE:
+      case GET_SPACE_NAME:
+      case GET_DIMENSION_HANDLE:
+      case GET_DIMENSION_NAME:
+        header.VP.O_I.handle = space ;
+        header.VP.O_I.size = handleArraySize ;
+        header.VP.O_I.date = getFederationTime() ;
+        header.bodySize = 1 ;
+        break ;
+
+      // Body contains interactionClass,transport,order
+      case CHANGE_INTERACTION_TRANSPORTATION_TYPE:
+      case CHANGE_INTERACTION_ORDER_TYPE:
+        header.bodySize = 1 ;
+        break ;
+
+      // Body contains region
+      case DDM_DELETE_REGION:
+        //header.VP.ddm.region = region ;
+        header.bodySize = 1 ;
+        break ;
+
+      // Body contains region,extents
+      case DDM_MODIFY_REGION:
+       header.bodySize = 1 ;
+       break ;
+
+        // --- MessageT_O_Struct, Body not empty ---
+      // Header contains type,exception,size and no more usefull.
+      // Body contains handleArraySize,transport,order,object,handleArray
+      case CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE:
+      case CHANGE_ATTRIBUTE_ORDER_TYPE:
+        header.bodySize = 1 ;
+        break ;
+
+        // --- TimeStruct, No Body ---
+        // case REQUEST_FEDERATION_TIME:
+
+      // FederationTime stored in header
+      case QUERY_LBTS:
+      case QUERY_FEDERATE_TIME:
+      case TIME_ADVANCE_REQUEST:
+      case NEXT_EVENT_REQUEST:
+      case TIME_ADVANCE_GRANT:
+        // header.VP.time.date = getFederationTime() ;
+        header.bodySize = 0 ;
+        break ;
+
+
+      // FederationTime has been stored in header
+      // We store lookahead in place
+      // Body is empty
+      case MODIFY_LOOKAHEAD:
+      case QUERY_LOOKAHEAD:
+        header.date = lookahead ;
+        header.bodySize = 0 ;
+        break ;
+
+      // Body contains boolean
+      case ENABLE_TIME_REGULATION:
+      case DISABLE_TIME_REGULATION:
+      case ENABLE_TIME_CONSTRAINED:
+      case DISABLE_TIME_CONSTRAINED:
+      case TICK_REQUEST:
+        header.bodySize = 1 ;
+        break ;
+
+      case GET_OBJECT_INSTANCE_HANDLE:
+      case GET_OBJECT_INSTANCE_NAME:
+        header.VP.O_I.handle = object;
+        header.VP.O_I.size = handleArraySize ;
+        header.VP.O_I.date = getFederationTime() ;
+        header.bodySize = 1 ;
+        break ;
+        
+        // -- Default Handler --
+      default:
+        D.Out(pdExcept, "Unknown type %d in WriteHeader.", header.type);
+        throw RTIinternalError("Message: Unknown type for Header.");
+
+    }
+
+    // 4- If Header.bodySize = 0, send message and return RTI_FALSE,
+    // Else send nothing(will be done by WriteBody), and return RTI_TRUE.
+    if (header.bodySize == 0)
+        socket->send((const unsigned char *) &header, sizeof(MessageHeader));
+
+    return header.bodySize != 0 ;
+}
+
+// ---------------------------------------------------------------
+void
+Message::writeResignAction(MessageBody &)
+{
+    //assert(false);
+}
+
+// ---------------------------------------------------------------------------
+void
+Message::writeValueArray(MessageBody &body)
+{
+    // length and value are stored into valueArray 
+    // so we have to write length and then value with a writeBlock
+    for (int i = 0 ; i < handleArraySize ; i ++)
+        {
+        body.writeLongInt(valueArray[i].length) ;
+        body.writeBlock(valueArray[i].value, valueArray[i].length) ;
+    }
+}
+
+} // namespace certi
+
+// $Id: Message_W.cc,v 3.1 2007/10/26 13:00:08 rousse Exp $

Index: Message_RW.cc
===================================================================
RCS file: Message_RW.cc
diff -N Message_RW.cc
--- Message_RW.cc       25 Oct 2007 08:07:16 -0000      3.38
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,1282 +0,0 @@
-// ----------------------------------------------------------------------------
-// CERTI - HLA RunTime Infrastructure
-// Copyright (C) 2002-2006  ONERA
-//
-// This program is free software ; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser 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
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser 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
-//
-// $Id: Message_RW.cc,v 3.38 2007/10/25 08:07:16 rousse Exp $
-// ----------------------------------------------------------------------------
-
-
-#include "Message.hh"
-
-#include <cassert>
-
-using std::vector ;
-
-namespace certi {
-
-static pdCDebug D("RTIA_MSG","(LocalMESS) - ");
-static PrettyDebug G("GENDOC",__FILE__);
-
-// You can comment this out if you don't want to optimize network messages.
-#define USE_HEADER_AND_BODY
-
-void Message::trace(const char* context)
-{
-D.Mes(pdMessage,'M',this->type,context);
-}
-
-// ----------------------------------------------------------------------------
-//! Read NetworkMessage Objects from Socket objects.
-void
-Message::read(SocketUN *socket)
-    throw (NetworkError, NetworkSignal)
-{
-#ifdef USE_HEADER_AND_BODY
-
-    bool has_body = readHeader(socket);
-    if (has_body) readBody(socket);
-
-#else
-#error    
-    socket->receive((void *) this, sizeof(Message));
-#endif
-}
-
-// ----------------------------------------------------------------------------
-//! Read a Message Body from a Socket, should be called after ReadHeader.
-void
-Message::readBody(SocketUN *socket)
-{
-    assert(header.bodySize > 0);
-
-    MessageBody body(header.bodySize);
-
-    // 1. Read Body from socket.
-    socket->receive(body.getBuffer(), header.bodySize);
-        // FIXME EN: we must update the write pointer of the 
-        //           MessageBody because we have just written 
-        //           on it using direct pointer access !! (nasty usage)
-        body.addToWritePointer(header.bodySize);
-       
-    // 3. Read informations from Message Body according to message type.
-    if (header.exception != e_NO_EXCEPTION) {
-        body.readString(exceptionReason, MAX_EXCEPTION_REASON_LENGTH);
-    }
-    else {
- 
-        // 1- Prepare Body Structure according to Message Type
-                       //D.Mes(pdMessage, 'M', header.type);
-                       this->trace("RTIG::chooseProcessingMethod ");
-
-        switch(header.type) {
-
-            // --- No Variable Part, Body not empty ---
-
-          case CREATE_FEDERATION_EXECUTION:
-            readFederationName(body);
-            readFEDid(body) ;
-            break ;
-
-          case DESTROY_FEDERATION_EXECUTION:
-            readFederationName(body);
-            break ;
-
-          case REGISTER_FEDERATION_SYNCHRONIZATION_POINT:
-            readLabel(body);
-            readTag(body);
-            boolean = body.readLongInt();
-            // boolean true means federates set exists
-            if ( boolean )
-                {
-                handleArraySize = body.readShortInt();
-                readHandleArray(body);
-                }
-            break ;
-
-          case ANNOUNCE_SYNCHRONIZATION_POINT:
-          case REQUEST_FEDERATION_RESTORE_FAILED:
-            readLabel(body);
-            readTag(body);
-            break ;
-
-          case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:
-          case SYNCHRONIZATION_POINT_ACHIEVED:
-          case FEDERATION_SYNCHRONIZED:
-          case REQUEST_FEDERATION_RESTORE:
-          case REQUEST_FEDERATION_RESTORE_SUCCEEDED:
-          case INITIATE_FEDERATE_RESTORE:
-            readLabel(body);
-            break ;
-
-          case INITIATE_FEDERATE_SAVE:
-            readLabel(body);
-            break ;
-
-          case REQUEST_FEDERATION_SAVE:
-            readLabel(body);
-            // boolean true means with time (in the header)
-            boolean = body.readLongInt();
-            break ;
-
-          case IS_ATTRIBUTE_OWNED_BY_FEDERATE:
-          case QUERY_ATTRIBUTE_OWNERSHIP:
-            // B.c. Objectid, AttribHandle and Tag.
-            object = body.readLongInt();
-            attribute = body.readShortInt();
-            readTag(body);
-            break ;
-
-          case ATTRIBUTE_IS_NOT_OWNED:
-          case INFORM_ATTRIBUTE_OWNERSHIP:
-            object = body.readLongInt();
-            attribute = body.readShortInt();
-            federate = body.readShortInt();
-            break ;
-
-          case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-          case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
-          case ATTRIBUTE_OWNERSHIP_ACQUISITION:
-          case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
-            object = body.readLongInt();
-            handleArraySize = body.readShortInt();
-            readHandleArray(body);
-            readTag(body);
-            break ;
-
-          case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:
-          case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:
-          case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:
-          case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-          case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-          case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:
-          case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:
-          case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
-          case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:
-            object = body.readLongInt();
-            handleArraySize = body.readShortInt();
-            readHandleArray(body);
-            break ;
-
-         case DDM_ASSOCIATE_REGION:
-           object = body.readLongInt();
-           region = body.readLongInt();
-           boolean = body.readLongInt();
-           handleArraySize = body.readShortInt();
-            readHandleArray(body);
-           break ;
-
-         case DDM_REGISTER_OBJECT:
-           objectClass = body.readLongInt();
-           object = body.readLongInt();
-           readTag(body);
-           handleArraySize = body.readShortInt();
-            readHandleArray(body);
-           readRegions(body);
-           break ;
-
-         case DDM_SUBSCRIBE_ATTRIBUTES:
-           objectClass = body.readLongInt();
-           region = body.readLongInt();
-           boolean = body.readLongInt();
-           handleArraySize = body.readShortInt();
-            readHandleArray(body);
-           break ;
-
-         case DDM_UNASSOCIATE_REGION:
-           object = body.readLongInt();
-           region = body.readLongInt();
-           break ;
-
-         case DDM_UNSUBSCRIBE_ATTRIBUTES:          
-           objectClass = body.readLongInt();
-           region = body.readLongInt();
-           break ;
-
-         case DDM_SUBSCRIBE_INTERACTION:
-         case DDM_UNSUBSCRIBE_INTERACTION:
-           interactionClass = body.readLongInt();
-           region = body.readLongInt();
-           boolean = body.readLongInt();
-           break ;
-           
-          case GET_ATTRIBUTE_SPACE_HANDLE:
-            objectClass = body.readLongInt();
-            attribute = body.readLongInt();
-            space = body.readLongInt();
-            break ;
-
-          case DDM_CREATE_REGION:
-            space = body.readLongInt();
-            number = body.readLongInt();
-            region = body.readLongInt();
-            break ;
-
-          case GET_INTERACTION_SPACE_HANDLE:
-            interactionClass = body.readLongInt();
-            space = body.readLongInt();
-            break ;
-
-            // --- MessageJ_R_Struct --
-
-          case JOIN_FEDERATION_EXECUTION:
-            readFederationName(body);
-            readFederateName(body);
-            break ;
-
-            // --- MessageO_I_Struct ---
-
-          case PUBLISH_OBJECT_CLASS:
-          case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTES:
-            readHandleArray(body);
-            break ;
-
-          case REGISTER_OBJECT_INSTANCE:
-            object = body.readLongInt();
-            readName(body);
-            break ;
-
-          case UPDATE_ATTRIBUTE_VALUES:
-            // B.c. object, Tag, HandleArray[], ValueArray[] and RAction.
-            // and boolean (true means UAV with time, false without time)
-            object = body.readLongInt();
-            readTag(body);
-            readHandleArray(body);
-            readValueArray(body);
-            readResignAction(body);
-            boolean = body.readLongInt();
-            break ;
-
-          case REFLECT_ATTRIBUTE_VALUES:
-            // B.c. object, Tag, HandleArray[], ValueArray[] and RAction.
-            object = body.readLongInt();
-            readTag(body);
-            readHandleArray(body);
-            readValueArray(body);
-            readResignAction(body);
-            break ;
-
-          case DISCOVER_OBJECT_INSTANCE:
-          case DELETE_OBJECT_INSTANCE:
-          case REMOVE_OBJECT_INSTANCE:
-            // B.c. object, Tag, Label, RAction
-            object = body.readLongInt();
-            readTag(body);
-            readName(body);
-            readLabel(body);
-            readResignAction(body);
-            break ;
-
-          case GET_OBJECT_CLASS_HANDLE:
-          case GET_OBJECT_CLASS_NAME:
-          case GET_ATTRIBUTE_HANDLE:
-          case GET_ATTRIBUTE_NAME:
-            // B.c. Name(and attribute)
-            readName(body);
-            attribute = body.readShortInt();
-            break ;
-
-          case GET_SPACE_HANDLE:
-          case GET_SPACE_NAME:
-            this->readName(body);
-            this->space = body.readLongInt();
-            break ;
-
-          case GET_DIMENSION_HANDLE:
-          case GET_DIMENSION_NAME:
-            this->readName(body);
-            this->dimension = body.readLongInt();
-            this->space = body.readLongInt();
-            break ;
-
-          case SEND_INTERACTION:
-          case RECEIVE_INTERACTION:
-            // B.c. Tag, HandleArray[], ValueArray[], RAction
-            // and boolean (true means SI with time, false without time)
-            readTag(body);
-            readHandleArray(body);
-            readValueArray(body);
-           region = body.readLongInt();
-            readResignAction(body);
-            boolean = body.readLongInt();
-            break ;
-
-          case GET_INTERACTION_CLASS_HANDLE:
-          case GET_INTERACTION_CLASS_NAME:
-          case GET_PARAMETER_HANDLE:
-          case GET_PARAMETER_NAME:
-            // body contains Name and ParamHandle
-            readName(body);
-            parameter = body.readShortInt();
-            break ;
-
-            // --- MessageT_O_Struct, body not empty ---
-
-          case CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE:
-          case CHANGE_ATTRIBUTE_ORDER_TYPE:
-            // B.c. object, HandleArray
-            object = body.readLongInt();
-            readHandleArray(body);
-            break ;
-
-         case DDM_MODIFY_REGION:
-           readExtents(body);
-           break ;
-
-         case GET_OBJECT_INSTANCE_HANDLE:
-         case GET_OBJECT_INSTANCE_NAME:
-            object = body.readLongInt();
-           readName(body);
-           break;
-           
-            // -- Default Handler --
-
-          default:
-            D.Out(pdExcept, "Unknown Type %d in ReadBody.", header.type);
-            throw RTIinternalError("Message: Unknown Type for Body(Read).");
-        }
-    }
-}
-
-// ----------------------------------------------------------------------------
-/*! Read a Header from a socket, and process it to read its content. Return
-  RTI_TRUE if the ReadBody Method has to be called.
-*/
-bool
-Message::readHeader(SocketUN *socket)
-{
-    // 1- Read Header from Socket
-    socket->receive((const unsigned char *) &header, sizeof(MessageHeader));
-
-    // 2- Parse Header(Static Part)
-    type = header.type ;
-    exception = header.exception ;
-
-    // If the message carry an exception, the Body will only contain the
-    // exception reason.
-
-    if (exception != e_NO_EXCEPTION)
-        return true ;
-
-    // 2- Parse Header according to its type(Variable Part)
-    // NULL, UAV and SendInteraction are the most common ones.
-
-    switch(type) {
-
-        // --- No Variable Part, Body not empty ---
-
-      case CREATE_FEDERATION_EXECUTION: // Body contains NomFederation
-      case DESTROY_FEDERATION_EXECUTION: // Body contains NomFedere
-      case REGISTER_FEDERATION_SYNCHRONIZATION_POINT: // Body contains Label
-      case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:
-      case ANNOUNCE_SYNCHRONIZATION_POINT:
-      case SYNCHRONIZATION_POINT_ACHIEVED: // Body contains Label
-      case FEDERATION_SYNCHRONIZED:
-      case INITIATE_FEDERATE_SAVE:
-      case IS_ATTRIBUTE_OWNED_BY_FEDERATE:// B.c. object, attribute and Tag.
-      case QUERY_ATTRIBUTE_OWNERSHIP: // B.c. object and attribute.
-      case ATTRIBUTE_IS_NOT_OWNED:
-      case INFORM_ATTRIBUTE_OWNERSHIP:
-      case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-      case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
-      case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:
-      case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:
-      case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:
-      case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-      case ATTRIBUTE_OWNERSHIP_ACQUISITION:
-      case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
-      case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:
-      case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-      case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:
-      case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:
-      case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
-      case GET_ATTRIBUTE_SPACE_HANDLE:
-      case GET_INTERACTION_SPACE_HANDLE:
-      case DDM_CREATE_REGION:
-      case REQUEST_FEDERATION_RESTORE:
-      case REQUEST_FEDERATION_RESTORE_SUCCEEDED:
-      case REQUEST_FEDERATION_RESTORE_FAILED:
-      case FEDERATE_RESTORE_COMPLETE:
-      case FEDERATE_RESTORE_NOT_COMPLETE:
-      case FEDERATION_RESTORED:
-      case FEDERATION_NOT_RESTORED:
-      case FEDERATION_RESTORE_BEGUN:
-      case DDM_ASSOCIATE_REGION:
-      case DDM_UNASSOCIATE_REGION:
-      case DDM_SUBSCRIBE_ATTRIBUTES:
-      case DDM_UNSUBSCRIBE_ATTRIBUTES:
-      case DDM_SUBSCRIBE_INTERACTION:
-      case DDM_UNSUBSCRIBE_INTERACTION:
-      case DDM_REGISTER_OBJECT:
-        break ;
-
-      // Body empty
-      case ENABLE_ASYNCHRONOUS_DELIVERY:
-      case DISABLE_ASYNCHRONOUS_DELIVERY:
-        break;
-
-        // --- MessageJ_R_Struct --
-
-      case RESIGN_FEDERATION_EXECUTION: // No body
-        resignAction = header.VP.J_R.action ;
-        break ;
-
-      case INITIATE_FEDERATE_RESTORE:
-      case JOIN_FEDERATION_EXECUTION: // Body contains NomFederation&NomFedere
-        federate = header.VP.J_R.federate ;
-        break ;
-
-        // --- MessageO_I_Struct, No body ---
-
-      case UNPUBLISH_OBJECT_CLASS:
-      case UNSUBSCRIBE_OBJECT_CLASS:
-        objectClass = header.VP.O_I.handle ;
-        break ;
-
-
-      case PUBLISH_INTERACTION_CLASS:
-      case UNPUBLISH_INTERACTION_CLASS:
-      case SUBSCRIBE_INTERACTION_CLASS:
-      case UNSUBSCRIBE_INTERACTION_CLASS:
-      case TURN_INTERACTIONS_ON:
-      case TURN_INTERACTIONS_OFF:
-        interactionClass = header.VP.O_I.handle ;
-        break ;
-
-        // --- MessageO_I_Struct, body not Empty ---
-
-      // RFS without time will receive date=0
-      case REQUEST_FEDERATION_SAVE:
-        setFederationTime(header.VP.O_I.date);
-      break ;
-
-      case PUBLISH_OBJECT_CLASS: // Body contains HandleArray
-      case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTES: // Body contains HandleArray
-      case REGISTER_OBJECT_INSTANCE: // Body contains object
-      case DISCOVER_OBJECT_INSTANCE: // B.c. object, Tag and resignAction
-      case REFLECT_ATTRIBUTE_VALUES: // B.c. object, Tag, HandleArray[]
-        // and ValueArray[]
-      case DELETE_OBJECT_INSTANCE: // Body contains object, Tag.
-      case REMOVE_OBJECT_INSTANCE: // B.c. object, Tag, Label&resignAction
-      case GET_OBJECT_CLASS_HANDLE: // Body contains Name
-      case GET_OBJECT_CLASS_NAME: // Body contains Name
-      case GET_ATTRIBUTE_HANDLE: // B.c. Name and attribute.
-      case GET_ATTRIBUTE_NAME: // B.c. Name and attribute.
-        objectClass = header.VP.O_I.handle ;
-        handleArraySize = header.VP.O_I.size ;
-        setFederationTime(header.VP.O_I.date);
-        break ;
-
-     case UPDATE_ATTRIBUTE_VALUES: // B.c. object, Tag, HandleArray[]
-        // ValueArray[] and resignAction.
-        objectClass = header.VP.O_I.handle ;
-        handleArraySize = header.VP.O_I.size ;
-        setFederationTime(header.VP.O_I.date);
-        break ;
-
-      case SEND_INTERACTION: // B.c. Tag, HandleArray[], ValueArray[]
-      case RECEIVE_INTERACTION: // B.c. Tag, HandleArray[], ValueArray[], 
resignAction
-      case GET_INTERACTION_CLASS_HANDLE: // Body contains Name
-      case GET_INTERACTION_CLASS_NAME: // Body contains Name
-      case GET_PARAMETER_HANDLE: // Body contains Name and parameter
-      case GET_PARAMETER_NAME: // Body contains Name and parameter
-        interactionClass = header.VP.O_I.handle ;
-        handleArraySize = header.VP.O_I.size ;
-        setFederationTime(header.VP.O_I.date );
-        break ;
-
-      case GET_SPACE_HANDLE:
-      case GET_SPACE_NAME:
-      case GET_DIMENSION_NAME:
-      case GET_DIMENSION_HANDLE:
-        this->space = header.VP.O_I.handle ;
-        handleArraySize = header.VP.O_I.size ;
-        setFederationTime(header.VP.O_I.date );
-        break ;
-
-        // --- MessageT_O_Struct, No Body ---
-
-      case CHANGE_INTERACTION_TRANSPORTATION_TYPE:
-      case CHANGE_INTERACTION_ORDER_TYPE:
-        interactionClass = header.VP.T_O.handle ;
-        transport = header.VP.T_O.transport ;
-        order = header.VP.T_O.order ;
-        break ;
-
-        // Message_DDM, no body
-      case DDM_DELETE_REGION:
-        region = header.VP.ddm.region ;
-        break ;
-
-       // Message_DDM, Body
-      case DDM_MODIFY_REGION:
-       region = header.VP.ddm.region ;
-       break ; 
-       
-        // --- MessageT_O_Struct, Body not empty ---
-
-      case CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE: // B.c. object, HandleArray.
-      case CHANGE_ATTRIBUTE_ORDER_TYPE: // B.c. object, HandleArray.
-        handleArraySize = header.VP.T_O.size ;
-        transport = header.VP.T_O.transport ;
-        order = header.VP.T_O.order ;
-        break ;
-
-        // --- TimeStruct, No Body ---
-        // case REQUEST_FEDERATION_TIME:
-      case QUERY_LBTS:
-      case QUERY_FEDERATE_TIME:
-      case TIME_ADVANCE_REQUEST:
-      case NEXT_EVENT_REQUEST:
-      case TIME_ADVANCE_GRANT:
-        setFederationTime(header.VP.time.date );
-        break ;
-
-      case MODIFY_LOOKAHEAD:
-      case QUERY_LOOKAHEAD:
-        lookahead = header.VP.time.date ;
-        break ;
-
-      case ENABLE_TIME_REGULATION:
-      case DISABLE_TIME_REGULATION:
-      case ENABLE_TIME_CONSTRAINED:
-      case DISABLE_TIME_CONSTRAINED:
-      case TICK_REQUEST:
-        boolean = header.VP.time.mode ;
-        break ;
-
-      case GET_OBJECT_INSTANCE_HANDLE:
-      case GET_OBJECT_INSTANCE_NAME:
-       object = header.VP.O_I.handle;
-        handleArraySize = header.VP.O_I.size ;
-        setFederationTime(header.VP.O_I.date);
-        break ;
-
-      default:
-        D.Out(pdExcept, "Unknown type %d in ReadHeader.", header.type);
-        throw RTIinternalError("Message: Received unknown Header type.");
-    }
-
-    // 4- Return depends on body
-    return header.bodySize != 0 ;
-}
-
-// ----------------------------------------------------------------------------
-void
-Message::readHandleArray(MessageBody &body)
-{
-    body.readBlock((char *) handleArray, handleArraySize * 
sizeof(AttributeHandle));
-}
-
-// ----------------------------------------------------------------------------
-void
-Message::readLabel(MessageBody &body)
-{
-    body.readString(label, MAX_USER_TAG_LENGTH);
-}
-
-// ----------------------------------------------------------------------------
-void
-Message::readName(MessageBody &body)
-{
-    body.readString(name, MAX_USER_TAG_LENGTH);
-}
-
-// ----------------------------------------------------------------------------
-void
-Message::readFederationName(MessageBody &body)
-{
-    body.readString(federationName, MAX_FEDERATION_NAME_LENGTH);
-}
-
-// ----------------------------------------------------------------------------
-void
-Message::readFederateName(MessageBody &body)
-{
-    body.readString(federateName, MAX_FEDERATE_NAME_LENGTH);
-}
-
-// ----------------------------------------------------------------------------
-void
-Message::readResignAction(MessageBody &)
-{
-    // BUG: Should do something.
-}
-
-// ----------------------------------------------------------------------------
-void
-Message::readTag(MessageBody &body)
-{
-    body.readString(tag, MAX_USER_TAG_LENGTH);
-}
-
-// ----------------------------------------------------------------------------
-void
-Message::readFEDid(MessageBody &body)
-{
-    body.readString(FEDid, MAX_FEDFILE_NAME_LENGTH);
-}
-// ----------------------------------------------------------------------------
-//! readValueArray.
-void
-Message::readValueArray(MessageBody &body)
-{
-// valueArray contains length and value
-// so we have to read length and then value with a readBlock
-    for (int i = 0 ; i < handleArraySize ; i ++)
-        {
-        valueArray[i].length = body.readLongInt() ;
-        body.readBlock((char *) valueArray[i].value, valueArray[i].length);
-        }
-}
-
-// ----------------------------------------------------------------------------
-//! Write NetworkMessage Objects to Socket objects.
-void
-Message::write(SocketUN *socket)
-    throw (NetworkError, NetworkSignal)
-{
-#ifdef USE_HEADER_AND_BODY
-
-    bool result ;
-
-    result = writeHeader(socket);
-    if (result)
-        writeBody(socket);
-
-#else
-    socket->send((void *) this, sizeof(Message));
-#endif
-}
-
-// ----------------------------------------------------------------------------
-/*! Prepare and write a Body to a socket, should be called after WriteHeader.
-  The message is written onto the socket by WriteHeader if no body is
-  required, or by WriteBody is a body has been required by WriteHeader.
-*/
-void
-Message::writeBody(SocketUN *socket)
-{
-    MessageBody body ;
-
-    // 0- Copy the Header at the beginning of the Body, in order to
-    // make a single Socket->Emettre call while sending both.
-    // WARNING: As the Body size is not known yet, we will have to
-    // change it in the copy also!
-    body.writeBlock((char *) &header, sizeof(MessageHeader));
-
-    // If the message carry an exception, the Body will only contain the
-    // exception reason.
-
-    if (header.exception != e_NO_EXCEPTION) {
-        body.writeString(exceptionReason);
-    }
-    else {
-
-        // 1- Prepare Body Structure according to Message type
-        switch(header.type) {
-
-            // --- No Variable Part, Body not empty ---
-
-          case CREATE_FEDERATION_EXECUTION:
-            body.writeString(federationName);
-            body.writeString(FEDid);
-            break ;
-
-          case DESTROY_FEDERATION_EXECUTION:
-            body.writeString(federationName);
-            break ;
-
-          case REGISTER_FEDERATION_SYNCHRONIZATION_POINT:
-            body.writeString(label);
-            body.writeString(tag);
-            body.writeLongInt(boolean);
-            // boolean true means federates set exists
-            if ( boolean )
-                {
-                body.writeShortInt(handleArraySize);
-                writeHandleArray(body);
-                }
-            break ;
-
-          // RFS needs label and boolean in the body and time in the header
-          case REQUEST_FEDERATION_SAVE:
-            body.writeString(label);
-            body.writeLongInt(boolean);
-            break;
-
-          case INITIATE_FEDERATE_SAVE:
-            body.writeString(label);
-            break;
-
-          case ANNOUNCE_SYNCHRONIZATION_POINT:
-          case REQUEST_FEDERATION_RESTORE_FAILED:
-            body.writeString(label);
-            body.writeString(tag);
-            break ;
-
-          case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:
-          case SYNCHRONIZATION_POINT_ACHIEVED:
-          case FEDERATION_SYNCHRONIZED:
-            body.writeString(label);
-            break ;
-
-          case IS_ATTRIBUTE_OWNED_BY_FEDERATE:
-          case QUERY_ATTRIBUTE_OWNERSHIP:
-            // B.c. object, attribute, Tag
-            body.writeLongInt(object);
-            body.writeShortInt(attribute);
-            body.writeString(tag);
-            break ;
-
-          case ATTRIBUTE_IS_NOT_OWNED:
-          case INFORM_ATTRIBUTE_OWNERSHIP:
-            body.writeLongInt(object);
-            body.writeShortInt(attribute);
-            body.writeShortInt(federate);
-            break ;
-
-          case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-          case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
-          case ATTRIBUTE_OWNERSHIP_ACQUISITION:
-          case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
-            body.writeLongInt(object);
-            body.writeShortInt(handleArraySize);
-            writeHandleArray(body);
-            body.writeString(tag);
-            break ;
-
-          case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:
-          case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:
-          case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:
-          case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-          case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:
-          case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-          case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:
-          case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:
-          case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
-            body.writeLongInt(object);
-            body.writeShortInt(handleArraySize);
-            writeHandleArray(body);
-            break ;
-
-         case DDM_ASSOCIATE_REGION:
-           body.writeLongInt(object);
-           body.writeLongInt(region);
-           body.writeLongInt(boolean);
-            body.writeShortInt(handleArraySize);
-            writeHandleArray(body);
-           break ;
-
-         case DDM_REGISTER_OBJECT:
-           body.writeLongInt(objectClass);
-           body.writeLongInt(object);
-           body.writeString(tag);
-            body.writeShortInt(handleArraySize);
-            writeHandleArray(body);
-           writeRegions(body);
-           break ;
-
-         case DDM_SUBSCRIBE_ATTRIBUTES:
-           body.writeLongInt(objectClass);
-           body.writeLongInt(region);
-           body.writeLongInt(boolean);
-            body.writeShortInt(handleArraySize);
-            writeHandleArray(body);
-           break ;
-
-         case DDM_UNASSOCIATE_REGION:
-           body.writeLongInt(object);
-           body.writeLongInt(region);
-           break ;
-
-         case DDM_UNSUBSCRIBE_ATTRIBUTES:
-           body.writeLongInt(objectClass);
-           body.writeLongInt(region);
-           break ;
-           
-         case DDM_SUBSCRIBE_INTERACTION:
-         case DDM_UNSUBSCRIBE_INTERACTION:
-           body.writeLongInt(interactionClass);
-           body.writeLongInt(region);
-           body.writeLongInt(boolean);
-           break ;
-           
-          case GET_ATTRIBUTE_SPACE_HANDLE:
-            body.writeLongInt(objectClass);
-            body.writeLongInt(attribute);
-            body.writeLongInt(space);
-            break ;
-
-          case DDM_CREATE_REGION:
-            body.writeLongInt(space);
-            body.writeLongInt(number);
-            body.writeLongInt(region);
-            break ;
-
-          case GET_INTERACTION_SPACE_HANDLE:
-            body.writeLongInt(interactionClass);
-            body.writeLongInt(space);
-            break ;
-
-            // --- MessageJ_R_Struct --
-
-          case JOIN_FEDERATION_EXECUTION:
-            body.writeString(federationName);
-            body.writeString(federateName);
-            break ;
-
-            // --- MessageO_I_Struct ---
-
-          case PUBLISH_OBJECT_CLASS:
-          case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTES:
-            writeHandleArray(body);
-            break ;
-
-          case REGISTER_OBJECT_INSTANCE:
-            body.writeLongInt(object);
-            body.writeString(name);
-            break ;
-
-          case UPDATE_ATTRIBUTE_VALUES:
-            // B.c. object, Tag, handleArray[], ValueArray[] and resignAction.
-            // and also a boolean (true UAV or RAV with time, false without 
time)
-            body.writeLongInt(object);
-            body.writeString(tag);
-            writeHandleArray(body);
-            writeValueArray(body);
-            writeResignAction(body);
-            body.writeLongInt(boolean);
-            break ;
-
-          case REFLECT_ATTRIBUTE_VALUES:
-            // B.c. object, Tag, handleArray[], ValueArray[] and resignAction.
-            // and also a boolean (true UAV or RAV with time, false without 
time)
-            body.writeLongInt(object);
-            body.writeString(tag);
-            writeHandleArray(body);
-            writeValueArray(body);
-            writeResignAction(body);
-            body.writeLongInt(boolean);
-            break ;
-
-          case DISCOVER_OBJECT_INSTANCE:
-          case DELETE_OBJECT_INSTANCE:
-          case REMOVE_OBJECT_INSTANCE:
-            // B.c. object, Tag, label, resignAction
-            body.writeLongInt(object);
-            body.writeString(tag);
-            body.writeString(name);
-            body.writeString(label);
-            writeResignAction(body);
-            break ;
-
-          case GET_OBJECT_CLASS_HANDLE:
-          case GET_OBJECT_CLASS_NAME:
-          case GET_ATTRIBUTE_HANDLE:
-          case GET_ATTRIBUTE_NAME:
-            // B.c. name(and attribute)
-            body.writeString(name);
-            body.writeShortInt(attribute);
-            break ;
-
-          case GET_SPACE_HANDLE:
-          case GET_SPACE_NAME:
-            body.writeString(name);
-            body.writeLongInt(space);
-            break ;
-
-          case GET_DIMENSION_HANDLE:
-          case GET_DIMENSION_NAME:
-            body.writeString(name);
-            body.writeLongInt(dimension);
-            body.writeLongInt(space);
-            break ;
-
-          case SEND_INTERACTION:
-          case RECEIVE_INTERACTION:
-            // B.c. Tag, HandleArray[], ValueArray[], resignAction
-           // and also a boolean (true SI or RI with time, false without time)
-            body.writeString(tag);
-            writeHandleArray(body);
-            writeValueArray(body);
-           body.writeLongInt(region);
-            writeResignAction(body);
-            body.writeLongInt(boolean);
-            break ;
-
-          case GET_INTERACTION_CLASS_HANDLE:
-          case GET_INTERACTION_CLASS_NAME:
-          case GET_PARAMETER_HANDLE:
-          case GET_PARAMETER_NAME:
-            // Body contains name and parameter
-            body.writeString(name);
-            body.writeShortInt(parameter);
-            break ;
-
-
-            // --- MessageT_O_Struct, Body not empty ---
-
-          case CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE:
-          case CHANGE_ATTRIBUTE_ORDER_TYPE:
-            // B.c. object, HandleArray
-            body.writeLongInt(object);
-            writeHandleArray(body);
-            break ;
-
-         case DDM_MODIFY_REGION:
-           writeExtents(body);
-           break ;
-           
-         case GET_OBJECT_INSTANCE_HANDLE:
-         case GET_OBJECT_INSTANCE_NAME :
-           body.writeLongInt(object);
-           body.writeString(name);
-           break;
-           
-            // -- Default Handler --
-
-          default:
-            D.Out(pdExcept, "Unknown type %d in Writebody.", header.type);
-            throw RTIinternalError("Message: Unknown type for body.");
-
-        }
-    }
-
-    // 2- Set Header.bodySize
-
-    // Body Size does not include the copy of the Header!
-    header.bodySize = body.size() - sizeof(MessageHeader);
-
-    // Put the real Body Size in the copy of the Header.
-    (reinterpret_cast<MessageHeader *>(body.getBufferModeRW()))->bodySize = 
header.bodySize ;
-
-    // 3- Write Header to socket, then write Body to socket.
-    // socket->send((void *) &Header, sizeof(MessageHeader));
-    socket->send(body.getBuffer(), body.size());
-}
-
-// ----------------------------------------------------------------------------
-void
-Message::writeHandleArray(MessageBody &body)
-{
-    body.writeBlock((char *) handleArray, handleArraySize * 
sizeof(AttributeHandle));
-}
-
-// ----------------------------------------------------------------------------
-/*! Prepare and Write a Header to a Socket, and return RTI_TRUE if the
-  WriteBody method has to be called.
-  The message is written onto the socket by WriteHeader if no body is
-  required, or by WriteBody is a body has been required by WriteHeader.
-*/
-bool
-Message::writeHeader(SocketUN *socket)
-{
-    // 1- Clear Header
-    memset((void *) &header, '\0', sizeof(MessageHeader));
-
-    // 2- Fill Header(Static Part)
-    header.type = this->type ;
-    header.exception = this->exception ;
-
-    // If the message carry an exception, the Body will only contain the
-    // exception reason.
-
-    if (exception != e_NO_EXCEPTION) {
-        header.bodySize = 1 ;
-        return true ;
-    }
-
-    // 3- Fill Header(Variable Part)[Sorted by Variable part type]
-    // Note: Header.bodySize is not set to the actual Body size, but
-    // to zero to indicate there is no Body, or 1 if a Body is needed.
-
-    switch(this->type) {
-
-        // --- No Variable Part, Body not empty ---
-
-      case CREATE_FEDERATION_EXECUTION: // Body contains federationName
-      case DESTROY_FEDERATION_EXECUTION: // Body contains federationName
-      case REGISTER_FEDERATION_SYNCHRONIZATION_POINT: // Body contains Label
-      case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:
-      case ANNOUNCE_SYNCHRONIZATION_POINT:
-      case SYNCHRONIZATION_POINT_ACHIEVED: // Body contains Label
-      case FEDERATION_SYNCHRONIZED:
-      case IS_ATTRIBUTE_OWNED_BY_FEDERATE:// B.c. object, attribute and Tag.
-      case QUERY_ATTRIBUTE_OWNERSHIP: // B.c. object and attribute.
-      case ATTRIBUTE_IS_NOT_OWNED:
-      case INFORM_ATTRIBUTE_OWNERSHIP:
-      case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-      case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
-      case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:
-      case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:
-      case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:
-      case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-      case ATTRIBUTE_OWNERSHIP_ACQUISITION:
-      case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
-      case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:
-      case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
-      case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:
-      case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:
-      case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
-      case GET_ATTRIBUTE_SPACE_HANDLE:
-      case GET_INTERACTION_SPACE_HANDLE:
-      case DDM_CREATE_REGION:
-      case DDM_ASSOCIATE_REGION:
-      case DDM_UNASSOCIATE_REGION:
-      case DDM_SUBSCRIBE_ATTRIBUTES:
-      case DDM_UNSUBSCRIBE_ATTRIBUTES:
-      case DDM_SUBSCRIBE_INTERACTION:
-      case DDM_UNSUBSCRIBE_INTERACTION:
-      case DDM_REGISTER_OBJECT:
-        header.bodySize = 1 ;
-        break ;
-
-      case REQUEST_FEDERATION_SAVE: // Body contains Label
-        // RFS with time (boolean=true) needs date
-        if ( boolean )
-            header.VP.O_I.date = getFederationTime() ;
-        else
-            header.VP.O_I.date = 0 ;
-        header.bodySize = 1 ;
-        break ;
-
-      case INITIATE_FEDERATE_SAVE: // Body contains label
-        header.bodySize = 1 ;
-        break ;
- 
-      // Body empty       
-      case FEDERATE_SAVE_BEGUN:
-      case FEDERATE_SAVE_COMPLETE:
-      case FEDERATE_SAVE_NOT_COMPLETE:
-      case FEDERATION_SAVED:
-      case FEDERATION_NOT_SAVED:
-      case REQUEST_FEDERATION_RESTORE:
-      case REQUEST_FEDERATION_RESTORE_SUCCEEDED:
-      case REQUEST_FEDERATION_RESTORE_FAILED:
-      case FEDERATE_RESTORE_COMPLETE:
-      case FEDERATE_RESTORE_NOT_COMPLETE:
-      case FEDERATION_RESTORED:
-      case FEDERATION_NOT_RESTORED:
-      case FEDERATION_RESTORE_BEGUN:
-      case ENABLE_ASYNCHRONOUS_DELIVERY:
-      case DISABLE_ASYNCHRONOUS_DELIVERY:
-        header.bodySize = 0 ;
-        break ;
-
-        // --- MessageJ_R_Struct --
-
-      case RESIGN_FEDERATION_EXECUTION: // No Body
-        header.VP.J_R.action = resignAction ;
-        header.bodySize = 0 ;
-        break ;
-
-      case INITIATE_FEDERATE_RESTORE:
-      case JOIN_FEDERATION_EXECUTION: // Body contains 
federationName&federateName
-        header.VP.J_R.federate = federate ;
-        header.bodySize = 1 ;
-        break ;
-
-        // --- MessageO_I_Struct, No Body ---
-
-      case UNPUBLISH_OBJECT_CLASS:
-      case UNSUBSCRIBE_OBJECT_CLASS:
-        header.VP.O_I.handle = this->objectClass ;
-        header.bodySize = 0 ;
-        break ;
-
-      case PUBLISH_INTERACTION_CLASS:
-      case UNPUBLISH_INTERACTION_CLASS:
-      case SUBSCRIBE_INTERACTION_CLASS:
-      case UNSUBSCRIBE_INTERACTION_CLASS:
-      case TURN_INTERACTIONS_ON:
-      case TURN_INTERACTIONS_OFF:
-        header.VP.O_I.handle = this->interactionClass ;
-        header.bodySize = 0 ;
-        break ;
-
-        // --- MessageO_I_Struct, Body not Empty ---
-
-      case PUBLISH_OBJECT_CLASS: // Body contains handleArray
-      case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTES: // Body contains handleArray
-      case REGISTER_OBJECT_INSTANCE: // Body contains object
-      case DISCOVER_OBJECT_INSTANCE: // B.c. object, Tag and resignAction
-      case REFLECT_ATTRIBUTE_VALUES: // B.c. object, Tag, handleArray[]
-        // and ValueArray[]
-      case DELETE_OBJECT_INSTANCE: // Body contains object, Tag.
-      case REMOVE_OBJECT_INSTANCE: // B.c. object, Tag, label&resignAction
-      case GET_OBJECT_CLASS_HANDLE: // Body contains name
-      case GET_OBJECT_CLASS_NAME: // Body contains name
-      case GET_ATTRIBUTE_HANDLE: // B.c. name and attribute.
-      case GET_ATTRIBUTE_NAME: // B.c. name and attribute.
-        header.VP.O_I.handle = objectClass ;
-        header.VP.O_I.size = handleArraySize ;
-        header.VP.O_I.date = getFederationTime() ;
-        header.bodySize = 1 ;
-        break ;
-
-      case UPDATE_ATTRIBUTE_VALUES: // B.c. object, Tag, handleArray[]
-        // ValueArray[] and resignAction.
-        header.VP.O_I.handle = objectClass ;
-        header.VP.O_I.size = handleArraySize ;
-        // UAV with time (boolean=true) needs date
-        if ( boolean )
-            header.VP.O_I.date = getFederationTime() ;
-        else
-            header.VP.O_I.date = 0 ;
-        header.bodySize = 1 ;
-        break ;
-
-      case SEND_INTERACTION: // B.c. Tag, handleArray[], ValueArray[]
-      case RECEIVE_INTERACTION: 
-        header.VP.O_I.handle = interactionClass ;
-        header.VP.O_I.size = handleArraySize ;
-       // SI with time (boolean=true) needs date
-        if ( boolean )
-            header.VP.O_I.date = getFederationTime() ;
-        else
-            header.VP.O_I.date = 0 ;
-        header.bodySize = 1 ;
-        break ;
-
-      // B.c. Tag, handleArray[],
-      // ValueArray[], resignAction
-      case GET_INTERACTION_CLASS_HANDLE: // Body contains name
-      case GET_INTERACTION_CLASS_NAME: // Body contains name
-      case GET_PARAMETER_HANDLE: // Body contains name and parameter
-      case GET_PARAMETER_NAME: // Body contains name and parameter
-        header.VP.O_I.handle = interactionClass ;
-        header.VP.O_I.size = handleArraySize ;
-        header.VP.O_I.date = getFederationTime() ;
-        header.bodySize = 1 ;
-        break ;
-
-      case GET_SPACE_HANDLE:
-      case GET_SPACE_NAME:
-      case GET_DIMENSION_HANDLE:
-      case GET_DIMENSION_NAME:
-        header.VP.O_I.handle = space ;
-        header.VP.O_I.size = handleArraySize ;
-        header.VP.O_I.date = getFederationTime() ;
-        header.bodySize = 1 ;
-        break ;
-
-        // --- MessageT_O_Struct, No Body ---
-
-      case CHANGE_INTERACTION_TRANSPORTATION_TYPE:
-      case CHANGE_INTERACTION_ORDER_TYPE:
-        header.VP.T_O.handle = interactionClass ;
-        header.VP.T_O.transport = transport ;
-        header.VP.T_O.order = order ;
-        header.bodySize = 0 ;
-        break ;
-
-        // Message_DDM, no body
-      case DDM_DELETE_REGION:
-        header.VP.ddm.region = region ;
-        header.bodySize = 0 ;
-        break ;
-
-       // Message_DDM, Body
-      case DDM_MODIFY_REGION:
-       header.VP.ddm.region = region ;
-       header.bodySize = 1 ;
-       break ;
-
-        // --- MessageT_O_Struct, Body not empty ---
-
-      case CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE: // B.c. object, handleArray.
-      case CHANGE_ATTRIBUTE_ORDER_TYPE: // B.c. object, handleArray.
-        header.VP.T_O.size = handleArraySize ;
-        header.VP.T_O.transport = transport ;
-        header.VP.T_O.order = order ;
-        header.bodySize = 1 ;
-        break ;
-
-        // --- TimeStruct, No Body ---
-        // case REQUEST_FEDERATION_TIME:
-      case QUERY_LBTS:
-      case QUERY_FEDERATE_TIME:
-      case TIME_ADVANCE_REQUEST:
-      case NEXT_EVENT_REQUEST:
-      case TIME_ADVANCE_GRANT:
-        header.VP.time.date = getFederationTime() ;
-        header.bodySize = 0 ;
-        break ;
-
-
-      case MODIFY_LOOKAHEAD:
-      case QUERY_LOOKAHEAD:
-        header.VP.time.date = lookahead ;
-        header.bodySize = 0 ;
-        break ;
-
-      case ENABLE_TIME_REGULATION:
-      case DISABLE_TIME_REGULATION:
-      case ENABLE_TIME_CONSTRAINED:
-      case DISABLE_TIME_CONSTRAINED:
-      case TICK_REQUEST:
-        header.VP.time.mode = boolean ;
-        header.bodySize = 0 ;
-        break ;
-
-      case GET_OBJECT_INSTANCE_HANDLE:
-      case GET_OBJECT_INSTANCE_NAME:
-        header.VP.O_I.handle = object;
-        header.VP.O_I.size = handleArraySize ;
-        header.VP.O_I.date = getFederationTime() ;
-        header.bodySize = 1 ;
-        break ;
-
-        // -- Default Handler --
-      default:
-        D.Out(pdExcept, "Unknown type %d in WriteHeader.", header.type);
-        throw RTIinternalError("Message: Unknown type for Header.");
-
-    }
-
-    // 4- If Header.bodySize = 0, send message and return RTI_FALSE,
-    // Else send nothing(will be done by WriteBody), and return RTI_TRUE.
-    if (header.bodySize == 0)
-        socket->send((const unsigned char *) &header, sizeof(MessageHeader));
-
-    return header.bodySize != 0 ;
-}
-
-// ---------------------------------------------------------------
-void
-Message::writeResignAction(MessageBody &)
-{
-    //assert(false);
-}
-
-// ---------------------------------------------------------------------------
-void
-Message::writeValueArray(MessageBody &body)
-{
-    // length and value are stored into valueArray 
-    // so we have to write length and then value with a writeBlock
-    for (int i = 0 ; i < handleArraySize ; i ++)
-        {
-        body.writeLongInt(valueArray[i].length) ;
-        body.writeBlock(valueArray[i].value, valueArray[i].length) ;
-    }
-}
-
-} // namespace certi
-
-// $Id: Message_RW.cc,v 3.38 2007/10/25 08:07:16 rousse Exp $




reply via email to

[Prev in Thread] Current Thread [Next in Thread]