Subversion Repositories spk

Rev

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

Rev 62 Rev 88
Line 13... Line 13...
13
#include "DirIO.h"
13
#include "DirIO.h"
14
#include "File_IO.h"
14
#include "File_IO.h"
15
#include "CatFile.h"
15
#include "CatFile.h"
16
#include "archive/zip.h"
16
#include "archive/zip.h"
17
#include "Packages.h"
17
#include "Packages.h"
-
 
18
#include "TextDB.h"
18
 
19
 
19
#include <Package/InstallText.h>
20
#include <Package/InstallText.h>
20
 
21
 
21
// remove these eventually
22
// remove these eventually
22
using namespace SPK;
23
using namespace SPK;
Line 54... Line 55...
54
	m_bSigned = false;
55
	m_bSigned = false;
55
	m_bEnable = m_bGlobal = m_bProfile = m_bModifiedEnabled = true;
56
	m_bEnable = m_bGlobal = m_bProfile = m_bModifiedEnabled = true;
56
	m_bOverrideFiles = false;
57
	m_bOverrideFiles = false;
57
}
58
}
58
 
59
 
59
CBaseFile::CBaseFile()
60
CBaseFile::CBaseFile() : _pTextDB(NULL)
60
{
61
{
61
	SetDefaults ();
62
	SetDefaults ();
62
}
63
}
63
CBaseFile::~CBaseFile()
64
CBaseFile::~CBaseFile()
64
{
65
{
Line 73... Line 74...
73
	{
74
	{
74
		delete m_pIconFile;
75
		delete m_pIconFile;
75
		m_pIconFile = NULL;
76
		m_pIconFile = NULL;
76
	}
77
	}
77
 
78
 
-
 
79
	if ( _pTextDB ) {
-
 
80
		delete _pTextDB;
-
 
81
		_pTextDB = NULL;
-
 
82
	}
-
 
83
 
78
	m_lNames.clear(true);
84
	m_lNames.clear(true);
79
}
85
}
80
 
86
 
81
CyString CBaseFile::GetLanguageName ( int lang )
87
CyString CBaseFile::GetLanguageName ( int lang )
82
{
88
{
Line 188... Line 194...
188
	return SPKFILE_INVALID;
194
	return SPKFILE_INVALID;
189
}
195
}
190
 
196
 
191
void CBaseFile::ClearFileData()
197
void CBaseFile::ClearFileData()
192
{
198
{
193
	for ( C_File *f = m_lFiles.First(); f; f = m_lFiles.Next() )
199
	for ( CListNode<C_File> *f = m_lFiles.Front(); f; f = f->next() )
194
	{
200
	{
195
		f->DeleteData();
201
		f->Data()->DeleteData();
196
	}
202
	}
197
}
203
}
198
 
204
 
199
CyString CBaseFile::GetNameValidFile ()
205
CyString CBaseFile::GetNameValidFile ()
200
{
206
{
Line 252... Line 258...
252
 
258
 
253
		m_lFiles.remove(node, true);
259
		m_lFiles.remove(node, true);
254
		break;
260
		break;
255
	}
261
	}
256
 
262
 
257
	file->UpdateSigned();
-
 
258
	_changed();
263
	_addFile(file);
259
	m_lFiles.push_back ( file );
-
 
260
}
264
}
261
 
265
 
262
C_File *CBaseFile::AddFile ( CyString file, CyString dir, int type, int game )
266
C_File *CBaseFile::AddFile ( CyString file, CyString dir, int type, int game )
263
{
267
{
264
	C_File *newfile = new C_File ( file );
268
	C_File *newfile = new C_File ( file );
Line 282... Line 286...
282
		// must already exist, delete this one
286
		// must already exist, delete this one
283
		m_lFiles.remove(node, true);
287
		m_lFiles.remove(node, true);
284
		break;
288
		break;
285
	}
289
	}
286
 
290
 
287
	_changed();
-
 
288
	newfile->UpdateSigned();
-
 
289
	m_lFiles.push_back ( newfile );
291
	_addFile(newfile);
290
 
292
 
291
	return newfile;
293
	return newfile;
292
}
294
}
293
 
295
 
