bool CSourceSaver::Process(CPartFile* file, UINT maxSourcesToSave) // return false if sources not saved { if ((int)(::GetTickCount() - m_dwLastTimeSaved) > RESAVETIME) { TCHAR szslsfilepath[_MAX_PATH]; _tmakepath(szslsfilepath,NULL,(CString)file->GetTempPath()+_T("\\Source Lists"), file->GetPartMetFileName(),_T(".txtsrc")); //MORPH - Changed by SiRoB, SLS keep only for rare files, reduce Saved Source and life time //if (file->GetAvailableSrcCount() > 100 && file->GetDownPriority() < PR_HIGH) if (file->GetAvailableSrcCount() > 25) { if (PathFileExists(szslsfilepath)) _tremove(szslsfilepath); return false; } m_dwLastTimeSaved = ::GetTickCount() + (rand() * 30000 / RAND_MAX) - 15000; SourceList srcs; LoadSourcesFromFile(file, &srcs, szslsfilepath); SaveSources(file, &srcs, szslsfilepath, maxSourcesToSave); if ((int)(::GetTickCount() - m_dwLastTimeLoaded) > RELOADTIME) { m_dwLastTimeLoaded = ::GetTickCount() + (rand() * 30000 / RAND_MAX) - 15000; AddSourcesToDownload(file, &srcs); } while (!srcs.IsEmpty()) delete srcs.RemoveHead(); return true; } return false; }
void CSourceSaver::SaveSources(CPartFile* file, SourceList* prevsources, LPCTSTR slsfile, UINT maxSourcesToSave) { SourceList srcstosave; CSourceData* sourcedata; ASSERT(srcstosave.IsEmpty()); POSITION pos2,pos; CUpDownClient* cur_src; // Choose best sources for the file for(pos = file->srclist.GetHeadPosition();pos!=0;){ cur_src = file->srclist.GetNext(pos); if (cur_src->GetDownloadState() != DS_ONQUEUE && cur_src->GetDownloadState() != DS_DOWNLOADING && cur_src->GetDownloadState() != DS_NONEEDEDPARTS || cur_src->IsEd2kClient() == false) continue; if (srcstosave.IsEmpty()) { sourcedata = new CSourceData(cur_src, CalcExpiration(EXPIREIN)); srcstosave.AddHead(sourcedata); continue; } // Skip also Required Obfuscation, because we don't save the userhash (and we don't know if all settings are still valid on next restart) if (cur_src->RequiresCryptLayer() ||thePrefs.IsClientCryptLayerRequired()) continue; if ((UINT)srcstosave.GetCount() < maxSourcesToSave || (cur_src->GetAvailablePartCount() > srcstosave.GetTail()->partsavailable) || (cur_src->GetSourceExchange1Version() > srcstosave.GetTail()->nSrcExchangeVer)) { if ((UINT)srcstosave.GetCount() == maxSourcesToSave) delete srcstosave.RemoveTail(); ASSERT((UINT)srcstosave.GetCount() < maxSourcesToSave); bool bInserted = false; for (pos2 = srcstosave.GetTailPosition();pos2 != 0;srcstosave.GetPrev(pos2)){ CSourceData* cur_srctosave = srcstosave.GetAt(pos2); // khaos::kmod+ Source Exchange Version if (file->GetAvailableSrcCount() > (maxSourcesToSave*2) && cur_srctosave->nSrcExchangeVer > cur_src->GetSourceExchange1Version()) { bInserted = true; } else if (file->GetAvailableSrcCount() > (maxSourcesToSave*2) && cur_srctosave->nSrcExchangeVer == cur_src->GetSourceExchange1Version() && cur_srctosave->partsavailable > cur_src->GetAvailablePartCount()) { bInserted = true; } else if (file->GetAvailableSrcCount() <= (maxSourcesToSave*2) && cur_srctosave->partsavailable > cur_src->GetAvailablePartCount()) { bInserted = true; } const uint8* srcstatus = cur_src->GetPartStatus(); if (srcstatus){ if (cur_src->GetPartCount() == file->GetPartCount()){ // only save sources which have needed parts for (uint16 x = 0; x < file->GetPartCount(); x++){ //MORPH - Changed by SiRoB, ICS merged into partstatus /* if (srcstatus[x] && !file->IsPartShareable(x)){ */ if ((srcstatus[x]&SC_AVAILABLE) && !file->IsPartShareable(x)){ bInserted = true; break; } } } } if (bInserted) { sourcedata = new CSourceData(cur_src, CalcExpiration(EXPIREIN)); srcstosave.InsertAfter(pos2, sourcedata); break; } // khaos::kmod- } if (!bInserted) { sourcedata = new CSourceData(cur_src, CalcExpiration(EXPIREIN)); srcstosave.AddHead(sourcedata); } } } // Add previously saved sources if found sources does not reach the limit for (pos = prevsources->GetHeadPosition(); pos; prevsources->GetNext(pos)) { CSourceData* cur_sourcedata = prevsources->GetAt(pos); if ((UINT)srcstosave.GetCount() == maxSourcesToSave) break; ASSERT((UINT)srcstosave.GetCount() <= maxSourcesToSave); bool bFound = false; for (pos2 = srcstosave.GetHeadPosition(); pos2; srcstosave.GetNext(pos2)) { if (srcstosave.GetAt(pos2)->Compare(cur_sourcedata)) { bFound = true; break; } } if (!bFound) { srcstosave.AddTail(new CSourceData(cur_sourcedata)); } } //DEBUG_ONLY(AddLogLine(/*TBN_NONOTIFY, */false, "Saving %i sources for file %s", srcstosave.GetCount(), file->GetFileName())); CString strLine; CStdioFile f; if (!f.Open(slsfile, CFile::modeCreate | CFile::modeWrite | CFile::typeText)) return; f.WriteString(_T("#format: a.b.c.d:port,expirationdate(yymmddhhmm);\r\n")); f.WriteString(_T("#") + file->GetED2kLink() + _T("\r\n")); //MORPH - Added by IceCream, Storing ED2K link in Save Source files, To recover corrupted met by skynetman while (!srcstosave.IsEmpty()) { CSourceData* cur_src = srcstosave.RemoveHead(); uint32 dwID = cur_src->sourceID; uint16 wPort = cur_src->sourcePort; uint32 dwserverip = cur_src->serverip; uint16 wserverport = cur_src->serverport; strLine.Format(_T("%s:%i,%s,%i,%s:%i;\r\n"), ipstr(dwID), wPort, cur_src->expiration, cur_src->nSrcExchangeVer, ipstr(dwserverip), wserverport); delete cur_src; f.WriteString(strLine); } f.Close(); }