/* * Copyright (C) 2009, 2010, 2014 Nicolas Bonnefon and other contributors * * This file is part of glogg. * * glogg is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * glogg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glogg. If not, see . */ #ifndef LOGDATAWORKERTHREAD_H #define LOGDATAWORKERTHREAD_H #include #include #include #include #include #include "loadingstatus.h" #include "linepositionarray.h" // This class is a mutex protected set of indexing data. // It is thread safe. class IndexingData { public: IndexingData() : dataMutex_(), linePosition_(), maxLength_(0), indexedSize_(0) { } // Atomically get all the indexing data void getAll( qint64* size, int* length, LinePositionArray* linePosition ); // Atomically set all the indexing data // (overwriting the existing, linePosition is moved) void setAll( qint64 size, int length, LinePositionArray& linePosition ); // Atomically add to all the existing // indexing data. void addAll( qint64 size, int length, const LinePositionArray& linePosition ); private: QMutex dataMutex_; LinePositionArray linePosition_; int maxLength_; qint64 indexedSize_; }; class IndexOperation : public QObject { Q_OBJECT public: IndexOperation( QString& fileName, bool* interruptRequest ); virtual ~IndexOperation() { } // Start the indexing operation, returns true if it has been done // and false if it has been cancelled (results not copied) virtual bool start( IndexingData& result ) = 0; signals: void indexingProgressed( int ); protected: static const int sizeChunk; // Returns the total size indexed qint64 doIndex( LinePositionArray& linePosition, int* maxLength, qint64 initialPosition ); QString fileName_; bool* interruptRequest_; }; class FullIndexOperation : public IndexOperation { public: FullIndexOperation( QString& fileName, bool* interruptRequest ) : IndexOperation( fileName, interruptRequest ) { } virtual bool start( IndexingData& result ); }; class PartialIndexOperation : public IndexOperation { public: PartialIndexOperation( QString& fileName, bool* interruptRequest, qint64 position ); virtual bool start( IndexingData& result ); private: qint64 initialPosition_; }; // Create and manage the thread doing loading/indexing for // the creating LogData. One LogDataWorkerThread is used // per LogData instance. // Note everything except the run() function is in the LogData's // thread. class LogDataWorkerThread : public QThread { Q_OBJECT public: LogDataWorkerThread(); ~LogDataWorkerThread(); // Attaches to a file on disk. Attaching to a non existant file // will work, it will just appear as an empty file. void attachFile( const QString& fileName ); // Instructs the thread to start a new full indexing of the file, sending // signals as it progresses. void indexAll(); // Instructs the thread to start a partial indexing (starting at // the index passed). void indexAdditionalLines( qint64 position ); // Interrupts the indexing if one is in progress void interrupt(); // Returns a copy of the current indexing data void getIndexingData( qint64* indexedSize, int* maxLength, LinePositionArray* linePosition ); signals: // Sent during the indexing process to signal progress // percent being the percentage of completion. void indexingProgressed( int percent ); // Sent when indexing is finished, signals the client // to copy the new data back. void indexingFinished( LoadingStatus status ); protected: void run(); private: void doIndexAll(); // Mutex to protect operationRequested_ and friends QMutex mutex_; QWaitCondition operationRequestedCond_; QWaitCondition nothingToDoCond_; QString fileName_; // Set when the thread must die bool terminate_; bool interruptRequested_; IndexOperation* operationRequested_; // Shared indexing data IndexingData indexingData_; }; #endif