Subversion Repositories spk

Rev

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

Rev 51 Rev 52
Line 12... Line 12...
12
	m_bCreate = false;
12
	m_bCreate = false;
13
}
13
}
14
 
14
 
15
CCatFile::~CCatFile ()
15
CCatFile::~CCatFile ()
16
{
16
{
-
 
17
	m_fDatFile.close();
-
 
18
	m_fCatFile.close();
17
	for ( SInCatFile *c = m_lFiles.First(); c; c = m_lFiles.Next() )
19
	for ( SInCatFile *c = m_lFiles.First(); c; c = m_lFiles.Next() )
18
	{
20
	{
19
		if ( c->sData )
21
		if ( c->sData )
20
			delete c->sData;
22
			delete c->sData;
21
		delete c;
23
		delete c;
Line 531... Line 533...
531
		return fo.ChangeFileExtension ( "pbd" );
533
		return fo.ChangeFileExtension ( "pbd" );
532
 
534
 
533
	return f;
535
	return f;
534
}
536
}
535
 
537
 
536
bool CCatFile::AppendFile ( CyString filename, CyString to, bool pck, bool bXor, CyString *sChangeTo)
538
bool CCatFile::AppendFile(const Utils::String &filename, const Utils::String &sTo, bool pck, bool bXor, Utils::String *sChangeTo)
537
{
539
{
538
	if ( (!m_bCreate) && (!m_fCatFile.Exists ()) )
540
	CLog::logf(CLog::Log_IO, 1, "CCatFile::AppendFile() Adding file, %s, into cat file, %s::%s [PCK:%s XOR:%s]", filename.c_str(), this->m_fCatFile.GetFilename().ToString().c_str(), sTo.c_str(), (pck) ? "Yes" : "No", (bXor) ? "Yes" : "No");
539
		return false;
-
 
540
 
541
 
-
 
542
	if ( filename.isin ( "::" ) ) return WriteFromCat ( filename.token("::", 1), filename.token("::", 2));
-
 
543
	if ( (!m_bCreate) && (!m_fCatFile.exists ()) ) {
-
 
544
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() Cat File: %s, doesn't exist, quitting...", m_fCatFile.GetFullFilename().ToString().c_str());
-
 
545
		return false;
-
 
546
	}
-
 
547
	CyString to = sTo;
541
	if ( !m_sAddonDir.Empty() && CCatFile::IsAddonDir(to) ) {
548
	if ( !m_sAddonDir.Empty() && CCatFile::IsAddonDir(to) ) {
-
 
549
		CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() changing destination to included addon fir, %s => %s", to, m_sAddonDir + "/" + to);
542
		to = m_sAddonDir + "\\" + to;
550
		to = m_sAddonDir + "\\" + to;
543
	}
551
	}
544
 
-
 
545
	if ( filename.IsIn ( "::" ) )
-
 
546
		return WriteFromCat ( filename.GetToken ( "::", 1, 1 ), filename.GetToken ( "::", 2, 2 ) );
-
 
547
 
-
 
548
	// first open the file to check it exists
-
 
549
	FILE *id = fopen ( filename.c_str(), "rb" );
-
 
550
	if ( !id )
-
 
551
		return false;
-
 
552
	fclose ( id );
-
 
553
 
-
 
554
	// then check if the file already exists
-
 
555
	/*
-
 
556
	if ( !m_lFiles.empty() )
-
 
557
	{
-
 
558
		SInCatFile *f = FindData ( to );
-
 
559
		if ( f )
-
 
560
		{
-
 
561
			if ( !RemoveFile ( f ) )
-
 
562
				return false;
-
 
563
		}
-
 
564
	}*/
-
 
565
 
552
 
566
	// change the file extension and remove the file again
553
	// change the file extension and remove the file again
567
	if ( pck && CheckExtensionPck(filename) ) {
554
	if ( pck && CheckExtensionPck(filename) ) {
-
 
555
		CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() changing file extension for packed file, %s => %s", to.c_str(), PckChangeExtension(to).ToString().c_str());
568
		to = PckChangeExtension ( to );
556
		to = PckChangeExtension(to);
569
	}
-
 
570
 
-
 
571
	if ( sChangeTo ) {
-
 
572
		*sChangeTo = to;
-
 
573
	}
557
	}
-
 
558
	if ( sChangeTo ) *sChangeTo = to.ToString();
574
 
559
 
575
	if ( !m_lFiles.empty() ) {
560
	if ( !m_lFiles.empty() ) {
576
		SInCatFile *checkf = FindData ( to );
561
		SInCatFile *checkf = FindData ( to );
577
		if ( checkf ) {
562
		if ( checkf ) {
-
 
563
			CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() removing existing filechanging file extension for packed file, %s => %s", to.c_str(), PckChangeExtension(to).ToString().c_str());
578
			if ( !RemoveFile ( checkf ) ) return false;
564
			if ( !RemoveFile(checkf) ) {
-
 
565
				CLog::logf(CLog::Log_IO, 1, "CCatFile::AppendFile() unable to remove existing file, quitting...");
-
 
566
				return false;
-
 
567
			}
579
		}
568
		}
580
	}
569
	}
581
 
570
 
582
	bool append = false;
571
	bool append = false;
583
 
572
 
584
	SInCatFile *f = new SInCatFile;
573
	SInCatFile *f = new SInCatFile;
585
	f->sData = 0;
574
	f->sData = 0;
586
	f->lOffset = this->GetEndOffset();
575
	f->lOffset = this->GetEndOffset();
587
 
576
 
588
	bool dofile = true;
577
	bool dofile = true;
589
 
578
 
590
	if ( !m_lFiles.size() )
579
	if ( !m_lFiles.size() )	{
-
 
580
		CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() no existing files found, wipeing the existing dat file");
591
		m_fDatFile.WipeFile();
581
		m_fDatFile.WipeFile();
592
 
582
	}
593
//	if ( CheckPackedExtension(to) && !CheckPackedExtension(filename) )
-
 
594
	{
583
 
595
		FILE *id = fopen ( filename.c_str(), "rb" );
584
	CFileIO File(filename);
596
		if ( !id )
585
	if ( !File.startRead() ) {
-
 
586
		CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() unable to open file, %s, for reading", filename.c_str());
597
			return false;
587
		return false;
598
		fseek ( id, 0, SEEK_END );
588
	}
599
		size_t size = ftell ( id );
-
 
-
 
589
	
600
		fseek ( id, 0, SEEK_SET );
590
	CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() reading file data, %s:%d", filename.c_str(), File.fileSize());
601
		unsigned char *data = new unsigned char[size + 1];
591
	unsigned char *data = File.readAll();
602
		fread ( data, sizeof(unsigned char), size, id );
-
 
603
		data[size] = '\0';
-
 
604
		fclose ( id );
592
	File.close();
605
 
593
 
-
 
594
	// check if we need to pack the file
606
		int iFileType = this->_checkFiletype(data, 3);
595
	int iFileType = this->_checkFiletype(data, 3);
-
 
596
	CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() preparing to append file data, Type=%d", iFileType);
607
		if ( CheckPackedExtension(to) && iFileType == FILETYPE_PLAIN )
597
	if ( iFileType == FILETYPE_PLAIN && CheckPackedExtension(to) ) {
608
		{
-
 
-
 
598
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() plain text file needs to packed");
609
			size_t newsize = 0;
599
		size_t newsize = 0;
610
			unsigned char *newdata = PCKData ( data, size, &newsize, bXor );
600
		unsigned char *newdata = PCKData(data, File.fileSize(), &newsize, bXor);
-
 
601
		CLog::logf(CLog::Log_IO, 1, "CCatFile::AppendFile() file has been packed, %d => %d", File.fileSize(), newsize);
611
 
602
 
612
			f->lSize = newsize;
603
		f->lSize = newsize;
-
 
604
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() Decrypting data");
613
			this->DecryptDAT(newdata, f->lSize);
605
		this->DecryptDAT(newdata, f->lSize);
-
 
606
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() appending data to Dat file, Offset:%d", f->lOffset);
614
			append = m_fDatFile.AppendDataToPos ( (const char *)newdata, newsize, f->lOffset );
607
		append = m_fDatFile.AppendDataToPos ( (const char *)newdata, newsize, f->lOffset );
615
 
608
 
616
			delete [] newdata;
609
		delete [] newdata;
617
		}
610
	}
618
		else 
611
	else  {
619
		{
-
 
-
 
612
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() Decrypting data");
620
			this->DecryptDAT(data, size);
613
		this->DecryptDAT(data, File.fileSize());
621
			f->lSize = size;
614
		f->lSize = File.fileSize();
-
 
615
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() appending data to Dat file, Offset:%d", f->lOffset);
622
			append = m_fDatFile.AppendDataToPos ( (const char *)data, f->lSize, f->lOffset );
616
		append = m_fDatFile.AppendDataToPos ( (const char *)data, f->lSize, f->lOffset );
623
		}
617
	}
624
 
618
 
-
 
619
	CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() cleaning up memory");
625
		delete [] data;
620
	delete [] data;
626
	}
-
 
627
 
621
 
628
	if ( append )
622
	if ( append ) {
-
 
623
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() append complete, adding file into cat list");
629
	{
624
		m_fDatFile.close();
630
		m_bCreate = false;
625
		m_bCreate = false;
631
		f->sFile = to;
626
		f->sFile = to;
632
		m_lFiles.push_back ( f );
627
		m_lFiles.push_back ( f );
-
 
628
		CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() writing the new cat file");
633
		WriteCatFile ();
629
		this->WriteCatFile ();
634
	}
630
	}
635
	else
631
	else {
-
 
632
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() appending failed, cleaning up file data");
636
		delete f;
633
		delete f;
-
 
634
	}
637
 
635
 
638
	return true;
636
	return true;
639
}
637
}
640
 
638
 
641
bool CCatFile::AddData ( CyString catfile, unsigned char *data, size_t size, CyString to, bool pck, bool create )
639
bool CCatFile::AddData ( CyString catfile, unsigned char *data, size_t size, CyString to, bool pck, bool create )
642
{
640
{
643
	int err = Open ( catfile, "", CATREAD_CATDECRYPT, create );
641
	int err = Open ( catfile, "", CATREAD_CATDECRYPT, create );
644
	if ( (err != CATERR_NONE) && (err != CATERR_CREATED) )
642
	if ( (err != CATERR_NONE) && (err != CATERR_CREATED) )
645
		return false;
643
		return false;
646
 
644
 
647
	return AppendData ( data, size, to, pck );
645
	return AppendData ( data, size, to, pck );
648
}
646
}
649
 
647
 
650
int CCatFile::GetEndOffset()
648
int CCatFile::GetEndOffset()
651
{
649
{
652
	if ( m_lFiles.empty() )
650
	if ( m_lFiles.empty() )
653
		return 0;
651
		return 0;
654
	else
652
	else
655
		return m_lFiles.Back()->Data()->lOffset + m_lFiles.Back()->Data()->lSize;
653
		return m_lFiles.Back()->Data()->lOffset + m_lFiles.Back()->Data()->lSize;
656
}
654
}
657
 
655
 
658
 
656
 
659
bool CCatFile::AppendData ( unsigned char *data, size_t size, CyString to, bool pck, bool bXor )
657
bool CCatFile::AppendData ( unsigned char *data, size_t size, CyString to, bool pck, bool bXor )
660
{
658
{
661
	if ( (!m_bCreate) && (!m_fCatFile.Exists ()) )
659
	if ( (!m_bCreate) && (!m_fCatFile.exists ()) )
662
		return false;
660
		return false;
663
 
661
 
664
	if ( (size <= 0) || (!data) )
662
	if ( (size <= 0) || (!data) )
665
		return false;
663
		return false;
666
 
664
 
667
	// then check if the file already exists
665
	// then check if the file already exists
668
	if ( !m_lFiles.empty() )
666
	if ( !m_lFiles.empty() )
669
	{
667
	{
Line 717... Line 715...
717
		append = m_fDatFile.AppendDataToPos ( (const char *)data, size, f->lOffset );
715
		append = m_fDatFile.AppendDataToPos ( (const char *)data, size, f->lOffset );
718
	}
716
	}
719
 
717
 
720
	if ( append )
718
	if ( append )
721
	{
719
	{
-
 
720
		m_fDatFile.close();
722
		m_bCreate = false;
721
		m_bCreate = false;
723
		f->sFile = to;
722
		f->sFile = to;
724
		m_lFiles.push_back ( f );
723
		m_lFiles.push_back ( f );
725
		WriteCatFile ();
724
		WriteCatFile ();
726
	}
725
	}
Line 737... Line 736...
737
	if ( ext == "pck" )
736
	if ( ext == "pck" )
738
	{
737
	{
739
		CyString firstDir = f->sFile.FindReplace("/", "\\").GetToken("\\", 1, 1).lower();
738
		CyString firstDir = f->sFile.FindReplace("/", "\\").GetToken("\\", 1, 1).lower();
740
 
739
 
741
		if ( firstDir == "t" )
740
		if ( firstDir == "t" )
742
			return fo.ChangeFileExtension ( "xml" );
741
			return fo.ChangeFileExtension ( "xml" );
743
		else if ( firstDir == "director" )
742
		else if ( firstDir == "director" )
744
			return fo.ChangeFileExtension ( "xml" );
743
			return fo.ChangeFileExtension ( "xml" );
745
		return fo.ChangeFileExtension ( "txt" );
744
		return fo.ChangeFileExtension ( "txt" );
746
	}
745
	}
747
	else if ( ext == "pbb" )
746
	else if ( ext == "pbb" )
Line 826... Line 825...
826
 
825
 
827
	// load the data from file
826
	// load the data from file
828
	ReadFileToData ( f );
827
	ReadFileToData ( f );
829
 
828
 
830
	data = this->UnpackFile(f, &size);
829
	data = this->UnpackFile(f, &size);
831
	if ( !data )
830
	if ( !data ) {
832
	{
-
 
833
		m_iError = CATERR_CANTREAD;
831
		m_iError = CATERR_CANTREAD;
834
		return false;
832
		return false;
835
	}
833
	}
836
 
834
 
837
	CFileIO fo(CCatFile::RenameFileExtension(f));
835
	CFileIO fo(CCatFile::RenameFileExtension(f));
Line 875... Line 873...
875
		}
873
		}
876
	}
874
	}
