VR-Link API Documentation for HLA Evolved
dExerciseConn.h
Go to the documentation of this file.
00001 /*********************************************************************
00002 ** Copyright (c) 1992-2010 VT MAK
00003 ** All rights reserved.
00004 *********************************************************************/
00008 
00009 #if DtDIS
00010 
00011 #ifndef DtDisExerciseConn_H_
00012 #define DtDisExerciseConn_H_
00013 
00014 #include <vlutil/vlMachineTypes.h>
00015 #include "pduCbMgr.h"
00016 #include <vlpi/disEnums.h>
00017 #include "packets/pduHeader.h"
00018 #include "baseExConn.h"
00019 #include "dStateMsg.h"
00020 #include "dInteraction.h"
00021 #include <matrix/vlMath.h>
00022 #include <vlutil/vlHashlist.h>
00023 #include "pduFactory.h"
00024 #include <vlutil/vlTimeStampType.h>
00025 #include "eventId.h"
00026 #include <vlutil/vlVersion.h>
00027 
00028 #include <vlutil/vlInetDevice.h>
00029 #include <vlutil/vlInetEndpoint.h>
00030 #include <vlutil/vlInetAddr.h>
00031 #include <vlutil/vlInetSocket.h>
00032 
00033 class DtPdu;
00034 class DtDisObjectManager;
00035 class DtExerciseConnInitializer;
00036 class DtInetDevice;
00037 class DtDisSocket;
00038 
00040 const DtExerciseId DtMaxExerciseId = 255;
00042 const DtExerciseId DtAnyExercise   = 0;
00043 
00053 class DT_DLL_VL DtExerciseConn : public DtBaseExerciseConn
00054 {
00055 public:
00056 
00057    typedef int (*DtPredicate)(DtPdu *pdu, void *arg);
00058 
00060    enum {
00061       DtNET_READ_SUCCESS    =0, 
00062       DtNET_READ_NO_PACKETS      =1, 
00063       DtNET_READ_BAD_PACKET      =2, 
00064       DtNET_READ_SERVER_MSG      =3, 
00065       DtNET_READ_SIZE_MISMATCH   =4 
00066    };
00067    enum
00068    {
00069       DtPROCESS_PDU_SUCCESS      =0,
00070       DtPROCESS_PDU_WRONG_EXID   =5,
00071       DtPROCESS_PDU_NO_PDU       =6,
00072       DtNET_READ_FILTERED_PACKET =7
00073    };
00074 
00083    enum InitializationStatus {
00084       DtINIT_SUCCESS             =0, 
00085       DtCOULD_NOT_CREATE_SOCKET  =1  
00086    };
00087 
00088 public:
00089 
00096    DtExerciseConn(const DtExerciseConnInitializer& initial, InitializationStatus* status = 0);
00097 
00100    DtExerciseConn(int port, int exercise_id, 
00101       int site_id, int application_num, 
00102       InitializationStatus* status = 0, bool use_async_io = false,
00103       bool useIpv6 = false, bool suppressSelfReflect = false);
00104 
00107    DtExerciseConn(int port, const DtInetAddr& destAddr, int exercise_id, 
00108       int site_id, int application_num, InitializationStatus* status = 0, 
00109       bool use_async_io = false, bool suppressSelfReflect = false);
00110 
00113    DtExerciseConn(DtInetSocket* skt, int exercise_id, 
00114       int site_id, int application_num, InitializationStatus* status = 0);
00115 
00117    virtual ~DtExerciseConn();
00118 
00119 private:
00120 
00122    DtExerciseConn(const DtExerciseConn& orig);
00123 
00125    DtExerciseConn& operator=(const DtExerciseConn& orig);
00126 
00127 public:
00128 
00129 
00133    virtual void addPduCallback( DtPduKind pduKind, DtPduCallbackFcn fcn, void *usr);
00134 
00138    virtual void removePduCallback( DtPduKind pduKind, DtPduCallbackFcn fcn, void *usr);
00139 
00145    virtual int drainInput(DtTime timeout=-1, int nReadPerTimeCheck=100);
00146 
00149    virtual int readAndProcess(void);
00150 
00154    virtual int processPdu(DtPdu *pdu);
00155 
00160    virtual DtPdu *netRead(int *retCode = 0);
00161 
00167    virtual void addInterestInPduKind(DtPduKind kind);
00168 
00174    virtual void subtractInterestInPduKind(DtPduKind kind);
00175 
00180    virtual DtPduKind readUntil(DtPredicate predicate, void *arg, 
00181       DtTime timeout, DtTime sleepTime=0.1);
00182 
00185    virtual void addInterestInMcastAddr(const DtInetAddr& addr);
00186 
00189    virtual void subtractInterestInMcastAddr(const DtInetAddr& addr);
00190 
00192    virtual void send(const DtStateMsg &msg);
00193 
00195    virtual void send(const DtInteraction &msg);
00196 
00198    virtual void sendStamped(const DtStateMsg &msg);
00199 
00201    virtual void sendStamped(const DtInteraction &msg);
00202 
00207    virtual int send(
00208       const DtPdu &pdu, const DtInetAddr* addr = 0);
00209 
00215    virtual int sendStamped(
00216       const DtPdu &pdu, const DtInetAddr* addr = 0);
00217 
00220    virtual DtInetAddr* destinationAddr(const DtPdu &pdu);
00221 
00228    virtual bool addDestination(const DtInetAddr& destination, DtU16 port=0);
00229 
00236    virtual bool removeDestination(const DtInetAddr& destination, DtU16 port=0);
00237 
00239    virtual void setExerciseId(int exercise_id);
00240 
00242    virtual DtExerciseId exerciseId() const;
00243 
00246    virtual const DtEventID& nextEventId();
00247 
00249    virtual DtInetSocket* socket();
00250 
00251 
00259    virtual DtPduFactory *pduFactory();
00260 
00266    virtual void setPduFactory(DtPduFactory* fact);
00267 
00269    virtual void enableFiltering();
00270 
00272    virtual void disableFiltering();
00273 
00275    virtual void setTimeStampType(DtTimeStampType relOrAbs);
00276 
00278    virtual DtTimeStampType timeStampType() const;
00279 
00283    virtual void setTimeStampType(int relOrAbs);
00284 
00286    virtual DtDisObjectManager* disObjectManager();
00287 
00288 public:
00289 
00291    static DtString vrlinkVersion();
00292 
00294    static const int nSizeMismatchComplain;
00295 
00296 protected:
00297 
00298 
00302    virtual DtTime currentTimeForStamping();
00303 
00305    void init0(int port, int exerId, int siteId, int applNum, 
00306       InitializationStatus* status, bool async_io, bool useIpv6, 
00307       bool suppressSelfReflect);
00308    
00310    void init0(DtInetSocket* s, int exerId, int siteId, int applNum, 
00311       InitializationStatus* status);
00312 
00313    virtual void setRemoteEndpoint( const DtInetAddr& addr, int port );
00315 
00316    void init(DtInetSocket* s, int deleteSkt, 
00317       int exerId, int siteId, int applNum, InitializationStatus* status);
00318 
00319    DtDisSocket* initializeSocket(const DtInetAddr& address, int port, 
00320       bool useAsyncIo, DtInetDevice* device, bool suppressSelfReflect);
00321 
00322 protected:
00323    DtExerciseId myExerciseId; 
00324    int availEventNum;
00325    int deleteSocket;
00326    DtPduCallbackManager myPduCbMgr;
00327    int pduInterest[DtMAX_PDU_KINDS + 1];
00328    void zeroPduInterestList();
00329    int nSizeMismatch;
00330    bool filtering;
00331    DtHashlist mcastAddrs;
00332    DtPduFactory* myPduFact;
00333    DtPduFactory* myDfltPduFact;
00334    DtEventID myCurrentEventId;
00335    DtTimeStampType myRelOrAbs;
00336    DtDisObjectManager* myDisObjectManager; 
00337 
00338    DtInetSocket*     mySocket;
00339    DtInetEndpoint    myRemoteEndpoint;
00340    DtInetBufferChain myBufferChain;
00341    DtInetBuffer      myBuffer;
00342    char*             myPacketBuffer;
00343    DtInetEndpoint    myEndpointReceivedFrom;
00344 };
00345 
00346 
00347 inline DtExerciseConn::DtExerciseConn(int po, int ex, int si, 
00348    int ap, InitializationStatus* status, bool use_async_io, bool useIpv6,
00349    bool suppressSelfReflect) 
00350    : mcastAddrs()
00351    , myRelOrAbs(DtTimeStampRelative)
00352    , myBufferChain()
00353    , myBuffer(DtDEFAULT_SOCK_BUFF_SIZE)
00354    , myPacketBuffer(0)
00355    , myEndpointReceivedFrom()
00356 { 
00357    init0(po, ex, si, ap,  status, use_async_io, useIpv6, suppressSelfReflect); 
00358 }
00359 
00360 inline DtExerciseConn::DtExerciseConn(
00361    DtInetSocket* so, int ex, int si, 
00362    int ap, InitializationStatus* status) 
00363    : mcastAddrs()
00364    , myRelOrAbs(DtTimeStampRelative)
00365    , myBufferChain()
00366    , myBuffer(DtDEFAULT_SOCK_BUFF_SIZE)
00367    , myPacketBuffer(0)
00368    , myEndpointReceivedFrom()
00369 {
00370    init0(so, ex, si, ap,  status); 
00371 }  
00372 
00373 inline int DtExerciseConn::readAndProcess() 
00374 { 
00375    int result;
00376    DtPdu *pdu = netRead(&result);
00377    if (result == DtNET_READ_SUCCESS)      
00378    {
00379      result = processPdu(pdu);
00380    }
00381    if (pdu)
00382    {
00383       delete pdu;
00384    }
00385    return result;
00386 }
00387 
00388 inline DtExerciseId DtExerciseConn::exerciseId() const
00389 {
00390    return myExerciseId; 
00391 }
00392 
00393 inline DtPduFactory *DtExerciseConn::pduFactory()
00394 {
00395    return myPduFact;
00396 }
00397 
00398 inline DtInetSocket* DtExerciseConn::socket()
00399 {
00400    return mySocket;
00401 }
00402 
00403 inline DtDisObjectManager* DtExerciseConn::disObjectManager()
00404 {
00405    return myDisObjectManager;
00406 }
00407 
00408 
00409 #endif //! DtDIS
00410 #endif //! DtDisExerciseConn_H_
00411 
00412 

Document ID: Generated on Mon May 14 08:06:18 EDT 2012 from SVN revision 114750
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)