294
bool CBaseFile::AddFileNow ( CyString file, CyString dir, int type, CProgressInfo *progress )
296
bool CBaseFile::AddFileNow ( CyString file, CyString dir, int type, CProgressInfo *progress )
Line 802... Line 804...
802
	File->seek(4 + m_SHeader2.lSize);
804
	File->seek(4 + m_SHeader2.lSize);
803
 
805
 
804
	return File;
806
	return File;
805
}
807
}
806
 
808
 
-
 
809
void CBaseFile::_addFile(C_File *file, bool dontChange)
-
 
810
{
-
 
811
	if ( !dontChange ) {
-
 
812
		file->UpdateSigned();
-
 
813
		_changed();
-
 
814
	}
-
 
815
	m_lFiles.push_back(file);
-
 
816
 
-
 
817
	_updateTextDB(file);
-
 
818
}
-
 
819
 
-
 
820
void CBaseFile::_updateTextDB(C_File *file)
-
 
821
{
-
 
822
	if ( !_pTextDB ) _pTextDB = new CTextDB();
-
 
823
 
-
 
824
	if ( file->GetFileType() == FILETYPE_TEXT ) {
-
 
825
		Utils::String baseFile = CFileIO(file->filePointer()).baseName();
-
 
826
		int lang = (baseFile.isin("-L")) ? baseFile.right(3) : baseFile.truncate(-4);
-
 
827
 
-
 
828
		// read in the text file to the database
-
 
829
		_pTextDB->parseTextFile(0, 0, file->filePointer(), lang);
-
 
830
	}
-
 
831
}
-
 
832
 
-
 
833
void CBaseFile::_resetTextDB()
-
 
834
{
-
 
835
	if ( _pTextDB ) delete _pTextDB;
-
 
836
	_pTextDB = new CTextDB();
-
 
837
 
-
 
838
	for(CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next()) {
-
 
839
		_updateTextDB(node->Data());
-
 
840
	}
-
 
841
}
-
 
842
 
807
void CBaseFile::ReadIconFileToMemory ()
843
void CBaseFile::ReadIconFileToMemory ()
808
{
844
{
809
	if ( !m_pIconFile )	return;
845
	if ( !m_pIconFile )	return;
810
	CFileIO *File = _startRead();
846
	CFileIO *File = _startRead();
811
	if ( !File ) return;
847
	if ( !File ) return;
Line 1531... Line 1567...
1531
	file->SetDataCompression ( compression );
1567
	file->SetDataCompression ( compression );
1532
	file->SetUncompressedDataSize ( usize );
1568
	file->SetUncompressedDataSize ( usize );
1533
	file->SetShared ( shared );
1569
	file->SetShared ( shared );
1534
	file->SetCompressedToFile ( compressToFile );
1570
	file->SetCompressedToFile ( compressToFile );
1535
 
1571
 
1536
	m_lFiles.push_back ( file );
1572
	_addFile(file, true);
1537
 
1573
 
1538
	return true;
1574
	return true;
1539
}
1575
}
1540
 
1576
 
1541
 
1577
 
Line 1705... Line 1741...
1705
	// next should be the next header
1741
	// next should be the next header
1706
	if ( !ParseFileHeader(File.readEndOfLine()) ) return false;
1742
	if ( !ParseFileHeader(File.readEndOfLine()) ) return false;
1707
 
1743
 
1708
	// clear the current file list
1744
	// clear the current file list
1709
	m_lFiles.clear(true);
1745
	m_lFiles.clear(true);
-
 
1746
	if ( _pTextDB ) {
-
 
1747
		delete _pTextDB;
-
 
1748
		_pTextDB = NULL;
-
 
1749
	}
1710
 
1750
 
1711
	// update the progress for each section
1751
	// update the progress for each section
1712
	if ( readtype != SPKREAD_ALL && progress ) progress->UpdateProgress(4, maxProgress);
1752
	if ( readtype != SPKREAD_ALL && progress ) progress->UpdateProgress(4, maxProgress);
1713
 
1753
 
1714
	if ( m_SHeader2.lSize ) this->_read_FileHeader(File.stream(), readtype, maxProgress, doneLen, progress);
1754
	if ( m_SHeader2.lSize ) this->_read_FileHeader(File.stream(), readtype, maxProgress, doneLen, progress);
