Subversion Repositories spk

Rev

Rev 241 | Rev 249 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 241 Rev 248
Line 391... Line 391...
391
					if ( cmd == L"<script>" )
391
					if ( cmd == L"<script>" )
392
					{
392
					{
393
						if ( packageFile->IsMod() && packageFile->IsEnabled() )
393
						if ( packageFile->IsMod() && packageFile->IsEnabled() )
394
							m_pEnabledMod = packageFile;
394
							m_pEnabledMod = packageFile;
395
 
395
 
396
						m_lPackages.push_back(packageFile);
396
						
397
						this->ConvertOldPackage(packageFile);
397
						_processAddPackage(packageFile);
398
						packageFile = new CSpkFile();
398
						packageFile = new CSpkFile();
399
						iStatus = READ_SCRIPT;
399
						iStatus = READ_SCRIPT;
400
 
400
 
401
					}
401
					}
402
					else if ( cmd == L"<ship>" )
402
					else if ( cmd == L"<ship>" )
403
					{
403
					{
404
						m_lPackages.push_back(packageFile);
-
 
405
						this->ConvertOldPackage(packageFile);
404
						_processAddPackage(packageFile);
406
						packageFile = new CXspFile();
405
						packageFile = new CXspFile();
407
						iStatus = READ_SCRIPT;
406
						iStatus = READ_SCRIPT;
408
					}
407
					}
409
					else if ( cmd == L"<base>" )
408
					else if ( cmd == L"<base>" )
410
					{
409
					{
411
						m_lPackages.push_back(packageFile);
-
 
412
						this->ConvertOldPackage(packageFile);
410
						_processAddPackage(packageFile);
413
						packageFile = new CBaseFile();
411
						packageFile = new CBaseFile();
414
						iStatus = READ_SCRIPT;
412
						iStatus = READ_SCRIPT;
415
					}
413
					}
416
					else if ( cmd == L"<archive>" )
414
					else if ( cmd == L"<archive>" )
417
					{
415
					{
418
						m_lPackages.push_back(packageFile);
-
 
419
						this->ConvertOldPackage(packageFile);
416
						_processAddPackage(packageFile);
420
						packageFile = new CArchiveFile();
417
						packageFile = new CArchiveFile();
421
						iStatus = READ_SCRIPT;
418
						iStatus = READ_SCRIPT;
422
					}
419
					}
423
					else if ( cmd == L"</scripts>" )
420
					else if (cmd == L"</scripts>")
424
					{
421
					{
425
						if ( packageFile->IsMod() && packageFile->IsEnabled() )
422
						if ( packageFile->IsMod() && packageFile->IsEnabled() )
426
							m_pEnabledMod = packageFile;
423
							m_pEnabledMod = packageFile;
427
 
424
 
428
						m_lPackages.push_back(packageFile);
-
 
429
						this->ConvertOldPackage(packageFile);
425
						_processAddPackage(packageFile);
430
					}
426
					}
431
					else
427
					else
432
					{
428
					{
433
						int fileNum = line.token(L"::", 1).toLong();
429
						int fileNum = line.token(L"::", 1).toLong();
434
						if ( fileNum >= 0 && fileNum < m_lFiles.size() )
430
						if ( fileNum >= 0 && fileNum < m_lFiles.size() )
Line 1039... Line 1035...
1039
			}
1035
			}
1040
		}
1036
		}
1041
	}
1037
	}
1042
}
1038
}
1043
 
1039
 
-
 
1040
void CPackages::_processAddPackage(CBaseFile* p)
-
 
1041
{
-
 
1042
	if (p)
-
 
1043
	{
-
 
1044
		this->ConvertOldPackage(p);
-
 
1045
		p->completeFile();
-
 
1046
		m_lPackages.push_back(p);
-
 
1047
	}
-
 
1048
}
-
 
1049
 
1044
void CPackages::UpdatePackage(CBaseFile *p)
1050
void CPackages::UpdatePackage(CBaseFile *p)
1045
{
1051
{
1046
	if ( p->GetType() != TYPE_SPK )
1052
	if ( p->GetType() != TYPE_SPK )
1047
		return;
1053
		return;
1048
 
1054
 
Line 1789... Line 1795...
1789
		m_pEnabledMod = package;
1795
		m_pEnabledMod = package;
1790
		CLog::log(CLog::Log_Install, 1, L"Setting package as primary mod");
1796
		CLog::log(CLog::Log_Install, 1, L"Setting package as primary mod");
1791
	}
1797
	}
