Exemple #1
0
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;
}
Exemple #2
0
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();
}