Line 1955... Line 1995...
1955
	if ( progress )
1995
	if ( progress )
1956
	{
1996
	{
1957
		progress->UpdateStatus(STATUS_WRITE);
1997
		progress->UpdateStatus(STATUS_WRITE);
1958
		progress->SetDone(0);
1998
		progress->SetDone(0);
1959
		long max = 0;
1999
		long max = 0;
1960
		for ( C_File *file = m_lFiles.First(); file; file = m_lFiles.Next() )
2000
		for ( CListNode<C_File> *file = m_lFiles.Front(); file; file = file->next() )
1961
			max += file->GetDataSize();
2001
			max += file->Data()->GetDataSize();
1962
		if ( m_pIconFile )
2002
		if ( m_pIconFile )
1963
			max += m_pIconFile->GetDataSize();
2003
			max += m_pIconFile->GetDataSize();
1964
		progress->SetMax(max);
2004
		progress->SetMax(max);
1965
	}
2005
	}
1966
 
2006
 
Line 3007... Line 3047...
3007
	}
3047
	}
3008
 
3048
 
3009
	return false;
3049
	return false;
3010
}
3050
}
3011
 
3051
 
-
 
3052
Utils::String builtInWares()
-
 
3053
{
-
 
3054
	Utils::String str;
-
 
3055
	str += "28;0;0;0;0;59;5753;0;35714;1;1;0;35714;-100000;0;0;SS_WARE_SW_NEW1;\n";
-
 
3056
	str += "28;0;0;0;0;60;5763;0;33232;1;1;0;33232;0;1043;0;SS_WARE_SW_NEW2;\n";
-
 
3057
	str += "28;0;0;0;0;61;5773;0;21428;1;1;0;21428;0;1043;0;SS_WARE_SW_NEW3;\n";
-
 
3058
	str += "28;0;0;0;0;62;5783;0;56;1;1;0;56;-100000;0;0;SS_WARE_SW_NEW4;\n";
-
 
3059
	str += "28;0;0;0;0;63;5793;0;88;1;1;0;88;-100000;0;0;SS_WARE_SW_NEW5;\n";
-
 
3060
	str += "28;0;0;0;0;64;5803;0;283;1;1;0;283;-100000;0;0;SS_WARE_SW_NEW6;\n";
-
 
3061
	str += "28;0;0;0;0;65;5813;0;383;1;1;0;383;-100000;0;0;SS_WARE_SW_NEW7;\n";
-
 
3062
	str += "28;0;0;0;0;66;5823;0;1389;1;1;0;1389;-100000;1043;0;SS_WARE_SW_NEW8;\n";
-
 
3063
	str += "28;0;0;0;0;67;5833;0;3396;1;1;0;3396;-100000;0;0;SS_WARE_SW_NEW9;\n";
-
 
3064
	str += "28;0;0;0;0;68;5843;0;4215;1;1;0;4215;-100000;0;0;SS_WARE_SW_NEW10;\n";
-
 
3065
	str += "28;0;0;0;0;69;5853;0;5635;1;1;0;5635;-100000;0;0;SS_WARE_SW_NEW11;\n";
-
 
3066
	str += "28;0;0;0;0;70;5863;0;65735;1;1;0;65735;-100000;0;0;SS_WARE_SW_NEW12;\n";
-
 
3067
	str += "28;0;0;0;0;71;5873;0;17857;1;1;0;17857;333;1043;0;SS_WARE_SW_NEW13;\n";
-
 
3068
	str += "28;0;0;0;0;72;5883;0;21428;1;1;0;21428;0;1043;0;SS_WARE_SW_NEW14;\n";
-
 
3069
	str += "28;0;0;0;0;73;5893;0;324515;1;1;0;324515;-100000;0;0;SS_WARE_SW_NEW15;\n";
-
 
3070
	str += "28;0;0;0;0;74;5903;0;638508;1;1;0;638508;-100000;0;0;SS_WARE_SW_NEW16;\n";
-
 
3071
	str += "28;0;0;0;0;75;5913;0;225755;1;1;0;225755;-100000;0;0;SS_WARE_SW_NEW17;\n";
-
 
3072
	str += "28;0;0;0;0;76;5923;0;1931535;1;1;0;1931535;1000;0;0;SS_WARE_SW_NEW18;\n";
-
 
3073
	str += "28;0;0;0;0;77;5933;0;2209150;1;1;0;2209150;-100000;0;0;SS_WARE_SW_NEW19;\n";
-
 
3074
	str += "28;0;0;0;0;78;5943;0;6727565;1;1;0;6727565;-100000;0;0;SS_WARE_SW_NEW20;\n";
-
 
3075
	str += "28;0;0;0;0;85;9999;0;105;1;5;0;105;0;1043;0;SS_WARE_SW_X3TC_1;\n";
-
 
3076
	str += "28;0;0;0;0;86;15053;0;105;1;5;0;105;0;1043;0;SS_WARE_SW_X3TC_2;\n";
-
 
3077
	str += "28;0;0;0;0;87;15063;0;105;1;5;0;105;0;1043;0;SS_WARE_SW_X3TC_3;\n";
-
 
3078
	str += "28;0;0;0;0;88;15073;0;105;1;5;0;105;0;1043;0;SS_WARE_SW_X3TC_4;\n";
-
 
3079
	str += "28;0;0;0;0;89;15083;0;105;1;5;0;105;0;1043;0;SS_WARE_SW_X3TC_5;\n";
-
 
3080
	str += "28;0;0;0;0;90;15093;0;105;1;5;0;105;0;1043;0;SS_WARE_SW_X3TC_6;\n";
-
 
3081
 
-
 
3082
	return str;
-
 
3083
}
-
 
