![]() |
MAK RTIspy API Documentation for HLA Evolved
|
00001 /******************************************************************************* 00002 ** Copyright (c) 2005 MaK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 /******************************************************************************* 00006 ** $RCSfile: extendedRtiMsgForwarder.h,v $ $Revision: 1.7 $ $State: Exp $ 00007 *******************************************************************************/ 00010 00011 #ifndef DtExtendedRtiMsgForwarder_H_ 00012 #define DtExtendedRtiMsgForwarder_H_ 00013 00014 #include "forwarderPort.h" 00015 #include "rtiMsConfig.h" 00016 #include "rtiMessageForwarder.h" 00017 #include "vlThreadedObject.h" 00018 #include <vlutil/vlRunnable.h> 00019 #include "vlThreadSafeQueue.h" 00020 #include "vlThreadSafeBufferQueue.h" 00021 #include <vlutil/vlTime.h> 00022 #include <udpMsgSocket.h> 00023 #include <set> 00024 00025 class DtRIDParameters; 00026 class DtMessageBufferFilter; 00027 class DtFederateTrackingFilter; 00028 class DtNetworkMapLanRequestFilter; 00029 00030 class DT_DLL_FORWARDER DtExtendedRtiMsgForwarder : public DtRtiMsgForwarder 00031 { 00032 protected: 00033 00035 DtExtendedRtiMsgForwarder( unsigned long id, const DtRIDParameters& params, bool postMessagesToParent = true ); 00036 00037 public: 00038 00039 typedef DtThreadSafeBufferQueue<char> DtCharBufferQueue; 00040 00045 static DtExtendedRtiMsgForwarder* create( unsigned int id, const DtRIDParameters& params, bool postMessagesToParent = true ); 00046 00048 virtual ~DtExtendedRtiMsgForwarder(); 00049 00052 virtual void applyFilters(); 00053 00055 virtual void sendByTransport( const DtForwarderPort::DtForwarderMsg& msg ); 00056 00058 virtual void sendToAllReliable( const DtForwarderPort::DtForwarderMsg& msg ); 00059 00061 virtual void sendBestEffort( const DtForwarderPort::DtForwarderMsg& msg ); 00062 00065 virtual void sendMessageToWan( const DtRtiMsg& msg ); 00066 00069 virtual inline bool flush(); 00070 00073 virtual const DtCharBufferQueue::Buffer* getNextMsg(); 00074 00077 virtual void selectParams( MAKRti::DtSelectParamWithWrite& selectParams ); 00078 00080 virtual DtForwarderPort::DtAddressPortList newConnections() const; 00081 00083 virtual DtForwarderPort::DtAddressPortList droppedConnections() const; 00084 00086 virtual DtForwarderPort::DtAddressPortList connections() const; 00087 00089 virtual void listenToMulticastGroup( const MAKRti::DtInetAddr& mcastAddr ); 00090 virtual void dropMulticastGroup( const MAKRti::DtInetAddr& mcastAddr ); 00091 00092 00094 virtual void federateJoined(const MAKRti::DtString&, const MAKRti::DtString&, 00095 const MAKRti::DtString&, 00096 unsigned int, unsigned int, const DtInetAddrAndPort&, 00097 const MAKRti::DtString&, unsigned int, const MAKRti::DtString&, 00098 const MAKRti::DtString&, DtHlaVersionId); 00099 virtual void federateResigned(const MAKRti::DtString&, 00100 const MAKRti::DtString&, unsigned int, unsigned int, 00101 const DtInetAddrAndPort& ); 00102 virtual void updateSocketQueueStatus( unsigned int connId, int connQueueStatus); 00103 00104 virtual void addFederateJoinedCb( 00105 DtForwarderPort::DtFederateAddedCb callback, void* usr ); 00106 virtual void addFederateResignedCb( 00107 DtForwarderPort::DtFederateRemovedCb callback, void* usr ) ; 00108 00109 virtual void addSocketAdditionCb( 00110 DtForwarderPort::DtConnectionChangeCb cb, void* usr ); 00111 virtual void addSocketRemovalCb( 00112 DtForwarderPort::DtConnectionChangeCb cb, void* usr ); 00113 00114 virtual void addSocketQueueCb( 00115 DtForwarderPort::DtSocketQueueCb cb, void* usr ); 00116 00118 virtual void addExecConnectionEstablishedCb( 00119 DtForwarderPort::DtExecAddChangeCb callback, void* usr ); 00120 virtual void removeExecConnectionEstablishedCb( 00121 DtForwarderPort::DtExecAddChangeCb callback, void* usr ); 00122 00124 virtual void addExecConnectionLostCb( 00125 DtForwarderPort::DtExecRemovedChangeCb callback, void* usr ); 00126 virtual void removeExecConnectionLostCb( 00127 DtForwarderPort::DtExecRemovedChangeCb callback, void* usr ); 00128 00129 virtual const DtFederateTrackingFilter* fedHandleTrackingFilter() const { return myFedHandleTracker; } 00130 00131 00132 protected: 00133 00135 virtual void init(); 00136 00138 virtual void tcpSocketAdditionCb(DtTcpMsgSocket* sock); 00139 virtual void tcpSocketRemovalCb(DtTcpMsgSocket* sock); 00140 00147 virtual void refreshConnectionList() const; 00148 00149 public: 00150 00152 static const unsigned int theForwarderId; 00153 00154 protected: 00155 00156 typedef std::pair< DtInetAddrAndPort, int > DtAddressAndSockIdPair; 00157 00158 DtUdpMsgSocket* myUdpRcvSocket; 00159 DtUdpMsgSocket* myUdpSendSocket; 00160 00161 std::auto_ptr<DtCharBufferQueue::Buffer> myLastReceivedMsg; 00162 DtCharBufferQueue myInMsgQueue; 00163 DtCharBufferQueue myOutMsgQueue; 00164 DtMessageBufferFilter* myOutMsgFilter; 00165 DtNetworkMapLanRequestFilter* myNetMapRequestFilter; 00166 DtFederateTrackingFilter* myFedHandleTracker; 00167 00169 DtClock myClock; 00170 00172 MAKRti::DtTime myLastDiscoveryTickTime; 00173 00174 DtForwarderPort::DtFederateAddedCallbackList myFederateJoinedCbs; 00175 DtForwarderPort::DtFederateRemovedCallbackList myFederateResignedCbs; 00176 00177 DtForwarderPort::DtSocketQueueCallbackList mySocketQueueCbs; 00178 00179 DtForwarderPort::DtCallbackList mySocketAddedCbs; 00180 DtForwarderPort::DtCallbackList mySocketRemovedCbs; 00181 00186 typedef std::pair< bool, DtAddressAndSockIdPair > DtBoolAddressSocketIdPair; 00187 mutable DtThreadSafeQueue< DtBoolAddressSocketIdPair > mySocketListChanges; 00188 mutable std::set< DtAddressAndSockIdPair > myConnections; 00189 mutable DtForwarderPort::DtAddressPortList myNewConnections; 00190 mutable DtForwarderPort::DtAddressPortList myDroppedConnections; 00191 00192 00195 bool myForwardMessagesToParent; 00196 }; 00197 00198 inline bool DtExtendedRtiMsgForwarder::flush() 00199 { 00200 bool status = true; 00204 if ( myUdpSendSocket->isOpen() ) 00205 { 00206 status = myUdpSendSocket->flush(); 00207 } 00208 00209 return status; 00210 } 00211 #endif //! DtExtendedRtiMsgForwarder 00212