![]() |
VR-Link API Documentation for HLA 1516
|
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