Subversion Repositories spk

Rev

Rev 1 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
#include "../StdAfx.h"
2
#include "ExtractDialog.h"
3
 
4
#include "FileExists.h"
5
 
6
namespace SpkExplorer {
7
	void ExtractDialog::Background_DoWork(System::Object ^Sender, DoWorkEventArgs ^E)
8
	{
9
		System::Threading::Thread::Sleep(5);
10
		switch ( m_iWorkingStatus )
11
		{
12
			case WORKER_READ:
13
				if ( m_pMultiPackage )
14
				{
15
					if ( !m_pMultiPackage->ReadSpk(m_pWorkingPackage, SPKREAD_ALL) )
16
						m_sFailed = "Reading";
17
				}
18
				else
19
				{
20
					if ( m_iGame != -1 ) {
21
						if ( m_pWorkingFile->GetGame() && m_pWorkingFile->GetGame() != m_iGame ) {
22
							m_iWorkingStatus = WORKER_WRITE;
23
							break;
24
						}
25
						else if ( !m_iGame && m_pWorkingFile->GetGame() ) {
26
							m_iWorkingStatus = WORKER_WRITE;
27
							break;
28
						}
29
					}
30
 
31
					if ( !m_pPackage->ReadFileToMemory(m_pWorkingFile) )
32
						m_sFailed = "Reading";
33
				}
34
				break;
35
			case WORKER_UNCOMPRESS:
36
				{
37
					if ( !m_pMultiPackage )
38
					{
39
						long size;
40
						m_pUncompressData = m_pWorkingFile->UncompressData(&size, 0);
41
						if ( !size || !m_pUncompressData )
42
							m_sFailed = "Uncompressing";
43
						m_iUncompressSize = size;
44
					}
45
				}
46
				break;
47
			case WORKER_WRITE:
48
				{
49
					CyString sToDir = CyStringFromSystemString(m_sToDir);
50
					if ( m_pMultiPackage )
51
					{
52
						if ( !m_pMultiPackage->ExtractFile(m_pWorkingPackage, sToDir) )
53
							m_sFailed = "Writing";
54
					}
55
					else
56
					{
57
						if ( !CDirIO(sToDir + "/" + m_pWorkingFile->GetDirectory(NULL)).Exists() )
58
						{
59
							if ( !CDirIO(sToDir + "/" + m_pWorkingFile->GetDirectory(NULL)).Create() )
60
							{
61
								m_sFailed = "Creating Directory";
62
								break;
63
							}
64
						}
65
 
66
						if ( !m_pWorkingFile->WriteToFile(CFileIO(sToDir + "/" + m_pWorkingFile->GetNameDirectory(NULL)).GetFullFilename(), m_pUncompressData, m_iUncompressSize) )
67
							m_sFailed = "Writing";
68
						else
69
							m_iExtractCount++;
70
					}
71
				}
72
				break;
73
		}
74
	}
75
 
76
	void ExtractDialog::DoNextFile()
77
	{
78
		++m_iCount;
79
		this->progressBar1->Value = m_iCount;
80
 
81
		bool finished = false;
82
		if ( m_pMultiPackage )
83
		{
84
			m_pWorkingPackage = m_pMultiList->Next();
85
			if ( !m_pWorkingPackage )
86
				finished = true;
87
		}
88
		else
89
		{
90
			m_pWorkingFile = m_pList->Next();
91
			if ( !m_pWorkingFile )
92
				finished = true;
93
		}
94
 
95
		if ( !finished )
96
		{
97
			this->UpdateDisplay();
98
			this->StartWork(WORKER_READ);
99
		}
100
		else
101
			this->Finished();
102
	}
103
 
104
	void ExtractDialog::Background_Finished(System::Object ^Sender, RunWorkerCompletedEventArgs ^E)
105
	{
106
		if ( m_sFailed->Length )
107
		{
108
			if ( m_pMultiPackage )
109
				m_pFailedList->PushBack(m_pWorkingPackage->sName, CyStringFromSystemString(m_sFailed));
110
			else
111
				m_pFailedList->PushBack(m_pWorkingFile->GetNameDirectory(NULL), CyStringFromSystemString(m_sFailed));
112
		}
113
 
114
		if ( m_iWorkingStatus == WORKER_WRITE || m_sFailed->Length )
115
			this->DoNextFile();
116
		else
117
			this->StartWork(m_iWorkingStatus + 1);
118
	}
119
 
120
	void ExtractDialog::Finished()
121
	{
122
		m_bOK = true;
123
		if ( !m_pFailedList->Empty() )
124
		{
125
			CyString s;
126
			for ( SStringList *str = m_pFailedList->Head(); str; str = str->next )
127
				s += str->str + " (" + str->data + ")\n";
128
			MessageBox::Show(this, "Error Extracting Files:\n\n" + SystemStringFromCyString(s), "Extract Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
129
			m_bOK = false;
130
		}
131
 
132
		this->Close();
133
	}
134
 
135
	bool ExtractDialog::CheckExists(System::String ^file)
136
	{
137
		if ( m_bYesToAll )
138
			return true;
139
 
140
		if ( !System::IO::File::Exists(file) )
141
			return true;
142
 
143
		if ( m_bNoToAll )
144
			return false;
145
 
146
		CyString sFile = CyStringFromSystemString(file);
147
		sFile.FindReplace("/", "\\");
148
		FileExists ^exists = gcnew FileExists(SystemStringFromCyString(sFile));
149
		System::Windows::Forms::DialogResult result = exists->ShowDialog(this);
150
		if ( result == System::Windows::Forms::DialogResult::Yes )
151
			return true;
152
		else if ( result == System::Windows::Forms::DialogResult::Cancel )
153
		{
154
			m_bCancel = true;
155
			this->Close();
156
			return false;
157
		}
158
		else if ( result == System::Windows::Forms::DialogResult::No )
159
			return false;
160
		else if ( result == System::Windows::Forms::DialogResult::Ignore )
161
		{
162
			m_bNoToAll = true;
163
			return false;
164
		}
165
		else if ( result == System::Windows::Forms::DialogResult::OK )
166
		{
167
			m_bYesToAll = true;
168
			return true;
169
		}
170
 
171
		return false;
172
	}
173
 
174
	void ExtractDialog::StartWork(int status)
175
	{
176
		m_iWorkingStatus = status;
177
		bool start = true;
178
		switch ( m_iWorkingStatus )
179
		{
180
			case WORKER_READ:
181
				{
182
					String ^checkFile;
183
					if ( m_pMultiPackage )
184
						checkFile = m_sToDir + "/" + SystemStringFromCyString(m_pWorkingPackage->sName);
185
					else
186
						checkFile = m_sToDir + "/" + SystemStringFromCyString(m_pWorkingFile->GetNameDirectory(NULL));
187
					if ( !this->CheckExists(checkFile) )
188
					{
189
						start = false;
190
						if ( !m_bCancel )
191
							this->DoNextFile();
192
						break;
193
					}
194
					this->LabStatus->Text = "Reading file to memory";
195
				}
196
				break;
197
			case WORKER_UNCOMPRESS:
198
				this->LabStatus->Text = "Uncompressing...";
199
				break;
200
			case WORKER_WRITE:
201
				this->LabStatus->Text = "Writing File...";
202
				break;
203
			default:
204
				start = false;
205
		}
206
 
207
		if ( start )
208
		{
209
			m_sFailed = "";
210
			backgroundWorker1->RunWorkerAsync();
211
		}
212
	}
213
 
214
 
215
	void ExtractDialog::UpdateDisplay()
216
	{
217
		CyString sToDir = CyStringFromSystemString(m_sToDir);
218
 
219
		int max = 0;
220
		if ( m_pMultiPackage )
221
			max = m_pMultiList->size();
222
		else
223
			max = m_pList->size();
224
 
225
		this->Text = "Extracting Files [" + (m_iCount + 1) + "/" + max + "]";
226
 
227
		CyString filename;
228
		if ( m_pMultiPackage )
229
			filename = sToDir + "/" + m_pWorkingPackage->sName;
230
		else
231
			filename = sToDir + "/" + m_pWorkingFile->GetNameDirectory(NULL);
232
 
233
		CyString displayFilename = filename;
234
		displayFilename.FindReplace("/", "\\");
235
		this->LabFilename->Text = SystemStringFromCyString(displayFilename);
236
 
237
		if ( m_pMultiPackage )
238
			this->LabSize->Text = SystemStringFromCyString(SPK::GetSizeString(m_pWorkingPackage->lSize));
239
		else
240
			this->LabSize->Text = SystemStringFromCyString(m_pWorkingFile->GetUncompressedSizeString());
241
		this->LabStatus->Text = "Waiting";
242
	}
243
 
244
	void ExtractDialog::Start()
245
	{
246
		if ( m_pMultiPackage )
247
		{
248
			this->progressBar1->Maximum = m_pMultiList->size();
249
			m_pWorkingPackage = m_pMultiList->First();
250
		}
251
		else
252
		{
253
			this->progressBar1->Maximum = m_pList->size();
254
			m_pWorkingFile = m_pList->First();
255
		}
256
		this->progressBar1->Value = 0;
257
 
258
		m_iCount = 0;
259
		this->UpdateDisplay();
260
		this->StartWork(WORKER_READ);
261
	}
262
}