![]() |
MAK RTIspy API Documentation for HLA Evolved
|
00001 /******************************************************************************* 00002 ** Copyright (c) 2007 MaK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 /******************************************************************************* 00006 ** $RCSfile: distributorThreadEvents.h,v $ $Revision: 1.3 $ $State: Exp $ 00007 *******************************************************************************/ 00008 00011 00012 #ifndef DtDistributorThreadEvents_H_ 00013 #define DtDistributorThreadEvents_H_ 00014 00015 #include <rtiMsConfig.h> 00016 #include <memory> 00017 #include <typeinfo> 00018 #include <vector> 00019 #include <map> 00020 #include <vlutil/vlString.h> 00021 #include "rtiMsg.h" 00022 #include "fomModuleRequestMsg.h" 00023 #include "fomModuleDistributionMsg.h" 00024 00025 class DtFedExec; 00026 class DtAsyncFileDistributorRunnable; 00027 class DtRtiExecFederateMgr; 00028 class DtFileInformation; 00029 class DtRtiExecFederateMgr; 00030 class DtFomModuleDistributionMsg; 00031 class DtFomModuleRequestMsg; 00032 class DtFederate; 00033 00034 00035 //base class enforces clone() ability 00038 class DT_DLL_EXEC DtDistributorThreadEvent 00039 { 00040 public: 00041 00042 virtual ~DtDistributorThreadEvent() {} 00043 virtual DtDistributorThreadEvent* clone() const = 0; 00044 00049 virtual bool operator==( const DtDistributorThreadEvent& value ) 00050 { 00051 return ( typeid( *this ) == typeid( value )); 00052 } 00053 00056 virtual void processResults() {} 00057 }; 00058 00059 00061 00065 class DT_DLL_EXEC DtFedExecDistribFunctor : public DtDistributorThreadEvent 00066 { 00067 public: 00068 00069 virtual ~DtFedExecDistribFunctor() {}; 00070 virtual void operator()( const DtAsyncFileDistributorRunnable& dist ) = 0; 00071 }; 00072 00073 00074 class DT_DLL_EXEC DtGetFileFromDistributorCmd : public DtFedExecDistribFunctor 00075 { 00076 public: 00077 DtGetFileFromDistributorCmd( const std::vector<DtString>& fileNames, 00078 const unsigned long ID) : 00079 DtFedExecDistribFunctor(), myFileNames ( fileNames ), myInitiatorID(ID) {} 00080 00081 virtual ~DtGetFileFromDistributorCmd() {} 00082 virtual void operator()(const DtAsyncFileDistributorRunnable& dist ); 00083 virtual DtDistributorThreadEvent* clone() const 00084 { return new DtGetFileFromDistributorCmd(myFileNames, myInitiatorID); } 00085 00086 virtual void processResults(); 00087 00088 std::vector<DtString> myFileNames; 00089 unsigned long myInitiatorID; 00090 }; 00091 00092 class DT_DLL_EXEC DtFedexRemoveFileCmd : public DtFedExecDistribFunctor 00093 { 00094 public: 00095 DtFedexRemoveFileCmd( unsigned long ID, const std::vector<DtString>& fileNames ) : 00096 DtFedExecDistribFunctor(), myFileNames( fileNames), myInitiatorID(ID) {} 00097 virtual ~DtFedexRemoveFileCmd() {} 00098 virtual void operator()(const DtAsyncFileDistributorRunnable& dist ); 00099 virtual DtDistributorThreadEvent* clone() const 00100 { return new DtFedexRemoveFileCmd(myInitiatorID, myFileNames); } 00101 00102 std::vector<DtString> myFileNames; 00103 unsigned long myInitiatorID; 00104 }; 00105 00106 class DT_DLL_EXEC DtPushFilesToAllFederatesCmd : public DtFedExecDistribFunctor 00107 { 00108 public: 00109 DtPushFilesToAllFederatesCmd( const DtString fileName, 00110 const char* fileBuff, unsigned long fileSize, 00111 const unsigned int ID ) : 00112 DtFedExecDistribFunctor(), myFileBuffer(fileBuff), myFileName(fileName), 00113 myFileSize(fileSize), myDestination(ID) {} 00114 virtual ~DtPushFilesToAllFederatesCmd() {} 00115 virtual void operator()(const DtAsyncFileDistributorRunnable& dist); 00116 virtual DtDistributorThreadEvent* clone() const 00117 { return new DtPushFilesToAllFederatesCmd(myFileName, 00118 myFileBuffer, myFileSize, myDestination); } 00119 00120 const char* myFileBuffer; 00121 unsigned long myFileSize; 00122 DtString myFileName; 00123 unsigned long myDestination; 00124 }; 00125 00126 00127 class DT_DLL_EXEC DtDistributionMsgCmd : public DtFedExecDistribFunctor 00128 { 00129 public: 00130 DtDistributionMsgCmd(unsigned long ID, const DtFomModuleDistributionMsg msg ) : 00131 DtFedExecDistribFunctor( ), myMsg(msg), myInitiatorID(ID) {}; 00132 00133 virtual DtDistributorThreadEvent* clone() const 00134 { 00135 return new DtDistributionMsgCmd(myInitiatorID, myMsg ); 00136 } 00137 virtual void operator()(const DtAsyncFileDistributorRunnable& dist); 00138 const DtFomModuleDistributionMsg myMsg; 00139 unsigned long myInitiatorID; 00140 }; 00141 00142 00143 class DT_DLL_EXEC DtFomModuleRequestMsgCmd : public DtFedExecDistribFunctor 00144 { 00145 public: 00146 DtFomModuleRequestMsgCmd( unsigned long ID, const DtFomModuleRequestMsg msg ) : 00147 DtFedExecDistribFunctor(), myMsg(msg), myInitiatorID(ID) {}; 00148 virtual DtFomModuleRequestMsgCmd* clone() const 00149 { 00150 return new DtFomModuleRequestMsgCmd(myInitiatorID, myMsg); 00151 } 00152 virtual void operator()(const DtAsyncFileDistributorRunnable& dist); 00153 const DtFomModuleRequestMsg myMsg; 00154 unsigned long myInitiatorID; 00155 }; 00156 00159 class DT_DLL_EXEC DtFedexTakeFileCmd : public DtFedExecDistribFunctor 00160 { 00161 public: 00162 DtFedexTakeFileCmd( unsigned long ID, 00163 const std::map<DtString, DtFileInformation*>& files ) : 00164 DtFedExecDistribFunctor( ), 00165 myFiles(files), myInitiatorID(ID) {}; 00166 static DtFedexTakeFileCmd* createNamesOnlyTakeFileEvent(DtFedExec* parent, 00167 const std::vector<DtString>& fileNames); 00169 virtual DtDistributorThreadEvent* clone() const 00170 { 00171 return new DtFedexTakeFileCmd( myInitiatorID, myFiles ); 00172 } 00173 virtual void operator()(const DtAsyncFileDistributorRunnable& dist); 00174 std::map<DtString, DtFileInformation*> myFiles; 00175 unsigned long myInitiatorID; 00176 }; 00177 00178 00180 00181 00182 00183 00184 //Event Definitions 00185 class DT_DLL_EXEC DtDistribFunctor : public DtDistributorThreadEvent 00186 { 00187 public: 00188 virtual ~DtDistribFunctor() {}; 00189 virtual void operator()( const DtAsyncFileDistributorRunnable& dist ) = 0; 00190 }; 00191 00192 00195 class DT_DLL_EXEC DtFedexDistributionEvent : public DtDistribFunctor 00196 { 00197 public: 00198 DtFedexDistributionEvent( DtFedExec* parent ) : 00199 DtDistribFunctor(), myParent ( parent) { }; 00200 virtual void operator()( const DtAsyncFileDistributorRunnable& dist ) {} 00201 00202 DtFedExec* myParent; 00203 }; 00204 00205 class DT_DLL_EXEC DtRequestedModulesArrivedEvent : public DtFedexDistributionEvent 00206 { 00207 public: 00208 DtRequestedModulesArrivedEvent(DtFedExec* parent ) : 00209 DtFedexDistributionEvent( parent ) {}; 00210 00211 virtual DtDistributorThreadEvent* clone() const 00212 { 00213 return new DtRequestedModulesArrivedEvent( myParent ); 00214 } 00215 virtual void operator()( const std::vector<DtString>& fileNames); 00216 virtual void processResults(); 00217 00218 std::vector<DtString> myFileNames; 00219 }; 00220 00221 class DT_DLL_EXEC DtFedFileRequestMsgEvent : public DtFedexDistributionEvent 00222 { 00223 public: 00224 DtFedFileRequestMsgEvent( DtFedExec* parent ) : 00225 DtFedexDistributionEvent( parent ) {}; 00226 virtual DtDistributorThreadEvent* clone() const 00227 { 00228 return new DtFedFileRequestMsgEvent( myParent ); 00229 } 00230 virtual void operator()( const std::vector<DtString>& fileNames, unsigned long fedID); 00231 virtual void processResults(); 00232 00233 std::vector<DtString> myFileNames; 00234 unsigned long myInitiatingID; 00235 }; 00236 00237 00238 class DT_DLL_EXEC DtFedExTakeFileEvent : public DtFedexDistributionEvent 00239 { 00240 public: 00241 DtFedExTakeFileEvent( DtFedExec* parent ) : 00242 DtFedexDistributionEvent(parent) {}; 00243 virtual DtDistributorThreadEvent* clone() const { return new DtFedExTakeFileEvent(myParent); } 00244 virtual void operator()( const std::map<DtString, DtFileInformation*>& fileNames ); 00245 virtual void processResults(); 00246 00247 std::map<DtString, DtFileInformation*> myFileNames; 00248 }; 00249 00250 class DT_DLL_EXEC DtFileRequestedEvent : public DtFedexDistributionEvent 00251 { 00252 public: 00253 DtFileRequestedEvent( DtFedExec* parent ) : 00254 DtFedexDistributionEvent(parent) {}; 00255 virtual DtDistributorThreadEvent* clone() const 00256 { 00257 return new DtFileRequestedEvent( myParent ); 00258 } 00259 virtual void operator()( const std::vector<DtString>& files ); 00260 virtual void processResults(); 00261 00262 std::vector<DtString> myFileNames; 00263 }; 00264 00265 class DT_DLL_EXEC DtFileReceivedEvent : public DtFedexDistributionEvent 00266 { 00267 public: 00268 DtFileReceivedEvent( DtFedExec* parent ) : 00269 DtFedexDistributionEvent(parent) {}; 00270 00271 virtual DtDistributorThreadEvent* clone() const 00272 { 00273 return new DtFileReceivedEvent( myParent ); 00274 } 00275 virtual void operator()( const DtFomModuleDistributionMsg& msg ); 00276 virtual void processResults(); 00277 00278 00279 DtFomModuleDistributionMsg myMsg; 00280 }; 00281 00282 class DT_DLL_EXEC DtPushFedFileToFederatesEvent : public DtFedexDistributionEvent 00283 { 00284 public: 00285 DtPushFedFileToFederatesEvent( DtFedExec* parent ) : 00286 DtFedexDistributionEvent( parent ) {}; 00287 virtual DtDistributorThreadEvent* clone() const 00288 { 00289 return new DtPushFedFileToFederatesEvent(myParent); 00290 } 00291 virtual void operator()(DtString name, int fileSize, const char* buff); 00292 virtual void processResults(); 00293 00294 DtString myFileName; 00295 int myFileSize; 00296 const char* myBuff; 00297 }; 00298 00299 00300 00301 class DT_DLL_EXEC DtPushFedFileToSingleFederateEvent : public DtPushFedFileToFederatesEvent 00302 { 00303 public: 00304 DtPushFedFileToSingleFederateEvent( DtFedExec* parent ) : 00305 mySingleFederate(0), 00306 DtPushFedFileToFederatesEvent(parent) {}; 00307 virtual DtDistributorThreadEvent* clone() const 00308 { 00309 return new DtPushFedFileToSingleFederateEvent(myParent); 00310 } 00311 virtual void operator()(DtString name, int fileSize, const char* buff, DtFederateHandle recipientHandle) 00312 { 00313 DtPushFedFileToFederatesEvent::operator ()(name, fileSize, buff); 00314 mySingleFederate = recipientHandle; 00315 } 00316 virtual void processResults(); 00317 DtFederateHandle mySingleFederate; 00318 }; 00319 00320 00321 00323 00324 00325 class DT_DLL_EXEC DtDistribFunctorChangeRequest: public DtDistributorThreadEvent 00326 { 00327 public: 00328 enum EventType { 00329 RequestedModuleArrived, 00330 FedFileRequested, 00331 FedFileReceived, 00332 PushFedFileToAllFederates, 00333 PushFedFileToSingleFederate, 00334 TakeFile, 00335 UploadToExec, 00336 RtiMsg, 00337 BackendExited 00338 }; 00339 00340 DtDistribFunctorChangeRequest( EventType type, 00341 const DtDistributorThreadEvent& newFunctor, 00342 bool addition = true ): 00343 myType( type ), 00344 myAddition( addition ), 00345 myFunctor( newFunctor.clone() ), 00346 myMsgKind(), 00347 myIsMomMsg( false ) 00348 {} 00349 00350 DtDistribFunctorChangeRequest( EventType type, 00351 const DtDistributorThreadEvent& newFunctor, 00352 bool addition, 00353 DtRtiMsgKind kind, 00354 bool isMomMsg = false) : 00355 myType( type ), 00356 myAddition( addition ), 00357 myFunctor( newFunctor.clone() ), 00358 myMsgKind( kind ), 00359 myIsMomMsg( isMomMsg ) 00360 {} 00361 00362 DtDistribFunctorChangeRequest( const DtDistribFunctorChangeRequest& orig ) : 00363 myType( orig.myType ), 00364 myAddition( orig.myAddition ), 00365 myFunctor( orig.myFunctor->clone() ), 00366 myMsgKind( orig.myMsgKind ), 00367 myIsMomMsg( orig.myIsMomMsg ) 00368 {} 00369 00370 virtual ~DtDistribFunctorChangeRequest() { delete myFunctor; myFunctor = 0; } 00371 00372 virtual DtDistributorThreadEvent* clone() const 00373 { 00374 return new DtDistribFunctorChangeRequest( myType, *myFunctor, myAddition, 00375 myMsgKind, myIsMomMsg ); 00376 } 00377 00378 virtual DtDistribFunctorChangeRequest& operator=( const DtDistribFunctorChangeRequest& orig ) 00379 { 00380 if ( this == &orig ) return *this; 00381 00382 DtDistributorThreadEvent* copy = orig.myFunctor->clone(); 00383 myFunctor = copy; 00384 myType = orig.myType; 00385 myAddition = orig.myAddition; 00386 myMsgKind = orig.myMsgKind; 00387 myIsMomMsg = orig.myIsMomMsg; 00388 00389 return *this; 00390 } 00391 00392 00393 EventType myType; 00394 bool myAddition; 00395 DtDistributorThreadEvent* myFunctor; 00396 DtRtiMsgKind myMsgKind; 00397 bool myIsMomMsg; 00398 }; 00399 00400 00401 00402 00403 #endif //DtDistributorThreadEvents_H_