Subversion Repositories spk

Rev

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

Rev 162 Rev 170
Line 62... Line 62...
62
	SetDefaults ();
62
	SetDefaults ();
63
}
63
}
64
CBaseFile::~CBaseFile()
64
CBaseFile::~CBaseFile()
65
{
65
{
66
	Delete();
66
	Delete();
-
 
67
}
-
 
68
 
-
 
69
 
-
 
70
Utils::String CBaseFile::getFullPackageName(int language, const Utils::String &byString) const
-
 
71
{ 
-
 
72
	return getFullPackageName(language, true, byString); 
-
 
73
}
-
 
74
Utils::String CBaseFile::getFullPackageName(int language, bool includeVersion, const Utils::String &byString) const
-
 
75
{
-
 
76
	Utils::String p;
-
 
77
	if (language == -1)
-
 
78
		p = this->name();
-
 
79
	else
-
 
80
		p = getLanguageName(language);
-
 
81
	if (includeVersion)
-
 
82
	{
-
 
83
		p += " V";
-
 
84
		p += this->version();
-
 
85
	}
-
 
86
	p += " ";
-
 
87
	p += byString + " " + this->author();
-
 
88
	return p;
-
 
89
}
-
 
90
 
-
 
91
Utils::String CBaseFile::getFullPackageName(const Utils::String &format, int lang) const
-
 
92
{
-
 
93
	if (format.empty())
-
 
94
		return getFullPackageName(lang);
-
 
95
 
-
 
96
	Utils::String args[3] = { this->getLanguageName(lang), this->version(), this->author()};
-
 
97
	return format.args(args, 3);
67
}
98
}
68
 
99
 
69
void CBaseFile::Delete ()
100
void CBaseFile::Delete ()
70
{
101
{
-
 
102
	m_lTempFiles.clear();
71
	m_lFiles.clear(true);
103
	m_lFiles.clear(true);
72
 
104
 
73
	if ( m_pIconFile )
105
	if ( m_pIconFile )
74
	{
106
	{
75
		delete m_pIconFile;
107
		delete m_pIconFile;
76
		m_pIconFile = NULL;
108
		m_pIconFile = NULL;
77
	}
109
	}
78
 
110
 
79
	if ( _pTextDB ) {
111
	if ( _pTextDB ) {
80
		delete _pTextDB;
112
		delete _pTextDB;
81
		_pTextDB = NULL;
113
		_pTextDB = NULL;
82
	}
114
	}
83
 
-
 
84
	m_lNames.clear(true);
-
 
85
}
115
}
86
 
116
 
87
CyString CBaseFile::GetLanguageName(int lang) const
-
 
88
{
-
 
89
	for (CListNode<SNames>* node = m_lNames.Front(); node; node = node->next())
-
 
90
	{
-
 
91
		SNames* n = node->Data();
-
 
92
		if (n->iLanguage == lang)
-
 
93
			return n->sName;
-
 
94
	}
-
 
95
	return this->name();
-
 
96
}
-
 
97
 
-
 
98
const Utils::String &CBaseFile::getLanguageName(int lang) const
117
const Utils::String &CBaseFile::getLanguageName(int lang) const
99
{
118
{
100
	for (CListNode<SNames>* node = m_lNames.Front(); node; node = node->next())
-
 
101
	{
-
 
102
		SNames* n = node->Data();
-
 
103
		if (n->iLanguage == lang)
-
 
104
			return n->sName;
-
 
105
	}
-
 
106
	return this->name();
119
	return name(lang);
107
}
120
}
108
 
121
 
109
 
122
 
110
/*
123
/*
111
##########################################################################################
124
##########################################################################################
112
##################                Base Class Functions                  ##################
125
##################                Base Class Functions                  ##################
113
##########################################################################################
126
##########################################################################################
114
*/
127
*/
115
 
128
 
116
const CLinkList<C_File> *CBaseFile::fileList() const
129
const CLinkList<C_File> &CBaseFile::fileList() const
117
{
130
{
118
	return &m_lFiles;
131
	return m_lFiles;
119
}
132
}
120
CLinkList<C_File> *CBaseFile::fileList(int type) const
133
CLinkList<C_File> &CBaseFile::fileList(FileType type, CLinkList<C_File>& list) const
121
{
134
{ 
122
	CLinkList<C_File> *list = new CLinkList<C_File>;
-
 
123
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
135
	for (CListNode<C_File>* node = m_lFiles.Front(); node; node = node->next())
124
	{
136
	{
125
		C_File *f = node->Data();
137
		C_File* f = node->Data();
126
		if ( f->GetFileType() == type )
138
		if (f->GetFileType() == type)
127
			list->push_back(f);
139
			list.push_back(f);
128
	}
140
	}
129
 
141
 
130
	return list;
142
	return list;
-
 
143
}
-
 
144
CLinkList<C_File> &CBaseFile::fileList(FileType type)
-
 
145
{
-
 
146
	m_lTempFiles.clear();
-
 
147
	return fileList(type, m_lTempFiles);
131
}
148
}
132
 
149
 
133
C_File *CBaseFile::GetNextFile(C_File *prev) const
150
C_File *CBaseFile::GetNextFile(C_File *prev) const
134
{
151
{
135
	int type = -1;
152
	int type = -1;
Line 167... Line 184...
167
		}
184
		}
168
		else
185
		else
169
		{
186
		{
170
			if ( f->GetFileType() == type )
187
			if ( f->GetFileType() == type )
171
				return f;
188
				return f;
172
		}
189
		}
173
	}
190
	}
174
 
191
 
175
	return NULL;
192
	return NULL;
176
}
193
}
177
 
194
 
178
C_File *CBaseFile::GetFirstFile(int type) const
195
C_File *CBaseFile::GetFirstFile(int type) const
179
{
196
{
180
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
197
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
181
	{
198
	{
Line 263... Line 280...
263
		C_File *f = node->Data();
280
		C_File *f = node->Data();
264
		if ( f->fileType() != file->fileType() )
281
		if ( f->fileType() != file->fileType() )
265
			continue;
282
			continue;
266
		if ( f->name() != file->name () )
283
		if ( f->name() != file->name () )
267
			continue;
284
			continue;
268
		if ( f->GetDir() != file->GetDir() )
285
		if ( f->dir() != file->dir() )
269
			continue;
286
			continue;
270
		if ( f->game() != file->game() )
287
		if ( f->game() != file->game() )
271
			continue;
288
			continue;
272
 
289
 
273
		m_lFiles.remove(node, true);
290
		m_lFiles.remove(node, true);
Line 275... Line 292...
275
	}
292
	}
276
 
293
 
277
	_addFile(file);
294
	_addFile(file);
278
}
295
}
279
 
296
 
280
C_File *CBaseFile::AddFile(CyString file, CyString dir, int type, int game)
-
 
