gzip ISO: fix broken handling of file names with non-english chars

this uses <wxString>.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.
This commit is contained in:
Avi Halachmi (:avih) 2015-01-09 12:07:03 +02:00
parent a3cd81c1bb
commit 7b7a977d11
1 changed files with 24 additions and 23 deletions

View File

@ -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;
}