QString CTorrent::GetSubFilePath(int Index) { const QList<CTorrentInfo::SFileInfo>& Files = m_TorrentInfo->GetFiles(); if(Files.size() <= Index) return ""; CFile * pFile = GetFile(); QString Dir = pFile->GetFileDir(); Dir += pFile->GetFileName() + "/"; if(!Files[Index].FilePath.isEmpty()) Dir += Files[Index].FilePath.join("/") + "/"; return Dir; }
void CTorrent::SetupPartMap() { ASSERT(!m_TorrentInfo->IsEmpty()); CFile* pFile = GetFile(); // Single File if(!m_TorrentInfo->IsMultiFile()) { if(!pFile->GetPartMap()) pFile->SetPartMap(CPartMapPtr(new CSynced<CPartMap>(m_TorrentInfo->GetTotalLength()))); return; } // Multi File: CJoinedPartMap* pParts = qobject_cast<CJoinedPartMap*>(pFile->GetPartMap()); if(pParts) { ASSERT(!pParts->GetLinks().isEmpty()); return; // is already set up } pParts = new CJoinedPartMap(pFile->GetFileSize()); pFile->GetInspector()->SetIndexSource(HashTorrent); CFileList* pList = pFile->GetList(); uint64 Offset = 0; foreach(const CTorrentInfo::SFileInfo& SubFile, m_TorrentInfo->GetFiles()) { if(SubFile.Length == 0) { LogLine(LOG_DEBUG | LOG_WARNING, tr("Ignoring empty file '%1' in torrent '%2'").arg(SubFile.FileName).arg(pFile->GetFileName())); continue; } CFile* pSubFile = new CFile(); if(pFile->GetProperty("Temp").toBool()) pSubFile->SetProperty("Temp", true); QString Dir = pFile->GetFileDir(); Dir += pFile->GetFileName() + "/"; if(!SubFile.FilePath.isEmpty()) Dir += SubFile.FilePath.join("/") + "/"; pSubFile->SetFileDir(Dir); pSubFile->AddEmpty(HashTorrent, SubFile.FileName, SubFile.Length, pFile->IsPending()); // Note: SubFile->MasterHash is set in MasterFile->Resume uint64 uBegin = Offset; uint64 uEnd = Offset + SubFile.Length; Offset += SubFile.Length; CSharedPartMap* pSubParts = new CSharedPartMap(uEnd - uBegin); pSubFile->SetPartMap(CPartMapPtr(pSubParts)); pParts->SetupLink(uBegin, uEnd, pSubFile->GetFileID()); pSubParts->SetupLink(uBegin, uEnd, pFile->GetFileID()); pList->AddFile(pSubFile); if(!pSubFile->IsPending()) pSubFile->Resume(); if(pFile->IsPaused(true)) pSubFile->Pause(); else if(pFile->IsStarted()) pSubFile->Start(); } pFile->SetPartMap(CPartMapPtr(pParts)); }