⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchmanager.cpp

📁 一个关于电驴的源码,大家有需要可以下载
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	m_critical.Lock();
	try
	{
		retVal = (m_searches.count(target) > 0);
	} 
	catch (...) 
	{
		CKademlia::debugLine("Exception in CSearchManager::alreadySearchingFor");
	}
	m_critical.Unlock();
	return retVal;
}

void CSearchManager::getWords(LPCSTR str, WordList *words)
{
	LPSTR s = (LPSTR)str;
	int len = 0;
	CString word;
	CString wordtemp;
	uint32 i;
	while (strlen(s) > 0)
	{
		len = (int)strcspn(s, _aszInvKadKeywordChars);
		if (len > 2)
		{
			word = s;
			word.Truncate(len);
			word.MakeLower();
			for( i = 0; i < words->size(); i++)
			{
				wordtemp = words->front();
				words->pop_front();
				if(  wordtemp != word )
					words->push_back(wordtemp);
			}
			words->push_back(word);
		}
		if (len < (int)strlen(s))
			len++;
		s += len;
	}
	if(words->size() > 1 && len == 3)
	{
		words->pop_back();
	}
}

void CSearchManager::jumpStart(void)
{
	time_t now = time(NULL);
	m_critical.Lock();
	try
	{
		SearchMap::iterator it = m_searches.begin(); 
		while (it != m_searches.end())
		{
			switch(it->second->getSearchTypes()){
				case CSearch::FILE:
				{
					if (it->second->m_created + SEARCHFILE_LIFETIME < now)
					{
						delete it->second;
						it = m_searches.erase(it);
					}
					else if (it->second->getCount() > SEARCHFILE_TOTAL || it->second->m_created + SEARCHFILE_LIFETIME - SEC(20) < now)
					{
						it->second->prepareToStop();
						it++;
					}
					else
					{
						it->second->jumpStart();
						it++;
					}
					break;
				}
				case CSearch::KEYWORD:
				{
					if (it->second->m_created + SEARCHKEYWORD_LIFETIME < now)
					{
						delete it->second;
						it = m_searches.erase(it);
					}
					else if (it->second->getCount() > SEARCHKEYWORD_TOTAL || it->second->m_created + SEARCHKEYWORD_LIFETIME - SEC(20) < now)
					{
						it->second->prepareToStop();
						it++;
					}
					else
					{
						it->second->jumpStart();
						it++;
					}
					break;
				}
				case CSearch::NODE:
				{
					if (it->second->m_created + SEARCHNODE_LIFETIME < now)
					{
						delete it->second;
						it = m_searches.erase(it);
					}
					else
					{
						it->second->jumpStart();
						it++;
					}
					break;
				}
				case CSearch::NODECOMPLETE:
				{
					if (it->second->m_created + SEARCHNODE_LIFETIME < now)
					{
						CPrefs *prefs = CKademlia::getPrefs();
						if(prefs)
							prefs->setPublish(true);
						else
							CKademlia::debugLine("No preference object found CSearchManager::jumpStart");
						delete it->second;
						it = m_searches.erase(it);
					}
					else if ((it->second->m_created + SEARCHNODECOMP_LIFETIME < now) && (it->second->getCount() > SEARCHNODECOMP_TOTAL))
					{
						CPrefs *prefs = CKademlia::getPrefs();
						if(prefs)
							prefs->setPublish(true);
						else
							CKademlia::debugLine("No preference object found CSearchManager::jumpStart");
						delete it->second;
						it = m_searches.erase(it);
					}
					else
					{
						it->second->jumpStart();
						it++;
					}
					break;
				}
				case CSearch::STOREFILE:
				{
					if (it->second->m_created + SEARCHSTOREFILE_LIFETIME < now)
					{
						delete it->second;
						it = m_searches.erase(it);
					}
					else if (it->second->getCount() > SEARCHSTOREFILE_TOTAL || it->second->m_created + SEARCHSTOREFILE_LIFETIME - SEC(20) < now)
					{
						it->second->prepareToStop();
						it++;
					}
					else
					{
						it->second->jumpStart();
						it++;
					}
					break;
				}
				case CSearch::STOREKEYWORD:
				{
					if (it->second->m_created + SEARCHSTOREKEYWORD_LIFETIME < now)
					{
						delete it->second;
						it = m_searches.erase(it);
					}
					else if (it->second->getCount() > SEARCHSTOREKEYWORD_TOTAL || it->second->m_created + SEARCHSTOREKEYWORD_LIFETIME - SEC(20)< now)
					{
						it->second->prepareToStop();
						it++;
					}
					else
					{
						it->second->jumpStart();
						it++;
					}
					break;
				}
				default:
				{
					if (it->second->m_created + SEARCH_LIFETIME < now)
					{
						delete it->second;
						it = m_searches.erase(it);
					}
					else
					{
						it->second->jumpStart();
						it++;
					}
					break;
				}
			}
		}
	} 
	catch (...) 
	{
		CKademlia::debugLine("Exception in CSearchManager::jumpStart");
	}
	m_critical.Unlock();
}

