// multi-part ISO support is provided for FAT32 compatibility; so that large 4GB+ isos // can be split into multiple smaller files. // // Returns TRUE if multiple parts for the ISO are found. Returns FALSE if only one // part is found. void isoFile::FindParts() { wxFileName nameparts( m_filename ); wxString curext( nameparts.GetExt() ); wxChar prefixch = wxTolower(curext[0]); // Multi-part rules! // * The first part can either be the proper extension (ISO, MDF, etc) or the numerical // extension (I00, I01, M00, M01, etc). // * Numerical extensions MUST begin at 00 (I00 etc), regardless of if the first part // is proper or numerical. uint i = 0; if ((curext.Length() == 3) && (curext[1] == L'0') && (curext[2] == L'0')) { // First file is an OO, so skip 0 in the loop below: i = 1; } FastFormatUnicode extbuf; extbuf.Write( L"%c%02u", prefixch, i ); nameparts.SetExt( extbuf ); if (!pxFileExists_WithExt(nameparts, extbuf)) return; DevCon.WriteLn( Color_Blue, "isoFile: multi-part %s detected...", curext.Upper().c_str() ); ConsoleIndentScope indent; for (; i < MaxSplits; ++i) { extbuf.Clear(); extbuf.Write( L"%c%02u", prefixch, i ); if (!pxFileExists_WithExt(nameparts, extbuf)) break; _IsoPart& thispart( m_parts[m_numparts] ); thispart.handle = new wxFileInputStream( nameparts.GetFullPath() ); pxStream_OpenCheck( *thispart.handle, nameparts.GetFullPath(), L"reading" ); m_blocks += thispart.CalculateBlocks( m_blocks, m_blocksize ); DevCon.WriteLn( Color_Blue, L"\tblocks %u - %u in: %s", thispart.slsn, thispart.elsn, nameparts.GetFullPath().c_str() ); ++m_numparts; } //Console.WriteLn( Color_Blue, "isoFile: multi-part ISO loaded (%u parts found)", m_numparts ); }
void MultipartFileReader::FindParts() { wxFileName nameparts( m_filename ); wxString curext( nameparts.GetExt() ); wxChar prefixch = wxTolower(curext[0]); // Multi-part rules! // * The first part can either be the proper extension (ISO, MDF, etc) or the numerical // extension (I00, I01, M00, M01, etc). // * Numerical extensions MUST begin at 00 (I00 etc), regardless of if the first part // is proper or numerical. uint i = 0; if ((curext.Length() == 3) && (curext[1] == L'0') && (curext[2] == L'0')) { // First file is an OO, so skip 0 in the loop below: i = 1; } FastFormatUnicode extbuf; extbuf.Write( L"%c%02u", prefixch, i ); nameparts.SetExt( extbuf ); if (!pxFileExists_WithExt(nameparts, extbuf)) return; DevCon.WriteLn( Color_Blue, "isoFile: multi-part %s detected...", WX_STR(curext.Upper()) ); ConsoleIndentScope indent; int bsize = m_parts[0].reader->GetBlockSize(); int blocks = m_parts[0].end; m_numparts = 1; for (; i < MaxParts; ++i) { extbuf.Clear(); extbuf.Write( L"%c%02u", prefixch, i ); nameparts.SetExt( extbuf ); if (!pxFileExists_WithExt(nameparts, extbuf)) break; Part* thispart = m_parts + m_numparts; AsyncFileReader* thisreader = thispart->reader = new FlatFileReader(); wxString name = nameparts.GetFullPath(); thisreader->Open(name); thisreader->SetBlockSize(bsize); thispart->start = blocks; uint bcount = thisreader->GetBlockCount(); blocks += bcount; thispart->end = blocks; DevCon.WriteLn( Color_Blue, L"\tblocks %u - %u in: %s", thispart->start, thispart->end, WX_STR(nameparts.GetFullPath()) ); ++m_numparts; } //Console.WriteLn( Color_Blue, "isoFile: multi-part ISO loaded (%u parts found)", m_numparts ); }