Subversion Repositories spk

Rev

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