Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "../StdAfx.h"
#include "ExtractDialog.h"
#include "FileExists.h"
namespace SpkExplorer {
void ExtractDialog::Background_DoWork(System::Object ^Sender, DoWorkEventArgs ^E)
{
System::Threading::Thread::Sleep(5);
switch ( m_iWorkingStatus )
{
case WORKER_READ:
if ( m_pMultiPackage )
{
if ( !m_pMultiPackage->ReadSpk(m_pWorkingPackage, SPKREAD_ALL) )
m_sFailed = "Reading";
}
else
{
if ( m_iGame != -1 ) {
if ( m_pWorkingFile->GetGame() && m_pWorkingFile->GetGame() != m_iGame ) {
m_iWorkingStatus = WORKER_WRITE;
break;
}
else if ( !m_iGame && m_pWorkingFile->GetGame() ) {
m_iWorkingStatus = WORKER_WRITE;
break;
}
}
if ( !m_pPackage->ReadFileToMemory(m_pWorkingFile) )
m_sFailed = "Reading";
}
break;
case WORKER_UNCOMPRESS:
{
if ( !m_pMultiPackage )
{
long size;
m_pUncompressData = m_pWorkingFile->UncompressData(&size, 0);
if ( !size || !m_pUncompressData )
m_sFailed = "Uncompressing";
m_iUncompressSize = size;
}
}
break;
case WORKER_WRITE:
{
CyString sToDir = CyStringFromSystemString(m_sToDir);
if ( m_pMultiPackage )
{
if ( !m_pMultiPackage->ExtractFile(m_pWorkingPackage, sToDir) )
m_sFailed = "Writing";
}
else
{
if ( !CDirIO(sToDir + "/" + m_pWorkingFile->GetDirectory(NULL)).Exists() )
{
if ( !CDirIO(sToDir + "/" + m_pWorkingFile->GetDirectory(NULL)).Create() )
{
m_sFailed = "Creating Directory";
break;
}
}
if ( !m_pWorkingFile->WriteToFile(CFileIO(sToDir + "/" + m_pWorkingFile->GetNameDirectory(NULL)).GetFullFilename(), m_pUncompressData, m_iUncompressSize) )
m_sFailed = "Writing";
else
m_iExtractCount++;
}
}
break;
}
}
void ExtractDialog::DoNextFile()
{
++m_iCount;
this->progressBar1->Value = m_iCount;
bool finished = false;
if ( m_pMultiPackage )
{
m_pWorkingPackage = m_pMultiList->Next();
if ( !m_pWorkingPackage )
finished = true;
}
else
{
m_pWorkingFile = m_pList->Next();
if ( !m_pWorkingFile )
finished = true;
}
if ( !finished )
{
this->UpdateDisplay();
this->StartWork(WORKER_READ);
}
else
this->Finished();
}
void ExtractDialog::Background_Finished(System::Object ^Sender, RunWorkerCompletedEventArgs ^E)
{
if ( m_sFailed->Length )
{
if ( m_pMultiPackage )
m_pFailedList->PushBack(m_pWorkingPackage->sName, CyStringFromSystemString(m_sFailed));
else
m_pFailedList->PushBack(m_pWorkingFile->GetNameDirectory(NULL), CyStringFromSystemString(m_sFailed));
}
if ( m_iWorkingStatus == WORKER_WRITE || m_sFailed->Length )
this->DoNextFile();
else
this->StartWork(m_iWorkingStatus + 1);
}
void ExtractDialog::Finished()
{
m_bOK = true;
if ( !m_pFailedList->Empty() )
{
CyString s;
for ( SStringList *str = m_pFailedList->Head(); str; str = str->next )
s += str->str + " (" + str->data + ")\n";
MessageBox::Show(this, "Error Extracting Files:\n\n" + SystemStringFromCyString(s), "Extract Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
m_bOK = false;
}
this->Close();
}
bool ExtractDialog::CheckExists(System::String ^file)
{
if ( m_bYesToAll )
return true;
if ( !System::IO::File::Exists(file) )
return true;
if ( m_bNoToAll )
return false;
CyString sFile = CyStringFromSystemString(file);
sFile.FindReplace("/", "\\");
FileExists ^exists = gcnew FileExists(SystemStringFromCyString(sFile));
System::Windows::Forms::DialogResult result = exists->ShowDialog(this);
if ( result == System::Windows::Forms::DialogResult::Yes )
return true;
else if ( result == System::Windows::Forms::DialogResult::Cancel )
{
m_bCancel = true;
this->Close();
return false;
}
else if ( result == System::Windows::Forms::DialogResult::No )
return false;
else if ( result == System::Windows::Forms::DialogResult::Ignore )
{
m_bNoToAll = true;
return false;
}
else if ( result == System::Windows::Forms::DialogResult::OK )
{
m_bYesToAll = true;
return true;
}
return false;
}
void ExtractDialog::StartWork(int status)
{
m_iWorkingStatus = status;
bool start = true;
switch ( m_iWorkingStatus )
{
case WORKER_READ:
{
String ^checkFile;
if ( m_pMultiPackage )
checkFile = m_sToDir + "/" + SystemStringFromCyString(m_pWorkingPackage->sName);
else
checkFile = m_sToDir + "/" + SystemStringFromCyString(m_pWorkingFile->GetNameDirectory(NULL));
if ( !this->CheckExists(checkFile) )
{
start = false;
if ( !m_bCancel )
this->DoNextFile();
break;
}
this->LabStatus->Text = "Reading file to memory";
}
break;
case WORKER_UNCOMPRESS:
this->LabStatus->Text = "Uncompressing...";
break;
case WORKER_WRITE:
this->LabStatus->Text = "Writing File...";
break;
default:
start = false;
}
if ( start )
{
m_sFailed = "";
backgroundWorker1->RunWorkerAsync();
}
}
void ExtractDialog::UpdateDisplay()
{
CyString sToDir = CyStringFromSystemString(m_sToDir);
int max = 0;
if ( m_pMultiPackage )
max = m_pMultiList->size();
else
max = m_pList->size();
this->Text = "Extracting Files [" + (m_iCount + 1) + "/" + max + "]";
CyString filename;
if ( m_pMultiPackage )
filename = sToDir + "/" + m_pWorkingPackage->sName;
else
filename = sToDir + "/" + m_pWorkingFile->GetNameDirectory(NULL);
CyString displayFilename = filename;
displayFilename.FindReplace("/", "\\");
this->LabFilename->Text = SystemStringFromCyString(displayFilename);
if ( m_pMultiPackage )
this->LabSize->Text = SystemStringFromCyString(SPK::GetSizeString(m_pWorkingPackage->lSize));
else
this->LabSize->Text = SystemStringFromCyString(m_pWorkingFile->GetUncompressedSizeString());
this->LabStatus->Text = "Waiting";
}
void ExtractDialog::Start()
{
if ( m_pMultiPackage )
{
this->progressBar1->Maximum = m_pMultiList->size();
m_pWorkingPackage = m_pMultiList->First();
}
else
{
this->progressBar1->Maximum = m_pList->size();
m_pWorkingFile = m_pList->First();
}
this->progressBar1->Value = 0;
m_iCount = 0;
this->UpdateDisplay();
this->StartWork(WORKER_READ);
}
}