1792
 
1798
 
1793
	package->updateTextDB();
1799
	package->updateTextDB();
-
 
1800
	package->completeFile();
1794
 
1801
 
1795
	m_bRemoveDir = true;
1802
	m_bRemoveDir = true;
1796
 
1803
 
1797
	CLog::log(CLog::Log_Install, 1, L"Saving data to file");
1804
	CLog::log(CLog::Log_Install, 1, L"Saving data to file");
1798
	this->WriteData();
1805
	this->WriteData();
Line 1916... Line 1923...
1916
 
1923
 
1917
		if ( uninstalledPackages )
1924
		if ( uninstalledPackages )
1918
			uninstalledPackages->push_back(p);
1925
			uninstalledPackages->push_back(p);
1919
		else
1926
		else
1920
			delete p;
1927
			delete p;
-
 
1928
 
-
 
1929
		for (CListNode<SGameShip>* wNode = m_lGameShips.Front(); wNode; wNode = wNode->next())
-
 
1930
		{
-
 
1931
			if (wNode->Data()->pPackage == p)
-
 
1932
			{
-
 
1933
				wNode->Data()->pPackage = NULL;
-
 
1934
				break;
-
 
1935
			}
-
 
1936
		}
1921
	}
1937
	}
1922
 
1938
 
1923
	m_lInstallList.clear();
1939
	m_lInstallList.clear();
1924
 
1940
 
1925
	// check unistall files
1941
	// check unistall files
Line 2684... Line 2700...
2684
		lines.pushBack(L"SurpressProtectedWarning");
2700
		lines.pushBack(L"SurpressProtectedWarning");
2685
	if ( !m_sSetMod.empty() )
2701
	if ( !m_sSetMod.empty() )
2686
		lines.pushBack(L"SetMod: " + m_sSetMod);
2702
		lines.pushBack(L"SetMod: " + m_sSetMod);
2687
	if (!_sSaveDir.empty())
2703
	if (!_sSaveDir.empty())
2688
		lines.pushBack(L"SaveDir: " + _sSaveDir);
2704
		lines.pushBack(L"SaveDir: " + _sSaveDir);
2689
	lines.pushBack(L"ShipBuffer: " + (long)m_iShipBuffer);
2705
	lines.pushBack(L"ShipBuffer: " + Utils::WString::Number(m_iShipBuffer));
2690
	Utils::WString wareBuffer = L"WareBuffers:";
2706
	Utils::WString wareBuffer = L"WareBuffers:";
2691
	for ( int i = 0; i < WAREBUFFERS; i++ )
2707
	for ( int i = 0; i < WAREBUFFERS; i++ )
2692
		wareBuffer += Utils::WString(L" ") + (long)m_iWareBuffer[i];
2708
		wareBuffer += Utils::WString(L" ") + (long)m_iWareBuffer[i];
2693
	lines.pushBack(wareBuffer);
2709
	lines.pushBack(wareBuffer);
2694
	for ( int i = 0; i < WAREBUFFERS; i++ )
2710
	for ( int i = 0; i < WAREBUFFERS; i++ )