void CSearchManager::updateStats(void)
{
	uint8 m_totalFile = 0;
	uint8 m_totalStoreSrc = 0;
	uint8 m_totalStoreKey = 0;
	m_critical.Lock();
	try
	{
		SearchMap::iterator it = m_searches.begin(); 
		while (it != m_searches.end())
		{
			switch(it->second->getSearchTypes()){
				case CSearch::FILE:
				{
					m_totalFile++;
					it++;
					break;
				}
				case CSearch::STOREFILE:
				{
					m_totalStoreSrc++;
					it++;
					break;
				}
				case CSearch::STOREKEYWORD:
				{
					m_totalStoreKey++;
					it++;
					break;
				}
				default:
					it++;
					break;
			}
		}
	} 
	catch (...) 
	{
		CKademlia::debugLine("Exception in CSearchManager::updateStats");
	}
	m_critical.Unlock();
	CPrefs *prefs = CKademlia::getPrefs();
	if(prefs != NULL)
	{
		prefs->setTotalFile(m_totalFile);
		prefs->setTotalStoreSrc(m_totalStoreSrc);
		prefs->setTotalStoreKey(m_totalStoreKey);
	}
}

void CSearchManager::processPublishResult(const CUInt128 &target)
{
	CSearch *s = NULL;
	m_critical.Lock();
	try
	{
		SearchMap::const_iterator it = m_searches.find(target);
		if (it != m_searches.end())
			s = it->second;
	} 
	catch (...) 
	{
		CKademlia::debugLine("Exception in CSearchManager::processPublishResults");
	}
	m_critical.Unlock();

	if (s == NULL)
	{
//		CKademlia::debugLine("Search either never existed or receiving late results (CSearchManager::processPublishResults)");
		return;
	}
	s->m_count++;
}


void CSearchManager::processResponse(const CUInt128 &target, uint32 fromIP, uint16 fromPort, ContactList *results)
{
	CSearch *s = NULL;
	m_critical.Lock();
	try
	{
		SearchMap::const_iterator it = m_searches.find(target);
		if (it != m_searches.end())
			s = it->second;
	} 
	catch (...) 
	{
		CKademlia::debugLine("Exception in CSearchManager::processResponse");
	}
	m_critical.Unlock();

	if (s == NULL)
	{
//		CKademlia::debugLine("Search either never existed or receiving late results (CSearchManager::processResponse)");
		ContactList::const_iterator it2;
		for (it2 = results->begin(); it2 != results->end(); it2++)
			delete (*it2);
		delete results;
		return;
	}
	else
		s->processResponse(target, fromIP, fromPort, results);
}

void CSearchManager::processResult(const CUInt128 &target, uint32 fromIP, uint16 fromPort, const CUInt128 &answer, TagList *info)
{
	CSearch *s = NULL;
	m_critical.Lock();
	try
	{
		SearchMap::const_iterator it = m_searches.find(target);
		if (it != m_searches.end())
			s = it->second;
	} 
	catch (...) 
	{
		CKademlia::debugLine("Exception in CSearchManager::processResult");
	}
	m_critical.Unlock();

	if (s == NULL)
	{
//		CKademlia::debugLine("Search either never existed or receiving late results (CSearchManager::processResult)");
		TagList::const_iterator it;
		for (it = info->begin(); it != info->end(); it++)
			delete *it;
		delete info;
	}
	else
		s->processResult(target, fromIP, fromPort, answer, info);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -