Subversion Repositories spk

Rev

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

Rev 53 Rev 58
Line 215... Line 215...
215
			}
215
			}
216
			catch(std::exception &e) {
216
			catch(std::exception &e) {
217
				CLog::logf(CLog::Log_IO, 2, "CCatFile::LoadDatFile() unable to read file data: %s, %d (%s)", c->sFile.c_str(), c->lSize, e.what());
217
				CLog::logf(CLog::Log_IO, 2, "CCatFile::LoadDatFile() unable to read file data: %s, %d (%s)", c->sFile.c_str(), c->lSize, e.what());
218
				continue;
218
				continue;
219
			}
219
			}
-
 
220
			c->bDecrypted = false;
220
			this->DecryptDAT(c);
221
			this->DecryptDAT(c);
221
		}
222
		}
222
		File.close();
223
		File.close();
223
	}
224
	}
224
}
225
}
Line 336... Line 337...
336
 
337
 
337
	if ( !c->sData ) {
338
	if ( !c->sData ) {
338
		if ( m_fDatFile.startRead() ) {
339
		if ( m_fDatFile.startRead() ) {
339
			m_fDatFile.seek(c->lOffset);
340
			m_fDatFile.seek(c->lOffset);
340
			c->sData = m_fDatFile.read(c->lSize);
341
			c->sData = m_fDatFile.read(c->lSize);
-
 
342
			c->bDecrypted = false;
341
			m_fDatFile.close();
343
			m_fDatFile.close();
342
 
344
 
343
			if ( !c->sData ) (*size) = 0;
345
			if ( !c->sData ) (*size) = 0;
344
			else {
346
			else {
345
				c->sData[c->lSize] = '\0';
347
				c->sData[c->lSize] = '\0';
346
				DecryptDAT(c->sData, c->lSize);
-
 
347
				c->bDecrypted = true;
348
				DecryptDAT(c);
348
			}
349
			}
349
		}
350
		}
350
	}
351
	}
351
 
352
 
352
	return c->sData;
353
	return c->sData;
Line 495... Line 496...
495
		return true;
496
		return true;
496
 
497
 
497
	return false;
498
	return false;
498
}
499
}
499
 
500
 
500
bool CCatFile::CheckPackedExtension ( CyString filename )
501
bool CCatFile::CheckPackedExtension(const Utils::String &sFilename)
501
{
502
{
502
	CyString ext = filename.GetToken ( ".", filename.NumToken  ( "." ) ).lower();
503
	Utils::String ext = CFileIO(sFilename).extension().lower();
503
 
504
 
504
	if ( ext == "pck" )
505
	if ( ext == "pck" )
505
		return true;
506
		return true;
506
	else if ( ext == "pbb" )
507
	else if ( ext == "pbb" )
507
		return true;
508
		return true;
508
	else if ( ext == "pbd" )
509
	else if ( ext == "pbd" )
509
		return true;
510
		return true;
510
 
511
 
511
	return false;
512
	return false;
512
}
513
}
513
 
514
 
514
CyString CCatFile::PckChangeExtension ( CyString f )
515
CyString CCatFile::PckChangeExtension ( CyString f )
515
{
516
{
516
	CFileIO fo ( f );
517
	CFileIO fo ( f );
517
	CyString ext = fo.GetFileExtension ().lower();
518
	CyString ext = fo.GetFileExtension ().lower();
Line 523... Line 524...
523
		return fo.ChangeFileExtension ( "pbb" );
524
		return fo.ChangeFileExtension ( "pbb" );
524
	else if ( ext == "bod" )
525
	else if ( ext == "bod" )
525
		return fo.ChangeFileExtension ( "pbd" );
526
		return fo.ChangeFileExtension ( "pbd" );
526
 
527
 
527
	return f;
528
	return f;
528
}
529
}
529
 
530
 
530
bool CCatFile::AppendFile(const Utils::String &filename, const Utils::String &sTo, bool pck, bool bXor, Utils::String *sChangeTo)
531
bool CCatFile::AppendFile(const Utils::String &filename, const Utils::String &sTo, bool pck, bool bXor, Utils::String *sChangeTo)
531
{
532
{
532
	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");
533
	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");
533
 
534
 
Line 574... Line 575...
574
	}
575
	}
575
 
576
 
576
	CFileIO File(filename);
577
	CFileIO File(filename);
577
	if ( !File.startRead() ) {
578
	if ( !File.startRead() ) {
578
		CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() unable to open file, %s, for reading", filename.c_str());
579
		CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() unable to open file, %s, for reading", filename.c_str());
579
		return false;
580
		return false;
580
	}
581
	}
581
	
582
	
582
	CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() reading file data, %s:%d", filename.c_str(), File.fileSize());
