| Line 123... |
Line 123... |
| 123 |
try {
|
123 |
try {
|
| 124 |
if ( m_sData ) delete [] m_sData;
|
124 |
if ( m_sData ) delete [] m_sData;
|
| 125 |
m_sData = new unsigned char[size + 1];
|
125 |
m_sData = new unsigned char[size + 1];
|
| 126 |
}
|
126 |
}
|
| 127 |
catch (std::exception &e) {
|
127 |
catch (std::exception &e) {
|
| 128 |
CLog::logf(CLog::Log_IO, 2, "Memory Exception error, unable to alloc enough memory to store file data, %d (%s)", size + 1, e.what());
|
128 |
CLog::logf(CLog::Log_IO, 2, L"Memory Exception error, unable to alloc enough memory to store file data, %d (%hs)", size + 1, e.what());
|
| 129 |
return CATERR_MALLOC;
|
129 |
return CATERR_MALLOC;
|
| 130 |
}
|
130 |
}
|
| 131 |
|
131 |
|
| 132 |
m_lSize = size;
|
132 |
m_lSize = size;
|
| 133 |
try {
|
133 |
try {
|
| 134 |
File.read(m_sData, m_lSize);
|
134 |
File.read(m_sData, m_lSize);
|
| 135 |
} catch (std::exception &e) {
|
135 |
} catch (std::exception &e) {
|
| 136 |
CLog::logf(CLog::Log_IO, 3, "CCatFile::Open() unable to read from cat file, %s", e.what());
|
136 |
CLog::logf(CLog::Log_IO, 3, L"CCatFile::Open() unable to read from cat file, %hs", e.what());
|
| 137 |
RemoveData ();
|
137 |
RemoveData ();
|
| 138 |
File.close();
|
138 |
File.close();
|
| 139 |
return CATERR_READCAT;
|
139 |
return CATERR_READCAT;
|
| 140 |
}
|
140 |
}
|
| 141 |
|
141 |
|
| Line 213... |
Line 213... |
| 213 |
|
213 |
|
| 214 |
try {
|
214 |
try {
|
| 215 |
c->sData = new unsigned char[c->lSize + 1];
|
215 |
c->sData = new unsigned char[c->lSize + 1];
|
| 216 |
}
|
216 |
}
|
| 217 |
catch (std::exception &e) {
|
217 |
catch (std::exception &e) {
|
| 218 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::LoadDatFile() unable to malloc data storage: %s, %d (%s)", c->sFile.c_str(), c->lSize, e.what());
|
218 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::LoadDatFile() unable to malloc data storage: %s, %d (%hs)", c->sFile.c_str(), c->lSize, e.what());
|
| 219 |
continue;
|
219 |
continue;
|
| 220 |
}
|
220 |
}
|
| 221 |
|
221 |
|
| 222 |
try {
|
222 |
try {
|
| 223 |
m_fDatFile.read(c->sData, c->lSize);
|
223 |
m_fDatFile.read(c->sData, c->lSize);
|
| 224 |
}
|
224 |
}
|
| 225 |
catch(std::exception &e) {
|
225 |
catch(std::exception &e) {
|
| 226 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::LoadDatFile() unable to read file data: %s, %d (%s)", c->sFile.c_str(), c->lSize, e.what());
|
226 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::LoadDatFile() unable to read file data: %s, %d (%hs)", c->sFile.c_str(), c->lSize, e.what());
|
| 227 |
continue;
|
227 |
continue;
|
| 228 |
}
|
228 |
}
|
| 229 |
c->bDecrypted = false;
|
229 |
c->bDecrypted = false;
|
| 230 |
this->DecryptDAT(c);
|
230 |
this->DecryptDAT(c);
|
| 231 |
}
|
231 |
}
|
| Line 519... |
Line 519... |
| 519 |
|
519 |
|
| 520 |
bool ret = m_fCatFile.write(data, cat.length());
|
520 |
bool ret = m_fCatFile.write(data, cat.length());
|
| 521 |
delete []data;
|
521 |
delete []data;
|
| 522 |
}
|
522 |
}
|
| 523 |
catch(std::exception &e) {
|
523 |
catch(std::exception &e) {
|
| 524 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::WriteCatFile() unable to malloc, %d (%s)", len + 1, e.what());
|
524 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::WriteCatFile() unable to malloc, %d (%hs)", len + 1, e.what());
|
| 525 |
return false;
|
525 |
return false;
|
| 526 |
}
|
526 |
}
|
| 527 |
|
527 |
|
| 528 |
m_fCatFile.close();
|
528 |
m_fCatFile.close();
|
| 529 |
m_bCatChanged = false;
|
529 |
m_bCatChanged = false;
|
| Line 580... |
Line 580... |
| 580 |
return f;
|
580 |
return f;
|
| 581 |
}
|
581 |
}
|
| 582 |
|
582 |
|
| 583 |
bool CCatFile::appendFile(const Utils::WString &filename, const Utils::WString &sTo, bool pck, bool bXor, Utils::WString *sChangeTo)
|
583 |
bool CCatFile::appendFile(const Utils::WString &filename, const Utils::WString &sTo, bool pck, bool bXor, Utils::WString *sChangeTo)
|
| 584 |
{
|
584 |
{
|
| 585 |
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.filename().c_str(), sTo.c_str(), (pck) ? "Yes" : "No", (bXor) ? "Yes" : "No");
|
585 |
CLog::logf(CLog::Log_IO, 1, L"CCatFile::AppendFile() Adding file, %s, into cat file, %s::%s [PCK:%s XOR:%s]", filename.c_str(), this->m_fCatFile.filename().c_str(), sTo.c_str(), (pck) ? L"Yes" : L"No", (bXor) ? L"Yes" : L"No");
|
| 586 |
|
586 |
|
| 587 |
if ( filename.isin (L"::" ) ) return writeFromCat(filename.token(L"::", 1), filename.token(L"::", 2));
|
587 |
if ( filename.isin (L"::" ) ) return writeFromCat(filename.token(L"::", 1), filename.token(L"::", 2));
|
| 588 |
if ( (!m_bCreate) && (!m_fDatFile.exists ()) ) {
|
588 |
if ( (!m_bCreate) && (!m_fDatFile.exists ()) ) {
|
| 589 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() Cat File: %s, doesn't exist, quitting...", m_fCatFile.fullFilename().c_str());
|
589 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() Cat File: %s, doesn't exist, quitting...", m_fCatFile.fullFilename().c_str());
|
| 590 |
return false;
|
590 |
return false;
|
| 591 |
}
|
591 |
}
|
| 592 |
Utils::WString to = sTo;
|
592 |
Utils::WString to = sTo;
|
| 593 |
if ( !_sAddonDir.empty() && CCatFile::IsAddonDir(to) ) {
|
593 |
if ( !_sAddonDir.empty() && CCatFile::IsAddonDir(to) ) {
|
| 594 |
CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() changing destination to included addon fir, %s => %s", to, _sAddonDir + L"/" + to);
|
594 |
CLog::logf(CLog::Log_IO, 3, L"CCatFile::AppendFile() changing destination to included addon fir, %s => %s", to, _sAddonDir + L"/" + to);
|
| 595 |
to = _sAddonDir + L"\\" + to;
|
595 |
to = _sAddonDir + L"\\" + to;
|
| 596 |
}
|
596 |
}
|
| 597 |
|
597 |
|
| 598 |
// change the file extension and remove the file again
|
598 |
// change the file extension and remove the file again
|
| 599 |
if ( pck && checkExtensionPck(filename) ) {
|
599 |
if ( pck && checkExtensionPck(filename) ) {
|
| 600 |
CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() changing file extension for packed file, %s => %s", to.c_str(), PckChangeExtension(to).c_str());
|
600 |
CLog::logf(CLog::Log_IO, 3, L"CCatFile::AppendFile() changing file extension for packed file, %s => %s", to.c_str(), PckChangeExtension(to).c_str());
|
| 601 |
to = PckChangeExtension(to);
|
601 |
to = PckChangeExtension(to);
|
| 602 |
}
|
602 |
}
|
| 603 |
if ( sChangeTo ) *sChangeTo = to;
|
603 |
if ( sChangeTo ) *sChangeTo = to;
|
| 604 |
|
604 |
|
| 605 |
if ( !_lFiles->empty() ) {
|
605 |
if ( !_lFiles->empty() ) {
|
| 606 |
SInCatFile *checkf = findData(to);
|
606 |
SInCatFile *checkf = findData(to);
|
| 607 |
if ( checkf ) {
|
607 |
if ( checkf ) {
|
| 608 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() removing existing filechanging file extension for packed file, %s => %s", to.c_str(), PckChangeExtension(to).c_str());
|
608 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() removing existing filechanging file extension for packed file, %s => %s", to.c_str(), PckChangeExtension(to).c_str());
|
| 609 |
if ( !removeFile(checkf) ) {
|
609 |
if ( !removeFile(checkf) ) {
|
| 610 |
CLog::logf(CLog::Log_IO, 1, "CCatFile::AppendFile() unable to remove existing file, quitting...");
|
610 |
CLog::logf(CLog::Log_IO, 1, L"CCatFile::AppendFile() unable to remove existing file, quitting...");
|
| 611 |
return false;
|
611 |
return false;
|
| 612 |
}
|
612 |
}
|
| 613 |
}
|
613 |
}
|
| 614 |
}
|
614 |
}
|
| 615 |
|
615 |
|
| Line 620... |
Line 620... |
| 620 |
f->lOffset = this->GetEndOffset();
|
620 |
f->lOffset = this->GetEndOffset();
|
| 621 |
|
621 |
|
| 622 |
bool dofile = true;
|
622 |
bool dofile = true;
|
| 623 |
|
623 |
|
| 624 |
if ( _lFiles->empty() ) {
|
624 |
if ( _lFiles->empty() ) {
|
| 625 |
CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() no existing files found, wipeing the existing dat file");
|
625 |
CLog::logf(CLog::Log_IO, 3, L"CCatFile::AppendFile() no existing files found, wipeing the existing dat file");
|
| 626 |
m_fDatFile.WipeFile();
|
626 |
m_fDatFile.WipeFile();
|
| 627 |
}
|
627 |
}
|
| 628 |
|
628 |
|
| 629 |
CFileIO File(filename);
|
629 |
CFileIO File(filename);
|
| 630 |
if ( !File.startRead() ) {
|
630 |
if ( !File.startRead() ) {
|
| 631 |
CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() unable to open file, %s, for reading", filename.c_str());
|
631 |
CLog::logf(CLog::Log_IO, 3, L"CCatFile::AppendFile() unable to open file, %s, for reading", filename.c_str());
|
| 632 |
return false;
|
632 |
return false;
|
| 633 |
}
|
633 |
}
|
| 634 |
|
634 |
|
| 635 |
CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() reading file data, %s:%d", filename.c_str(), File.fileSize());
|
635 |
CLog::logf(CLog::Log_IO, 3, L"CCatFile::AppendFile() reading file data, %s:%d", filename.c_str(), File.fileSize());
|
| 636 |
unsigned char *data = File.readAll();
|
636 |
unsigned char *data = File.readAll();
|
| 637 |
File.close();
|
637 |
File.close();
|
| 638 |
|
638 |
|
| 639 |
// check if we need to pack the file
|
639 |
// check if we need to pack the file
|
| 640 |
int iFileType = this->_checkFiletype(data, 3);
|
640 |
int iFileType = this->_checkFiletype(data, 3);
|
| 641 |
CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() preparing to append file data, Type=%d", iFileType);
|
641 |
CLog::logf(CLog::Log_IO, 3, L"CCatFile::AppendFile() preparing to append file data, Type=%d", iFileType);
|
| 642 |
if ( iFileType == FILETYPE_PLAIN && CheckPackedExtension(to) ) {
|
642 |
if ( iFileType == FILETYPE_PLAIN && CheckPackedExtension(to) ) {
|
| 643 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() plain text file needs to packed");
|
643 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() plain text file needs to packed");
|
| 644 |
size_t newsize = 0;
|
644 |
size_t newsize = 0;
|
| 645 |
unsigned char *newdata = PCKData(data, File.fileSize(), &newsize, bXor);
|
645 |
unsigned char *newdata = PCKData(data, File.fileSize(), &newsize, bXor);
|
| 646 |
CLog::logf(CLog::Log_IO, 1, "CCatFile::AppendFile() file has been packed, %d => %d", File.fileSize(), newsize);
|
646 |
CLog::logf(CLog::Log_IO, 1, L"CCatFile::AppendFile() file has been packed, %d => %d", File.fileSize(), newsize);
|
| 647 |
|
647 |
|
| 648 |
f->lSize = newsize;
|
648 |
f->lSize = newsize;
|
| 649 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() Decrypting data");
|
649 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() Decrypting data");
|
| 650 |
this->DecryptDAT(newdata, f->lSize);
|
650 |
this->DecryptDAT(newdata, f->lSize);
|
| 651 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() appending data to Dat file, Offset:%d", f->lOffset);
|
651 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() appending data to Dat file, Offset:%d", f->lOffset);
|
| 652 |
append = m_fDatFile.AppendDataToPos ( (const char *)newdata, newsize, f->lOffset );
|
652 |
append = m_fDatFile.AppendDataToPos ( (const char *)newdata, newsize, f->lOffset );
|
| 653 |
|
653 |
|
| 654 |
delete [] newdata;
|
654 |
delete [] newdata;
|
| 655 |
}
|
655 |
}
|
| 656 |
else {
|
656 |
else {
|
| 657 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() Decrypting data");
|
657 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() Decrypting data");
|
| 658 |
this->DecryptDAT(data, File.fileSize());
|
658 |
this->DecryptDAT(data, File.fileSize());
|
| 659 |
f->lSize = File.fileSize();
|
659 |
f->lSize = File.fileSize();
|
| 660 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() appending data to Dat file, Offset:%d", f->lOffset);
|
660 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() appending data to Dat file, Offset:%d", f->lOffset);
|
| 661 |
append = m_fDatFile.AppendDataToPos ( (const char *)data, f->lSize, f->lOffset );
|
661 |
append = m_fDatFile.AppendDataToPos ( (const char *)data, f->lSize, f->lOffset );
|
| 662 |
}
|
662 |
}
|
| 663 |
|
663 |
|
| 664 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() cleaning up memory");
|
664 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() cleaning up memory");
|
| 665 |
delete [] data;
|
665 |
delete [] data;
|
| 666 |
|
666 |
|
| 667 |
m_fDatFile.close();
|
667 |
m_fDatFile.close();
|
| 668 |
|
668 |
|
| 669 |
if ( append ) {
|
669 |
if ( append ) {
|
| 670 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() append complete, adding file into cat list");
|
670 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() append complete, adding file into cat list");
|
| 671 |
m_bCreate = false;
|
671 |
m_bCreate = false;
|
| 672 |
f->sFile = to;
|
672 |
f->sFile = to;
|
| 673 |
_lFiles->push_back(f);
|
673 |
_lFiles->push_back(f);
|
| 674 |
CLog::logf(CLog::Log_IO, 3, "CCatFile::AppendFile() writing the new cat file");
|
674 |
CLog::logf(CLog::Log_IO, 3, L"CCatFile::AppendFile() writing the new cat file");
|
| 675 |
m_bCatChanged = true;
|
675 |
m_bCatChanged = true;
|
| 676 |
}
|
676 |
}
|
| 677 |
else {
|
677 |
else {
|
| 678 |
CLog::logf(CLog::Log_IO, 2, "CCatFile::AppendFile() appending failed, cleaning up file data");
|
678 |
CLog::logf(CLog::Log_IO, 2, L"CCatFile::AppendFile() appending failed, cleaning up file data");
|
| 679 |
delete f;
|
679 |
delete f;
|
| 680 |
}
|
680 |
}
|
| 681 |
|
681 |
|
| 682 |
CLog::logf(CLog::Log_IO, 4, "CCatFile::AppendFile() function complete");
|
682 |
CLog::logf(CLog::Log_IO, 4, L"CCatFile::AppendFile() function complete");
|
| 683 |
|
683 |
|
| 684 |
return append;
|
684 |
return append;
|
| 685 |
}
|
685 |
}
|
| 686 |
|
686 |
|
| 687 |
bool CCatFile::addData(const Utils::WString &catfile, unsigned char *data, size_t size, const Utils::WString &to, bool pck, bool create)
|
687 |
bool CCatFile::addData(const Utils::WString &catfile, unsigned char *data, size_t size, const Utils::WString &to, bool pck, bool create)
|