3084
 
-
 
3085
void CBaseFile::_addWaresToList(int iLang, CLinkList<SWareEntry> &list, const Utils::String &wares, enum WareTypes eType)
-
 
3086
{
-
 
3087
	int totalWares = 0;
-
 
3088
	Utils::String *w = wares.tokenise("\n", &totalWares);
-
 
3089
	
-
 
3090
	for(int i = 0; i < totalWares; i++) {
-
 
3091
		int textId = w[i].token(";", 7).toLong();
-
 
3092
		int useLang = iLang;
-
 
3093
		if ( !_pTextDB->exists(useLang, 17, textId) )
-
 
3094
			useLang = 44;
-
 
3095
		if ( !_pTextDB->exists(useLang, 17, textId) )
-
 
3096
			useLang = 49;
-
 
3097
		if ( _pTextDB->exists(useLang, 17, textId) ) {	
-
 
3098
			SWareEntry *ware = new SWareEntry;
-
 
3099
			ware->name = _pTextDB->get(useLang, 17, textId);
-
 
3100
			ware->description = _pTextDB->get(useLang, 17, textId + 1);
-
 
3101
			ware->id = w[i].token(";", -2);
-
 
3102
			ware->relval = w[i].token(";", 9).toLong();
-
 
3103
			ware->notority = w[i].token(";", 14).toLong();
-
 
3104
			ware->type = eType;
-
 
3105
			ware->position = i;
-
 
3106
			list.push_back(ware);
-
 
3107
		}
-
 
3108
	}
-
 
3109
 
-
 
3110
	CLEANSPLIT(w, totalWares);
-
 
3111
}
-
 
3112
 
-
 
3113
bool CBaseFile::readWares(int iLang, CLinkList<SWareEntry> &list, const Utils::String &empWares)
-
 
3114
{
-
 
3115
	_pTextDB->setLanguage(iLang);
-
 
3116
 
-
 
3117
	// now go through all emp wares and get the ones we have text for
-
 
3118
	_addWaresToList(iLang, list, empWares, Ware_EMP);
-
 
3119
	_addWaresToList(iLang, list, builtInWares(), Ware_BuiltIn);
-
 
3120
 
-
 
3121
	// now add any custom wares
-
 
3122
	
-
 
3123
 
-
 
3124
	return true;
-
 
3125
}
-
 
3126
 
3012
int CBaseFile::FindFirstGameInPackage()
3127
int CBaseFile::FindFirstGameInPackage()
3013
{
3128
{
3014
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() ) {
3129
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() ) {
3015
		if ( node->Data()->GetGame() )
3130
		if ( node->Data()->GetGame() )
3016
			return node->Data()->GetGame();
3131
			return node->Data()->GetGame();