Subversion Repositories spk

Rev

Rev 225 | 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 ) {
128 cycrow 21
						if ( m_pWorkingFile->game() && !(m_pWorkingFile->game() & (1 << m_iGame))) {
1 cycrow 22
							m_iWorkingStatus = WORKER_WRITE;
23
							break;
24
						}
128 cycrow 25
						else if ( !m_iGame && m_pWorkingFile->game() ) {
1 cycrow 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
					{
45 cycrow 39
						long size = 0;
62 cycrow 40
						if ( m_pWorkingFile->GetDataSize() ) {
45 cycrow 41
							m_pUncompressData = m_pWorkingFile->UncompressData(&size, 0);
42
							if ( !size || !m_pUncompressData )
43
								m_sFailed = "Uncompressing";
44
						}
1 cycrow 45
						m_iUncompressSize = size;
46
					}
47
				}
48
				break;
49
			case WORKER_WRITE:
50
				{
197 cycrow 51
					Utils::WString sToDir = _WS(m_sToDir);
1 cycrow 52
					if ( m_pMultiPackage )
53
					{
224 cycrow 54
						if ( !m_pMultiPackage->extractFile(m_pWorkingPackage, sToDir) )
1 cycrow 55
							m_sFailed = "Writing";
56
					}
57
					else
58
					{
128 cycrow 59
						// check for addon directory
60
						if (m_pWorkingFile->isFileInAddon())
1 cycrow 61
						{
128 cycrow 62
							unsigned int game = m_iGame;
63
							if (game <= 0)
1 cycrow 64
							{
128 cycrow 65
								unsigned int checkGame = m_pWorkingFile->game() & ~GAME_ALLNEW;
66
								for (int i = 0; i < 31; ++i)
67
								{
68
									if (checkGame == (1 << i))
69
									{
70
										game = i;
71
										break;
72
									}
73
								}
74
							}
75
 
76
							if (game > 0)
77
							{
197 cycrow 78
								SGameExe *exe = _pPackages->GetGameExe()->game(game - 1);
128 cycrow 79
								if (exe && !exe->sAddon.empty())
197 cycrow 80
									sToDir += L"/" + exe->sAddon;
128 cycrow 81
							}
82
						}
83
 
197 cycrow 84
						if ( !CDirIO(sToDir + L"/" + m_pWorkingFile->getDirectory(NULL)).exists() )
128 cycrow 85
						{
197 cycrow 86
							if ( !CDirIO(sToDir + L"/" + m_pWorkingFile->getDirectory(NULL)).create() )
128 cycrow 87
							{
1 cycrow 88
								m_sFailed = "Creating Directory";
89
								break;
90
							}
91
						}
92
 
197 cycrow 93
						if ( !m_pWorkingFile->writeToFile(CFileIO(sToDir + L"/" + m_pWorkingFile->getNameDirectory(NULL)).fullFilename(), m_pUncompressData, m_iUncompressSize) )
1 cycrow 94
							m_sFailed = "Writing";
95
						else
96
							m_iExtractCount++;
97
					}
98
				}
99
				break;
100
		}
101
	}
102
 
103
	void ExtractDialog::DoNextFile()
104
	{
105
		++m_iCount;
106
		this->progressBar1->Value = m_iCount;
107
 
108
		bool finished = false;
109
		if ( m_pMultiPackage )
110
		{
111
			m_pWorkingPackage = m_pMultiList->Next();
112
			if ( !m_pWorkingPackage )
113
				finished = true;
114
		}
115
		else
116
		{
117
			m_pWorkingFile = m_pList->Next();
118
			if ( !m_pWorkingFile )
119
				finished = true;
120
		}
121
 
122
		if ( !finished )
123
		{
124
			this->UpdateDisplay();
125
			this->StartWork(WORKER_READ);
126
		}
127
		else
128
			this->Finished();
129
	}
130
 
131
	void ExtractDialog::Background_Finished(System::Object ^Sender, RunWorkerCompletedEventArgs ^E)
132
	{
133
		if ( m_sFailed->Length )
134
		{
135
			if ( m_pMultiPackage )
219 cycrow 136
				m_pFailedList->pushBack(m_pWorkingPackage->sName, _WS(m_sFailed));
1 cycrow 137
			else
219 cycrow 138
				m_pFailedList->pushBack(m_pWorkingFile->getNameDirectory(NULL), _WS(m_sFailed));
1 cycrow 139
		}
140
 
141
		if ( m_iWorkingStatus == WORKER_WRITE || m_sFailed->Length )
142
			this->DoNextFile();
143
		else
144
			this->StartWork(m_iWorkingStatus + 1);
145
	}
146
 
147
	void ExtractDialog::Finished()
