📄 searchmanager.cpp
字号:
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 + -