877
 
875
 
878
	if ( tofile.Empty() )
876
	if ( tofile.Empty() )
879
		tofile = fo.GetFilename();
877
		tofile = fo.GetFilename();
-
 
878
 
-
 
879
	bool bWritten = false;
880
 
880
 
881
	// create the directory to extract to
881
	// create the directory to extract to
882
	if ( !todir.Empty() && !CDirIO(todir).Create() )
882
	if ( !todir.Empty() && !CDirIO(todir).Create() )
883
		m_iError = CATERR_CANTCREATEDIR;
883
		m_iError = CATERR_CANTCREATEDIR;
884
	else
884
	else
Line 888... Line 888...
888
			file += "/";
888
			file += "/";
889
		file += tofile;
889
		file += tofile;
890
		file = file.FindReplace("/", "\\");
890
		file = file.FindReplace("/", "\\");
891
		file = file.FindReplace("\\\\", "\\");
891
		file = file.FindReplace("\\\\", "\\");
892
 
892
 
893
		FILE *id = fopen ( file.c_str(), "wb" );
893
		CFileIO File(file.c_str());
894
		if ( !id )
-
 
895
			m_iError = CATERR_INVALIDDEST;
894
		if ( !File.startWrite() ) m_iError = CATERR_INVALIDDEST;