281
{
-
 
282
	return addFile(file.ToString(), dir.ToString(), (FileType)type, game);
-
 
283
}
-
 
284
C_File *CBaseFile::addFile(const Utils::String &file, const Utils::String &dir, FileType type, int game, bool packed)
297
C_File *CBaseFile::addFile(const Utils::String &file, const Utils::String &dir, FileType type, int game, bool packed)
285
{
298
{
286
	C_File *newfile = new C_File(file);
299
	C_File *newfile = new C_File(file);
287
	newfile->SetDir(dir);
300
	newfile->SetDir(dir);
288
	newfile->setFileType(type);
301
	newfile->setFileType(type);
Line 359... Line 372...
359
		}
372
		}
360
 
373
 
361
		// must already exist, delete this one
374
		// must already exist, delete this one
362
		m_lFiles.remove(node, true);
375
		m_lFiles.remove(node, true);
363
		break;
376
		break;
364
	}
377
	}
365
 
378
 
366
	_addFile(newfile);
379
	_addFile(newfile);
367
 
380
 
368
	return newfile;
381
	return newfile;
369
}
382
}
370
 
383
 
371
bool CBaseFile::AddFileNow ( CyString file, CyString dir, int type, CProgressInfo *progress )
384
bool CBaseFile::addFileNow(const Utils::String &file, const Utils::String &dir, FileType type, CProgressInfo* progress)
372
{
385
{
373
	C_File *f = AddFile ( file, dir, type );
386
	C_File* f = addFile(file, dir, type);
374
	if ( !f->ReadFromFile () )
387
	if (!f->ReadFromFile())
375
		return false;
388
		return false;
376
 
389
 
377
	// compress the file
390
	// compress the file
378
	return f->CompressData ( m_SHeader2.iDataCompression, progress );
391
	return f->CompressData(m_SHeader2.iDataCompression, progress);
379
}
392
}
380
 
393
 
381
C_File *CBaseFile::appendFile(const Utils::String &file, int type, int game, bool packed, const Utils::String &dir, CProgressInfo *progress )
394
C_File *CBaseFile::appendFile(const Utils::String &file, int type, int game, bool packed, const Utils::String &dir, CProgressInfo *progress )
382
{
395
{
383
	C_File *newfile = addFile(file, dir, static_cast<FileType>(type), game, packed);
396
	C_File *newfile = addFile(file, dir, static_cast<FileType>(type), game, packed);
384
	if ( !newfile )
397
	if ( !newfile )
385
		return NULL;
398
		return NULL;
386
 
399
 
387
	// read the file into memory
400
	// read the file into memory
388
	if (newfile->GetData() && newfile->GetDataSize())
401
	if (newfile->GetData() && newfile->GetDataSize())
389
	{
402
	{
390
		// now compress the file
403
		// now compress the file
391
		if (newfile->CompressData(m_SHeader2.iDataCompression, progress))
404
		if (newfile->CompressData(m_SHeader2.iDataCompression, progress))
392
			return newfile;
405
			return newfile;
393
	}
406
	}
394
	if ( newfile->ReadFromFile () )
407
	if ( newfile->ReadFromFile () )
Line 407... Line 420...
407
	delete newfile;
420
	delete newfile;
408
 
421
 
409
	return NULL;
422
	return NULL;
410
}
423
}
411
 
424
 
412
C_File *CBaseFile::FindFileAt ( int filetype, int pos )
425
C_File *CBaseFile::findFileAt(FileType filetype, size_t pos) const
413
{
426
{
414
	int count = 0;
427
	size_t count = 0;
415
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
428
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
416
	{
429
	{
417
		C_File *file = node->Data();
430
		C_File *file = node->Data();
418
		if ( file->GetFileType() != filetype )
431
		if ( file->GetFileType() != filetype )
419
			continue;
432
			continue;
420
 
433
 
421
		if ( count == pos )
434
		if ( count == pos )
422
			return file;
435
			return file;
423
 
436
 
424
		++count;
437
		++count;
425
	}
438
	}
426
 
439
 
427
	return NULL;
440
	return NULL;
428
}
441
}
429
 
442
 
430
C_File *CBaseFile::FindFile ( CyString filename, int type, CyString dir, int game )
443
C_File* CBaseFile::findFile(const Utils::String &filename, FileType type, const Utils::String &dir, int game) const
431
{
444
{	
432
	CyString lfile = filename.ToLower();
445
	Utils::String lfile = CFileIO(filename.lower()).filename();
433
	lfile = lfile.FindReplace ( "\\", "/" );
-
 
434
 
-
 
435
	lfile = lfile.GetToken ( lfile.NumToken('/'), '/' );
-
 
436
 
446
 
437
	CListNode<C_File> *node = m_lFiles.Front();
447
	CListNode<C_File>* node = m_lFiles.Front();
438
	while ( node )
448
	while (node)
439
	{
449
	{
440
		C_File *f = node->Data();
450
		C_File* f = node->Data();
441
		node = node->next();
451
		node = node->next();
442
 
452
 
443
		if ( type != f->GetFileType() )
453
		if (type != f->GetFileType())
444
			continue;
454
			continue;
445
		if ( dir != f->GetDir() )
455
		if (dir != f->dir())
446
			continue;
456
			continue;
447
		if ( game != f->game() )
457
		if (game != f->game())
448
			continue;
458
			continue;
449
		if ( f->GetName().ToLower() == lfile )
459
		if (f->name().lower() == lfile)
450
			return f;
460
			return f;
451
	}
461
	}
452
	return NULL;
462
	return NULL;
453
}
463
}
454
 
464
 
455
bool CBaseFile::RemoveFile ( CyString file, int type, CyString dir, int game )
465
bool CBaseFile::removeFile(const Utils::String& file, FileType type, const Utils::String& dir, int game)
456
{
466
{
457
	C_File *f = FindFile (file, type, dir, game);
467
	C_File* f = findFile(file, type, dir, game);
458
	if ( !f )
468
	if (!f)
459
		return false;
469
		return false;
460
	return RemoveFile ( f );
470
	return RemoveFile(f);
461
}
471
}
462
 
472
 