583
	CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() reading file data, %s:%d", filename.c_str(), File.fileSize());
583
	unsigned char *data = File.readAll();
584
	unsigned char *data = File.readAll();
584
	File.close();
585
	File.close();
585
 
586
 
586
	// check if we need to pack the file
587
	// check if we need to pack the file
587
	int iFileType = this->_checkFiletype(data, 3);
588
	int iFileType = this->_checkFiletype(data, 3);
588
	CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() preparing to append file data, Type=%d", iFileType);
589
	CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() preparing to append file data, Type=%d", iFileType);
589
	if ( iFileType == FILETYPE_PLAIN && CheckPackedExtension(to) ) {
590
	if ( iFileType == FILETYPE_PLAIN && CheckPackedExtension(to.ToString()) ) {
590
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() plain text file needs to packed");
591
		CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() plain text file needs to packed");
591
		size_t newsize = 0;
592
		size_t newsize = 0;
592
		unsigned char *newdata = PCKData(data, File.fileSize(), &newsize, bXor);
593
		unsigned char *newdata = PCKData(data, File.fileSize(), &newsize, bXor);
593
		CLog::logf(CLog::Log_IO, 1, "CCatFile::AppendFile() file has been packed, %d => %d", File.fileSize(), newsize);
594
		CLog::logf(CLog::Log_IO, 1, "CCatFile::AppendFile() file has been packed, %d => %d", File.fileSize(), newsize);
594
 
595
 
Line 681... Line 682...
681
		f->lOffset = m_fDatFile.GetFilesize();
682
		f->lOffset = m_fDatFile.GetFilesize();
682
 
683
 
683
	// if file extension is packed but not the file, then pack it, "pck" forces it to be packed unless it already is
684
	// if file extension is packed but not the file, then pack it, "pck" forces it to be packed unless it already is
684
 
685
 
685
	f->lSize = size;
686
	f->lSize = size;
686
	if ( (((pck) && (CheckExtensionPck (to))) || ((CheckPackedExtension ( to )))) && (!IsDataPCK ( data, size )) )
687
	if ( (((pck) && (CheckExtensionPck (to.ToString()))) || ((CheckPackedExtension ( to.ToString() )))) && (!IsDataPCK ( data, size )) )
687
	{
688
	{
688
		to = PckChangeExtension ( to );
689
		to = PckChangeExtension ( to );
689
 
690
 
690
		if ( !m_lFiles.empty() )
691
		if ( !m_lFiles.empty() )
691
		{
692
		{
Line 708... Line 709...
708
	else {
709
	else {
709
		this->DecryptDAT(data, size);
710
		this->DecryptDAT(data, size);
710
		append = m_fDatFile.AppendDataToPos ( (const char *)data, size, f->lOffset );
711
		append = m_fDatFile.AppendDataToPos ( (const char *)data, size, f->lOffset );
711
	}
712
	}
712
 
713
 
713
	if ( append )
-
 
714
	{
-
 
715
		m_fDatFile.close();
714
	m_fDatFile.close();
-
 
715
	if ( append ) {
716
		m_bCreate = false;
716
		m_bCreate = false;
717
		f->sFile = to;
717
		f->sFile = to;
718
		m_lFiles.push_back ( f );
718
		m_lFiles.push_back ( f );
719
		m_bCatChanged = true;
719
		m_bCatChanged = true;
720
	}
720
	}
Line 1061... Line 1061...
1061
		return false;
1061
		return false;
1062
 
1062
 
1063
	// now check if it exists in this file
1063
	// now check if it exists in this file
1064
	RemoveFile ( file );
1064
	RemoveFile ( file );
1065
 
1065
 
-
 
1066
	int offset = (m_lFiles.empty()) ? 0 : (m_lFiles.Back()->Data()->lOffset + m_lFiles.Back()->Data()->lSize);
1066
	// now write to the new file
1067
	// now write to the new file
-
 
1068
	if ( getfile->bDecrypted ) this->DecryptDAT(getfile->sData, getfile->lSize);
-
 
1069
	getfile->bDecrypted = false;
1067
	if ( !m_fDatFile.AppendData ( (const char *)data, size ) ) return false;
1070
	if ( !m_fDatFile.AppendDataToPos((const char *)getfile->sData, getfile->lSize, offset) ) return false;
-
 
1071
    m_fDatFile.close();
1068
 
1072
 
1069
	// finally add to the list
1073
	// finally add to the list
1070
	SInCatFile *f = new SInCatFile;
1074
	SInCatFile *f = new SInCatFile;
1071
	f->sData = 0;
1075
	f->sData = 0;
1072
	if ( m_lFiles.empty() )
1076
	if ( m_lFiles.empty() )