896
		else
-
 
897
		{
-
 
898
			fwrite ( data, sizeof(char), size, id );
895
		else bWritten = File.write(data, size);
899
			fclose ( id );
-
 
900
 
-
 
901
			ClearError ();
-
 
902
 
-
 
903
			delete data;
-
 
904
			f->sData = 0;
-
 
905
 
-
 
906
			return true;
-
 
907
		}
-
 
908
	}
896
	}
909
 
897
 
910
	delete data;
898
	delete data;
911
	f->sData = 0;
899
	f->sData = 0;
912
 
900
 
-
 
901
	if ( bWritten ) this->ClearError();
-
 
902
 
913
	return false;
903
	return bWritten;
914
}
904
}
915
 
905
 
916
CyString CCatFile::GetErrorString ()
906
CyString CCatFile::GetErrorString ()
917
{
907
{
918
	switch ( m_iError )
908
	switch ( m_iError )
Line 1182... Line 1172...
1182
CyStringList *CCatFile::GetTShipsEntries()
1172
CyStringList *CCatFile::GetTShipsEntries()
1183
{
1173
{
1184
	if ( this->ExtractFile("types/tships.pck", "tships.txt") )
1174
	if ( this->ExtractFile("types/tships.pck", "tships.txt") )
1185
	{
1175
	{
1186
		CFileIO TShips("tships.txt");
1176
		CFileIO TShips("tships.txt");
1187
		if ( TShips.Exists() )
1177
		if ( TShips.exists() )
1188
		{
1178
		{
1189
			CyStringList *lines = TShips.ReadLinesStr();
1179
			CyStringList *lines = TShips.ReadLinesStr();
1190
			if ( lines )
1180
			if ( lines )
1191
			{
1181
			{
1192
				// remove any commands, blank lines, and start
1182
				// remove any commands, blank lines, and start
Line 1222... Line 1212...
1222
					while ( str->data.Empty() )
1212
					while ( str->data.Empty() )
1223
						str->data = str->str.GetToken(";", num--, (num + 2));
1213
						str->data = str->str.GetToken(";", num--, (num + 2));
1224
				}
1214
				}
1225
			}
1215
			}
1226
			// remove the tmp file
1216
			// remove the tmp file
1227
			TShips.Remove();
1217
			TShips.remove();
1228
 
1218
 
1229
			if ( lines )
1219
			if ( lines )
1230
				lines->RemoveMarked();
1220
				lines->RemoveMarked();
1231
			return lines;
1221
			return lines;
1232
		}
1222
		}