void CFileDetailDialogInfo::RefreshData() { CString str; if (m_paFiles->GetSize() == 1) { CPartFile* file = STATIC_DOWNCAST(CPartFile, (*m_paFiles)[0]); // if file is completed, we output the 'file path' and not the 'part.met file path' if (file->GetStatus(true) == PS_COMPLETE) GetDlgItem(IDC_FD_X2)->SetWindowText(GetResString(IDS_DL_FILENAME)); SetDlgItemText(IDC_FNAME, file->GetFileName()); SetDlgItemText(IDC_METFILE, file->GetFullName()); SetDlgItemText(IDC_FHASH, md4str(file->GetFileHash())); if (file->GetTransferringSrcCount() > 0) str.Format(GetResString(IDS_PARTINFOS2), file->GetTransferringSrcCount()); else str = file->getPartfileStatus(); SetDlgItemText(IDC_PFSTATUS, str); str.Format(_T("%u; %s: %u (%.1f%%)"), file->GetPartCount(), GetResString(IDS_AVAILABLE) , file->GetAvailablePartCount(), (float)((file->GetAvailablePartCount()*100)/file->GetPartCount())); SetDlgItemText(IDC_PARTCOUNT, str); // date created if (file->GetCrFileDate() != 0) { str.Format(_T("%s ") + GetResString(IDS_TIMEBEFORE), file->GetCrCFileDate().Format(thePrefs.GetDateTimeFormat()), CastSecondsToLngHM(time(NULL) - file->GetCrFileDate())); } else str = GetResString(IDS_UNKNOWN); SetDlgItemText(IDC_FILECREATED, str); // active download time time_t nDlActiveTime = file->GetDlActiveTime(); //vs2005 if (nDlActiveTime) str = CastSecondsToLngHM(nDlActiveTime); else str = GetResString(IDS_UNKNOWN); SetDlgItemText(IDC_DL_ACTIVE_TIME, str); // last seen complete struct tm tmTemp; struct tm* ptimLastSeenComplete = file->lastseencomplete.GetLocalTm(&tmTemp); if (file->lastseencomplete == NULL || ptimLastSeenComplete == NULL) str.Format(GetResString(IDS_NEVER)); else { str.Format(_T("%s ") + GetResString(IDS_TIMEBEFORE), file->lastseencomplete.Format(thePrefs.GetDateTimeFormat()), CastSecondsToLngHM(time(NULL) - safe_mktime(ptimLastSeenComplete))); } SetDlgItemText(IDC_LASTSEENCOMPL, str); // last receive if (file->GetFileDate() != 0 && file->GetRealFileSize() > (uint64)0) { // 'Last Modified' sometimes is up to 2 seconds greater than the current time ??? // If it's related to the FAT32 seconds time resolution the max. failure should still be only 1 sec. // Happens at least on FAT32 with very high download speed. uint32 tLastModified = file->GetFileDate(); time_t tNow = time(NULL); //vs2005 uint32 tAgo; if (tNow >= tLastModified) tAgo = tNow - tLastModified; else{ TRACE("tNow = %s\n", CTime(tNow).Format("%X")); TRACE("tLMd = %s, +%u\n", CTime(tLastModified).Format("%X"), tLastModified - tNow); TRACE("\n"); tAgo = 0; } str.Format(_T("%s ") + GetResString(IDS_TIMEBEFORE), file->GetCFileDate().Format(thePrefs.GetDateTimeFormat()), CastSecondsToLngHM(tAgo)); } else str = GetResString(IDS_NEVER); SetDlgItemText(IDC_LASTRECEIVED, str); // AICH Hash switch (file->GetAICHRecoveryHashSet()->GetStatus()) { case AICH_TRUSTED: case AICH_VERIFIED: case AICH_HASHSETCOMPLETE: if (file->GetAICHRecoveryHashSet()->HasValidMasterHash()) { SetDlgItemText(IDC_FD_AICHHASH, file->GetAICHRecoveryHashSet()->GetMasterHash().GetString()); break; } default: SetDlgItemText(IDC_FD_AICHHASH, GetResString(IDS_UNKNOWN)); } // file type CString ext; bool showwarning = false; int pos = file->GetFileName().ReverseFind(_T('.')); if (file->GetFileName().ReverseFind(_T('\\')) < pos) { ext = file->GetFileName().Mid(pos + 1); ext.MakeUpper(); } EFileType bycontent = GetFileTypeEx((CKnownFile *)file, false, true); if (bycontent != FILETYPE_UNKNOWN) { str = GetFileTypeName(bycontent) + _T(" ("); str.Append(GetResString(IDS_VERIFIED) + _T(')')); int extLevel = IsExtensionTypeOf(bycontent, ext); if (extLevel == -1) { showwarning = true; str.Append(_T(" - ")); str.Append(GetResString(IDS_INVALIDFILEEXT) + _T(": ")); str.Append(ext); } else if (extLevel == 0) { str.Append(_T(" - ")); str.Append(GetResString(IDS_UNKNOWNFILEEXT) + _T(": ")); str.Append(ext); } } else { // not verified if (pos != -1) { str =file->GetFileName().Mid(pos + 1); str.MakeUpper(); str.Append(_T(" (") ); str.Append( GetResString(IDS_UNVERIFIED) + _T(')')); } else str = GetResString(IDS_UNKNOWN); } m_bShowFileTypeWarning = showwarning; SetDlgItemText(IDC_FD_X11,str); } else { SetDlgItemText(IDC_FNAME, sm_pszNotAvail); SetDlgItemText(IDC_METFILE, sm_pszNotAvail); SetDlgItemText(IDC_FHASH, sm_pszNotAvail); SetDlgItemText(IDC_PFSTATUS, sm_pszNotAvail); SetDlgItemText(IDC_PARTCOUNT, sm_pszNotAvail); SetDlgItemText(IDC_FD_X11, sm_pszNotAvail); SetDlgItemText(IDC_FILECREATED, sm_pszNotAvail); SetDlgItemText(IDC_DL_ACTIVE_TIME, sm_pszNotAvail); SetDlgItemText(IDC_LASTSEENCOMPL, sm_pszNotAvail); SetDlgItemText(IDC_LASTRECEIVED, sm_pszNotAvail); SetDlgItemText(IDC_FD_AICHHASH, sm_pszNotAvail); } uint64 uFileSize = 0; uint64 uRealFileSize = 0; uint64 uTransferred = 0; uint64 uCorrupted = 0; uint32 uRecoveredParts = 0; uint64 uCompression = 0; uint64 uCompleted = 0; int iMD4HashsetAvailable = 0; int iAICHHashsetAvailable = 0; uint32 uDataRate = 0; UINT uSources = 0; UINT uValidSources = 0; UINT uNNPSources = 0; UINT uA4AFSources = 0; for (int i = 0; i < m_paFiles->GetSize(); i++) { CPartFile* file = STATIC_DOWNCAST(CPartFile, (*m_paFiles)[i]); uFileSize += (uint64)file->GetFileSize(); uRealFileSize += (uint64)file->GetRealFileSize(); uTransferred += (uint64)file->GetTransferred(); uCorrupted += file->GetCorruptionLoss(); uRecoveredParts += file->GetRecoveredPartsByICH(); uCompression += file->GetCompressionGain(); uDataRate += file->GetDatarate(); uCompleted += (uint64)file->GetCompletedSize(); iMD4HashsetAvailable += (file->GetFileIdentifier().HasExpectedMD4HashCount()) ? 1 : 0; iAICHHashsetAvailable += (file->GetFileIdentifier().HasExpectedAICHHashCount()) ? 1 : 0; if (file->IsPartFile()) { uSources += file->GetSourceCount(); uValidSources += file->GetValidSourcesCount(); uNNPSources += file->GetSrcStatisticsValue(DS_NONEEDEDPARTS); uA4AFSources += file->GetSrcA4AFCount(); } } str.Format(_T("%s (%s %s); %s %s"), CastItoXBytes(uFileSize, false, false), GetFormatedUInt64(uFileSize), GetResString(IDS_BYTES), GetResString(IDS_ONDISK), CastItoXBytes(uRealFileSize, false, false)); SetDlgItemText(IDC_FSIZE, str); if (m_paFiles->GetSize() == 1) { if (iAICHHashsetAvailable == 0 && iMD4HashsetAvailable == 0) SetDlgItemText(IDC_HASHSET, GetResString(IDS_NO)); else if (iAICHHashsetAvailable == 1 && iMD4HashsetAvailable == 1) SetDlgItemText(IDC_HASHSET, GetResString(IDS_YES) + _T(" (eD2K + AICH)")); else if (iAICHHashsetAvailable == 1) SetDlgItemText(IDC_HASHSET, GetResString(IDS_YES) + _T(" (AICH)")); else if (iMD4HashsetAvailable == 1) SetDlgItemText(IDC_HASHSET, GetResString(IDS_YES) + _T(" (eD2K)")); } else { if (iAICHHashsetAvailable == 0 && iMD4HashsetAvailable == 0) SetDlgItemText(IDC_HASHSET, GetResString(IDS_NO)); else if (iMD4HashsetAvailable == m_paFiles->GetSize() && iAICHHashsetAvailable == m_paFiles->GetSize()) SetDlgItemText(IDC_HASHSET, GetResString(IDS_YES) + + _T(" (eD2K + AICH)")); else SetDlgItemText(IDC_HASHSET, _T("")); } str.Format(GetResString(IDS_SOURCESINFO), uSources, uValidSources, uNNPSources, uA4AFSources); SetDlgItemText(IDC_SOURCECOUNT, str); SetDlgItemText(IDC_DATARATE, CastItoXBytes(uDataRate, false, true)); SetDlgItemText(IDC_TRANSFERRED, CastItoXBytes(uTransferred, false, false)); str.Format(_T("%s (%.1f%%)"), CastItoXBytes(uCompleted, false, false), uFileSize!=0 ? (uCompleted * 100.0 / uFileSize) : 0.0); SetDlgItemText(IDC_COMPLSIZE, str); str.Format(_T("%s (%.1f%%)"), CastItoXBytes(uCorrupted, false, false), uTransferred!=0 ? (uCorrupted * 100.0 / uTransferred) : 0.0); SetDlgItemText(IDC_CORRUPTED, str); str.Format(_T("%s (%.1f%%)"), CastItoXBytes(uFileSize - uCompleted, false, false), uFileSize!=0 ? ((uFileSize - uCompleted) * 100.0 / uFileSize) : 0.0); SetDlgItemText(IDC_REMAINING, str); str.Format(_T("%u %s"), uRecoveredParts, GetResString(IDS_FD_PARTS)); SetDlgItemText(IDC_RECOVERED, str); str.Format(_T("%s (%.1f%%)"), CastItoXBytes(uCompression, false, false), uTransferred!=0 ? (uCompression * 100.0 / uTransferred) : 0.0); SetDlgItemText(IDC_COMPRESSION, str); }
bool CDownloadQueue::SendNextUDPPacket() { if ( m_filelist.empty() || !theApp->serverconnect->IsUDPSocketAvailable() || !theApp->IsConnectedED2K()) { return false; } // Start monitoring the server and the files list if ( !m_queueServers.IsActive() ) { AddObserver( &m_queueFiles ); theApp->serverlist->AddObserver( &m_queueServers ); } bool packetSent = false; while ( !packetSent ) { // Get max files ids per packet for current server int filesAllowed = GetMaxFilesPerUDPServerPacket(); if (filesAllowed < 1 || !m_udpserver || IsConnectedServer(m_udpserver)) { // Select the next server to ask, must not be the connected server do { m_udpserver = m_queueServers.GetNext(); } while (IsConnectedServer(m_udpserver)); m_cRequestsSentToServer = 0; filesAllowed = GetMaxFilesPerUDPServerPacket(); } // Check if we have asked all servers, in which case we are done if (m_udpserver == NULL) { DoStopUDPRequests(); return false; } // Memoryfile containing the hash of every file to request // 28bytes allocation because 16b + 4b + 8b is the worse case scenario. CMemFile hashlist( 28 ); CPartFile* file = m_queueFiles.GetNext(); while ( file && filesAllowed ) { uint8 status = file->GetStatus(); if ( ( status == PS_READY || status == PS_EMPTY ) && file->GetSourceCount() < thePrefs::GetMaxSourcePerFileUDP() ) { if (file->IsLargeFile() && !m_udpserver->SupportsLargeFilesUDP()) { AddDebugLogLineN(logDownloadQueue, wxT("UDP Request for sources on a large file ignored: server doesn't support it")); } else { ++m_cRequestsSentToServer; hashlist.WriteHash( file->GetFileHash() ); // See the notes on TCP packet if ( m_udpserver->GetUDPFlags() & SRV_UDPFLG_EXT_GETSOURCES2 ) { if (file->IsLargeFile()) { wxASSERT(m_udpserver->SupportsLargeFilesUDP()); hashlist.WriteUInt32( 0 ); hashlist.WriteUInt64( file->GetFileSize() ); } else { hashlist.WriteUInt32( file->GetFileSize() ); } } --filesAllowed; } } // Avoid skipping a file if we can't send any more currently if ( filesAllowed ) { file = m_queueFiles.GetNext(); } } // See if we have anything to send if ( hashlist.GetLength() ) { packetSent = SendGlobGetSourcesUDPPacket(hashlist); } // Check if we've covered every file if ( file == NULL ) { // Reset the list of asked files so that the loop will start over m_queueFiles.Reset(); // Unset the server so that the next server will be used m_udpserver = NULL; } } return true; }
ConvStatus CPartFileConvert::performConvertToeMule(const CPath& fileName) { wxString filepartindex; CPath folder = fileName.GetPath(); CPath partfile = fileName.GetFullName(); CPath newfilename; CDirIterator finder(folder); Notify_ConvertUpdateProgressFull(0, _("Reading temp folder"), s_pfconverting->folder.GetPrintable()); filepartindex = partfile.RemoveAllExt().GetRaw(); Notify_ConvertUpdateProgress(4, _("Retrieving basic information from download info file")); CPartFile* file = new CPartFile(); s_pfconverting->partmettype = file->LoadPartFile(folder, partfile, false, true); switch (s_pfconverting->partmettype) { case PMT_UNKNOWN: case PMT_BADFORMAT: delete file; return CONV_BADFORMAT; } CPath oldfile = folder.JoinPaths(partfile.RemoveExt()); { wxMutexLocker lock(s_mutex); s_pfconverting->size = file->GetFileSize(); s_pfconverting->filename = file->GetFileName(); s_pfconverting->filehash = file->GetFileHash().Encode(); } Notify_ConvertUpdateJobInfo(s_pfconverting); if (theApp->downloadqueue->GetFileByID(file->GetFileHash())) { delete file; return CONV_ALREADYEXISTS; } if (s_pfconverting->partmettype == PMT_SPLITTED) { unsigned fileindex; char *ba = new char [PARTSIZE]; try { CFile inputfile; // just count unsigned maxindex = 0; unsigned partfilecount = 0; CPath filePath = finder.GetFirstFile(CDirIterator::File, filepartindex + wxT(".*.part")); while (filePath.IsOk()) { long l; ++partfilecount; filePath.GetFullName().RemoveExt().GetExt().ToLong(&l); fileindex = (unsigned)l; filePath = finder.GetNextFile(); if (fileindex > maxindex) maxindex = fileindex; } float stepperpart; { wxMutexLocker lock(s_mutex); if (partfilecount > 0) { stepperpart = (80.0f / partfilecount); if (maxindex * PARTSIZE <= s_pfconverting->size) { s_pfconverting->spaceneeded = maxindex * PARTSIZE; } else { s_pfconverting->spaceneeded = s_pfconverting->size; } } else { stepperpart = 80.0f; s_pfconverting->spaceneeded = 0; } } Notify_ConvertUpdateJobInfo(s_pfconverting); sint64 freespace = CPath::GetFreeSpaceAt(thePrefs::GetTempDir()); if (freespace != wxInvalidOffset) { if (static_cast<uint64>(freespace) < maxindex * PARTSIZE) { delete file; delete [] ba; return CONV_OUTOFDISKSPACE; } } // create new partmetfile, and remember the new name file->CreatePartFile(); newfilename = file->GetFullName(); Notify_ConvertUpdateProgress(8, _("Creating destination file")); file->m_hpartfile.SetLength( s_pfconverting->spaceneeded ); unsigned curindex = 0; CPath filename = finder.GetFirstFile(CDirIterator::File, filepartindex + wxT(".*.part")); while (filename.IsOk()) { // stats ++curindex; Notify_ConvertUpdateProgress(10 + (curindex * stepperpart), CFormat(_("Loading data from old download file (%u of %u)")) % curindex % partfilecount); long l; filename.GetFullName().RemoveExt().GetExt().ToLong(&l); fileindex = (unsigned)l; if (fileindex == 0) { filename = finder.GetNextFile(); continue; } uint32 chunkstart = (fileindex - 1) * PARTSIZE; // open, read data of the part-part-file into buffer, close file inputfile.Open(filename, CFile::read); uint64 toReadWrite = std::min<uint64>(PARTSIZE, inputfile.GetLength()); inputfile.Read(ba, toReadWrite); inputfile.Close(); Notify_ConvertUpdateProgress(10 + (curindex * stepperpart), CFormat(_("Saving data block into new single download file (%u of %u)")) % curindex % partfilecount); // write the buffered data file->m_hpartfile.WriteAt(ba, chunkstart, toReadWrite); filename = finder.GetNextFile(); } delete[] ba; } catch (const CSafeIOException& e) { AddDebugLogLineC(logPfConvert, wxT("IO error while converting partfiles: ") + e.what()); delete[] ba; file->Delete(); return CONV_IOERROR; } file->m_hpartfile.Close(); } // import an external common format partdownload else //if (pfconverting->partmettype==PMT_DEFAULTOLD || pfconverting->partmettype==PMT_NEWOLD || Shareaza ) { if (!s_pfconverting->removeSource) { wxMutexLocker lock(s_mutex); s_pfconverting->spaceneeded = oldfile.GetFileSize(); } Notify_ConvertUpdateJobInfo(s_pfconverting); sint64 freespace = CPath::GetFreeSpaceAt(thePrefs::GetTempDir()); if (freespace == wxInvalidOffset) { delete file; return CONV_IOERROR; } else if (freespace < s_pfconverting->spaceneeded) { delete file; return CONV_OUTOFDISKSPACE; } file->CreatePartFile(); newfilename = file->GetFullName(); file->m_hpartfile.Close(); bool ret = false; Notify_ConvertUpdateProgress(92, _("Copy")); CPath::RemoveFile(newfilename.RemoveExt()); if (!oldfile.FileExists()) { // data file does not exist. well, then create a 0 byte big one CFile datafile; ret = datafile.Create(newfilename.RemoveExt()); } else if (s_pfconverting->removeSource) { ret = CPath::RenameFile(oldfile, newfilename.RemoveExt()); } else { ret = CPath::CloneFile(oldfile, newfilename.RemoveExt(), false); } if (!ret) { file->Delete(); //delete file; return CONV_FAILED; } } Notify_ConvertUpdateProgress(94, _("Retrieving source downloadfile information")); CPath::RemoveFile(newfilename); if (s_pfconverting->removeSource) { CPath::RenameFile(folder.JoinPaths(partfile), newfilename); } else { CPath::CloneFile(folder.JoinPaths(partfile), newfilename, false); } file->m_hashlist.clear(); if (!file->LoadPartFile(thePrefs::GetTempDir(), file->GetPartMetFileName(), false)) { //delete file; file->Delete(); return CONV_BADFORMAT; } if (s_pfconverting->partmettype == PMT_NEWOLD || s_pfconverting->partmettype == PMT_SPLITTED) { file->SetCompletedSize(file->transferred); file->m_iGainDueToCompression = 0; file->m_iLostDueToCorruption = 0; } Notify_ConvertUpdateProgress(100, _("Adding download and saving new partfile")); theApp->downloadqueue->AddDownload(file, thePrefs::AddNewFilesPaused(), 0); file->SavePartFile(); if (file->GetStatus(true) == PS_READY) { theApp->sharedfiles->SafeAddKFile(file); // part files are always shared files } if (s_pfconverting->removeSource) { CPath oldFile = finder.GetFirstFile(CDirIterator::File, filepartindex + wxT(".*")); while (oldFile.IsOk()) { CPath::RemoveFile(folder.JoinPaths(oldFile)); oldFile = finder.GetNextFile(); } if (s_pfconverting->partmettype == PMT_SPLITTED) { CPath::RemoveDir(folder); } } return CONV_OK; }
void CDownloadQueue::LoadMetFiles(const CPath& path) { AddLogLineNS(CFormat(_("Loading temp files from %s.")) % path.GetPrintable()); std::vector<CPath> files; // Locate part-files to be loaded CDirIterator TempDir(path); CPath fileName = TempDir.GetFirstFile(CDirIterator::File, wxT("*.part.met")); while (fileName.IsOk()) { files.push_back(path.JoinPaths(fileName)); fileName = TempDir.GetNextFile(); } // Loading in order makes it easier to figure which // file is broken in case of crashes, or the like. std::sort(files.begin(), files.end()); // Load part-files for ( size_t i = 0; i < files.size(); i++ ) { AddLogLineNS(CFormat(_("Loading PartFile %u of %u")) % (i + 1) % files.size()); fileName = files[i].GetFullName(); CPartFile *toadd = new CPartFile(); bool result = toadd->LoadPartFile(path, fileName) != 0; if (!result) { // Try from backup result = toadd->LoadPartFile(path, fileName, true) != 0; } if (result && !IsFileExisting(toadd->GetFileHash())) { { wxMutexLocker lock(m_mutex); m_filelist.push_back(toadd); } NotifyObservers(EventType(EventType::INSERTED, toadd)); Notify_DownloadCtrlAddFile(toadd); } else { wxString msg; if (result) { msg << CFormat(wxT("WARNING: Duplicate partfile with hash '%s' found, skipping: %s")) % toadd->GetFileHash().Encode() % fileName; } else { // If result is false, then reading of both the primary and the backup .met failed AddLogLineN(_("ERROR: Failed to load backup file. Search http://forum.amule.org for .part.met recovery solutions.")); msg << CFormat(wxT("ERROR: Failed to load PartFile '%s'")) % fileName; } AddLogLineCS(msg); // Delete the partfile object in the end. delete toadd; } } AddLogLineNS(_("All PartFiles Loaded.")); if ( GetFileCount() == 0 ) { AddLogLineN(_("No part files found")); } else { AddLogLineN(CFormat(wxPLURAL("Found %u part file", "Found %u part files", GetFileCount())) % GetFileCount()); DoSortByPriority(); CheckDiskspace( path ); Notify_ShowUpdateCatTabTitles(); } }
BOOL CUpdateInfo::ClearUpdateHistory(const uchar * hashkey)//清除历史升级任务 { for (int i = 0; i < CGlobalVariable::sharedfiles->GetCount(); i++) { CKnownFile* file = CGlobalVariable::sharedfiles->GetFileByIndex(i); CPartFile* pPartFile; try { //共享列表中是否有 if(file) { if ( IsUpdateTask( file->GetFilePath() ) && file->GetFileHash() != hashkey ) { if(file->IsPartFile()) { //共享列表有,但未下载完,移除 pPartFile = DYNAMIC_DOWNCAST(CPartFile,file); if( pPartFile ) { pPartFile->DeleteFile(); } } else { //共享列表有,已经下载完成未安装,移除 DeleteFile(file->GetFilePath()); theApp.emuledlg->sharedfileswnd->sharedfilesctrl.RemoveFile(file); CGlobalVariable::sharedfiles->RemoveFile(file); CGlobalVariable::filemgr.RemoveFileItem(file); } } else continue; } } catch (CException* e) { e->Delete(); //return FALSE; } } for (int i = 0; i < CGlobalVariable::downloadqueue->GetFileCount(); i++) { CPartFile* pFile = CGlobalVariable::downloadqueue->GetFileByIndex(i); try { if (pFile) { if ( IsUpdateTask( pFile->GetFilePath() ) && pFile->GetFileHash() != hashkey ) { //共享列表没有,但未下载完,移除 pFile->DeleteFile(); } } } catch (CException* e) { e->Delete(); //return FALSE; } } return TRUE; }