From 7b7a977d110cf4ae1f2d45caaf156ee63756d5c1 Mon Sep 17 00:00:00 2001 From: "Avi Halachmi (:avih)" Date: Fri, 9 Jan 2015 12:07:03 +0200 Subject: [PATCH] gzip ISO: fix broken handling of file names with non-english chars this uses .mbc_str() instead of .toUTF8() for all file related stuff. also normalizes all Console outputs to use WX_STR(str). TODO: this was only tested on windows. if someone could test on linux (wx 2.8 and 3.0) that english-only and not english-only iso.gz file names work correctly (open the file, create the index, read the index on next boot and that all console prints are good), please post a comment. --- pcsx2/CDVD/CompressedFileReader.cpp | 47 +++++++++++++++-------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/pcsx2/CDVD/CompressedFileReader.cpp b/pcsx2/CDVD/CompressedFileReader.cpp index 92b4696105..e327749060 100644 --- a/pcsx2/CDVD/CompressedFileReader.cpp +++ b/pcsx2/CDVD/CompressedFileReader.cpp @@ -28,7 +28,7 @@ static s64 fsize(const wxString& filename) { if (!wxFileName::FileExists(filename)) return -1; - std::ifstream f(filename.ToUTF8(), std::ifstream::binary); + std::ifstream f(filename.mbc_str(), std::ifstream::binary); f.seekg(0, f.end); s64 size = f.tellg(); f.close(); @@ -46,15 +46,15 @@ static s64 fsize(const wxString& filename) { static Access* ReadIndexFromFile(const wxString& filename) { s64 size = fsize(filename); if (size <= 0) { - Console.Error("Error: Can't open index file: '%s'", (const char*)filename.To8BitData()); + Console.Error(L"Error: Can't open index file: '%s'", WX_STR(filename)); return 0; } - std::ifstream infile(filename.ToUTF8(), std::ifstream::binary); + std::ifstream infile(filename.mbc_str(), std::ifstream::binary); char fileId[GZIP_ID_LEN + 1] = { 0 }; infile.read(fileId, GZIP_ID_LEN); if (wxString::From8BitData(GZIP_ID) != wxString::From8BitData(fileId)) { - Console.Error("Error: Incompatible gzip index, please delete it manually: '%s'", (const char*)filename.To8BitData()); + Console.Error(L"Error: Incompatible gzip index, please delete it manually: '%s'", WX_STR(filename)); infile.close(); return 0; } @@ -64,7 +64,7 @@ static Access* ReadIndexFromFile(const wxString& filename) { s64 datasize = size - GZIP_ID_LEN - sizeof(Access); if (datasize != index->have * sizeof(Point)) { - Console.Error("Error: unexpected size of gzip index, please delete it manually: '%s'.", (const char*)filename.To8BitData()); + Console.Error(L"Error: unexpected size of gzip index, please delete it manually: '%s'.", WX_STR(filename)); infile.close(); free(index); return 0; @@ -79,11 +79,11 @@ static Access* ReadIndexFromFile(const wxString& filename) { static void WriteIndexToFile(Access* index, const wxString filename) { if (wxFileName::FileExists(filename)) { - Console.Warning("WARNING: Won't write index - file name exists (please delete it manually): '%s'", (const char*)filename.To8BitData()); + Console.Warning(L"WARNING: Won't write index - file name exists (please delete it manually): '%s'", WX_STR(filename)); return; } - std::ofstream outfile(filename.ToUTF8(), std::ofstream::binary); + std::ofstream outfile(filename.mbc_str(), std::ofstream::binary); outfile.write(GZIP_ID, GZIP_ID_LEN); Point* tmp = index->list; @@ -96,9 +96,9 @@ static void WriteIndexToFile(Access* index, const wxString filename) { // Verify if (fsize(filename) != (s64)GZIP_ID_LEN + sizeof(Access) + sizeof(Point) * index->have) { - Console.Warning("Warning: Can't write index file to disk: '%s'", (const char*)filename.To8BitData()); + Console.Warning(L"Warning: Can't write index file to disk: '%s'", WX_STR(filename)); } else { - Console.WriteLn(Color_Green, "OK: Gzip quick access index file saved to disk: '%s'", (const char*)filename.To8BitData()); + Console.WriteLn(Color_Green, L"OK: Gzip quick access index file saved to disk: '%s'", WX_STR(filename)); } } @@ -345,21 +345,22 @@ bool GzippedFileReader::OkIndex() { return false; // iso2indexname(...) will print errors if it can't apply the template if (wxFileName::FileExists(indexfile) && (m_pIndex = ReadIndexFromFile(indexfile))) { - Console.WriteLn(Color_Green, "OK: Gzip quick access index read from disk: '%s'", (const char*)indexfile.To8BitData()); + Console.WriteLn(Color_Green, L"OK: Gzip quick access index read from disk: '%s'", WX_STR(indexfile)); if (m_pIndex->span != SPAN_DEFAULT) { - Console.Warning("Note: This index has %1.1f MB intervals, while the current default for new indexes is %1.1f MB.", (float)m_pIndex->span / 1024 / 1024, (float)SPAN_DEFAULT / 1024 / 1024); - Console.Warning("It will work fine, but if you want to generate a new index with default intervals, delete this index file."); - Console.Warning("(smaller intervals mean bigger index file and quicker but more frequent decompressions)"); + Console.Warning(L"Note: This index has %1.1f MB intervals, while the current default for new indexes is %1.1f MB.", + (float)m_pIndex->span / 1024 / 1024, (float)SPAN_DEFAULT / 1024 / 1024); + Console.Warning(L"It will work fine, but if you want to generate a new index with default intervals, delete this index file."); + Console.Warning(L"(smaller intervals mean bigger index file and quicker but more frequent decompressions)"); } InitZstates(); return true; } // No valid index file. Generate an index - Console.Warning("This may take a while (but only once). Scanning compressed file to generate a quick access index..."); + Console.Warning(L"This may take a while (but only once). Scanning compressed file to generate a quick access index..."); Access *index; - FILE* infile = fopen(m_filename.ToUTF8(), "rb"); + FILE* infile = fopen(m_filename.mbc_str(), "rb"); int len = build_index(infile, SPAN_DEFAULT, &index); printf("\n"); // build_index prints progress without \n's fclose(infile); @@ -368,7 +369,7 @@ bool GzippedFileReader::OkIndex() { m_pIndex = index; WriteIndexToFile((Access*)m_pIndex, indexfile); } else { - Console.Error("ERROR (%d): index could not be generated for file '%s'", len, (const char*)m_filename.To8BitData()); + Console.Error(L"ERROR (%d): index could not be generated for file '%s'", len, WX_STR(m_filename)); InitZstates(); return false; } @@ -380,7 +381,7 @@ bool GzippedFileReader::OkIndex() { bool GzippedFileReader::Open(const wxString& fileName) { Close(); m_filename = fileName; - if (!(m_src = fopen(m_filename.ToUTF8(), "rb")) || !CanHandle(fileName) || !OkIndex()) { + if (!(m_src = fopen(m_filename.mbc_str(), "rb")) || !CanHandle(fileName) || !OkIndex()) { Close(); return false; }; @@ -408,7 +409,7 @@ int GzippedFileReader::ReadSync(void* pBuffer, uint sector, uint count) { int bytesToRead = count * m_blocksize; int res = _ReadSync(pBuffer, offset, bytesToRead); if (res < 0) - Console.Error("Error: iso-gzip read unsuccessful."); + Console.Error(L"Error: iso-gzip read unsuccessful."); return res; } @@ -495,11 +496,11 @@ int GzippedFileReader::_ReadSync(void* pBuffer, PX_off_t offset, uint bytesToRea int duration = NOW() - s; if (duration > 10) - Console.WriteLn(Color_Gray, "gunzip: chunk #%5d-%2d : %1.2f MB - %d ms", - (int)(offset / 4 / 1024 / 1024), - (int)(offset % (4 * 1024 * 1024) / READ_CHUNK_SIZE), - (float)size / 1024 / 1024, - duration); + Console.WriteLn(Color_Gray, L"gunzip: chunk #%5d-%2d : %1.2f MB - %d ms", + (int)(offset / 4 / 1024 / 1024), + (int)(offset % (4 * 1024 * 1024) / READ_CHUNK_SIZE), + (float)size / 1024 / 1024, + duration); return copied; }