00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_MESSAGE_RECORDER_H
00027 #define NL_MESSAGE_RECORDER_H
00028
00029 #include "nel/misc/types_nl.h"
00030 #include "nel/net/buf_net_base.h"
00031
00032 #include "nel/net/message.h"
00033 #include "nel/misc/time_nl.h"
00034 #include "nel/misc/mem_stream.h"
00035
00036 #include <fstream>
00037 #include <queue>
00038 #include <string>
00039
00040 using namespace std;
00041
00042
00043 namespace NLNET {
00044
00045
00046 class CInetAddress;
00047
00049 enum TNetworkEvent { Sending, Receiving, Connecting, ConnFailing, Accepting, Disconnecting, Error };
00050
00051
00053 string EventToString( TNetworkEvent e );
00054
00056 TNetworkEvent StringToEvent( string& s );
00057
00058
00059
00060
00061
00062 struct TMessageRecord
00063 {
00065 TMessageRecord( bool input = false ) : UpdateCounter(0), SockId(NULL), Message( "", input ) {}
00066
00068 TMessageRecord( TNetworkEvent event, TSockId sockid, CMessage& msg, sint64 updatecounter ) :
00069 Event(event), SockId(sockid), Message(msg), UpdateCounter(updatecounter) {}
00070
00072 void serial( NLMISC::CMemStream& stream )
00073 {
00074 nlassert( stream.stringMode() );
00075
00076 uint32 len;
00077 string s_event;
00078 stream.serial( UpdateCounter );
00079 if ( stream.isReading() )
00080 {
00081 stream.serial( s_event );
00082 Event = StringToEvent( s_event );
00083 stream.serialHex( (uint32&)SockId );
00084 stream.serial( len );
00085 stream.serialBuffer( Message.bufferToFill( len ), len );
00086 }
00087 else
00088 {
00089 s_event = EventToString( Event );
00090 stream.serial( s_event );
00091 stream.serialHex( (uint32&)SockId );
00092 len = Message.length();
00093 stream.serial( len );
00094 stream.serialBuffer( const_cast<uint8*>(Message.buffer()), len );
00095 }
00096 }
00097
00098
00099 sint64 UpdateCounter;
00100 TNetworkEvent Event;
00101 TSockId SockId;
00102 CMessage Message;
00103 };
00104
00105
00106
00116 class CMessageRecorder
00117 {
00118 public:
00119
00121 CMessageRecorder();
00122
00124 ~CMessageRecorder();
00125
00127 bool startRecord( const std::string& filename, bool recordall=true );
00128
00130 void recordNext( sint64 updatecounter, TNetworkEvent event, TSockId sockid, CMessage& message );
00131
00133 void stopRecord();
00134
00136 bool startReplay( const std::string& filename );
00137
00139 void replayNextDataAvailable( sint64 updatecounter );
00140
00145 TNetworkEvent checkNextOne( sint64 updatecounter );
00146
00148 TNetworkEvent replayConnectionAttempt( const CInetAddress& addr );
00149
00151 void stopReplay();
00152
00154 std::queue<NLNET::TMessageRecord> ReceivedMessages;
00155
00156 protected:
00157
00159 bool loadNext( TMessageRecord& record );
00160
00162 bool getNext( TMessageRecord& record, sint64 updatecounter );
00163
00164 private:
00165
00166
00167 std::fstream _File;
00168
00169
00170 std::string _Filename;
00171
00172
00173 std::deque<TMessageRecord> _PreloadedRecords;
00174
00175
00176 std::deque<TMessageRecord> _ConnectionAttempts;
00177
00178
00179 bool _RecordAll;
00180 };
00181
00182
00183 }
00184
00185
00186 #endif // NL_MESSAGE_RECORDER_H
00187
00188