Line 5041... Line 5057...
5041
	{
5057
	{
5042
		m_gameExe.parseExe(L"x2.exe|0:5:1:NOSAVESUBDIR:HKCU/Software/EgoSoftware/X2/ModName:X2 The Threat:!GAMEDIR!:2:1604608!2150400:1.4 Artifical Life:1974272:1.5 Uplink");
5058
		m_gameExe.parseExe(L"x2.exe|0:5:1:NOSAVESUBDIR:HKCU/Software/EgoSoftware/X2/ModName:X2 The Threat:!GAMEDIR!:2:1604608!2150400:1.4 Artifical Life:1974272:1.5 Uplink");
5043
		m_gameExe.parseExe(L"x3.exe|30:5:1:0:HKCU/Software/Egosoft/X3/ModName:X3 Reunion:Egosoft/X3:2:2347008:2.0 Bala Gi:2367488!2375680:2.5 Uplink");
5059
		m_gameExe.parseExe(L"x3.exe|30:5:1:0:HKCU/Software/Egosoft/X3/ModName:X3 Reunion:Egosoft/X3:2:2347008:2.0 Bala Gi:2367488!2375680:2.5 Uplink");
5044
		m_gameExe.parseExe(L"x3tc.exe|35:5:1:NO_XOR|TC_TEXT|MYDOCLOG:HKCU/Software/Egosoft/X3TC/ModName:X3 Terran Conflict:Egosoft/X3TC:3:1933464!1933520:2.0 Aldrin Expansion:-1:2.5 A New Home (Superbox):-1:3.0 Balance of Power");
5060
		m_gameExe.parseExe(L"x3tc.exe|35:5:1:NO_XOR|TC_TEXT|MYDOCLOG:HKCU/Software/Egosoft/X3TC/ModName:X3 Terran Conflict:Egosoft/X3TC:3:1933464!1933520:2.0 Aldrin Expansion:-1:2.5 A New Home (Superbox):-1:3.0 Balance of Power");
5045
		m_gameExe.parseExe(L"x3ap.exe|38:2:2:NO_XOR|TC_TEXT|MYDOCLOG|ADDON:HKCU/Software/Egosoft/X3AP/ModName:X3 Albion Prelude:Egosoft/X3AP:addon!x3tc.exe:3:-1:2.0 The War Continues:-1:2.5 Operation Loose Ends:-1:3.0 Shady Business");
5061
		m_gameExe.parseExe(L"x3ap.exe|38:2:2:NO_XOR|TC_TEXT|MYDOCLOG|ADDON:HKCU/Software/Egosoft/X3AP/ModName:X3 Albion Prelude:Egosoft/X3AP:addon!x3tc.exe:3:-1:2.0 The War Continues:-1:2.5 Operation Loose Ends:-1:3.0 Shady Business");
5046
		m_gameExe.parseExe(L"x3fl.exe|39:3:3:NO_XOR|TC_TEXT|MYDOCLOG|ADDON:HKCU/Software/Egosoft/X3FL/ModName:X3 Farnham's Legacy:Egosoft/X3FL:addon2!x3tc.exe:0");
5062
		m_gameExe.parseExe(L"x3fl.exe|39:3:3:NO_XOR|TC_TEXT|SETTINGFILE|MYDOCLOG|ADDON:HKCU/Software/Egosoft/X3FL/ModName:X3 Farnham's Legacy:Egosoft/X3FL:addon2!x3tc.exe:0");
5047
	}
5063
	}
5048
}
5064
}
5049
void CPackages::startup(const Utils::WString &dir, const Utils::WString &tempDir, const Utils::WString &myDoc, const Utils::WString &mod)
5065
void CPackages::startup(const Utils::WString &dir, const Utils::WString &tempDir, const Utils::WString &myDoc, const Utils::WString &mod)
5050
{
5066
{
5051
	startup(dir, tempDir, myDoc);
5067
	startup(dir, tempDir, myDoc);
Line 5958... Line 5974...
5958
 
5974
 
5959
			// write shipyard info
5975
			// write shipyard info
5960
			if ( gs->pPackage )
5976
			if ( gs->pPackage )
5961
			{
5977
			{
5962
				int doStart = start + 5;
5978
				int doStart = start + 5;
5963
				for ( int i = SHIPYARD_ARGON; i <= SHIPYARD_MAX; i *= 2 )
5979
				for (ShipyardRace i = ShipyardRace::Argon; i <= ShipyardRace::Max; i = static_cast<ShipyardRace>(static_cast<unsigned int>(i) * 2))
5964
				{
5980
				{
5965
					writeData.push_back(Utils::WString(L"		<t id=\"") + (long)(doStart) + L"\">" + ((gs->pPackage->IsShipyard(i)) ? Utils::WString::Number(1) : Utils::WString::Number(0)) + L"</t>");
5981
					writeData.push_back(Utils::WString(L"		<t id=\"") + (long)(doStart) + L"\">" + ((gs->pPackage->isShipyard(i)) ? Utils::WString::Number(1) : Utils::WString::Number(0)) + L"</t>");
5966
					++doStart;
5982
					++doStart;
5967
				}
5983
				}
5968
			}
5984
			}
5969
 
5985
 
5970
			start += 20;
5986
			start += 20;
Line 6040... Line 6056...
6040
			pckFile.WriteData((char *)pckData, newFileSize);
6056
			pckFile.WriteData((char *)pckData, newFileSize);
6041
			this->addCreatedFile(pckFile.fullFilename());
6057
			this->addCreatedFile(pckFile.fullFilename());
6042
		}
6058
		}
