mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-22 06:05:08 -05:00
turtle dev. Worked on serialisation, mainly, and connexion to gui.
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@1076 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
decb7442bc
commit
29bd4795fd
65
libretroshare/src/rsiface/rsturtle.h
Normal file
65
libretroshare/src/rsiface/rsturtle.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#ifndef RETROSHARE_TURTLE_GUI_INTERFACE_H
|
||||||
|
#define RETROSHARE_TURTLE_GUI_INTERFACE_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* libretroshare/src/rsiface: rsturtle.h
|
||||||
|
*
|
||||||
|
* RetroShare C++ Interface.
|
||||||
|
*
|
||||||
|
* Copyright 2009 by Cyril Soler.
|
||||||
|
*
|
||||||
|
* 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 "csoler@users.sourceforge.net"
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <string>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
class RsTurtle;
|
||||||
|
extern RsTurtle *rsTurtle ;
|
||||||
|
|
||||||
|
typedef uint32_t TurtleRequestId ;
|
||||||
|
|
||||||
|
// Interface class for turtle hopping.
|
||||||
|
//
|
||||||
|
// This class mainly interacts with the turtle router, that is responsible
|
||||||
|
// for routing turtle packets between peers, accepting/forwarding search
|
||||||
|
// requests and dowloading files.
|
||||||
|
//
|
||||||
|
// As seen from here, the interface is really simple.
|
||||||
|
//
|
||||||
|
class RsTurtle
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RsTurtle() {}
|
||||||
|
virtual ~RsTurtle() {}
|
||||||
|
|
||||||
|
// Lauches a search request through the pipes, and immediately returns
|
||||||
|
// the request id, which will be further used by the gui to store results
|
||||||
|
// as they come back.
|
||||||
|
//
|
||||||
|
virtual TurtleRequestId turtleSearch(const std::string& match_string) = 0 ;
|
||||||
|
|
||||||
|
// Launches a complete download file operation: diggs one or more
|
||||||
|
// tunnels. Launches an exception if an error occurs during the
|
||||||
|
// initialization process.
|
||||||
|
//
|
||||||
|
virtual void turtleDownload(const std::string& file_hash) = 0 ;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -36,6 +36,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
RsFiles *rsFiles = NULL;
|
RsFiles *rsFiles = NULL;
|
||||||
|
#ifdef TURTLE_HOPPING
|
||||||
|
#include "rsiface/rsturtle.h"
|
||||||
|
RsTurtle *rsTurtle = NULL ;
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "pqi/pqipersongrp.h"
|
#include "pqi/pqipersongrp.h"
|
||||||
#include "pqi/pqisslpersongrp.h"
|
#include "pqi/pqisslpersongrp.h"
|
||||||
@ -60,6 +64,10 @@ RsFiles *rsFiles = NULL;
|
|||||||
#include "services/p3status.h"
|
#include "services/p3status.h"
|
||||||
#include "services/p3Qblog.h"
|
#include "services/p3Qblog.h"
|
||||||
|
|
||||||
|
#ifdef TURTLE_HOPPING
|
||||||
|
#include "services/p3turtle.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -642,6 +650,11 @@ int RsServer::StartupRetroShare()
|
|||||||
msgSrv = new p3MsgService(mConnMgr);
|
msgSrv = new p3MsgService(mConnMgr);
|
||||||
chatSrv = new p3ChatService(mConnMgr);
|
chatSrv = new p3ChatService(mConnMgr);
|
||||||
|
|
||||||
|
#ifdef TURTLE_HOPPING
|
||||||
|
p3turtle *tr = new p3turtle(mConnMgr) ;
|
||||||
|
rsTurtle = tr ;
|
||||||
|
pqih -> addService(tr);
|
||||||
|
#endif
|
||||||
pqih -> addService(ad);
|
pqih -> addService(ad);
|
||||||
pqih -> addService(msgSrv);
|
pqih -> addService(msgSrv);
|
||||||
pqih -> addService(chatSrv);
|
pqih -> addService(chatSrv);
|
||||||
|
@ -442,7 +442,7 @@ bool GetTlvString(void *data, uint32_t size, uint32_t *offset,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t GetTlvStringSize(std::string &in) {
|
uint32_t GetTlvStringSize(const std::string &in) {
|
||||||
return 4 + in.size();
|
return 4 + in.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,7 +238,7 @@ uint32_t GetTlvUInt64Size();
|
|||||||
|
|
||||||
bool SetTlvString(void *data, uint32_t size, uint32_t *offset, uint16_t type, std::string out);
|
bool SetTlvString(void *data, uint32_t size, uint32_t *offset, uint16_t type, std::string out);
|
||||||
bool GetTlvString(void *data, uint32_t size, uint32_t *offset, uint16_t type, std::string &in);
|
bool GetTlvString(void *data, uint32_t size, uint32_t *offset, uint16_t type, std::string &in);
|
||||||
uint32_t GetTlvStringSize(std::string &in);
|
uint32_t GetTlvStringSize(const std::string &in);
|
||||||
|
|
||||||
bool SetTlvWideString(void *data, uint32_t size, uint32_t *offset, uint16_t type, std::wstring out);
|
bool SetTlvWideString(void *data, uint32_t size, uint32_t *offset, uint16_t type, std::wstring out);
|
||||||
bool GetTlvWideString(void *data, uint32_t size, uint32_t *offset, uint16_t type, std::wstring &in);
|
bool GetTlvWideString(void *data, uint32_t size, uint32_t *offset, uint16_t type, std::wstring &in);
|
||||||
|
@ -23,12 +23,15 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
#include "rsiface/rsiface.h"
|
#include "rsiface/rsiface.h"
|
||||||
#include "rsiface/rspeers.h"
|
#include "rsiface/rspeers.h"
|
||||||
|
|
||||||
#include "pqi/p3authmgr.h"
|
#include "pqi/p3authmgr.h"
|
||||||
#include "pqi/p3connmgr.h"
|
#include "pqi/p3connmgr.h"
|
||||||
|
#include "pqi/pqinotify.h"
|
||||||
|
|
||||||
#include "p3turtle.h"
|
#include "p3turtle.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -47,7 +50,7 @@
|
|||||||
|
|
||||||
#define P3TURTLE_DEBUG 1
|
#define P3TURTLE_DEBUG 1
|
||||||
|
|
||||||
p3turtle::p3turtle(p3AuthMgr *am, p3ConnectMgr *cm) :p3Service(RS_SERVICE_TYPE_TURTLE), mAuthMgr(am), mConnMgr(cm)
|
p3turtle::p3turtle(p3ConnectMgr *cm) :p3Service(RS_SERVICE_TYPE_TURTLE), mConnMgr(cm)
|
||||||
{
|
{
|
||||||
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
|
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
|
||||||
|
|
||||||
@ -57,7 +60,7 @@ p3turtle::p3turtle(p3AuthMgr *am, p3ConnectMgr *cm) :p3Service(RS_SERVICE_TYPE_T
|
|||||||
int p3turtle::tick()
|
int p3turtle::tick()
|
||||||
{
|
{
|
||||||
handleIncoming(); // handle incoming packets
|
handleIncoming(); // handle incoming packets
|
||||||
handleOutgoing(); // handle outgoing packets
|
// handleOutgoing(); // handle outgoing packets
|
||||||
|
|
||||||
// Clean every 10 sec.
|
// Clean every 10 sec.
|
||||||
time_t now = time(NULL) ;
|
time_t now = time(NULL) ;
|
||||||
@ -78,7 +81,14 @@ void p3turtle::autoWash()
|
|||||||
// look for tunnels and stored temportary info that have not been used for a while.
|
// look for tunnels and stored temportary info that have not been used for a while.
|
||||||
}
|
}
|
||||||
|
|
||||||
TurtleRequestId p3turtle::performSearch(const std::string& string_to_match)
|
uint32_t p3turtle::generateRandomRequestId()
|
||||||
|
{
|
||||||
|
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
|
||||||
|
|
||||||
|
return lrand48() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
TurtleRequestId p3turtle::turtleSearch(const std::string& string_to_match)
|
||||||
{
|
{
|
||||||
// generate a new search id.
|
// generate a new search id.
|
||||||
|
|
||||||
@ -101,6 +111,14 @@ TurtleRequestId p3turtle::performSearch(const std::string& string_to_match)
|
|||||||
return id ;
|
return id ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void p3turtle::turtleDownload(const std::string& file_hash)
|
||||||
|
{
|
||||||
|
pqiNotify *notify = getPqiNotify();
|
||||||
|
|
||||||
|
if (notify)
|
||||||
|
notify->AddSysMessage(0, RS_SYS_WARNING, std::string("Unimplemented"),std::string("turtle download is not yet implemented. Sorry"));
|
||||||
|
}
|
||||||
|
|
||||||
int p3turtle::handleIncoming()
|
int p3turtle::handleIncoming()
|
||||||
{
|
{
|
||||||
#ifdef P3TURTLE_DEBUG
|
#ifdef P3TURTLE_DEBUG
|
||||||
@ -137,6 +155,7 @@ int p3turtle::handleIncoming()
|
|||||||
|
|
||||||
void p3turtle::handleSearchRequest(RsTurtleSearchRequestItem *item)
|
void p3turtle::handleSearchRequest(RsTurtleSearchRequestItem *item)
|
||||||
{
|
{
|
||||||
|
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
|
||||||
// take a look at the item:
|
// take a look at the item:
|
||||||
// - If the item destimation is
|
// - If the item destimation is
|
||||||
|
|
||||||
@ -220,6 +239,7 @@ void p3turtle::handleSearchRequest(RsTurtleSearchRequestItem *item)
|
|||||||
|
|
||||||
void p3turtle::handleSearchResult(RsTurtleSearchResultItem *item)
|
void p3turtle::handleSearchResult(RsTurtleSearchResultItem *item)
|
||||||
{
|
{
|
||||||
|
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
|
||||||
// Find who actually sent the corresponding request.
|
// Find who actually sent the corresponding request.
|
||||||
//
|
//
|
||||||
std::map<TurtleRequestId,TurtlePeerId>::const_iterator it = requests_origins.find(item->request_id) ;
|
std::map<TurtleRequestId,TurtlePeerId>::const_iterator it = requests_origins.find(item->request_id) ;
|
||||||
@ -315,3 +335,163 @@ void p3turtle::statusChange(const std::list<pqipeer> &plist)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "serialiser/rstlvbase.h"
|
||||||
|
#include "serialiser/rsbaseserial.h"
|
||||||
|
|
||||||
|
uint32_t RsTurtleSearchRequestItem::serial_size()
|
||||||
|
{
|
||||||
|
uint32_t s = 0 ;
|
||||||
|
|
||||||
|
s += 8 ; // header
|
||||||
|
s += GetTlvStringSize(match_string) ;
|
||||||
|
s += 4 ; // request_id
|
||||||
|
s += 2 ; // depth
|
||||||
|
|
||||||
|
return s ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RsTurtleSearchRequestItem::serialize(void *data,uint32_t& pktsize)
|
||||||
|
{
|
||||||
|
uint32_t tlvsize = serial_size();
|
||||||
|
uint32_t offset = 0;
|
||||||
|
|
||||||
|
if (pktsize < tlvsize)
|
||||||
|
return false; /* not enough space */
|
||||||
|
|
||||||
|
pktsize = tlvsize;
|
||||||
|
|
||||||
|
bool ok = true;
|
||||||
|
|
||||||
|
ok &= setRsItemHeader(data,tlvsize,PacketId(), tlvsize);
|
||||||
|
|
||||||
|
/* skip the header */
|
||||||
|
offset += 8;
|
||||||
|
|
||||||
|
/* add mandatory parts first */
|
||||||
|
|
||||||
|
ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_VALUE, match_string);
|
||||||
|
ok &= setRawUInt32(data, tlvsize, &offset, request_id);
|
||||||
|
ok &= setRawUInt16(data, tlvsize, &offset, depth);
|
||||||
|
|
||||||
|
if (offset != tlvsize)
|
||||||
|
{
|
||||||
|
ok = false;
|
||||||
|
#ifdef RSSERIAL_DEBUG
|
||||||
|
std::cerr << "RsFileConfigSerialiser::serialiseTransfer() Size Error! " << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t RsTurtleSearchResultItem::serial_size()
|
||||||
|
{
|
||||||
|
uint32_t s = 0 ;
|
||||||
|
|
||||||
|
s += 8 ; // header
|
||||||
|
s += 4 ; // search request id
|
||||||
|
s += 4 ; // number of results
|
||||||
|
|
||||||
|
for(std::map<TurtleFileHash,TurtleFileName>::const_iterator it(result.begin());it!=result.end();++it)
|
||||||
|
{
|
||||||
|
s += GetTlvStringSize(it->first) ; // file hash
|
||||||
|
s += GetTlvStringSize(it->second) ; // file name
|
||||||
|
}
|
||||||
|
|
||||||
|
return s ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RsTurtleSearchResultItem::serialize(void *data,uint32_t& pktsize)
|
||||||
|
{
|
||||||
|
uint32_t tlvsize = serial_size();
|
||||||
|
uint32_t offset = 0;
|
||||||
|
|
||||||
|
if (pktsize < tlvsize)
|
||||||
|
return false; /* not enough space */
|
||||||
|
|
||||||
|
pktsize = tlvsize;
|
||||||
|
|
||||||
|
bool ok = true;
|
||||||
|
|
||||||
|
ok &= setRsItemHeader(data,tlvsize,PacketId(), tlvsize);
|
||||||
|
|
||||||
|
/* skip the header */
|
||||||
|
offset += 8;
|
||||||
|
|
||||||
|
/* add mandatory parts first */
|
||||||
|
|
||||||
|
ok &= setRawUInt32(data, tlvsize, &offset, request_id);
|
||||||
|
ok &= setRawUInt32(data, tlvsize, &offset, result.size());
|
||||||
|
|
||||||
|
for(std::map<TurtleFileHash,TurtleFileName>::const_iterator it(result.begin());it!=result.end();++it)
|
||||||
|
{
|
||||||
|
ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_HASH_SHA1, it->first); // file hash
|
||||||
|
ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_NAME, it->second); // file name
|
||||||
|
}
|
||||||
|
|
||||||
|
if (offset != tlvsize)
|
||||||
|
{
|
||||||
|
ok = false;
|
||||||
|
#ifdef RSSERIAL_DEBUG
|
||||||
|
std::cerr << "RsFileConfigSerialiser::serialiseTransfer() Size Error! " << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
RsItem *RsTurtleSerialiser::deserialise(void *data, uint32_t *size)
|
||||||
|
{
|
||||||
|
// look what we have...
|
||||||
|
|
||||||
|
/* get the type */
|
||||||
|
uint32_t rstype = getRsItemId(data);
|
||||||
|
|
||||||
|
if ((RS_PKT_VERSION_SERVICE != getRsItemVersion(rstype)) || (RS_SERVICE_TYPE_TURTLE != getRsItemService(rstype)))
|
||||||
|
{
|
||||||
|
return NULL; /* wrong type */
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(getRsItemSubType(rstype))
|
||||||
|
{
|
||||||
|
case RS_TURTLE_SUBTYPE_SEARCH_REQUEST: return new RsTurtleSearchResultItem(data,*size) ;
|
||||||
|
case RS_TURTLE_SUBTYPE_SEARCH_RESULT: return new RsTurtleSearchResultItem(data,*size) ;
|
||||||
|
|
||||||
|
default:
|
||||||
|
std::cerr << "Unknown packet type in RsTurtle!" << std::endl ;
|
||||||
|
return NULL ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RsTurtleSearchResultItem::RsTurtleSearchResultItem(void *data,uint32_t pktsize)
|
||||||
|
: RsTurtleItem(RS_TURTLE_SUBTYPE_SEARCH_RESULT)
|
||||||
|
{
|
||||||
|
uint32_t offset = 8; // skip the header
|
||||||
|
uint32_t rssize = getRsItemSize(data);
|
||||||
|
|
||||||
|
/* add mandatory parts first */
|
||||||
|
|
||||||
|
bool ok = true ;
|
||||||
|
uint32_t s ;
|
||||||
|
ok &= getRawUInt32(data, pktsize, &offset, &request_id);
|
||||||
|
ok &= getRawUInt32(data, pktsize, &offset, &s) ;
|
||||||
|
|
||||||
|
result.clear() ;
|
||||||
|
|
||||||
|
for(uint i=0;i<s;++i)
|
||||||
|
{
|
||||||
|
std::string hash,filename ;
|
||||||
|
|
||||||
|
ok &= GetTlvString(data, pktsize, &offset, TLV_TYPE_STR_HASH_SHA1, hash); // file hash
|
||||||
|
ok &= GetTlvString(data, pktsize, &offset, TLV_TYPE_STR_NAME, filename); // file name
|
||||||
|
|
||||||
|
result[hash]=filename ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (offset != rssize)
|
||||||
|
throw std::runtime_error("Size error while deserializing.") ;
|
||||||
|
if (!ok)
|
||||||
|
throw std::runtime_error("Unknown error while deserializing.") ;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -49,6 +49,8 @@
|
|||||||
#include "pqi/pqi.h"
|
#include "pqi/pqi.h"
|
||||||
#include "pqi/pqimonitor.h"
|
#include "pqi/pqimonitor.h"
|
||||||
#include "services/p3service.h"
|
#include "services/p3service.h"
|
||||||
|
#include "serialiser/rsserviceids.h"
|
||||||
|
#include "rsiface/rsturtle.h"
|
||||||
|
|
||||||
class p3AuthMgr;
|
class p3AuthMgr;
|
||||||
class p3ConnectMgr;
|
class p3ConnectMgr;
|
||||||
@ -58,7 +60,6 @@ const uint8_t RS_TURTLE_SUBTYPE_SEARCH_RESULT = 0x02 ;
|
|||||||
|
|
||||||
static const int TURTLE_MAX_SEARCH_DEPTH = 6 ;
|
static const int TURTLE_MAX_SEARCH_DEPTH = 6 ;
|
||||||
|
|
||||||
typedef uint32_t TurtleRequestId ;
|
|
||||||
typedef std::string TurtlePeerId ;
|
typedef std::string TurtlePeerId ;
|
||||||
typedef std::string TurtleFileHash ;
|
typedef std::string TurtleFileHash ;
|
||||||
typedef std::string TurtleFileName ;
|
typedef std::string TurtleFileName ;
|
||||||
@ -68,9 +69,8 @@ class RsTurtleItem: public RsItem
|
|||||||
public:
|
public:
|
||||||
RsTurtleItem(uint8_t turtle_subtype) : RsItem(RS_PKT_VERSION_SERVICE,RS_SERVICE_TYPE_TURTLE,turtle_subtype) {}
|
RsTurtleItem(uint8_t turtle_subtype) : RsItem(RS_PKT_VERSION_SERVICE,RS_SERVICE_TYPE_TURTLE,turtle_subtype) {}
|
||||||
|
|
||||||
virtual bool serialize(void *data,uint32_t& size) = 0 ; // isn't it better that items can (de)serialize themselves ?
|
virtual bool serialize(void *data,uint32_t& size) = 0 ; // Isn't it better that items can serialize themselves ?
|
||||||
virtual RsItem *deserialize(const void *data,uint32_t size) = 0 ;
|
virtual uint32_t serial_size() = 0 ; // deserialise is handled using a constructor
|
||||||
virtual uint32_t serial_size() const = 0 ;
|
|
||||||
|
|
||||||
virtual void clear() {}
|
virtual void clear() {}
|
||||||
};
|
};
|
||||||
@ -79,6 +79,7 @@ class RsTurtleSearchResultItem: public RsTurtleItem
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RsTurtleSearchResultItem() : RsTurtleItem(RS_TURTLE_SUBTYPE_SEARCH_RESULT) {}
|
RsTurtleSearchResultItem() : RsTurtleItem(RS_TURTLE_SUBTYPE_SEARCH_RESULT) {}
|
||||||
|
RsTurtleSearchResultItem(void *data,uint32_t size) ; // deserialization
|
||||||
|
|
||||||
uint16_t depth ;
|
uint16_t depth ;
|
||||||
uint8_t peer_id[16]; // peer id. This will eventually be obfuscated in some way.
|
uint8_t peer_id[16]; // peer id. This will eventually be obfuscated in some way.
|
||||||
@ -90,14 +91,14 @@ class RsTurtleSearchResultItem: public RsTurtleItem
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool serialize(void *data,uint32_t& size) ;
|
virtual bool serialize(void *data,uint32_t& size) ;
|
||||||
virtual RsItem *deserialize(const void *data,uint32_t size) ;
|
virtual uint32_t serial_size() ;
|
||||||
virtual uint32_t serial_size() const ;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class RsTurtleSearchRequestItem: public RsTurtleItem
|
class RsTurtleSearchRequestItem: public RsTurtleItem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RsTurtleSearchRequestItem() : RsTurtleItem(RS_TURTLE_SUBTYPE_SEARCH_REQUEST) {}
|
RsTurtleSearchRequestItem() : RsTurtleItem(RS_TURTLE_SUBTYPE_SEARCH_REQUEST) {}
|
||||||
|
RsTurtleSearchRequestItem(void *data,uint32_t size) ; // deserialization
|
||||||
|
|
||||||
std::string match_string ; // string to match
|
std::string match_string ; // string to match
|
||||||
uint32_t request_id ; // randomly generated request id.
|
uint32_t request_id ; // randomly generated request id.
|
||||||
@ -107,8 +108,7 @@ class RsTurtleSearchRequestItem: public RsTurtleItem
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool serialize(void *data,uint32_t& size) ;
|
virtual bool serialize(void *data,uint32_t& size) ;
|
||||||
virtual RsItem *deserialize(const void *data,uint32_t size) ;
|
virtual uint32_t serial_size() ;
|
||||||
virtual uint32_t serial_size() const ;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Class responsible for serializing/deserializing all turtle items.
|
// Class responsible for serializing/deserializing all turtle items.
|
||||||
@ -126,7 +126,7 @@ class RsTurtleSerialiser: public RsSerialType
|
|||||||
{
|
{
|
||||||
return static_cast<RsTurtleItem *>(item)->serialize(data,*size) ;
|
return static_cast<RsTurtleItem *>(item)->serialize(data,*size) ;
|
||||||
}
|
}
|
||||||
virtual RsItem * deserialise (void *data, uint32_t *size) ;
|
virtual RsItem *deserialise (void *data, uint32_t *size) ;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TurtleTunnel
|
class TurtleTunnel
|
||||||
@ -137,16 +137,22 @@ class TurtleTunnel
|
|||||||
uint32_t time_stamp ; // last time the tunnel was actually used. Used for cleaning old tunnels.
|
uint32_t time_stamp ; // last time the tunnel was actually used. Used for cleaning old tunnels.
|
||||||
};
|
};
|
||||||
|
|
||||||
class p3turtle: public p3Service, public pqiMonitor
|
class p3turtle: public p3Service, public pqiMonitor, public RsTurtle
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
p3turtle(p3AuthMgr *am, p3ConnectMgr *cm);
|
p3turtle(p3ConnectMgr *cm);
|
||||||
|
|
||||||
// Lauches a search request through the pipes, and immediately returns
|
// Lauches a search request through the pipes, and immediately returns
|
||||||
// the request id, which will be further used by the gui to store results
|
// the request id, which will be further used by the gui to store results
|
||||||
// as they come back.
|
// as they come back.
|
||||||
//
|
//
|
||||||
TurtleRequestId performSearch(const std::string& string_to_match) ;
|
virtual TurtleRequestId turtleSearch(const std::string& string_to_match) ;
|
||||||
|
|
||||||
|
// Launches a complete download file operation: diggs one or more
|
||||||
|
// tunnels. Launches an exception if an error occurs during the
|
||||||
|
// initialization process.
|
||||||
|
//
|
||||||
|
virtual void turtleDownload(const std::string& file_hash) ;
|
||||||
|
|
||||||
/************* from pqiMonitor *******************/
|
/************* from pqiMonitor *******************/
|
||||||
// Informs the turtle router that some peers are (dis)connected. This should initiate digging new tunnels,
|
// Informs the turtle router that some peers are (dis)connected. This should initiate digging new tunnels,
|
||||||
@ -158,15 +164,15 @@ class p3turtle: public p3Service, public pqiMonitor
|
|||||||
|
|
||||||
// Handles incoming and outgoing packets, sort search requests and
|
// Handles incoming and outgoing packets, sort search requests and
|
||||||
// forward info upward.
|
// forward info upward.
|
||||||
int tick();
|
virtual int tick();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline uint32_t generateRandomRequestId() const { return lrand48() ; }
|
uint32_t generateRandomRequestId() ;
|
||||||
void autoWash() ;
|
void autoWash() ;
|
||||||
|
|
||||||
/* Network Input */
|
/* Network Input */
|
||||||
int handleIncoming();
|
int handleIncoming();
|
||||||
int handleOutgoing();
|
// int handleOutgoing();
|
||||||
|
|
||||||
// Performs a search calling local cache and search structure.
|
// Performs a search calling local cache and search structure.
|
||||||
void performLocalSearch(const std::string& s,std::map<TurtleFileHash,TurtleFileName>& result) {}
|
void performLocalSearch(const std::string& s,std::map<TurtleFileHash,TurtleFileName>& result) {}
|
||||||
@ -177,16 +183,15 @@ class p3turtle: public p3Service, public pqiMonitor
|
|||||||
// returns a search result upwards (possibly to the gui)
|
// returns a search result upwards (possibly to the gui)
|
||||||
void returnSearchResult(RsTurtleSearchResultItem *item) ;
|
void returnSearchResult(RsTurtleSearchResultItem *item) ;
|
||||||
|
|
||||||
|
/* data */
|
||||||
|
p3ConnectMgr *mConnMgr;
|
||||||
|
|
||||||
|
RsMutex mTurtleMtx;
|
||||||
|
|
||||||
std::map<TurtleRequestId,TurtlePeerId> requests_origins ; // keeps trace of who emmitted a given request
|
std::map<TurtleRequestId,TurtlePeerId> requests_origins ; // keeps trace of who emmitted a given request
|
||||||
std::map<TurtleFileHash,TurtleTunnel> file_tunnels ; // stores adequate tunnels for each file hash.
|
std::map<TurtleFileHash,TurtleTunnel> file_tunnels ; // stores adequate tunnels for each file hash.
|
||||||
|
|
||||||
p3AuthMgr *mAuthMgr;
|
|
||||||
p3ConnectMgr *mConnMgr;
|
|
||||||
|
|
||||||
time_t _last_clean_time ;
|
time_t _last_clean_time ;
|
||||||
|
|
||||||
/* data */
|
|
||||||
RsMutex mTurtleMtx;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
#include "rsiface/rsexpr.h"
|
#include "rsiface/rsexpr.h"
|
||||||
#include "rsiface/rsfiles.h"
|
#include "rsiface/rsfiles.h"
|
||||||
#include "rsiface/rspeers.h"
|
#include "rsiface/rspeers.h"
|
||||||
|
#ifdef TURTLE_HOPPING
|
||||||
|
#include "rsiface/rsturtle.h"
|
||||||
|
#endif
|
||||||
#include "util/misc.h"
|
#include "util/misc.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -416,6 +419,12 @@ void SearchDialog::advancedSearch(Expression* expression)
|
|||||||
|
|
||||||
void SearchDialog::searchKeywords()
|
void SearchDialog::searchKeywords()
|
||||||
{
|
{
|
||||||
|
#ifdef TURTLE_HOPPING
|
||||||
|
QString qTxt = ui.lineEdit->text();
|
||||||
|
std::string txt = qTxt.toStdString();
|
||||||
|
|
||||||
|
TurtleRequestId id = rsTurtle->turtleSearch(txt) ;
|
||||||
|
#else
|
||||||
QString qTxt = ui.lineEdit->text();
|
QString qTxt = ui.lineEdit->text();
|
||||||
std::string txt = qTxt.toStdString();
|
std::string txt = qTxt.toStdString();
|
||||||
|
|
||||||
@ -488,6 +497,7 @@ void SearchDialog::searchKeywords()
|
|||||||
|
|
||||||
/* abstraction to allow reusee of tree rendering code */
|
/* abstraction to allow reusee of tree rendering code */
|
||||||
resultsToTree(txt, *finalResults);
|
resultsToTree(txt, *finalResults);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void SearchDialog::resultsToTree(std::string txt, std::list<FileDetail> results)
|
void SearchDialog::resultsToTree(std::string txt, std::list<FileDetail> results)
|
||||||
|
65
retroshare-gui/src/rsiface/rsturtle.h
Normal file
65
retroshare-gui/src/rsiface/rsturtle.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#ifndef RETROSHARE_TURTLE_GUI_INTERFACE_H
|
||||||
|
#define RETROSHARE_TURTLE_GUI_INTERFACE_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* libretroshare/src/rsiface: rsturtle.h
|
||||||
|
*
|
||||||
|
* RetroShare C++ Interface.
|
||||||
|
*
|
||||||
|
* Copyright 2009 by Cyril Soler.
|
||||||
|
*
|
||||||
|
* 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 "csoler@users.sourceforge.net"
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <string>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
class RsTurtle;
|
||||||
|
extern RsTurtle *rsTurtle ;
|
||||||
|
|
||||||
|
typedef uint32_t TurtleRequestId ;
|
||||||
|
|
||||||
|
// Interface class for turtle hopping.
|
||||||
|
//
|
||||||
|
// This class mainly interacts with the turtle router, that is responsible
|
||||||
|
// for routing turtle packets between peers, accepting/forwarding search
|
||||||
|
// requests and dowloading files.
|
||||||
|
//
|
||||||
|
// As seen from here, the interface is really simple.
|
||||||
|
//
|
||||||
|
class RsTurtle
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RsTurtle() {}
|
||||||
|
virtual ~RsTurtle() {}
|
||||||
|
|
||||||
|
// Lauches a search request through the pipes, and immediately returns
|
||||||
|
// the request id, which will be further used by the gui to store results
|
||||||
|
// as they come back.
|
||||||
|
//
|
||||||
|
virtual TurtleRequestId turtleSearch(const std::string& match_string) = 0 ;
|
||||||
|
|
||||||
|
// Launches a complete download file operation: diggs one or more
|
||||||
|
// tunnels. Launches an exception if an error occurs during the
|
||||||
|
// initialization process.
|
||||||
|
//
|
||||||
|
virtual void turtleDownload(const std::string& file_hash) = 0 ;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user