VR-Link API Documentation for HLA 1516
 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 MAK Technologies, Inc
3 ** All rights reserved.
4 *********************************************************************/
8 
9 #pragma once
10 
11 #if DtDIS
12 
13 
14 #include <vlutil/vlMachineTypes.h>
15 #include "pduCallbackManager.h"
17 #include <vlpi/disEnums.h>
18 #include "packets/pduHeader.h"
19 #include "baseExerciseConn.h"
20 #include "stateMsgDIS.h"
21 #include "interactionDIS.h"
22 #include <matrix/vlMath.h>
23 #include <vlutil/vlHashlist.h>
24 #include "pduFactory.h"
25 #include <vlutil/vlTimeStampType.h>
26 #include "eventId.h"
27 #include <vlutil/vlVersion.h>
28 
29 #include <vlutil/vlInetDevice.h>
30 #include <vlutil/vlInetEndpoint.h>
31 #include <vlutil/vlInetAddr.h>
32 #include <vlutil/vlInetSocket.h>
33 
34 class DtPdu;
35 class DtDisObjectManager;
37 class DtInetDevice;
38 class DtDisSocket;
39 class DtOwnershipHandler;
40 class DtPduDecoderFactory;
41 class DtPduEncoderFactory;
42 class DtStateRepositoryExtensionEncoderFactory;
43 class DtStateRepositoryExtensionDecoderFactory;
44 
46 const DtExerciseId DtMaxExerciseId = 255;
48 const DtExerciseId DtAnyExercise = 0;
49 
51 typedef DtPdu* (*DtPduInterceptFcn)(DtPdu* pdu, int *retCode);
52 
63 {
64 public:
65 
66  typedef int (*DtPredicate)(DtPdu *pdu, void *arg);
67 
69  enum {
70  DtNET_READ_SUCCESS =0,
71  DtNET_READ_NO_PACKETS =1,
72  DtNET_READ_BAD_PACKET =2,
73  DtNET_READ_SERVER_MSG =3,
74  DtNET_READ_SIZE_MISMATCH =4
75  };
76  enum
77  {
78  DtPROCESS_PDU_SUCCESS =0,
79  DtPROCESS_PDU_WRONG_EXID =5,
80  DtPROCESS_PDU_NO_PDU =6,
81  DtNET_READ_FILTERED_PACKET =7
82  };
83 
92  enum InitializationStatus {
93  DtINIT_SUCCESS =0,
94  DtCOULD_NOT_CREATE_SOCKET =1
95  };
96 
97 public:
98 
105  DtExerciseConn(const DtExerciseConnInitializer& initial, InitializationStatus* status = 0);
106 
109  DtExerciseConn(int port, int exercise_id,
110  int site_id, int application_num,
111  InitializationStatus* status = 0, bool use_async_io = false,
112  bool useIpv6 = false, bool suppressSelfReflect = false);
113 
116  DtExerciseConn(int port, const DtInetAddr& destAddr, int exercise_id,
117  int site_id, int application_num, InitializationStatus* status = 0,
118  bool use_async_io = false, bool suppressSelfReflect = false);
119 
122  DtExerciseConn(DtInetSocket* skt, int exercise_id,
123  int site_id, int application_num, InitializationStatus* status = 0);
124 
126  virtual ~DtExerciseConn();
127 
128 private:
129 
131  DtExerciseConn(const DtExerciseConn& orig);
132 
135 
136 public:
137 
138 
142  virtual void addPduCallback( DtPduKind pduKind, DtPduCallbackFcn fcn, void *usr);
143 
147  virtual void removePduCallback( DtPduKind pduKind, DtPduCallbackFcn fcn, void *usr);
148 
152  virtual void addIffPduCallback(DtIffInteractionType type, DtPduCallbackFcn fcn, void* usr);
153 
157  virtual void removeIffPduCallback(DtIffInteractionType type, DtPduCallbackFcn fcn, void* usr);
163  virtual int drainInput(DtTime timeout=-1, int nReadPerTimeCheck=100);
164 
167  virtual int readAndProcess(void);
168 
172  virtual int processPdu(DtPdu *pdu);
173 
178  virtual DtPdu *netRead(int *retCode = 0);
179 
185  virtual void addInterestInPduKind(DtPduKind kind);
186 
192  virtual void subtractInterestInPduKind(DtPduKind kind);
193 
198  virtual DtPduKind readUntil(DtPredicate predicate, void *arg,
199  DtTime timeout, DtTime sleepTime=0.1);
200 
203  virtual void addInterestInMcastAddr(const DtInetAddr& addr);
204 
207  virtual void subtractInterestInMcastAddr(const DtInetAddr& addr);
208 
210  virtual void send(const DtStateMsg &msg);
211 
213  virtual void send(const DtInteraction &msg);
214 
216  virtual void sendStamped(const DtStateMsg &msg);
217 
219  virtual void sendStamped(const DtInteraction &msg);
220 
225  virtual int send(
226  const DtPdu &pdu, const DtInetAddr* addr = 0);
227 
233  virtual int sendStamped(
234  const DtPdu &pdu, const DtInetAddr* addr = 0);
235 
238  virtual DtInetAddr* destinationAddr(const DtPdu &pdu);
239 
246  virtual bool addDestination(const DtInetAddr& destination, DtU16 port=0);
247 
254  virtual bool removeDestination(const DtInetAddr& destination, DtU16 port=0);
255 
257  virtual void setExerciseId(int exercise_id);
258 
260  virtual DtExerciseId exerciseId() const;
261 
264  virtual const DtEventID& nextEventId();
265 
267  virtual DtInetSocket* socket();
268 
269 
277  virtual DtPduFactory *pduFactory();
278 
282  virtual DtPduEncoderFactory* pduEncoderFactory();
283 
287  virtual DtPduDecoderFactory* pduDecoderFactory();
288 
294  virtual void setPduFactory(DtPduFactory* fact);
295 
298  virtual DtStateRepositoryExtensionEncoderFactory* stateRepoExtensionEncoderFactory();
299 
302  virtual DtStateRepositoryExtensionDecoderFactory* stateRepoExtensionDecoderFactory();
303 
305  virtual void enableFiltering();
306 
308  virtual void disableFiltering();
309 
311  virtual void setTimeStampType(DtTimeStampType relOrAbs);
312 
314  virtual DtTimeStampType timeStampType() const;
315 
319  virtual void setTimeStampType(int relOrAbs);
320 
322  virtual DtDisObjectManager* disObjectManager();
323 
324 
328 
329  virtual void setDefaultOwnershipHandler(DtOwnershipHandler* ownershipHandler);
330  virtual DtOwnershipHandler* defaultOwnershipHandler();
331 
332  void setRelativeTimeRatio(float ratio);
333  float relativeTimeRatio();
334 
336  virtual void setAttributePduStrategy(DtAttributePduStrategy strat);
337  virtual DtAttributePduStrategy attributePduStrategy() const;
338 
340  void setPduInterceptor(DtPduInterceptFcn interceptor);
341  DtPduInterceptFcn pduInterceptor() const;
342 
343 public:
344 
346  static DtString vrlinkVersion();
347 
349  static const int nSizeMismatchComplain;
350 
351 protected:
352 
353 
357  virtual DtTime currentTimeForStamping();
358 
360  void init0(int port, int exerId, int siteId, int applNum,
361  InitializationStatus* status, bool async_io, bool useIpv6,
362  bool suppressSelfReflect);
363 
365  void init0(DtInetSocket* s, int exerId, int siteId, int applNum,
366  InitializationStatus* status);
367 
368  virtual void setRemoteEndpoint( const DtInetAddr& addr, int port );
369 
371  void init(DtInetSocket* s, int deleteSkt,
372  int exerId, int siteId, int applNum, InitializationStatus* status);
373 
374  DtDisSocket* initializeSocket(const DtInetAddr& address, int port,
375  bool useAsyncIo, DtInetDevice* device, bool suppressSelfReflect);
376 
377 protected:
378  DtExerciseId myExerciseId;
379  int availEventNum;
380  int deleteSocket;
381  DtPduCallbackManager myPduCbMgr;
382  DtIffPduCallbackManager myIffPduCbMgr;
383  int pduInterest[DtMAX_PDU_KINDS + 1];
384  void zeroPduInterestList();
385  int nSizeMismatch;
386  bool filtering;
387  DtHashlist mcastAddrs;
388  DtPduFactory* myPduFact;
389  DtPduFactory* myDfltPduFact;
390  DtPduEncoderFactory* myPduEncFact;
391  DtPduDecoderFactory* myPduDecFact;
392  DtStateRepositoryExtensionEncoderFactory* myStateRepoExtensionEncFac;
393  DtStateRepositoryExtensionDecoderFactory* myStateRepoExtensionDecFac;
394  DtEventID myCurrentEventId;
395  DtTimeStampType myRelOrAbs;
396  DtDisObjectManager* myDisObjectManager;
397  DtOwnershipHandler* myOwnershipHandler;
398  DtPduInterceptFcn myPduInterceptor;
399 
400  DtInetSocket* mySocket;
401  DtInetEndpoint myRemoteEndpoint;
402  DtInetBufferChain myBufferChain;
403  DtInetBuffer myBuffer;
404  char* myPacketBuffer;
405  DtInetEndpoint myEndpointReceivedFrom;
406 
407  // Correction coefficient for relative time correction
408  float myRelativeTimeRatio;
409 
410  // How we should send attribute PDUs
411  DtAttributePduStrategy myAttributePduStrategy;
412 };
413 
414 
415 inline DtExerciseConn::DtExerciseConn(int po, int ex, int si,
416  int ap, InitializationStatus* status, bool use_async_io, bool useIpv6,
417  bool suppressSelfReflect)
418  : mcastAddrs()
419  , myRelOrAbs(DtTimeStampRelative)
420  , myBufferChain()
421  , myBuffer(DtDEFAULT_SOCK_BUFF_SIZE)
422  , myPacketBuffer(0)
423  , myEndpointReceivedFrom()
424  , myOwnershipHandler(0)
425  , myPduInterceptor(0)
426  , myIffPduCbMgr(0)
428 {
429  init0(po, ex, si, ap, status, use_async_io, useIpv6, suppressSelfReflect);
430 }
431 
433  DtInetSocket* so, int ex, int si,
434  int ap, InitializationStatus* status)
435  : mcastAddrs()
436  , myRelOrAbs(DtTimeStampRelative)
437  , myBufferChain()
438  , myBuffer(DtDEFAULT_SOCK_BUFF_SIZE)
439  , myPacketBuffer(0)
440  , myEndpointReceivedFrom()
441  , myOwnershipHandler(0)
442  , myPduInterceptor(0)
443  , myIffPduCbMgr(0)
445 {
446  init0(so, ex, si, ap, status);
447 }
448 
449 inline int DtExerciseConn::readAndProcess()
450 {
451  int result;
452  DtPdu *pdu = netRead(&result);
453  if (result == DtNET_READ_SUCCESS)
454  {
455  result = processPdu(pdu);
456  }
457  if (pdu)
458  {
459  delete pdu;
460  }
461  return result;
462 }
463 
464 inline DtExerciseId DtExerciseConn::exerciseId() const
465 {
466  return myExerciseId;
467 }
468 
469 inline DtPduFactory *DtExerciseConn::pduFactory()
470 {
471  return myPduFact;
472 }
473 
474 
475 inline DtPduEncoderFactory *DtExerciseConn::pduEncoderFactory()
476 {
477  return myPduEncFact;
478 }
479 
480 
481 inline DtPduDecoderFactory *DtExerciseConn::pduDecoderFactory()
482 {
483  return myPduDecFact;
484 }
485 
486 inline DtStateRepositoryExtensionEncoderFactory* DtExerciseConn::stateRepoExtensionEncoderFactory()
487 {
488  return myStateRepoExtensionEncFac;
489 }
490 
491 inline DtStateRepositoryExtensionDecoderFactory* DtExerciseConn::stateRepoExtensionDecoderFactory()
492 {
493  return myStateRepoExtensionDecFac;
494 }
495 
496 
498 {
499  return mySocket;
500 }
501 
502 inline DtDisObjectManager* DtExerciseConn::disObjectManager()
503 {
504  return myDisObjectManager;
505 }
506 
507 
508 #endif
DtInteraction is an abstract base class for representing HLA interactions (or events) (as opposed to ...
Definition: interactionHLA.h:33
DtExerciseConn(const DtExerciseConnInitializer &init, InitializationStatus *status=0)
This constructor takes a DtExerciseConnInitializer and creates an exercise connection based on the pa...
This file contains the declaration of the DtInetSocket base class.
Instances of DtExerciseConn are used to provide an application&#39;s interface or connection to the netwo...
Definition: exerciseConnHLA.h:61
#define DT_DLL_VL
Definition: vlMachineTypes.h:108
Instances of DtExerciseConnInitializer are used to provide the DtExerciseConn with initialization dat...
Definition: exerciseConnInitializerHLA.h:41
DtBaseExerciseConn & operator=(const DtBaseExerciseConn &)
Assignment Operator – Not Implemented.
std::vector< DtInetBuffer * > DtInetBufferChain
Socket state enumeration.
Definition: vlInetSocket.h:105
Definition: vlTimeStampType.h:18
The DtInetSocket class provides a protocol independant, address family independant base class for TCP...
Definition: vlInetSocket.h:201
DtBaseExerciseConn is an abstract base class.
Definition: baseExerciseConn.h:31
This file declares macros which specify the VR-Link version.
This file contains the declaration of the DtInetEndpoint class.
The DtInetEndpoint class provides a protocol independant, address family independent mechanism to rep...
Definition: vlInetEndpoint.h:33
The DtDisSocket class provides an address family independent datagram socket.
Definition: vlDisSocket.h:75
This file defines math constants and methods which may be useful in simulations.
virtual void sendStamped(const DtStateMsg &msg)=0
Send a state message to the network which has been time stamped with the current time.
Defines DtHashlist and several helper functions.
Represents a IPv4 or IPv6 address.
Definition: vlInetAddr.h:36
Definition: vlAttributePduStrategy.h:19
virtual void send(const DtStateMsg &msg)=0
Send a state message to the network.
DtPdu is the base class for all PDU&#39;s in VR-Link.
Definition: pdu.h:69
std::vector< char > DtInetBuffer
Socket state enumeration.
Definition: vlInetSocket.h:104
DtAttributePduStrategy
Definition: vlAttributePduStrategy.h:16
Represents Events in the RPR FOM.
Definition: eventId.h:52
This file contains the declaration of the DtInetAddr class.
Definition: vlInetDevice.h:101
int socket(int, int, int)
#define DtDEFAULT_SOCK_BUFF_SIZE
Definition: vlInet.h:69
This file contains the declaration of the DtInetDevice class.
DtHashlist is deprecated and provided for backwards compatibility only.
Definition: vlHashlist.h:69
This is a base class meant to encapsulate user callbacks on ownership management services.
Definition: ownershipHandlerHLA.h:27
unsigned short DtU16
A 16 bit unsigned integer value.
Definition: vlMachineTypes.h:140
Contains the standard DIS enumerations.
Definition: vlAttributePduStrategy.h:20
DtTimeStampType
Definition: vlTimeStampType.h:16
int DtProtocolVersionToSend
Contains the DtEventId class declaration.
DtPduKind
([UID 4]) - PDU Type
Definition: disEnums.h:238
Instances of DtString are used to represent strings.
Definition: vlString.h:29
This file provides a declaration of the class DtBaseExerciseConn.
class DtStateMsg:
Definition: stateMsgHLA.h:32
DtIffInteractionType
Definition: disEnums.h:2134
DtU16 DtExerciseId
Definition: baseExerciseConn.h:16
This file contains typedefs for machine dependant types.

Document ID: Generated on Thu Sep 19 02:12:35 EDT 2024 from SVN revision 269601
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)