diff --git a/nandExtract/nandthread.cpp b/nandExtract/nandthread.cpp new file mode 100644 index 0000000..0b24e07 --- /dev/null +++ b/nandExtract/nandthread.cpp @@ -0,0 +1,152 @@ +#include "nandthread.h" + +NandThread::NandThread( QObject *parent ) : QThread( parent ) +{ + abort = false; + itemToExtract = NULL; + + connect( &nandBin, SIGNAL( SendError( QString ) ), this, SLOT( GetError( QString ) ) ); + connect( &nandBin, SIGNAL( SendText( QString ) ), this, SLOT( GetStatusUpdate( QString ) ) ); +} + +void NandThread::ForceQuit() +{ + mutex.lock(); + abort = true; + mutex.unlock(); +} + +NandThread::~NandThread() +{ + mutex.lock(); + abort = true; + condition.wakeOne(); + mutex.unlock(); + wait(); + + if( itemToExtract ) + delete itemToExtract; +} + +bool NandThread::IsRunning() +{ + return isRunning(); +} + +bool NandThread::SetPath( const QString &path ) +{ + if( isRunning() ) + { + emit SendError( tr( "Wait till the current job is done" ) ); + return false; + } + return nandBin.SetPath( path ); +} + +QTreeWidgetItem *NandThread::GetTree() +{ + if( isRunning() ) + { + emit SendError( tr( "Wait till the current job is done" ) ); + return NULL; + } + return nandBin.GetTree(); +} + +bool NandThread::InitNand( QIcon dirs, QIcon files ) +{ + if( isRunning() ) + { + emit SendError( tr( "Wait till the current job is done" ) ); + return false; + } + return nandBin.InitNand( dirs, files ); +} + +const QList NandThread::GetFats() +{ + return nandBin.GetFats(); +} + +const QList NandThread::GetFatsForFile( quint16 i ) +{ + return nandBin.GetFatsForFile( i ); +} + +void NandThread::Extract( QTreeWidgetItem *item, const QString &path ) +{ + if( isRunning() ) + { + emit SendError( tr( "This thread is already doing something. Please wait." ) ); + return; + } + if( !item ) + { + emit SendError( tr( "Oh Noez!! I was told to extract with a pointer to NULL :( ." ) ); + return; + } + abort = false; + extractPath = path; + itemToExtract = item->clone(); + + + + start( NormalPriority ); +} + +void NandThread::run() +{ + if( abort ) + { + qDebug( "NandThread::run -> Thread abort" ); + return; + } + mutex.lock(); + if( extractPath.isEmpty() ) + { + qDebug() << "NandThread::run -> its empty"; + return; + } + fileCnt = FileCount( itemToExtract ); + idx = 0; + mutex.unlock(); + emit SendProgress( 0 ); + + nandBin.ExtractToDir( itemToExtract, extractPath ); + + delete itemToExtract; + itemToExtract = NULL; + emit SendProgress( 100 ); + emit SendExtractDone(); +} + +quint32 NandThread::FileCount( QTreeWidgetItem *item ) +{ + if( item->text( 6 ) == "00" )//its a folder, recurse through it and count all the files + { + quint32 ret = 0; + quint16 cnt = item->childCount(); + for( quint16 i = 0; i < cnt; i++ ) + { + ret += FileCount( item->child( i ) ) ; + } + return ret; + } + //not a folder, must be a file. just return 1 + return 1; +} + +void NandThread::GetStatusUpdate( QString s ) +{ + emit SendText( s ); + emit SendProgress( (int)( ( (float)( idx++ ) / (float)fileCnt ) * (float)100 ) ); +} + +//just send errors from the nand object to the mainwindow +void NandThread::GetError( QString str ) +{ + emit SendError( str ); +} + + + diff --git a/nandExtract/nandthread.h b/nandExtract/nandthread.h new file mode 100644 index 0000000..0f7f3d3 --- /dev/null +++ b/nandExtract/nandthread.h @@ -0,0 +1,65 @@ +#ifndef NANDTHREAD_H +#define NANDTHREAD_H + +#include "../WiiQt/includes.h" +#include "../WiiQt/nandbin.h" + + +//TODO: this thread really isnt setup to be inturruptable. especially while it is extracting the full nand.bin +class NandThread : public QThread +{ + Q_OBJECT + + public: + NandThread( QObject *parent = 0 ); + ~NandThread(); + + bool IsRunning(); + + //these just call the same function of the nand.bin object + // dont use them if the thread is running ( it is busy extracting ) + // wait till after SendExtractDone() is emitted + bool SetPath( const QString &path ); + QTreeWidgetItem *GetTree(); + bool InitNand( QIcon dirs = QIcon(), QIcon files = QIcon() ); + const QList GetFats(); + const QList GetFatsForFile( quint16 i ); + + + //extract some stuff from a nand.bin in a thread so the gui doesn't freeze up + void Extract( QTreeWidgetItem *item, const QString &path ); + void ForceQuit(); + + protected: + void run(); + + signals: + void SendProgress( int ); + void SendExtractDone(); + void SendText( QString ); + void SendError( QString ); + + private: + QMutex mutex; + QWaitCondition condition; + + QString extractPath; + QTreeWidgetItem *itemToExtract; + NandBin nandBin; + + + quint32 fileCnt; + quint32 idx; + + bool abort; + + //count the number of files in a given folder + quint32 FileCount( QTreeWidgetItem *item ); + + + public slots: + void GetError( QString ); + void GetStatusUpdate( QString ); + }; + +#endif // NANDTHREAD_H