6043
	}
6059
	}
6044
	textFile.remove();
6060
	textFile.remove();
-
 
6061
 
-
 
6062
	// write out the settings file
-
 
6063
	if (m_iGameFlags & EXEFLAG_SETTINGFILE)
-
 
6064
	{
-
 
6065
		CDirIO Dir(m_sCurrentDir);
-
 
6066
		if (!Dir.exists(L"types"))
-
 
6067
			Dir.create(L"types");
-
 
6068
		Dir.cd(L"types");
-
 
6069
 
-
 
6070
		std::vector<Utils::WString> writeData;
-
 
6071
		CFileIO dataFile(Dir.file(L"manager.txt"));
-
 
6072
		if (dataFile.exists())
-
 
6073
			dataFile.remove();
-
 
6074
 
-
 
6075
		writeData.push_back(L"Data;" + Utils::WString::Number(m_iLastUpdated) + L";" + Utils::WString::Number(this->countPackages(TYPE_SPK, true)) + L";" + Utils::WString::Number(lWares.size()) + L";" + Utils::WString::Number(lShips.size()) + L";");
-
 
6076
 
-
 
6077
		for (CListNode<CBaseFile>* node = m_lPackages.Front(); node; node = node->next())
-
 
6078
		{
-
 
6079
			CBaseFile* p = node->Data();
-
 
6080
			if (!p->IsEnabled())
-
 
6081
				continue;
-
 
6082
 
-
 
6083
			if (p->GetType() != TYPE_SPK)
-
 
6084
				continue;
-
 
6085
 
-
 
6086
			CSpkFile* spk = (CSpkFile*)p;
-
 
6087
 
-
 
6088
			// count text files
-
 
6089
			Utils::WStringList textEntries;
-
 
6090
			C_File* f = p->GetFirstFile(FILETYPE_TEXT);
-
 
6091
			while (f)
-
 
6092
			{
-
 
6093
				Utils::WString sLang;
-
 
6094
				Utils::WString id;
-
 
6095
				if (m_iGameFlags & EXEFLAG_TCTEXT)
-
 
6096
				{
-
 
6097
					id = f->baseName().token(L"-", 1);
-
 
6098
					sLang = f->baseName().token(L"-", 2);
-
 
6099
					if (sLang.empty())
-
 
6100
						sLang = L"NULL";
-
 
6101
					else
-
 
6102
						sLang = sLang.erase(0, 1);  // remove the "L"
-
 
6103
				}
-
 
6104
				else
-
 
6105
				{
-
 
6106
					sLang = f->baseName().left((int)f->baseName().length() - 4).padNumber(3);
-
 
6107
					id = f->baseName().mid(((int)f->baseName().length() - 4) + 1, 4);
-
 
6108
				}
-
 
6109
 
-
 
6110
				if (sLang != L"NULL")
-
 
6111
				{
-
 
6112
					if (sLang.toInt() == lang)
-
 
6113
						textEntries.pushBack(id);
-
 
6114
				}
-
 
6115
				f = p->GetNextFile(f);
-
 
6116
			}
-
 
6117
 
-
 
6118
			CLinkList<SSettingType>* settings = spk->settingsList();
-
 
6119
 
-
 
6120
			Utils::WString str = L"Script;" + spk->name() + L";" + spk->author() + L";" + spk->version() + L";" + spk->name(lang) + L";" + Utils::WString::Number(textEntries.size());
-
 
6121
 
-
 
6122
			for (auto itr = textEntries.begin(); itr != textEntries.end(); itr++)
-
 
6123
				str += L";" + (*itr)->str;
-
 
6124
 
-
 
6125
			str += L";" + Utils::WString::Number(settings ? settings->size() : 0);
-
 
6126
			if (settings)
-
 
6127
			{
-
 
6128
				for (CListNode<SSettingType>* sNode = settings->Front(); sNode; sNode = sNode->next())
-
 
6129
				{
-
 
6130
					SSettingType* st = sNode->Data();
-
 
6131
					str += L";" + st->sKey + L";" + spk->getSetting(st);
-
 
6132
				}
-
 
6133
			}
-
 
6134
			writeData.push_back(str + L";");
-
 
6135
		}
-
 
6136
 
-
 
6137
		for (CListNode<SGameWare>* node = lWares.Front(); node; node = node->next())
-
 
6138
		{
-
 
6139
			SGameWare* w = node->Data();
-
 
6140
			Utils::WString str;
-
 
6141
			if (w->pWare && w->iType == WARETYPE_ADDED)
-
 
6142
				str = this->convertTextString(w->sWareName);
-
 
6143
			else
-
 
6144
				str = L"-1";
-
 
6145
			str += L";" + Utils::WString(w->cType) + L";" + Utils::WString::Number(w->iPos);
-
 
6146
			writeData.push_back(L"Ware;" + str + L";");
-
 
6147
		}
-
 
6148
 
-
 
6149
		for (CListNode<SGameShip>* node = lShips.Front(); node; node = node->next())
-
 
6150
		{
-
 
6151
			SGameShip* gs = node->Data();
-
 
6152
			if (gs->iType == WARETYPE_NONE)
-
 
6153
				continue;
-
 
6154
 
-
 
6155
			Utils::WString str;
-
 
6156
			if (gs->pPackage && gs->iType == WARETYPE_ADDED)
-
 
6157
				str = gs->sShipID;
-
 
6158
			else
-
 
6159
				str = L"-1";
-
 
6160
				
-
 
6161
			str += L";" + Utils::WString::Number(gs->iPos);
-
 
6162
 
-
 
6163
			// write shipyard info
-
 
6164
			if (gs->pPackage && gs->iType == WARETYPE_ADDED)
-
 
6165
			{
-
 
6166
				for (ShipyardRace i = ShipyardRace::Argon; i <= ShipyardRace::Max; i = static_cast<ShipyardRace>(static_cast<unsigned int>(i) * 2))
-
 
6167
				{
-
 
6168
					if (gs->pPackage->isShipyard(i))
-
 
6169
						str += L";" + GetShipyardName(i);
-
 
6170
				}
-
 
6171
			}
-
 
6172
			writeData.push_back(L"Ship;" + str + L";");
-
 
6173
		}
-
 
6174
 
-
 
6175
		dataFile.writeFileUTF(&writeData);
-
 
6176
	}
