#include <message_recorder.h>
Nevrax France
Definition at line 116 of file message_recorder.h.
Public Member Functions | |
| TNetworkEvent | checkNextOne (sint64 updatecounter) |
| CMessageRecorder () | |
| Constructor. | |
| void | recordNext (sint64 updatecounter, TNetworkEvent event, TSockId sockid, CMessage &message) |
| Add a record. | |
| TNetworkEvent | replayConnectionAttempt (const CInetAddress &addr) |
| Get the first stored connection attempt corresponding to addr. | |
| void | replayNextDataAvailable (sint64 updatecounter) |
| Push the received blocks for this counter into the receive queue. | |
| bool | startRecord (const std::string &filename, bool recordall=true) |
| Start recording. | |
| bool | startReplay (const std::string &filename) |
| Start replaying. | |
| void | stopRecord () |
| Stop recording. | |
| void | stopReplay () |
| Stop playback. | |
| ~CMessageRecorder () | |
| Destructor. | |
Data Fields | |
| std::queue< NLNET::TMessageRecord > | ReceivedMessages |
| Receive queue (corresponding to one update count). Use empty(), front(), pop(). | |
Protected Member Functions | |
| bool | getNext (TMessageRecord &record, sint64 updatecounter) |
| Get the next record (from the preloaded records, or from the file). | |
| bool | loadNext (TMessageRecord &record) |
| Load the next record from the file (throws EStreamOverflow). | |
Private Attributes | |
| std::deque< TMessageRecord > | _ConnectionAttempts |
| std::fstream | _File |
| std::string | _Filename |
| std::deque< TMessageRecord > | _PreloadedRecords |
| bool | _RecordAll |
|
|
Constructor.
Definition at line 79 of file message_recorder.cpp. References nlerror.
00079 : _RecordAll(true) 00080 { 00081 #ifndef MESSAGES_PLAIN_TEXT 00082 nlerror( "The message recorder works only with plain text messages. Please #define MESSAGES_PLAIN_TEXT" ); 00083 #endif 00084 } |
|
|
Destructor.
Definition at line 90 of file message_recorder.cpp. References nldebug, stopRecord(), and stopReplay().
00091 {
00092 if ( _Filename != "" )
00093 {
00094 nldebug( "MR:%s: End of recording", _Filename.c_str() );
00095 }
00096 stopRecord();
00097 stopReplay();
00098 }
|
|
|
Returns the event type if the counter of the next event is updatecounter, and skip it; otherwise return Error. Definition at line 308 of file message_recorder.cpp. References NLNET::Error, NLNET::TMessageRecord::Event, NLNET::EventToString(), getNext(), NL_I64, nldebug, sint64, and NLNET::TNetworkEvent.
00309 {
00310 TMessageRecord record;
00311 if ( getNext( record, updatecounter ) )
00312 {
00313 nldebug( "MR: Check next one: %s at update %"NL_I64"u", EventToString(record.Event).c_str(), updatecounter );
00314 return record.Event;
00315 }
00316 else
00317 {
00318 return Error;
00319 }
00320 }
|
|
||||||||||||
|
Get the next record (from the preloaded records, or from the file).
Definition at line 230 of file message_recorder.cpp. References _PreloadedRecords, loadNext(), nlassert, and sint64. Referenced by checkNextOne(), and replayNextDataAvailable().
00231 {
00232 if ( ! _PreloadedRecords.empty() )
00233 {
00234 if ( _PreloadedRecords.front().UpdateCounter == updatecounter )
00235 {
00236 // The requested record is in the preload
00237 record = _PreloadedRecords.front();
00238 _PreloadedRecords.pop_front();
00239 return true;
00240 }
00241 else
00242 {
00243 // The requested record is not in the file
00244 nlassert( updatecounter < _PreloadedRecords.front().UpdateCounter ); // not >
00245 return false;
00246 }
00247 }
00248 else
00249 {
00250 if ( loadNext( record ) )
00251 {
00252 if ( record.UpdateCounter == updatecounter )
00253 {
00254 // The requested record has been loaded
00255 return true;
00256 }
00257 else
00258 {
00259 // The next loaded record is a new one
00260 nlassert( updatecounter < record.UpdateCounter ); // not >
00261 _PreloadedRecords.push_back( record ); // when we read one too far
00262 return false;
00263 }
00264 }
00265 else
00266 {
00267 return false;
00268 }
00269 }
00270 }
|
|
|
Load the next record from the file (throws EStreamOverflow).
Definition at line 198 of file message_recorder.cpp. References _File, len, nlassert, nldebug, nlstop, NLNET::TMessageRecord::serial(), and uint32. Referenced by getNext(), and replayConnectionAttempt().
00199 {
00200 // WARNING!!! This features doesn't work anymore becaues bufferAsVector() is not available with new CMemStream
00201 nlstop;
00202 return false;
00203
00204 nlassert( _File.is_open() );
00205
00206 // Dump from file
00207 CMemStream stream ( true, true );
00208 uint32 len;
00209 char c;
00210 _File >> c; // skip "* ";
00211 _File >> (int&)len;
00212 _File.ignore(); // skip delimiter
00213 if ( ! _File.fail() )
00214 {
00215 _File.get( (char*)stream.bufferToFill( len+1 ), len+1, '\0' );
00216 //stream.bufferAsVector().resize( len ); // cut end of cstring
00217 nldebug( "MR:%s: Reading [%s]", _Filename.c_str(), stream.buffer() );
00218
00219 // Serial from stream
00220 record.serial( stream ); // may throw EStreamOverflow if _File.fail()
00221 }
00222
00223 return ! _File.fail(); // retest
00224 }
|
|
||||||||||||||||||||
|
Add a record.
Definition at line 141 of file message_recorder.cpp. References _File, _RecordAll, len, nlassert, nldebug, NLNET::Sending, NLNET::TMessageRecord::serial(), sint64, and NLNET::TSockId.
00142 {
00143 nlassert( _File.is_open() );
00144
00145 if ( (_RecordAll) || (event != Sending) )
00146 {
00147 // Serial to stream
00148 TMessageRecord rec ( event, sockid, message, updatecounter /*CTime::getLocalTime()*/ );
00149 CMemStream stream ( false, true );
00150 rec.serial( stream );
00151 char c = '\0'; // end of cstring
00152 stream.serial( c ); // added to the stream for _File << (char*)stream.buffer()
00153
00154 // Dump to file
00155 nldebug( "MR:%s: Recording [%s]", _Filename.c_str(), stream.buffer() );
00156 int len = (int)(stream.length()-2); // not the null character (and its separator) at the end of the buffer
00157 _File << "* ";
00158 _File << len; // if we put the expression directly, it makes an access violation ! Weird.
00159 _File << " ";
00160 _File << (char*)stream.buffer() << endl;
00161 }
00162 }
|
|
|
Get the first stored connection attempt corresponding to addr.
Definition at line 326 of file message_recorder.cpp. References _ConnectionAttempts, _PreloadedRecords, addr, NLNET::Connecting, NLNET::ConnFailing, NLNET::Error, NLNET::TMessageRecord::Event, loadNext(), NLNET::TMessageRecord::Message, NL_I64, nldebug, nlstop, NLMISC::CMemStream::serial(), NLNET::TNetworkEvent, and NLNET::TMessageRecord::UpdateCounter.
00327 {
00328 TNetworkEvent event;
00329 deque<TMessageRecord>::iterator ipr;
00330
00331 if ( ! _ConnectionAttempts.empty() )
00332 {
00333 // Search in the already processed connection attempts
00334 for ( ipr=_ConnectionAttempts.begin(); ipr!=_ConnectionAttempts.end(); ++ipr )
00335 {
00336 CInetAddress stored_addr;
00337 (*ipr).Message.serial( stored_addr );
00338 if ( stored_addr == addr )
00339 {
00340 // Found
00341 event = (*ipr).Event;
00342 nldebug( "MR: Connection attempt found at update %"NL_I64"u", (*ipr).UpdateCounter );
00343 _ConnectionAttempts.erase( ipr );
00344 return event;
00345 }
00346 }
00347 }
00348
00349 // Seek in the preloaded records
00350 for ( ipr=_PreloadedRecords.begin(); ipr!=_PreloadedRecords.end(); ++ipr )
00351 {
00352 event = (*ipr).Event;
00353 if ( (event == Connecting) || (event == ConnFailing) )
00354 {
00355 CInetAddress stored_addr;
00356 (*ipr).Message.serial( stored_addr );
00357 if ( stored_addr == addr )
00358 {
00359 // Found
00360 nldebug( "MR: Connection attempt found at update %"NL_I64"u", (*ipr).UpdateCounter );
00361 _PreloadedRecords.erase( ipr );
00362 return event;
00363 }
00364 }
00365 }
00366 if ( ipr==_PreloadedRecords.end() )
00367 {
00368 // If not found, load next records until found !
00369 TMessageRecord rec( true );
00370 while ( loadNext( rec ) )
00371 {
00372 if ( ( rec.Event == Connecting ) || ( rec.Event == ConnFailing ) )
00373 {
00374 CInetAddress stored_addr;
00375 rec.Message.serial( stored_addr );
00376 if ( stored_addr == addr )
00377 {
00378 // Found
00379 nldebug( "MR: Connection attempt found at update %"NL_I64"u", rec.UpdateCounter );
00380 return rec.Event;
00381 }
00382 else
00383 {
00384 _PreloadedRecords.push_back( rec );
00385 }
00386 }
00387 else
00388 {
00389 _PreloadedRecords.push_back( rec );
00390 }
00391 }
00392 // Not found
00393 nldebug( "MR: Connection attempt not found" );
00394 return Error;
00395 }
00396 nlstop;
00397 return Error;
00398 }
|
|
|
Push the received blocks for this counter into the receive queue.
Definition at line 276 of file message_recorder.cpp. References _ConnectionAttempts, NLNET::Accepting, NLNET::Connecting, NLNET::ConnFailing, NLNET::Disconnecting, NLNET::TMessageRecord::Event, getNext(), nlstop, ReceivedMessages, NLNET::Receiving, NLNET::Sending, and sint64.
00277 {
00278 TMessageRecord rec( true ); // input message
00279
00280 while ( getNext( rec, updatecounter ) )
00281 {
00282 switch ( rec.Event )
00283 {
00284 case Receiving :
00285 case Accepting :
00286 case Disconnecting :
00287 ReceivedMessages.push( rec );
00288 break;
00289
00290 case Sending :
00291 break;
00292
00293 case Connecting :
00294 case ConnFailing :
00295 _ConnectionAttempts.push_back( rec );
00296 break;
00297
00298 default :
00299 nlstop;
00300 }
00301 }
00302 }
|
|
||||||||||||
|
Start recording.
Definition at line 104 of file message_recorder.cpp. References _File, _RecordAll, nldebug, and nlwarning.
00105 {
00106 _Filename = filename;
00107 _File.open( _Filename.c_str(), ios_base::out );
00108 _File << endl;
00109 _RecordAll = recordall;
00110 if ( _File.fail() )
00111 {
00112 nlwarning( "MR: Record: Cannot open file %s", _Filename.c_str() );
00113 return false;
00114 }
00115 else
00116 {
00117 nldebug( "MR: Start recording into %s", _Filename.c_str() );
00118 return true;
00119 }
00120 }
|
|
|
Start replaying.
Definition at line 178 of file message_recorder.cpp. References _File, nldebug, and nlerror.
00179 {
00180 _Filename = filename;
00181 _File.open( _Filename.c_str(), ios_base::in );
00182 if ( _File.fail() )
00183 {
00184 nlerror( "MR: Replay: Cannot open file %s", _Filename.c_str() );
00185 return false;
00186 }
00187 else
00188 {
00189 nldebug( "MR: Start replaying from %s", _Filename.c_str() );
00190 return true;
00191 }
00192 }
|
|
|
Stop recording.
Definition at line 168 of file message_recorder.cpp. References _File. Referenced by ~CMessageRecorder().
|
|
|
Stop playback.
Definition at line 404 of file message_recorder.cpp. References _File. Referenced by ~CMessageRecorder().
|
|
|
Definition at line 176 of file message_recorder.h. Referenced by replayConnectionAttempt(), and replayNextDataAvailable(). |
|
|
Definition at line 167 of file message_recorder.h. Referenced by loadNext(), recordNext(), startRecord(), startReplay(), stopRecord(), and stopReplay(). |
|
|
Definition at line 170 of file message_recorder.h. |
|
|
Definition at line 173 of file message_recorder.h. Referenced by getNext(), and replayConnectionAttempt(). |
|
|
Definition at line 179 of file message_recorder.h. Referenced by recordNext(), and startRecord(). |
|
|
Receive queue (corresponding to one update count). Use empty(), front(), pop().
Definition at line 154 of file message_recorder.h. Referenced by replayNextDataAvailable(). |
1.3.6