148
	{
149
		m_bOK = true;
219 cycrow 150
		if ( !m_pFailedList->empty() )
1 cycrow 151
		{
219 cycrow 152
			Utils::WString s;
153
			for (auto itr = m_pFailedList->begin(); itr != m_pFailedList->end(); itr++)
154
				s += (*itr)->str + L" (" + (*itr)->data + L")\n";
155
			MessageBox::Show(this, "Error Extracting Files:\n\n" + _US(s), "Extract Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
1 cycrow 156
			m_bOK = false;
157
		}
158
 
159
		this->Close();
160
	}
161
 
162
	bool ExtractDialog::CheckExists(System::String ^file)
163
	{
164
		if ( m_bYesToAll )
165
			return true;
166
 
167
		if ( !System::IO::File::Exists(file) )
168
			return true;
169
 
170
		if ( m_bNoToAll )
171
			return false;
172
 
225 cycrow 173
		Utils::WString sFile = _WS(file);
174
		sFile = sFile.findReplace(L"/", L"\\");
175
		FileExists ^exists = gcnew FileExists(_US(sFile));
1 cycrow 176
		System::Windows::Forms::DialogResult result = exists->ShowDialog(this);
177
		if ( result == System::Windows::Forms::DialogResult::Yes )
178
			return true;
179
		else if ( result == System::Windows::Forms::DialogResult::Cancel )
180
		{
181
			m_bCancel = true;
182
			this->Close();
183
			return false;
184
		}
185
		else if ( result == System::Windows::Forms::DialogResult::No )
186
			return false;
187
		else if ( result == System::Windows::Forms::DialogResult::Ignore )
188
		{
189
			m_bNoToAll = true;
190
			return false;
191
		}
192
		else if ( result == System::Windows::Forms::DialogResult::OK )
193
		{
194
			m_bYesToAll = true;
195
			return true;
196
		}
197
 
198
		return false;
199
	}
200
 
201
	void ExtractDialog::StartWork(int status)
202
	{
203
		m_iWorkingStatus = status;
204
		bool start = true;
205
		switch ( m_iWorkingStatus )
206
		{
207
			case WORKER_READ:
208
				{
209
					String ^checkFile;
210
					if ( m_pMultiPackage )
178 cycrow 211
						checkFile = m_sToDir + "/" + _US(m_pWorkingPackage->sName);
1 cycrow 212
					else
178 cycrow 213
						checkFile = m_sToDir + "/" + _US(m_pWorkingFile->getNameDirectory(NULL));
1 cycrow 214
					if ( !this->CheckExists(checkFile) )
215
					{
216
						start = false;
217
						if ( !m_bCancel )
218
							this->DoNextFile();
219
						break;
220
					}
221
					this->LabStatus->Text = "Reading file to memory";
222
				}
223
				break;
224
			case WORKER_UNCOMPRESS:
225
				this->LabStatus->Text = "Uncompressing...";
226
				break;
227
			case WORKER_WRITE:
228
				this->LabStatus->Text = "Writing File...";
229
				break;
230
			default:
231
				start = false;
232
		}
233
 
234
		if ( start )
235
		{
236
			m_sFailed = "";
237
			backgroundWorker1->RunWorkerAsync();
238
		}
239
	}
240
 
241
 
242
	void ExtractDialog::UpdateDisplay()
243
	{
197 cycrow 244
		Utils::WString sToDir = _WS(m_sToDir);
1 cycrow 245
 
246
		int max = 0;
247
		if ( m_pMultiPackage )
248
			max = m_pMultiList->size();
249
		else
250
			max = m_pList->size();
251
 
252
		this->Text = "Extracting Files [" + (m_iCount + 1) + "/" + max + "]";
253
 
197 cycrow 254
		Utils::WString filename;
1 cycrow 255
		if ( m_pMultiPackage )
219 cycrow 256
			filename = sToDir + L"/" + m_pWorkingPackage->sName;
1 cycrow 257
		else
197 cycrow 258
			filename = sToDir + L"/" + m_pWorkingFile->getNameDirectory(NULL);
1 cycrow 259
 
197 cycrow 260
		Utils::WString displayFilename = filename;
226 cycrow 261
		displayFilename = displayFilename.findReplace(L"/", L"\\");
178 cycrow 262
		this->LabFilename->Text = _US(displayFilename);
1 cycrow 263
 
264
		if ( m_pMultiPackage )
178 cycrow 265
			this->LabSize->Text = _US(SPK::GetSizeString(m_pWorkingPackage->lSize));
1 cycrow 266
		else
178 cycrow 267
			this->LabSize->Text = _US(m_pWorkingFile->uncompressedSizeString());
1 cycrow 268
		this->LabStatus->Text = "Waiting";
269
	}
270
 
271
	void ExtractDialog::Start()
272
	{
273
		if ( m_pMultiPackage )
274
		{
275
			this->progressBar1->Maximum = m_pMultiList->size();
276
			m_pWorkingPackage = m_pMultiList->First();
277
		}
278
		else
279
		{
280
			this->progressBar1->Maximum = m_pList->size();
281
			m_pWorkingFile = m_pList->First();
282
		}
283
		this->progressBar1->Value = 0;
284
 
285
		m_iCount = 0;
286
		this->UpdateDisplay();
287
		this->StartWork(WORKER_READ);
288
	}
289
}