VR-Link API Documentation for HLA Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
exerciseConnDIS.h
Go to the documentation of this file.
1 /*********************************************************************
2 ** Copyright (c) 1992-2010 VT MAK
3 ** All rights reserved.
4 *********************************************************************/
8 
9 #pragma once
10 
11 #if DtDIS
12 
13 
14 #include <vlutil/vlMachineTypes.h>
15 #include "pduCallbackManager.h"
16 #include <vlpi/disEnums.h>
17 #include "packets/pduHeader.h"
18 #include "baseExerciseConn.h"
19 #include "stateMsgDIS.h"
20 #include "interactionDIS.h"
21 #include <matrix/vlMath.h>
22 #include <vlutil/vlHashlist.h>
23 #include "pduFactory.h"
24 #include <vlutil/vlTimeStampType.h>
25 #include "eventId.h"
26 #include <vlutil/vlVersion.h>
27 
28 #include <vlutil/vlInetDevice.h>
29 #include <vlutil/vlInetEndpoint.h>
30 #include <vlutil/vlInetAddr.h>
31 #include <vlutil/vlInetSocket.h>
32 
33 class DtPdu;
34 class DtDisObjectManager;
36 class DtInetDevice;
37 class DtDisSocket;
38 class DtOwnershipHandler;
39 class DtPduDecoderFactory;
40 class DtPduEncoderFactory;
41 
43 const DtExerciseId DtMaxExerciseId = 255;
45 const DtExerciseId DtAnyExercise = 0;
46 
48 typedef DtPdu* (*DtPduInterceptFcn)(DtPdu* pdu, int *retCode);
49 
60 {
61 public:
62 
63  typedef int (*DtPredicate)(DtPdu *pdu, void *arg);
64 
66  enum {
67  DtNET_READ_SUCCESS =0,
68  DtNET_READ_NO_PACKETS =1,
69  DtNET_READ_BAD_PACKET =2,
70  DtNET_READ_SERVER_MSG =3,
71  DtNET_READ_SIZE_MISMATCH =4
72  };
73  enum
74  {
75  DtPROCESS_PDU_SUCCESS =0,
76  DtPROCESS_PDU_WRONG_EXID =5,
77  DtPROCESS_PDU_NO_PDU =6,
78  DtNET_READ_FILTERED_PACKET =7
79  };
80 
89  enum InitializationStatus {
90  DtINIT_SUCCESS =0,
91  DtCOULD_NOT_CREATE_SOCKET =1
92  };
93 
94 public:
95 
102  DtExerciseConn(const DtExerciseConnInitializer& initial, InitializationStatus* status = 0);
103 
106  DtExerciseConn(int port, int exercise_id,
107  int site_id, int application_num,
108  InitializationStatus* status = 0, bool use_async_io = false,
109  bool useIpv6 = false, bool suppressSelfReflect = false);
110 
113  DtExerciseConn(int port, const DtInetAddr& destAddr, int exercise_id,
114  int site_id, int application_num, InitializationStatus* status = 0,
115  bool use_async_io = false, bool suppressSelfReflect = false);
116 
119  DtExerciseConn(DtInetSocket* skt, int exercise_id,
120  int site_id, int application_num, InitializationStatus* status = 0);
121 
123  virtual ~DtExerciseConn();
124 
125 private:
126 
128  DtExerciseConn(const DtExerciseConn& orig);
129 
132 
133 public:
134 
135 
139  virtual void addPduCallback( DtPduKind pduKind, DtPduCallbackFcn fcn, void *usr);
140 
144  virtual void removePduCallback( DtPduKind pduKind, DtPduCallbackFcn fcn, void *usr);
145 
151  virtual int drainInput(DtTime timeout=-1, int nReadPerTimeCheck=100);
152 
155  virtual int readAndProcess(void);
156 
160  virtual int processPdu(DtPdu *pdu);
161 
166  virtual DtPdu *netRead(int *retCode = 0);
167 
173  virtual void addInterestInPduKind(DtPduKind kind);
174 
180  virtual void subtractInterestInPduKind(DtPduKind kind);
181 
186  virtual DtPduKind readUntil(DtPredicate predicate, void *arg,
187  DtTime timeout, DtTime sleepTime=0.1);
188 
191  virtual void addInterestInMcastAddr(const DtInetAddr& addr);
192 
195  virtual void subtractInterestInMcastAddr(const DtInetAddr& addr);
196 
198  virtual void send(const DtStateMsg &msg);
199 
201  virtual void send(const DtInteraction &msg);
202 
204  virtual void sendStamped(const DtStateMsg &msg);
205 
207  virtual void sendStamped(const DtInteraction &msg);
208 
213  virtual int send(
214  const DtPdu &pdu, const DtInetAddr* addr = 0);
215 
221  virtual int sendStamped(
222  const DtPdu &pdu, const DtInetAddr* addr = 0);
223 
226  virtual DtInetAddr* destinationAddr(const DtPdu &pdu);
227 
234  virtual bool addDestination(const DtInetAddr& destination, DtU16 port=0);
235 
242  virtual bool removeDestination(const DtInetAddr& destination, DtU16 port=0);
243 
245  virtual void setExerciseId(int exercise_id);
246 
248  virtual DtExerciseId exerciseId() const;
249 
252  virtual const DtEventID& nextEventId();
253 
255  virtual DtInetSocket* socket();
256 
257 
265  virtual DtPduFactory *pduFactory();
266 
270  virtual DtPduEncoderFactory* pduEncoderFactory();
271 
275  virtual DtPduDecoderFactory* pduDecoderFactory();
276 
282  virtual void setPduFactory(DtPduFactory* fact);
283 
285  virtual void enableFiltering();
286 
288  virtual void disableFiltering();
289 
291  virtual void setTimeStampType(DtTimeStampType relOrAbs);
292 
294  virtual DtTimeStampType timeStampType() const;
295 
299  virtual void setTimeStampType(int relOrAbs);
300 
302  virtual DtDisObjectManager* disObjectManager();
303 
304 
308 
309  virtual void setDefaultOwnershipHandler(DtOwnershipHandler* ownershipHandler);
310  virtual DtOwnershipHandler* defaultOwnershipHandler();
311 
312  void setRelativeTimeRatio(float ratio);
313  float relativeTimeRatio();
314 
316  void setPduInterceptor(DtPduInterceptFcn interceptor);
317  DtPduInterceptFcn pduInterceptor() const;
318 
320  virtual void setAttributePduStrategy(DtAttributePduStrategy strat);
321  virtual DtAttributePduStrategy attributePduStrategy() const;
322 
323 public:
324 
326  static DtString vrlinkVersion();
327 
329  static const int nSizeMismatchComplain;
330 
331 protected:
332 
333 
337  virtual DtTime currentTimeForStamping();
338 
340  void init0(int port, int exerId, int siteId, int applNum,
341  InitializationStatus* status, bool async_io, bool useIpv6,
342  bool suppressSelfReflect);
343 
345  void init0(DtInetSocket* s, int exerId, int siteId, int applNum,
346  InitializationStatus* status);
347 
348  virtual void setRemoteEndpoint( const DtInetAddr& addr, int port );
349 
351  void init(DtInetSocket* s, int deleteSkt,
352  int exerId, int siteId, int applNum, InitializationStatus* status);
353 
354  DtDisSocket* initializeSocket(const DtInetAddr& address, int port,
355  bool useAsyncIo, DtInetDevice* device, bool suppressSelfReflect);
356 
357 protected:
358  DtExerciseId myExerciseId;
359  int availEventNum;
360  int deleteSocket;
361  DtPduCallbackManager myPduCbMgr;
362  int pduInterest[DtMAX_PDU_KINDS + 1];
363  void zeroPduInterestList();
364  int nSizeMismatch;
365  bool filtering;
366  DtHashlist mcastAddrs;
367  DtPduFactory* myPduFact;
368  DtPduFactory* myDfltPduFact;
369  DtPduEncoderFactory* myPduEncFact;
370  DtPduDecoderFactory* myPduDecFact;
371  DtEventID myCurrentEventId;
372  DtTimeStampType myRelOrAbs;
373  DtDisObjectManager* myDisObjectManager;
374  DtOwnershipHandler* myOwnershipHandler;
375  DtPduInterceptFcn myPduInterceptor;
376 
377  DtInetSocket* mySocket;
378  DtInetEndpoint myRemoteEndpoint;
379  DtInetBufferChain myBufferChain;
380  DtInetBuffer myBuffer;
381  char* myPacketBuffer;
382  DtInetEndpoint myEndpointReceivedFrom;
383 
384  // Correction coefficient for relative time correction
385  float myRelativeTimeRatio;
386 
387  // How we should send attribute PDUs
388  DtAttributePduStrategy myAttributePduStrategy;
389 };
390 
391 
392 inline DtExerciseConn::DtExerciseConn(int po, int ex, int si,
393  int ap, InitializationStatus* status, bool use_async_io, bool useIpv6,
394  bool suppressSelfReflect)
395  : mcastAddrs()
396  , myRelOrAbs(DtTimeStampRelative)
397  , myBufferChain()
398  , myBuffer(DtDEFAULT_SOCK_BUFF_SIZE)
399  , myPacketBuffer(0)
400  , myEndpointReceivedFrom()
401  , myOwnershipHandler(0)
402  , myPduInterceptor(0)
404 {
405  init0(po, ex, si, ap, status, use_async_io, useIpv6, suppressSelfReflect);
406 }
407 
409  DtInetSocket* so, int ex, int si,
410  int ap, InitializationStatus* status)
411  : mcastAddrs()
412  , myRelOrAbs(DtTimeStampRelative)
413  , myBufferChain()
414  , myBuffer(DtDEFAULT_SOCK_BUFF_SIZE)
415  , myPacketBuffer(0)
416  , myEndpointReceivedFrom()
417  , myOwnershipHandler(0)
418  , myPduInterceptor(0)
420 {
421  init0(so, ex, si, ap, status);
422 }
423 
424 inline int DtExerciseConn::readAndProcess()
425 {
426  int result;
427  DtPdu *pdu = netRead(&result);
428  if (result == DtNET_READ_SUCCESS)
429  {
430  result = processPdu(pdu);
431  }
432  if (pdu)
433  {
434  delete pdu;
435  }
436  return result;
437 }
438 
439 inline DtExerciseId DtExerciseConn::exerciseId() const
440 {
441  return myExerciseId;
442 }
443 
444 inline DtPduFactory *DtExerciseConn::pduFactory()
445 {
446  return myPduFact;
447 }
448 
449 
450 inline DtPduEncoderFactory *DtExerciseConn::pduEncoderFactory()
451 {
452  return myPduEncFact;
453 }
454 
455 
456 inline DtPduDecoderFactory *DtExerciseConn::pduDecoderFactory()
457 {
458  return myPduDecFact;
459 }
460 
461 
463 {
464  return mySocket;
465 }
466 
467 inline DtDisObjectManager* DtExerciseConn::disObjectManager()
468 {
469  return myDisObjectManager;
470 }
471 
472 
473 #endif

Document ID: Generated on Mon Apr 8 04:49:21 EDT 2019 from SVN revision 197403
Copyright © 2005-2016 VT MÄK. All Rights Reserved (www.mak.com)