463
bool CBaseFile::RemoveFile ( C_File *file )
473
bool CBaseFile::RemoveFile ( C_File *file )
464
{
474
{
465
	int count = 0;
475
	int count = 0;
Line 477... Line 487...
477
{
487
{
478
	if ( (pos < 0) || (pos >= m_lFiles.size()) )
488
	if ( (pos < 0) || (pos >= m_lFiles.size()) )
479
		return false;
489
		return false;
480
 
490
 
481
	C_File *file = m_lFiles.Get ( pos );
491
	C_File *file = m_lFiles.Get ( pos );
482
	m_lFiles.erase ( pos + 1 );
492
	m_lFiles.erase ( pos + 1 );
483
 
493
 
484
	if ( file )
494
	if ( file )
485
		delete file;
495
		delete file;
486
 
496
 
487
	_changed();
497
	_changed();
Line 506... Line 516...
506
			{
516
			{
507
				// just remove the game from file
517
				// just remove the game from file
508
				if (fileGame & (1 << game))
518
				if (fileGame & (1 << game))
509
					node->Data()->setGame(node->Data()->game() & ~(1 << game));
519
					node->Data()->setGame(node->Data()->game() & ~(1 << game));
510
				continue;
520
				continue;
511
			}
521
			}
512
		}
522
		}
513
		if ( type == FILETYPE_UNKNOWN || node->Data()->GetFileType() == type )
523
		if ( type == FILETYPE_UNKNOWN || node->Data()->GetFileType() == type )
514
			node->DeleteData();
524
			node->DeleteData();
515
	}
525
	}
516
 
526
 
517
	m_lFiles.RemoveEmpty();
527
	m_lFiles.RemoveEmpty();
518
 
528
 
519
	_changed();
529
	_changed();
520
}
530
}
521
 
531
 
522
void CBaseFile::RecompressAllFiles ( int type, CProgressInfo *progress )
532
void CBaseFile::RecompressAllFiles ( int type, CProgressInfo *progress )
523
{
533
{
524
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
534
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
525
	{
535
	{
Line 536... Line 546...
536
		file->ChangeCompression ( type, progress );
546
		file->ChangeCompression ( type, progress );
537
	}
547
	}
538
}
548
}
539
 
549
 
540
void CBaseFile::CompressAllFiles ( int type, CProgressInfo *progress, CProgressInfo *overallProgress, int level )
550
void CBaseFile::CompressAllFiles ( int type, CProgressInfo *progress, CProgressInfo *overallProgress, int level )
541
{
551
{
542
	if ( overallProgress ) overallProgress->SetMax(m_lFiles.size());
552
	if ( overallProgress ) overallProgress->SetMax(m_lFiles.size());
543
 
553
 
544
	int iCount = 0;
554
	int iCount = 0;
545
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
555
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
546
	{
556
	{
547
		C_File *file = node->Data();
557
		C_File *file = node->Data();
548
		if ( progress )
558
		if ( progress )
549
			progress->UpdateFile(file);
559
			progress->UpdateFile(file);
550
 
560
 
551
		if ( !file->GetData() )
561
		if ( !file->GetData() )
552
			file->ReadFromFile();
562
			file->ReadFromFile();
553
 
563
 
554
		file->CompressData ( type, progress, level );
564
		file->CompressData ( type, progress, level );
555
 
565
 
556
		if ( overallProgress ) overallProgress->SetDone(++iCount);
566
		if ( overallProgress ) overallProgress->SetDone(++iCount);
557
	}
567
	}
558
}
568
}
559
 
569
 
560
bool CBaseFile::UncompressAllFiles ( CProgressInfo *progress )
570
bool CBaseFile::UncompressAllFiles ( CProgressInfo *progress )
Line 565... Line 575...
565
		C_File *fit = node->Data();
575
		C_File *fit = node->Data();
566
		if ( progress )
576
		if ( progress )
567
		{
577
		{
568
			progress->UpdateFile ( fit );
578
			progress->UpdateFile ( fit );
569
			progress->UpdateProgress(countFile++, m_lFiles.size());
579
			progress->UpdateProgress(countFile++, m_lFiles.size());
570
		}
580
		}
571
 
581
 
572
		bool uncomprToFile = false;
582
		bool uncomprToFile = false;
573
 
583
 
574
		if ( progress )
584
		if ( progress )
575
			progress->SwitchSecond();
585
			progress->SwitchSecond();
576
 
586
 
577
		if(!fit->isExternalFile())
587
		if(!fit->isExternalFile())
578
		{
588
		{
Line 586... Line 596...
586
					{
596
					{
587
						uncomprToFile = true;
597
						uncomprToFile = true;
588
						fit->SetFullDir("temp");
598
						fit->SetFullDir("temp");
589
					}
599
					}
590
				}
600
				}
591
 
601
 
592
				if (!uncomprToFile)
602
				if (!uncomprToFile)
593
					return false;
603
					return false;
594
			}
604
			}
595
		}
605
		}
596
 
606
 
597
		if ( progress )
607
		if ( progress )
598
			progress->SwitchSecond();
608
			progress->SwitchSecond();
599
	}
609
	}
600
	return true;
610
	return true;
601
}
611
}
602
 
612
 
603
long CBaseFile::GetFullFileSize()
613
size_t CBaseFile::fileSize() const
604
{
614
{
605
	long fullsize = 1000;
615
	size_t fullsize = 1000;
606
 
616
 
607
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
617
	for (CListNode<C_File>* node = m_lFiles.Front(); node; node = node->next())
608
		fullsize += node->Data()->GetUncompressedDataSize();
618
		fullsize += node->Data()->GetUncompressedDataSize();
609
 
619
 
610
	if ( m_pIconFile )
620
	if (m_pIconFile)
611
		fullsize += m_pIconFile->GetUncompressedDataSize();
621
		fullsize += m_pIconFile->GetUncompressedDataSize();
612
 
622
 
613
	return fullsize;
623
	return fullsize;
614
}
624
}
615
 
625
 