6045
}
6177
}
6046
 
6178
 
6047
bool CPackages::isCurrentDir(const Utils::WString &dir) const
6179
bool CPackages::isCurrentDir(const Utils::WString &dir) const
6048
{
6180
{
6049
	Utils::WString cur = m_sCurrentDir;
6181
	Utils::WString cur = m_sCurrentDir;
Line 9235... Line 9367...
9235
	// make sure we can open the zip file
9367
	// make sure we can open the zip file
9236
	CBaseFile *archive = NULL;
9368
	CBaseFile *archive = NULL;
9237
#ifdef _RAR
9369
#ifdef _RAR
9238
	HANDLE hArcData;
9370
	HANDLE hArcData;
9239
	int RHCode,PFCode;
9371
	int RHCode,PFCode;
9240
	char CmtBuf[16384];
9372
	wchar_t CmtBuf[16384];
9241
	struct RARHeaderDataEx HeaderData;
9373
	struct RARHeaderDataEx HeaderData;
9242
	struct RAROpenArchiveDataEx OpenArchiveData;
9374
	struct RAROpenArchiveDataEx OpenArchiveData;
9243
 
9375
 
9244
	// find the pluginmanager text to covnert to spkfile
9376
	// find the pluginmanager text to covnert to spkfile
9245
	if ( toInstall ) {
9377
	if ( toInstall ) {
9246
		memset(&OpenArchiveData,0,sizeof(OpenArchiveData));
9378
		memset(&OpenArchiveData,0,sizeof(OpenArchiveData));
9247
		OpenArchiveData.ArcName=(char *)filename.c_str();
9379
		OpenArchiveData.ArcNameW=(wchar_t *)filename.c_str();
9248
		OpenArchiveData.CmtBuf=CmtBuf;
9380
		OpenArchiveData.CmtBufW=CmtBuf;
9249
		OpenArchiveData.CmtBufSize=sizeof(CmtBuf);
9381
		OpenArchiveData.CmtBufSize = sizeof(CmtBuf) / sizeof(CmtBuf[0]);
9250
		OpenArchiveData.OpenMode=RAR_OM_LIST;
9382
		OpenArchiveData.OpenMode=RAR_OM_LIST;
9251
		hArcData=RAROpenArchiveEx(&OpenArchiveData);
9383
		hArcData=RAROpenArchiveEx(&OpenArchiveData);
9252
 
9384
 
9253
		if (OpenArchiveData.OpenResult!=0) return NULL;
9385
		if (OpenArchiveData.OpenResult!=0) return NULL;
9254
 
9386
 
Line 9262... Line 9394...
9262
			}
9394
			}
9263
		}
9395
		}
