From: <man...@us...> - 2013-11-09 18:05:10
|
Revision: 3152 http://sourceforge.net/p/modplug/code/3152 Author: manxorist Date: 2013-11-09 18:05:00 +0000 (Sat, 09 Nov 2013) Log Message: ----------- [Ref] Rework CMappedFile to be based on CreateFileW instead of CFile so that unicode paths work. [Ref] Avoid using CFile for file i/o and replace it with mpt_fopen or mpt::ifstream. [Ref] Make CMappedFile take a mpt::PathString instead of const char*. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/MemoryMappedFile.cpp trunk/OpenMPT/mptrack/MemoryMappedFile.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/TuningDialog.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/Load_itp.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -1399,7 +1399,7 @@ BOOL bFirst, bOk; BeginWaitCursor(); - if ((!lpszFileName) || (!f.Open(lpszFileName))) + if ((!lpszFileName) || (!f.Open(mpt::PathString::FromLocale(lpszFileName)))) { EndWaitCursor(); return FALSE; Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -738,7 +738,7 @@ { CMappedFile f; BeginWaitCursor(); - if ((!lpszFileName) || (!f.Open(lpszFileName))) + if ((!lpszFileName) || (!f.Open(mpt::PathString::FromLocale(lpszFileName)))) { EndWaitCursor(); return false; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -1426,7 +1426,7 @@ { CMappedFile f; - if(f.Open(lpszFileName)) + if(f.Open(mpt::PathString::FromLocale(lpszFileName))) { FileReader file = f.GetFile(); if(file.IsValid()) Modified: trunk/OpenMPT/mptrack/MemoryMappedFile.cpp =================================================================== --- trunk/OpenMPT/mptrack/MemoryMappedFile.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/MemoryMappedFile.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -19,10 +19,23 @@ } -bool CMappedFile::Open(const char * lpszFileName) -//----------------------------------------------- +bool CMappedFile::Open(const mpt::PathString &filename) +//----------------------------------------------------- { - return m_File.Open(lpszFileName, CFile::modeRead | CFile::typeBinary | CFile::shareDenyWrite) != FALSE; + m_hFile = CreateFileW( + filename.AsNative().c_str(), + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + if(m_hFile == INVALID_HANDLE_VALUE) + { + m_hFile = nullptr; + return false; + } + return true; } @@ -30,14 +43,23 @@ //----------------------- { if(m_pData) Unlock(); - m_File.Close(); + if(m_hFile) + { + CloseHandle(m_hFile); + m_hFile = nullptr; + } } size_t CMappedFile::GetLength() //----------------------------- { - return mpt::saturate_cast<size_t>(m_File.GetLength()); + LARGE_INTEGER size; + if(GetFileSizeEx(m_hFile, &size) == FALSE) + { + return 0; + } + return mpt::saturate_cast<size_t>(size.QuadPart); } @@ -50,7 +72,7 @@ void *lpStream; HANDLE hmf = CreateFileMapping( - m_File.m_hFile, + m_hFile, NULL, PAGE_READONLY, 0, 0, @@ -76,7 +98,22 @@ // Fallback if memory-mapping fails for some weird reason if((lpStream = malloc(length)) == nullptr) return nullptr; - m_File.Read(lpStream, length); + memset(lpStream, 0, length); + size_t bytesToRead = length; + size_t bytesRead = 0; + while(bytesToRead > 0) + { + DWORD chunkToRead = mpt::saturate_cast<DWORD>(length); + DWORD chunkRead = 0; + if(ReadFile(m_hFile, (char*)lpStream + bytesRead, chunkToRead, &chunkRead, NULL) == FALSE) + { + // error + free(lpStream); + return nullptr; + } + bytesRead += chunkRead; + bytesToRead -= chunkRead; + } m_pData = lpStream; return lpStream; } @@ -106,4 +143,4 @@ free(m_pData); m_pData = nullptr; } -} \ No newline at end of file +} Modified: trunk/OpenMPT/mptrack/MemoryMappedFile.h =================================================================== --- trunk/OpenMPT/mptrack/MemoryMappedFile.h 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/MemoryMappedFile.h 2013-11-09 18:05:00 UTC (rev 3152) @@ -20,16 +20,16 @@ //=============== { protected: - CFile m_File; + HANDLE m_hFile; HANDLE m_hFMap; void *m_pData; public: - CMappedFile() : m_hFMap(nullptr), m_pData(nullptr) { } + CMappedFile() : m_hFile(nullptr), m_hFMap(nullptr), m_pData(nullptr) { } ~CMappedFile(); public: - bool Open(const char *lpszFileName); + bool Open(const mpt::PathString &filename); void Close(); size_t GetLength(); const void *Lock(); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -224,7 +224,7 @@ #else { CMappedFile f; - if (f.Open(lpszPathName)) + if (f.Open(mpt::PathString::FromCString(lpszPathName))) { FileReader file = f.GetFile(); if(file.IsValid()) @@ -341,7 +341,7 @@ CHAR szName[_MAX_FNAME], szExt[_MAX_EXT]; CMappedFile f; - if(f.Open(pszMidiMapName)) + if(f.Open(mpt::PathString::FromLocale(pszMidiMapName))) { FileReader file = f.GetFile(); if(file.IsValid()) Modified: trunk/OpenMPT/mptrack/TuningDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/TuningDialog.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/TuningDialog.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -1484,17 +1484,11 @@ CTuningDialog::EnSclImport CTuningDialog::ImportScl(LPCTSTR pszPath, LPCTSTR pszName) //----------------------------------------------------------------------------------- { - CFile file; - if (file.Open(pszPath, CFile::modeRead) == 0) + mpt::ifstream iStrm(pszPath, std::ios::in | std::ios::binary); + if(!iStrm) + { return enSclImportFailUnableToOpenFile; - - size_t nSize = static_cast<size_t>(file.GetLength()); - - std::vector<char> data(nSize + 1, 0); - nSize = file.Read(&data[0], nSize); - file.Close(); - - std::istringstream iStrm(std::string(&data[0], nSize)); + } return ImportScl(iStrm, pszName); } Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -267,7 +267,7 @@ CMappedFile f; SetCurrentDirectory(m_szInstrLibPath); - if (f.Open(pszSongName)) + if (f.Open(mpt::PathString::FromLocale(pszSongName))) { FileReader file = f.GetFile(); if (file.IsValid()) Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -1660,7 +1660,7 @@ CMappedFile f; const char *errorStr = nullptr; - if(f.Open(dlg.GetFirstFile().ToCString())) + if(f.Open(dlg.GetFirstFile())) { FileReader file = f.GetFile(); errorStr = VSTPresets::GetErrorMessage(VSTPresets::LoadFile(file, *this)); Modified: trunk/OpenMPT/mptrack/mod2midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/mod2midi.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/mptrack/mod2midi.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -371,9 +371,10 @@ CHAR s[256]; UINT nTickMultiplier, nClock, nOrder, nRow; UINT nSpeed; - CFile f; + FILE *f = nullptr; - if (!f.Open(m_szFileName, CFile::modeCreate | CFile::modeWrite)) + f = mpt_fopen(mpt::PathString::FromLocale(m_szFileName), "wb"); + if(!f) { return FALSE; } @@ -392,8 +393,8 @@ mthd.wTrks = static_cast<uint16>(Tracks.size()); // 1 track/channel mthd.wTrks = BigEndianW(mthd.wTrks); //Convert to big endian value. mthd.wDivision = BigEndianW(wPPQN); - if (m_bRmi) f.Write(&rmid, sizeof(rmid)); - f.Write(&mthd, sizeof(mthd)); + if (m_bRmi) fwrite(&rmid, 1, sizeof(rmid), f); + fwrite(&mthd, 1, sizeof(mthd), f); // Add Song Name on track 0 const std::string modTitle = m_pSndFile->GetTitle(); @@ -566,11 +567,11 @@ Tracks[iTrk].Write(tmp, 4); mtrk.id = 0x6B72544D; mtrk.len = BigEndian(Tracks[iTrk].nTrackSize); - f.Write(&mtrk, sizeof(mtrk)); + fwrite(&mtrk, 1, sizeof(mtrk), f); rmid.filelen += sizeof(mtrk) + Tracks[iTrk].nTrackSize; if (Tracks[iTrk].nTrackSize > 0) { - f.Write(Tracks[iTrk].pTrackData, Tracks[iTrk].nTrackSize); + fwrite(Tracks[iTrk].pTrackData, 1, Tracks[iTrk].nTrackSize, f); delete[] Tracks[iTrk].pTrackData; } } @@ -578,10 +579,10 @@ if (m_bRmi) { // Update header file size - f.SeekToBegin(); - f.Write(&rmid, sizeof(rmid)); + fseek(f, 0, SEEK_SET); + fwrite(&rmid, 1, sizeof(rmid), f); } - f.Close(); + fclose(f); return TRUE; } Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -1152,7 +1152,7 @@ lpMemFile = NULL; // Memory-Mapped file CMappedFile MapFile; - if (!MapFile.Open(filename.ToLocale().c_str())) return FALSE; + if (!MapFile.Open(filename)) return FALSE; dwMemLength = MapFile.GetLength(); if (dwMemLength >= 256) lpMemFile = (const BYTE *)MapFile.Lock(); if (!lpMemFile) Modified: trunk/OpenMPT/soundlib/Load_itp.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_itp.cpp 2013-11-09 15:35:10 UTC (rev 3151) +++ trunk/OpenMPT/soundlib/Load_itp.cpp 2013-11-09 18:05:00 UTC (rev 3152) @@ -223,7 +223,7 @@ CMappedFile f; for(INSTRUMENTINDEX ins = 0; ins < GetNumInstruments(); ins++) { - if(m_szInstrumentPath[ins].empty() || !f.Open(m_szInstrumentPath[ins].c_str())) continue; + if(m_szInstrumentPath[ins].empty() || !f.Open(mpt::PathString::FromLocale(m_szInstrumentPath[ins]))) continue; FileReader file = f.GetFile(); if(file.IsValid()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |