* forgotten files

git-svn-id: http://wiiqt.googlecode.com/svn/trunk@16 389f4c8b-5dfe-645f-db0e-df882bc27289
This commit is contained in:
giantpune@gmail.com 2010-12-11 10:39:41 +00:00
parent cc7d47f3ab
commit 034e487a31
2 changed files with 217 additions and 0 deletions

152
nandExtract/nandthread.cpp Normal file
View File

@ -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<quint16> NandThread::GetFats()
{
return nandBin.GetFats();
}
const QList<quint16> 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 );
}

65
nandExtract/nandthread.h Normal file
View File

@ -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<quint16> GetFats();
const QList<quint16> 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