616
/*
626
/*
617
	Func:   GetEndOfLine
627
	Func:   GetEndOfLine
618
	Input:  id - The file id for the current file to read from
628
	Input:  id - The file id for the current file to read from
619
	        line - Pointed to hold the line number thats read
629
	        line - Pointed to hold the line number thats read
620
			upper - true if it converts to uppercase
630
			upper - true if it converts to uppercase
Line 628... Line 638...
628
	char c = fgetc ( id );
638
	char c = fgetc ( id );
629
	if ( c == -1 )
639
	if ( c == -1 )
630
		return "";
640
		return "";
631
 
641
 
632
	while ( (c != 13) && (!feof(id)) && (c != '\n') )
642
	while ( (c != 13) && (!feof(id)) && (c != '\n') )
633
	{
643
	{
634
		word += c;
644
		word += c;
635
		c = fgetc ( id );
645
		c = fgetc ( id );
636
	}
646
	}
637
 
647
 
638
	if ( line )
648
	if ( line )
639
		++(*line);
649
		++(*line);
640
 
650
 
641
	if ( upper )
651
	if ( upper )
642
		return word.ToUpper();
652
		return word.ToUpper();
643
 
653
 
644
	return word;
654
	return word;
645
}
655
}
646
 
656
 
647
int CBaseFile::CountFiles ( int filetype )
657
size_t CBaseFile::countFiles(FileType filetype) const
648
{
658
{
649
	int i = 0;
659
	size_t i = 0;
650
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
660
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
651
	{
661
	{
652
		C_File *file = node->Data();
662
		C_File *file = node->Data();
653
		if ( file->GetFileType() != filetype )
663
		if ( file->GetFileType() != filetype )
654
			continue;
664
			continue;
655
		++i;
665
		++i;
656
	}
666
	}
657
 
667
 
658
	return i;
668
	return i;
659
}
-
 
660
 
-
 
661
void CBaseFile::ClearNames ()
-
 
662
{
-
 
663
	m_lNames.clear(true);
-
 
664
}
-
 
665
void CBaseFile::RemoveLanguageName ( int lang )
-
 
666
{
-
 
667
	SNames *n;
-
 
668
	for ( n = m_lNames.First(); n; n = m_lNames.Next() )
-
 
669
	{
-
 
670
		if ( n->iLanguage == lang )
-
 
671
		{
-
 
672
			m_lNames.RemoveCurrent();
-
 
673
			delete n;
-
 
674
			_changed();
-
 
675
		}
-
 
676
	}
-
 
677
}
-
 
678
 
-
 
679
void CBaseFile::AddLanguageName ( int lang, const Utils::String &name )
-
 
680
{
-
 
681
	// first check for an existing language
-
 
682
	SNames *n;
-
 
683
	for ( n = m_lNames.First(); n; n = m_lNames.Next() )
-
 
684
	{
-
 
685
		if ( n->iLanguage == lang )
-
 
686
		{
-
 
687
			n->sName = name;
-
 
688
			return;
-
 
689
		}
-
 
690
	}
-
 
691
 
-
 
692
	// not found, add a new entry
-
 
693
	n = new SNames;
-
 
694
	n->iLanguage = lang;
-
 
695
	n->sName = name;
-
 
696
	m_lNames.push_back ( n );
-
 
697
 
-
 
698
	_changed();
-
 
699
}
-
 
700
 
-
 
701
CyString CBaseFile::GetFullPackageName(CyString format, int lang)
-
 
702
{
-
 
703
	if ( format.Empty() )
-
 
704
		return GetFullPackageName(lang);
-
 
705
 
-
 
706
	CyString args[3] = { this->GetLanguageName(lang), this->version(), this->author() };
-
 
707
	return format.Args(args, 3);
-
 
708
}
669
}
709
 
670
 
710
/*
671
/*
711
	Func:   CreateFilesLine
672
	Func:   CreateFilesLine
712
	Return: String - returns the full string for files list
673
	Return: String - returns the full string for files list
713
	Desc:   Creates a signle line list of all the files
674
	Desc:   Creates a signle line list of all the files
714
*/
675
*/
715
CyString CBaseFile::CreateFilesLine ( bool updateheader, CProgressInfo *progress )
676
Utils::String CBaseFile::createFilesLine(bool updateheader, CProgressInfo* progress)
716
{
677
{
717
	CyString line;
678
	Utils::String line;
718
 
679
 
719
	if ( progress )
680
	if (progress)
720
	{
681
	{
721
		progress->SetDone(0);
682
		progress->SetDone(0);
722
		progress->UpdateStatus(STATUS_COMPRESS);
683
		progress->UpdateStatus(STATUS_COMPRESS);
723
	}
684
	}
724
 
685
 
725
	if ( updateheader )
686
	if (updateheader)
726
	{
687
	{
727
		m_SHeader2.iNumFiles = 0;
688
		m_SHeader2.iNumFiles = 0;
728
		m_SHeader2.lFullSize = 0;
689
		m_SHeader2.lFullSize = 0;
729
	}
690
	}
730
 
691
 
731
	if ( m_pIconFile )
692
	if (m_pIconFile)
732
	{
693
	{
733
		// no data, read it from file
694
		// no data, read it from file
734
		if ( !m_pIconFile->GetData() )
695
		if (!m_pIconFile->GetData())
735
			m_pIconFile->ReadFromFile ();
696
			m_pIconFile->ReadFromFile();
736
 
697
 
737
		// compress the file
698
		// compress the file
738
		if ( !m_pIconFile->CompressData ( m_SHeader2.iDataCompression, progress ) )
699
		if (!m_pIconFile->CompressData(m_SHeader2.iDataCompression, progress))
739
			m_pIconFile->SetDataCompression(SPKCOMPRESS_NONE);
700
			m_pIconFile->SetDataCompression(SPKCOMPRESS_NONE);
740
 
701
 
741
		line += CyString("Icon:") + (m_pIconFile->GetDataSize() + (long)4) + ":" + m_pIconFile->GetUncompressedDataSize() + ":" + (long)m_pIconFile->GetCompressionType() + ":" + _sIconExt + "\n";
702
		line += "Icon:" + Utils::String::Number(m_pIconFile->GetDataSize() + (long)4) + ":" + m_pIconFile->GetUncompressedDataSize() + ":" + (long)m_pIconFile->GetCompressionType() + ":" + _sIconExt + "\n";
742
		if ( updateheader )
703
		if (updateheader)
743
		{
704
		{
744
			++m_SHeader2.iNumFiles;
705
			++m_SHeader2.iNumFiles;
745
			m_SHeader2.lFullSize += (m_pIconFile->GetDataSize() + 4);
706
			m_SHeader2.lFullSize += (m_pIconFile->GetDataSize() + 4);
746
		}
707
		}
747
	}
708
	}
748
 
709
 
749
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
710
	for (CListNode<C_File>* node = m_lFiles.Front(); node; node = node->next())
750
	{
711
	{
751
		C_File *file = node->Data();
712
		C_File* file = node->Data();
752
		if ( progress )
713
		if (progress)
753
			progress->UpdateFile ( file );
714
			progress->UpdateFile(file);
754
 
715
 
755
		// no data, read it from file
716
		// no data, read it from file
756
		if ( !file->GetData() )
717
		if (!file->GetData())
757
		{
718
		{
758
			if ( !file->ReadFromFile () )
719
			if (!file->ReadFromFile())
759
			{
720
			{
760
				if ( file->GetLastError() == SPKERR_MALLOC )
721
				if (file->GetLastError() == SPKERR_MALLOC)
761
				{
722
				{
762
					if ( !file->CompressFile ( progress ) )
723
					if (!file->CompressFile(progress))
763
						continue;
724
						continue;
764
				}
725
				}
765
			}
726
			}
766
		}
727
		}
767
 
728
 
768
		if ( !file->GetData() )
729
		if (!file->GetData())
769
			continue;
730
			continue;
770
 
731
 
771
		// compress the file
732
		// compress the file
772
		if ( !file->CompressData ( m_SHeader2.iDataCompression, progress ) )
733
		if (!file->CompressData(m_SHeader2.iDataCompression, progress))
773
		{
734
		{
774
			file->SetDataCompression(SPKCOMPRESS_NONE);
735
			file->SetDataCompression(SPKCOMPRESS_NONE);
775
			file->SetUncompressedDataSize(file->GetDataSize());
736
			file->SetUncompressedDataSize(file->GetDataSize());
776
		}
737
		}
777
 
738
 
778
		CyString command = GetFileTypeString ( file->GetFileType() );
739
		Utils::String command = GetFileTypeString(file->GetFileType());
779
		if ( command.Empty() )
740
		if (command.empty())
780
			continue;
741
			continue;
781
 
742
 
782
		if ( file->IsShared() )
743
		if (file->IsShared())
783
			command = CyString("$") + command;
744
			command = "$" + command;
784
 
745
 
785
		if ( file->GetDir().Empty() )
746
		if (file->dir().empty())
786
			line += (command + &quot;:"; + (file->GetDataSize() + (long)4) + ";:" + file->GetUncompressedDataSize() + ":" + (long)file->GetCompressionType() + ":" + (long)file->GetCreationTime() + &quot;:"; + ((file->IsCompressedToFile()) ? "1" : "0") + ":" + file->filename() + ":NULL:" + (long)file-&gt;game() + &quot;\n");
747
			line += command + &quot;:"; + (file->GetDataSize() + (long)4) + ";:" + file->GetUncompressedDataSize() + ":" + (long)file->GetCompressionType() + ":" + (long)file->GetCreationTime() + &quot;:"; + ((file->IsCompressedToFile()) ? "1" : "0") + ":" + file->filename() + ":NULL:" + (long)file-&gt;game() + &quot;\n";
787
		else
748
		else
788
			line += (command + &quot;:"; + (file->GetDataSize() + (long)4) + &quot;:" + file->GetUncompressedDataSize() + ":" + (long)file->GetCompressionType() + ":" + (long)file->GetCreationTime() + &quot;:" + ((file->IsCompressedToFile()) ? "1" : &quot;0&quot;) + ":" + file->filename() + ":" + file->GetDir() + ":" + (long)file->game() + &quot;\n");
749
			line += command + &quot;:"; + (file->GetDataSize() + (long)4) + &quot;:" + file->GetUncompressedDataSize() + ":" + (long)file->GetCompressionType() + ":" + (long)file->GetCreationTime() + &quot;:" + ((file->IsCompressedToFile()) ? "1" : &quot;0&quot;) + ":" + file->filename() + ":" + file->dir() + ":&quot; + (long)file->game() + "\n";
789
 
750
 
790
		if ( updateheader )
751
		if (updateheader)
791
		{
752
		{
792
			++m_SHeader2.iNumFiles;
753
			++m_SHeader2.iNumFiles;
793
			m_SHeader2.lFullSize += (file->GetDataSize() + 4);
754
			m_SHeader2.lFullSize += (file->GetDataSize() + 4);
794
		}
755
		}
795
	}
756
	}
796
 
757
 
797
	return line;
758
	return line;
798
}
759
}
799
 
-
 
800
 
760
 
801
/*
761
/*
802
######################################################################################
762
######################################################################################
803
##########							Reading Functions			    		##########
763
##########							Reading Functions			    		##########
804
######################################################################################
764
######################################################################################
Line 1499... Line 1459...
1499
	else if ( first.Compare("Desc:") )				this->setDescription(rest);
1459
	else if ( first.Compare("Desc:") )				this->setDescription(rest);
1500
	else if ( first.Compare("UninstallAfter:") )	this->addUninstallText(ParseLanguage(rest.token("|", 1)), false, rest.tokens("|", 2));
1460
	else if ( first.Compare("UninstallAfter:") )	this->addUninstallText(ParseLanguage(rest.token("|", 1)), false, rest.tokens("|", 2));
1501
	else if ( first.Compare("UninstallBefore:") )	this->addUninstallText(ParseLanguage(rest.token("|", 1)), true, rest.tokens("|", 2));
1461
	else if ( first.Compare("UninstallBefore:") )	this->addUninstallText(ParseLanguage(rest.token("|", 1)), true, rest.tokens("|", 2));
1502
	else if ( first.Compare("InstallAfter:") )		this->addInstallText(ParseLanguage(rest.token("|", 1)), false, rest.tokens("|", 2));
1462
	else if ( first.Compare("InstallAfter:") )		this->addInstallText(ParseLanguage(rest.token("|", 1)), false, rest.tokens("|", 2));
1503
	else if ( first.Compare("InstallBefore:") )		this->addInstallText(ParseLanguage(rest.token("|", 1)), true, rest.tokens("|", 2));
1463
	else if ( first.Compare("InstallBefore:") )		this->addInstallText(ParseLanguage(rest.token("|", 1)), true, rest.tokens("|", 2));
1504
	else if ( first.Compare("ScriptName:") )
-
 
1505
		AddLanguageName(ParseLanguage(rest.token(":", 1)), rest.token(":", 2));
1464
	else if ( first.Compare("ScriptName:") )		addName(ParseLanguage(rest.token(":", 1)), rest.token(":", 2));
1506
	else if ( first.Compare("GameChanging:") )		this->setGameChanging(rest);
1465
	else if ( first.Compare("GameChanging:") )		this->setGameChanging(rest);
1507
	else if ( first.Compare("EaseOfUse:") )			this->setEaseOfUse(rest);
1466
	else if ( first.Compare("EaseOfUse:") )			this->setEaseOfUse(rest);
1508
	else if ( first.Compare("Recommended:") )		this->setRecommended(rest);
1467
	else if ( first.Compare("Recommended:") )		this->setRecommended(rest);
1509
	else if ( first.Compare("NeededLibrary:") )
1468
	else if ( first.Compare("NeededLibrary:") )
1510
		this->AddNeededLibrary(rest.token("||", 1), rest.token("||", 2), rest.token("||", 3));
1469
		this->AddNeededLibrary(rest.token("||", 1), rest.token("||", 2), rest.token("||", 3));
Line 1974... Line 1933...
1974
 
1933
 
1975
	values += Utils::String("GameChanging: ") + (long)gameChanging() + "\n";
1934
	values += Utils::String("GameChanging: ") + (long)gameChanging() + "\n";
1976
	values += Utils::String("EaseOfUse: ") + (long)easeOfUse() + "\n";
1935
	values += Utils::String("EaseOfUse: ") + (long)easeOfUse() + "\n";
1977
	values += Utils::String("Recommended: ") + (long)recommended() + "\n";
1936
	values += Utils::String("Recommended: ") + (long)recommended() + "\n";
1978
 
1937
 
1979
	for ( CListNode<SNames> *nNode = m_lNames.Front(); nNode; nNode = nNode->next() )
1938
	for(auto itr = namesList()->begin(); itr != namesList()->end(); itr++)
1980
		values += Utils::String("ScriptName: ") + (long)nNode->Data()->;iLanguage + ":" + nNode->Data()->sName + "\n";
1939
		values += Utils::String("ScriptName: ") + (long)(*itr)->;iLanguage + ":" + (*itr)->sName + "\n";
1981
 
1940
 
1982
	for ( CListNode<SNeededLibrary> *libNode = m_lNeededLibrarys.Front(); libNode; libNode = libNode->next() ) {
1941
	for ( CListNode<SNeededLibrary> *libNode = m_lNeededLibrarys.Front(); libNode; libNode = libNode->next() ) {
1983
		SNeededLibrary *l = libNode->Data();
1942
		SNeededLibrary *l = libNode->Data();
1984
		values += "NeededLibrary: " + l->sName + "||" + l->sAuthor + "||" + l->sMinVersion + "\n";
1943
		values += "NeededLibrary: " + l->sName + "||" + l->sAuthor + "||" + l->sMinVersion + "\n";
1985
	}
1944
	}
Line 2062... Line 2021...
2062
	file.write(valueCompr, valueComprLen);
2021
	file.write(valueCompr, valueComprLen);
2063
	free ( valueCompr );
2022
	free ( valueCompr );
2064
 
2023
 
2065
	// now compress the files header
2024
	// now compress the files header
2066
	// create the files values
2025
	// create the files values
2067
	CyString files = CreateFilesLine ( true, progress );
2026
	Utils::String files = createFilesLine (true, progress);
2068
 
2027
 
2069
	// compress the files values
2028
	// compress the files values
2070
	long fileUncomprLen = (long)files.Length(), fileComprLen = fileUncomprLen;
2029
	long fileUncomprLen = (long)files.length(), fileComprLen = fileUncomprLen;
2071
	unsigned char *fileCompr = NULL;
2030
	unsigned char *fileCompr = NULL;
2072
 
2031
 
2073
	compressed = false;
2032
	compressed = false;
2074
	if ( fileUncomprLen )
2033
	if ( fileUncomprLen )
2075
	{
2034
	{
Line 2078... Line 2037...
2078
			if ( fileComprLen < 100 )
2037
			if ( fileComprLen < 100 )
2079
				fileComprLen = 200;
2038
				fileComprLen = 200;
2080
			else if ( fileComprLen < 1000 )
2039
			else if ( fileComprLen < 1000 )
2081
				fileComprLen *= 2;
2040
				fileComprLen *= 2;
2082
			fileCompr = (unsigned char *)calloc((unsigned int)fileComprLen, 1);
2041
			fileCompr = (unsigned char *)calloc((unsigned int)fileComprLen, 1);
2083
			int err = compress ( (unsigned char *)fileCompr, (unsigned long *)&fileComprLen, (const unsigned char *)files.c_str(), (unsigned long)files.Length(), 0 );
2042
			int err = compress ( (unsigned char *)fileCompr, (unsigned long *)&fileComprLen, (const unsigned char *)files.c_str(), (unsigned long)files.length(), 0 );
2084
			if ( err == Z_OK )
2043
			if ( err == Z_OK )
2085
				compressed = true;
2044
				compressed = true;
2086
		}
2045
		}
2087
	}
2046
	}
2088
 
2047
 
Line 2584... Line 2543...
2584
		list->pushBack("# Ratings Values, 0 to 5, <ease> <changing> <recommended>");
2543
		list->pushBack("# Ratings Values, 0 to 5, <ease> <changing> <recommended>");
2585
		list->pushBack(Utils::String("Ratings: ") + (long)easeOfUse() + " " + (long)gameChanging() + " " + (long)recommended());
2544
		list->pushBack(Utils::String("Ratings: ") + (long)easeOfUse() + " " + (long)gameChanging() + " " + (long)recommended());
2586
		list->pushBack("");
2545
		list->pushBack("");
2587
	}
2546
	}
2588
 
2547
 
2589
	if ( m_lNames.size() )
2548
	if (namesList()->size())
2590
	{
2549
	{
2591
		list->pushBack("# Package names, uses different names for different languages");
2550
		list->pushBack("# Package names, uses different names for different languages");
2592
		for ( CListNode<SNames> *node = m_lNames.Front(); node; node = node->next() )
2551
		for(auto itr = namesList()->begin(); itr != namesList()->end(); itr++)
2593
			list->pushBack(Utils::String("ScriptName: ") + (long)node->Data()->;iLanguage + " " + node->Data()->sName);
2552
			list->pushBack(Utils::String("ScriptName: ") + (long)(*itr)->;iLanguage + " " + (*itr)->sName);
2594
		list->pushBack("");
2553
		list->pushBack("");
2595
	}
2554
	}
2596
 
2555
 
2597
	for ( int j = 0; j < 2; j++ ) {
2556
	for ( int j = 0; j < 2; j++ ) {
2598
		Utils::String installText = (j == 0) ? "Install" : "Uninstall";
2557
		Utils::String installText = (j == 0) ? "Install" : "Uninstall";
Line 2737... Line 2696...
2737
	}
2696
	}
2738
 
2697
 
2739
	return true;
2698
	return true;
2740
}
2699
}
2741
 
2700
 
2742
Utils::String CBaseFile::GetAutosaveName()
2701
Utils::String CBaseFile::getAutosaveName() const
2743
{
2702
{
2744
	return this->name() + "-V" + this->version() + "-" + this->creationDate().findReplace("/", ".");
2703
	return this->name() + "-V" + this->version() + "-" + this->creationDate().findReplace("/", ".");
2745
}
2704
}
2746
 
2705
 
2747
bool CBaseFile::CheckGameCompatability(int game)
2706
bool CBaseFile::CheckGameCompatability(int game)
Line 2754... Line 2713...
2754
			return true;
2713
			return true;
2755
	}
2714
	}
2756
	return false;
2715
	return false;
2757
}
2716
}
2758
 
2717
 
2759
bool CBaseFile::CheckGameVersionCompatability(int game, CyString sVersion, int iVersion)
2718
bool CBaseFile::checkGameVersionCompatability(int game, const Utils::String &sVersion, int iVersion) const
2760
{
2719
{
2761
	if ( m_lGames.empty() )
2720
	if (m_lGames.empty())
2762
		return true; // no game compatability added, assume its ok for all
2721
		return true; // no game compatability added, assume its ok for all
2763
 
2722
 
2764
	bool foundAll = false;
2723
	bool foundAll = false;
2765
	for ( CListNode<SGameCompat> *node = m_lGames.Front(); node; node = node->next() ) {
2724
	for ( CListNode<SGameCompat> *node = m_lGames.Front(); node; node = node->next() ) {
2766
		if ( node->Data()->iGame == 0 )
2725
		if ( node->Data()->iGame == 0 )
2767
			foundAll = true;
2726
			foundAll = true;
2768
		else if ( node->Data()->iGame == game ) { // now check the version
2727
		else if ( node->Data()->iGame == game ) { // now check the version
2769
			if ( node->Data()->sVersion.empty() ) {
2728
			if ( node->Data()->sVersion.empty() ) {
2770
				if ( CyString(node-&gt;Data()->sVersion).CompareVersion(sVersion) == COMPARE_OLDER )
2729
				if (node-&gt;Data()->sVersion.compareVersion(sVersion) == COMPARE_OLDER)
2771
					return false;
2730
					return false;
2772
				return true;
2731
				return true;
2773
			}
2732
			}
2774
			else {
2733
			else {
2775
				if ( node->Data()->iVersion > iVersion )
2734
				if ( node->Data()->iVersion > iVersion )
Line 2846... Line 2805...
2846
}
2805
}
2847
bool CBaseFile::LoadPackageData(const Utils::String &sFirst, const Utils::String &sRest, const Utils::String &sMainGame, Utils::CStringList &otherGames, Utils::CStringList &gameAddons, CProgressInfo *progress)
2806
bool CBaseFile::LoadPackageData(const Utils::String &sFirst, const Utils::String &sRest, const Utils::String &sMainGame, Utils::CStringList &otherGames, Utils::CStringList &gameAddons, CProgressInfo *progress)
2848
{
2807
{
2849
	if (sFirst.Compare("Name"))					this->setName(sRest);
2808
	if (sFirst.Compare("Name"))					this->setName(sRest);
2850
	else if (sFirst.Compare("Author"))			this->setAuthor(sRest);
2809
	else if (sFirst.Compare("Author"))			this->setAuthor(sRest);
2851
	else if (sFirst.Compare("ScriptName"))
-
 
2852
		AddLanguageName(ParseLanguage(sRest.token(" ", 1)), sRest.tokens(" ", 2));
2810
	else if (sFirst.Compare("ScriptName"))		addName(ParseLanguage(sRest.token(" ", 1)), sRest.tokens(" ", 2));
2853
	else if (sFirst.Compare("UninstallBefore"))	this->addUninstallText(ParseLanguage(sRest.token(" ", 1)), true, sRest.tokens(" ", 2));
2811
	else if (sFirst.Compare("UninstallBefore"))	this->addUninstallText(ParseLanguage(sRest.token(" ", 1)), true, sRest.tokens(" ", 2));
2854
	else if (sFirst.Compare("UninstallAfter"))	this->addUninstallText(ParseLanguage(sRest.token(" ", 1)), false, sRest.tokens(" ", 2));
2812
	else if (sFirst.Compare("UninstallAfter"))	this->addUninstallText(ParseLanguage(sRest.token(" ", 1)), false, sRest.tokens(" ", 2));
2855
	else if (sFirst.Compare("InstallBefore"))		this->addInstallText(ParseLanguage(sRest.token(" ", 1)), true, sRest.tokens(" ", 2));
2813
	else if (sFirst.Compare("InstallBefore"))		this->addInstallText(ParseLanguage(sRest.token(" ", 1)), true, sRest.tokens(" ", 2));
2856
	else if (sFirst.Compare("InstallAfter"))		this->addInstallText(ParseLanguage(sRest.token(" ", 1)), false, sRest.tokens(" ", 2));
2814
	else if (sFirst.Compare("InstallAfter"))		this->addInstallText(ParseLanguage(sRest.token(" ", 1)), false, sRest.tokens(" ", 2));
2857
	else if (sFirst.Compare("Date"))				this->setCreationDate(sRest);
2815
	else if (sFirst.Compare("Date"))				this->setCreationDate(sRest);
Line 2895... Line 2853...
2895
	else if (sFirst.Compare("WebMirror1"))
2853
	else if (sFirst.Compare("WebMirror1"))
2896
		this->addWebMirror(sRest);
2854
		this->addWebMirror(sRest);
2897
	else if (sFirst.Compare("WebMirror2"))
2855
	else if (sFirst.Compare("WebMirror2"))
2898
		this->addWebMirror(sRest);
2856
		this->addWebMirror(sRest);
2899
	else if (sFirst.Compare("Ftp"))
2857
	else if (sFirst.Compare("Ftp"))
2900
		m_sFtpAddr = sRest;
2858
		_sFtpAddr = sRest;
2901
	else if (sFirst.Compare("Ratings"))		_setRatings(sRest.token(" ", 1), sRest.token(" ", 2), sRest.token(" ", 3));
2859
	else if (sFirst.Compare("Ratings"))		_setRatings(sRest.token(" ", 1), sRest.token(" ", 2), sRest.token(" ", 3));
2902
	else if (sFirst.Compare("EaseOfUse"))		setEaseOfUse(sRest);
2860
	else if (sFirst.Compare("EaseOfUse"))		setEaseOfUse(sRest);
2903
	else if (sFirst.Compare("GameChanging"))	setGameChanging(sRest);
2861
	else if (sFirst.Compare("GameChanging"))	setGameChanging(sRest);
2904
	else if (sFirst.Compare("Recommended"))	setRecommended(sRest);
2862
	else if (sFirst.Compare("Recommended"))	setRecommended(sRest);
2905
	else if (sFirst.Compare("Depend"))
2863
	else if (sFirst.Compare("Depend"))
Line 2922... Line 2880...
2922
	}
2880
	}
2923
	else if (sFirst.Compare("Icon"))
2881
	else if (sFirst.Compare("Icon"))
2924
	{
2882
	{
2925
		C_File *icon = new C_File(sRest.c_str());
2883
		C_File *icon = new C_File(sRest.c_str());
2926
		if (icon->ReadFromFile())
2884
		if (icon->ReadFromFile())
2927
			this->SetIcon(icon, CFileIO(sRest).extension());
2885
			this->setIcon(icon, CFileIO(sRest).extension());
2928
	}
2886
	}
2929
	else if (sFirst.Compare("CombineGameFiles"))
2887
	else if (sFirst.Compare("CombineGameFiles"))
2930
		_bCombineFiles = sRest.Compare("true") || sRest.Compare("yes") || sRest.toInt();
2888
		_bCombineFiles = sRest.Compare("true") || sRest.Compare("yes") || sRest.toInt();
2931
	else if (sFirst.Compare("UpdateFile"))
2889
	else if (sFirst.Compare("UpdateFile"))
2932
		this->createUpdateFile(sRest);
2890
		this->createUpdateFile(sRest);
Line 3133... Line 3091...
3133
			file->SetShared(shared);
3091
			file->SetShared(shared);
3134
	}
3092
	}
3135
}
3093
}
3136
 
3094
 
3137
 
3095
 
3138
CyString CBaseFile::GetFullFileSizeString() { return SPK::GetSizeString ( this->GetFullFileSize() ); }
3096
Utils::String CBaseFile::fileSizeString() const { return SPK::GetSizeString ( this->fileSize() ); }
3139
 
3097
 
3140
// used for a multiple spk file
3098
// used for a multiple spk file
3141
unsigned char *CBaseFile::CreateData(size_t *size, CProgressInfo *progress)
3099
unsigned char *CBaseFile::CreateData(size_t *size, CProgressInfo *progress)
3142
{
3100
{
3143
	if ( this->WriteFile("temp.dat", progress) ) {
3101
	if ( this->WriteFile("temp.dat", progress) ) {
Line 3147... Line 3105...
3147
	}
3105
	}
3148
	return NULL;
3106
	return NULL;
3149
}
3107
}
3150
 
3108
 
3151
 
3109
 
3152
void CBaseFile::ConvertNormalMod(C_File *f, CyString to)
3110
void CBaseFile::convertNormalMod(C_File *f, const Utils::String &to) const
3153
{
3111
{
3154
	C_File *match = this->FindMatchingMod(f);
3112
	C_File *match = this->findMatchingMod(f);
3155
	if ( match )
3113
	if ( match )
3156
	{
3114
	{
3157
		// file link
3115
		// file link
3158
		if ( !match->GetData() )
3116
		if ( !match->GetData() )
3159
			match->ReadFromFile();
3117
			match->ReadFromFile();
Line 3165... Line 3123...
3165
		f->ReadFromFile();
3123
		f->ReadFromFile();
3166
 
3124
 
3167
	f->ChangeBaseName(to);
3125
	f->ChangeBaseName(to);
3168
}
3126
}
3169
 
3127
 
3170
void CBaseFile::ConvertAutoText(C_File *f)
3128
void CBaseFile::convertAutoText(C_File *f) const
3171
{
3129
{
3172
	CyString to;
3130
	Utils::String to;
3173
	if ( f->GetBaseName().IsIn("-L") )
3131
	if ( f->baseName().contains("-L") )
3174
		to = CyString("0000-L";) + f-&gt;GetBaseName().GetToken(";-L", 2, 2);
3132
		to = "0000-L"; + f-&gt;baseName().token(";-L", 2);
3175
	else if ( f->GetBaseName().IsIn("-l") )
3133
	else if ( f->GetBaseName().IsIn("-l") )
3176
		to = CyString("0000-L";) + f-&gt;GetBaseName().GetToken(";-l", 2, 2);
3134
		to = "0000-L"; + f-&gt;baseName().token(";-l", 2);
3177
	else
3135
	else
3178
		to = f->GetBaseName().Left(-4) + "0000";
3136
		to = f->baseName().left(-4) + "0000";
3179
 
3137
 
3180
	// file link
3138
	// file link
3181
	if ( !f->GetData() )
3139
	if ( !f->GetData() )
3182
		f->ReadFromFile();
3140
		f->ReadFromFile();
3183
 
3141
 
3184
	f->ChangeBaseName(to);
3142
	f->ChangeBaseName(to);
3185
 
-
 
3186
}
3143
}
3187
 
3144
 
3188
void CBaseFile::ConvertFakePatch(C_File *f)
3145
void CBaseFile::convertFakePatch(C_File *f) const
3189
{
3146
{
3190
	// find next available fake patch
3147
	// find next available fake patch
3191
	int num = 0;
3148
	int num = 0;
3192
 
3149
 
3193
	bool found = true;
3150
	bool found = true;
3194
	while ( found )
3151
	while ( found )
3195
	{
3152
	{
3196
		++num;
3153
		++num;
3197
		found = false;
3154
		found = false;
3198
		CyString find = CyString::Number(num).PadNumber(2);
3155
		Utils::String find = Utils::String::PadNumber(num, 2);
3199
		for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
3156
		for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
3200
		{
3157
		{
3201
			if ( node->Data()->GetFileType() != FILETYPE_MOD )
3158
			if ( node->Data()->GetFileType() != FILETYPE_MOD )
3202
				continue;
3159
				continue;
3203
			if ( !node->Data()->IsFakePatch() )
3160
			if ( !node->Data()->IsFakePatch() )
3204
				continue;
3161
				continue;
3205
			if ( node->Data()->GetBaseName().Compare(find) )
3162
			if ( node->Data()->baseName().Compare(find) )
3206
			{
3163
			{
3207
				found = true;
3164
				found = true;
3208
				break;
3165
				break;
3209
			}
3166
			}
3210
		}
3167
		}
3211
	}
3168
	}
3212
 
3169
 
3213
	CyString to = CyString::Number(num).PadNumber(2);
3170
	Utils::String to = Utils::String::PadNumber(num, 2);
3214
	C_File *match = this->FindMatchingMod(f);
3171
	C_File *match = this->findMatchingMod(f);
3215
 
3172
 
3216
	// file link
3173
	// file link
3217
	if ( !f->GetData() )
3174
	if ( !f->GetData() )
3218
		f->ReadFromFile();
3175
		f->ReadFromFile();
3219
 
3176
 
Line 3225... Line 3182...
3225
			match->ReadFromFile();
3182
			match->ReadFromFile();
3226
		match->ChangeBaseName(to);
3183
		match->ChangeBaseName(to);
3227
	}
3184
	}
3228
}
3185
}
3229
 
3186
 
3230
C_File *CBaseFile::FindMatchingMod(C_File *f)
3187
C_File *CBaseFile::findMatchingMod(C_File *f) const
3231
{
3188
{
3232
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
3189
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
3233
	{
3190
	{
3234
		if ( node->Data()->GetFileType() != FILETYPE_MOD )
3191
		if ( node->Data()->GetFileType() != FILETYPE_MOD )
3235
			continue;
3192
			continue;
Line 3242... Line 3199...
3242
	}
3199
	}
3243
 
3200
 
3244
	return NULL;
3201
	return NULL;
3245
}
3202
}
3246
 
3203
 
3247
void CBaseFile::RenameFile(C_File *f, CyString baseName)
3204
void CBaseFile::renameFile(C_File *f, const Utils::String &baseName) const
3248
{
3205
{
3249
	if ( f->GetFileType() == FILETYPE_MOD )
3206
	if ( f->GetFileType() == FILETYPE_MOD )
3250
	{
3207
	{
3251
		C_File *match = this->FindMatchingMod(f);
3208
		C_File *match = this->findMatchingMod(f);
3252
		if ( match )
3209
		if ( match )
3253
			match->ChangeBaseName(baseName);
3210
			match->ChangeBaseName(baseName);
3254
	}
3211
	}
3255
 
3212
 
3256
	// need to edit the file
3213
	// need to edit the file