9264
		RARCloseArchive(hArcData);
9396
		RARCloseArchive(hArcData);
9265
	}
9397
	}
9266
 
9398
 
9267
	if ( toInstall )
-
 
9268
		archive = new CArchiveFile(); // just installing an archive file
-
 
9269
	else
-
 
9270
		archive = new CSpkFile(); // converting to a spk file
-
 
9271
 
-
 
9272
	memset(&OpenArchiveData,0,sizeof(OpenArchiveData));
9399
	memset(&OpenArchiveData,0,sizeof(OpenArchiveData));
9273
	OpenArchiveData.ArcName=(char *)filename.c_str();
9400
	OpenArchiveData.ArcNameW = (wchar_t*)filename.c_str();
9274
	OpenArchiveData.CmtBuf=CmtBuf;
9401
	OpenArchiveData.CmtBufW = CmtBuf;
9275
	OpenArchiveData.CmtBufSize=sizeof(CmtBuf);
9402
	OpenArchiveData.CmtBufSize = sizeof(CmtBuf) / sizeof(CmtBuf[0]);
9276
	OpenArchiveData.OpenMode=RAR_OM_EXTRACT;
9403
	OpenArchiveData.OpenMode=RAR_OM_EXTRACT;
9277
	OpenArchiveData.UserData=EXTRACT;
9404
	OpenArchiveData.UserData=EXTRACT;
9278
	hArcData=RAROpenArchiveEx(&OpenArchiveData);
9405
	hArcData=RAROpenArchiveEx(&OpenArchiveData);
9279
 
9406
 
9280
	if (OpenArchiveData.OpenResult!=0) return NULL;
9407
	if (OpenArchiveData.OpenResult!=0) return NULL;
9281
 
9408
 
-
 
9409
	if (toInstall)
-
 
9410
		archive = new CArchiveFile(); // just installing an archive file
-
 
9411
	else
-
 
9412
		archive = new CSpkFile(); // converting to a spk file
-
 
9413
 
-
 
9414
 
9282
	HeaderData.CmtBuf=NULL;
9415
	HeaderData.CmtBuf=NULL;
9283
	memset(&OpenArchiveData.Reserved,0,sizeof(OpenArchiveData.Reserved));
9416
	memset(&OpenArchiveData.Reserved,0,sizeof(OpenArchiveData.Reserved));
9284
 
9417
 
9285
	bool error = false;
9418
	bool error = false;
9286
	Utils::WString extractedFile = CDirIO(m_sTempDir).file(L"extracted.tst").findReplace(L"/", L"\\").findReplace(L"\\\\", L"\\");
9419
	Utils::WString extractedFile = CDirIO(m_sTempDir).file(L"extracted.tst").findReplace(L"/", L"\\").findReplace(L"\\\\", L"\\");
9287
	while ((RHCode=RARReadHeaderEx(hArcData,&HeaderData))==0)
9420
	while ((RHCode=RARReadHeaderEx(hArcData,&HeaderData))==0)
9288
	{
9421
	{
9289
		Utils::WString fileName = HeaderData.FileName;
9422
		Utils::WString fileName(HeaderData.FileNameW);
9290
 
9423
 
9291
		if ( HeaderData.FileAttr == 16 )
9424
		if ( HeaderData.FileAttr == 16 )
9292
			continue;
9425
			continue;
9293
		PFCode=RARProcessFileW(hArcData, RAR_EXTRACT, NULL, NULL);
9426
		PFCode=RARProcessFileW(hArcData, RAR_EXTRACT, NULL, NULL);
9294
		if (PFCode!=0)
9427
		if (PFCode!=0)