void HearthstoneLogWatcher::CheckForLogChanges() { QFile file( mPath ); if( !file.open( QIODevice::ReadOnly ) ) { return; } qint64 size = file.size(); if( size < mLastSeekPos ) { DBG( "Log truncation detected. This is OK if game was restarted." ); mLastSeekPos = 0; } else { // Use raw QFile instead of QTextStream // QTextStream uses buffering and seems to skip some lines (see also QTextStream#pos) file.seek( mLastSeekPos ); QByteArray buf = file.readAll(); QList< QByteArray > lines = buf.split('\n'); QByteArray lastLine = lines.takeLast(); for( const QByteArray& line : lines ) { emit LineAdded( QString::fromUtf8( line.trimmed() ) ); } mLastSeekPos = file.pos() - lastLine.size(); } }
HearthstoneLogTracker::HearthstoneLogTracker() : mTurnCounter( 0 ), mHeroPowerUsed( false ), mHeroPlayerId( 0 ), mLegendTracked( false ) { qRegisterMetaType< ::CardHistoryList >( "CardHistoryList" ); for( int i = 0; i < NUM_LOG_MODULES; i++ ) { const char *moduleName = LOG_MODULE_NAMES[ i ]; QString logPath = Hearthstone::Instance()->LogPath( QString( "%1.log" ).arg( moduleName ) ); HearthstoneLogWatcher *logWatcher = new HearthstoneLogWatcher( this, logPath ); connect( logWatcher, SIGNAL( LineAdded(QString) ), this, SLOT( HandleLogLine(QString) ) ); mLogWatchers.push_back( logWatcher ); } Reset(); }