mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-06-07 14:12:43 -04:00
Added in Libresapi: Handler to get search result
This commit is contained in:
parent
034d88c4e2
commit
2293b600f9
2 changed files with 70 additions and 8 deletions
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "FileSearchHandler.h"
|
#include "FileSearchHandler.h"
|
||||||
|
|
||||||
|
#include <retroshare/rspeers.h>
|
||||||
#include <retroshare/rsexpr.h>
|
#include <retroshare/rsexpr.h>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
@ -10,13 +11,14 @@
|
||||||
namespace resource_api
|
namespace resource_api
|
||||||
{
|
{
|
||||||
|
|
||||||
FileSearchHandler::FileSearchHandler(StateTokenServer *sts, RsNotify *notify, RsTurtle *turtle, RsFiles */*files*/):
|
FileSearchHandler::FileSearchHandler(StateTokenServer *sts, RsNotify *notify, RsTurtle *turtle, RsFiles *files):
|
||||||
mStateTokenServer(sts), mNotify(notify), mTurtle(turtle),// mFiles(files),
|
mStateTokenServer(sts), mNotify(notify), mTurtle(turtle), mRsFiles(files),
|
||||||
mMtx("FileSearchHandler")
|
mMtx("FileSearchHandler")
|
||||||
{
|
{
|
||||||
mNotify->registerNotifyClient(this);
|
mNotify->registerNotifyClient(this);
|
||||||
addResourceHandler("*", this, &FileSearchHandler::handleWildcard);
|
addResourceHandler("*", this, &FileSearchHandler::handleWildcard);
|
||||||
addResourceHandler("create_search", this, &FileSearchHandler::handleCreateSearch);
|
addResourceHandler("create_search", this, &FileSearchHandler::handleCreateSearch);
|
||||||
|
addResourceHandler("get_search_result", this, &FileSearchHandler::handleGetSearchResult);
|
||||||
|
|
||||||
mSearchesStateToken = mStateTokenServer->getNewToken();
|
mSearchesStateToken = mStateTokenServer->getNewToken();
|
||||||
}
|
}
|
||||||
|
@ -102,8 +104,11 @@ void FileSearchHandler::handleWildcard(Request &req, Response &resp)
|
||||||
<< makeKeyValueReference("id", fd.hash)
|
<< makeKeyValueReference("id", fd.hash)
|
||||||
<< makeKeyValueReference("name", fd.name)
|
<< makeKeyValueReference("name", fd.name)
|
||||||
<< makeKeyValueReference("hash", fd.hash)
|
<< makeKeyValueReference("hash", fd.hash)
|
||||||
|
<< makeKeyValueReference("path", fd.path)
|
||||||
|
<< makeKeyValue("peer_id", fd.id.toStdString())
|
||||||
<< makeKeyValueReference("size", size)
|
<< makeKeyValueReference("size", size)
|
||||||
<< makeKeyValueReference("rank", fd.rank);
|
<< makeKeyValueReference("rank", fd.rank)
|
||||||
|
<< makeKeyValueReference("age", fd.age);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -194,7 +199,7 @@ void FileSearchHandler::handleCreateSearch(Request &req, Response &resp)
|
||||||
if(local)
|
if(local)
|
||||||
{
|
{
|
||||||
std::list<DirDetails> local_results;
|
std::list<DirDetails> local_results;
|
||||||
rsFiles->SearchBoolExp(&exprs, local_results, RS_FILE_HINTS_LOCAL);
|
mRsFiles->SearchBoolExp(&exprs, local_results, RS_FILE_HINTS_LOCAL);
|
||||||
|
|
||||||
for(std::list<DirDetails>::iterator lit = local_results.begin(); lit != local_results.end(); ++lit)
|
for(std::list<DirDetails>::iterator lit = local_results.begin(); lit != local_results.end(); ++lit)
|
||||||
{
|
{
|
||||||
|
@ -206,7 +211,7 @@ void FileSearchHandler::handleCreateSearch(Request &req, Response &resp)
|
||||||
if(remote)
|
if(remote)
|
||||||
{
|
{
|
||||||
std::list<DirDetails> remote_results;
|
std::list<DirDetails> remote_results;
|
||||||
rsFiles->SearchBoolExp(&exprs, remote_results, RS_FILE_HINTS_REMOTE);
|
mRsFiles->SearchBoolExp(&exprs, remote_results, RS_FILE_HINTS_REMOTE);
|
||||||
for(std::list<DirDetails>::iterator lit = remote_results.begin(); lit != remote_results.end(); ++lit)
|
for(std::list<DirDetails>::iterator lit = remote_results.begin(); lit != remote_results.end(); ++lit)
|
||||||
{
|
{
|
||||||
FileDetail fd;
|
FileDetail fd;
|
||||||
|
@ -239,4 +244,60 @@ void FileSearchHandler::handleCreateSearch(Request &req, Response &resp)
|
||||||
resp.setOk();
|
resp.setOk();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileSearchHandler::handleGetSearchResult(Request& req, Response& resp)
|
||||||
|
{
|
||||||
|
std::string search_id;
|
||||||
|
req.mStream << makeKeyValueReference("search_id", search_id);
|
||||||
|
|
||||||
|
if(search_id.size() != 8)
|
||||||
|
{
|
||||||
|
resp.setFail("Error: id has wrong size, should be 8 characters");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t id = 0;
|
||||||
|
for(uint8_t i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
id += (uint32_t(search_id[i]-'A')) << (i*4);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
RsStackMutex stackMtx(mMtx); // ********** STACK LOCKED MTX **********
|
||||||
|
std::map<uint32_t, Search>::iterator mit = mSearches.find(id);
|
||||||
|
if(mit == mSearches.end())
|
||||||
|
{
|
||||||
|
resp.setFail("Error: search id invalid");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Search& search = mit->second;
|
||||||
|
resp.mStateToken = search.mStateToken;
|
||||||
|
resp.mDataStream.getStreamToMember();
|
||||||
|
|
||||||
|
RsPgpId ownId = rsPeers->getGPGOwnId();
|
||||||
|
for(std::list<FileDetail>::iterator lit = search.mResults.begin(); lit != search.mResults.end(); ++lit)
|
||||||
|
{
|
||||||
|
FileDetail& fd = *lit;
|
||||||
|
bool isFriend = rsPeers->isFriend(fd.id);
|
||||||
|
bool isOwn = false;
|
||||||
|
if(ownId == rsPeers->getGPGId(fd.id))
|
||||||
|
isOwn = true;
|
||||||
|
|
||||||
|
double size = fd.size;
|
||||||
|
resp.mDataStream.getStreamToMember()
|
||||||
|
<< makeKeyValueReference("id", fd.hash)
|
||||||
|
<< makeKeyValueReference("name", fd.name)
|
||||||
|
<< makeKeyValueReference("hash", fd.hash)
|
||||||
|
<< makeKeyValueReference("path", fd.path)
|
||||||
|
<< makeKeyValue("peer_id", fd.id.toStdString())
|
||||||
|
<< makeKeyValueReference("is_friends", isFriend)
|
||||||
|
<< makeKeyValueReference("is_own", isOwn)
|
||||||
|
<< makeKeyValueReference("size", size)
|
||||||
|
<< makeKeyValueReference("rank", fd.rank)
|
||||||
|
<< makeKeyValueReference("age", fd.age);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resp.setOk();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace resource_api
|
} // namespace resource_api
|
||||||
|
|
|
@ -20,11 +20,12 @@ public:
|
||||||
private:
|
private:
|
||||||
void handleWildcard(Request& req, Response& resp);
|
void handleWildcard(Request& req, Response& resp);
|
||||||
void handleCreateSearch(Request& req, Response& resp);
|
void handleCreateSearch(Request& req, Response& resp);
|
||||||
|
void handleGetSearchResult(Request& req, Response& resp);
|
||||||
|
|
||||||
StateTokenServer* mStateTokenServer;
|
StateTokenServer* mStateTokenServer;
|
||||||
RsNotify* mNotify;
|
RsNotify* mNotify;
|
||||||
RsTurtle* mTurtle;
|
RsTurtle* mTurtle;
|
||||||
//RsFiles* mFiles;
|
RsFiles* mRsFiles;
|
||||||
|
|
||||||
class Search{
|
class Search{
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue