RetroShare/libretroshare/src/ft/ftfilesearch.cc
2012-11-02 13:52:29 +00:00

197 lines
4.2 KiB
C++

/*
* libretroshare/src/ft: ftfilesearch.cc
*
* File Transfer for RetroShare.
*
* Copyright 2008 by Robert Fernie.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License Version 2 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
* Please report all bugs and problems to "retroshare@lunamutt.com".
*
*/
#include "ft/ftfilesearch.h"
const uint32_t MAX_SEARCHS = 24; /* lower 24 bits of hint */
//#define DEBUG_SEARCH 1
ftFileSearch::ftFileSearch()
:mSearchs(MAX_SEARCHS)
{
uint32_t i;
for(i = 0; i < MAX_SEARCHS; i++)
{
mSearchs[i] = NULL;
}
}
bool ftFileSearch::addSearchMode(ftSearch *search, FileSearchFlags hintflags)
{
hintflags &= FileSearchFlags(0x000000ff);
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::addSearchMode() : " << hintflags;
std::cerr << std::endl;
#endif
uint32_t i;
for (i = 0; i < MAX_SEARCHS; i++)
{
uint32_t hints = hintflags.toUInt32() >> i;
if (hints & 0x0001)
{
/* has the flag */
mSearchs[i] = search;
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::addSearchMode() to slot ";
std::cerr << i;
std::cerr << std::endl;
#endif
return true;
}
}
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::addSearchMode() Failed";
std::cerr << std::endl;
#endif
return false;
}
bool ftFileSearch::search(const std::string &hash, FileSearchFlags hintflags, FileInfo &info) const
{
uint32_t hints, i;
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::search(" << hash ;
std::cerr << ", " << hintflags << ");";
std::cerr << std::endl;
#endif
for (i = 0; i < MAX_SEARCHS; i++)
{
hints = hintflags.toUInt32() >> i;
if (hints & 0x0001)
{
/* has the flag */
ftSearch *search = mSearchs[i];
if (search)
{
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::search() SLOT: ";
std::cerr << i;
std::cerr << std::endl;
#endif
if (search->search(hash, hintflags, info))
{
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::search() SLOT: ";
std::cerr << i << " success!";
std::cerr << std::endl;
#endif
return true;
}
else
{
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::search() SLOT: ";
std::cerr << i << " no luck";
std::cerr << std::endl;
#endif
}
}
}
}
/* if we haven't found it by now! - check if SPEC_ONLY flag is set */
if (hintflags & RS_FILE_HINTS_SPEC_ONLY)
{
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::search() SPEC_ONLY: Failed";
std::cerr << std::endl;
#endif
return false;
}
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::search() Searching Others (no SPEC ONLY):";
std::cerr << std::endl;
#endif
/* if we don't have the SPEC_ONLY flag,
* we check through all the others
*/
for (i = 0; i < MAX_SEARCHS; i++)
{
hints = hintflags.toUInt32() >> i;
if (hints & 0x0001)
{
continue;
}
/* has the flag */
ftSearch *search = mSearchs[i];
if (search)
{
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::search() SLOT: " << i;
std::cerr << std::endl;
#endif
if (search->search(hash, hintflags, info))
{
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::search() SLOT: ";
std::cerr << i << " success!";
std::cerr << std::endl;
#endif
return true;
}
else
{
#ifdef DEBUG_SEARCH
std::cerr << "ftFileSearch::search() SLOT: ";
std::cerr << i << " no luck";
std::cerr << std::endl;
#endif
}
}
}
/* found nothing */
return false;
}
bool ftSearchDummy::search(std::string /*hash*/, FileSearchFlags hintflags, FileInfo &/*info*/) const
{
/* remove unused parameter warnings */
(void) hintflags;
#ifdef DEBUG_SEARCH
std::cerr << "ftSearchDummy::search(" << hash ;
std::cerr << ", " << hintflags << ");";
std::cerr << std::endl;
#endif
return false;
}