diff options
Diffstat (limited to 'libktorrent/kademlia/rpcmsg.h')
-rw-r--r-- | libktorrent/kademlia/rpcmsg.h | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/libktorrent/kademlia/rpcmsg.h b/libktorrent/kademlia/rpcmsg.h new file mode 100644 index 0000000..4863ae2 --- /dev/null +++ b/libktorrent/kademlia/rpcmsg.h @@ -0,0 +1,269 @@ +/*************************************************************************** + * Copyright (C) 2005 by Joris Guisson * + * joris.guisson@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#ifndef DHTRPCMSG_H +#define DHTRPCMSG_H + +#include <ksocketaddress.h> +#include <util/constants.h> +#include "key.h" +#include "database.h" + +namespace bt +{ + class BDictNode; +} + +using bt::Uint8; +using bt::Uint32; + +namespace dht +{ + class DHT; + class RPCServer; + + enum Type + { + REQ_MSG, + RSP_MSG, + ERR_MSG, + INVALID + }; + + enum Method + { + PING, + FIND_NODE, + GET_PEERS, + ANNOUNCE_PEER, + NONE + }; + + + + /** + * Base class for all RPC messages. + */ + class MsgBase + { + public: + MsgBase(Uint8 mtid,Method m,Type type,const Key & id); + virtual ~MsgBase(); + + + /** + * When this message arrives this function will be called upon the DHT. + * The message should then call the appropriate DHT function (double dispatch) + * @param dh_table Pointer to DHT + */ + virtual void apply(DHT* dh_table) = 0; + + /** + * Print the message for debugging purposes. + */ + virtual void print() = 0; + + /** + * BEncode the message. + * @param arr Data array + */ + virtual void encode(QByteArray & arr) = 0; + + /// Set the origin (i.e. where the message came from) + void setOrigin(const KNetwork::KSocketAddress & o) {origin = o;} + + /// Get the origin + const KNetwork::KInetSocketAddress & getOrigin() const {return origin;} + + /// Set the origin (i.e. where the message came from) + void setDestination(const KNetwork::KSocketAddress & o) {origin = o;} + + /// Get the origin + const KNetwork::KInetSocketAddress & getDestination() const {return origin;} + + /// Get the MTID + Uint8 getMTID() const {return mtid;} + + /// Set the MTID + void setMTID(Uint8 m) {mtid = m;} + + /// Get the id of the sender + const Key & getID() const {return id;} + + /// Get the type of the message + Type getType() const {return type;} + + /// Get the message it's method + Method getMethod() const {return method;} + + protected: + Uint8 mtid; + Method method; + Type type; + Key id; + KNetwork::KInetSocketAddress origin; + }; + + /** + * Creates a message out of a BDictNode. + * @param dict The BDictNode + * @param srv The RPCServer + * @return A newly created message or 0 upon error + */ + MsgBase* MakeRPCMsg(bt::BDictNode* dict,RPCServer* srv); + + MsgBase* MakeRPCMsgTest(bt::BDictNode* dict,dht::Method req_method); + + class ErrMsg : public MsgBase + { + public: + ErrMsg(Uint8 mtid,const Key & id,const QString & msg); + virtual ~ErrMsg(); + + virtual void apply(DHT* dh_table); + virtual void print(); + virtual void encode(QByteArray & arr); + private: + QString msg; + }; + + class PingReq : public MsgBase + { + public: + PingReq(const Key & id); + virtual ~PingReq(); + + virtual void apply(DHT* dh_table); + virtual void print(); + virtual void encode(QByteArray & arr); + }; + + class FindNodeReq : public MsgBase + { + public: + FindNodeReq(const Key & id,const Key & target); + virtual ~FindNodeReq(); + + virtual void apply(DHT* dh_table); + virtual void print(); + virtual void encode(QByteArray & arr); + + const Key & getTarget() const {return target;} + + private: + Key target; + }; + + class GetPeersReq : public MsgBase + { + public: + GetPeersReq(const Key & id,const Key & info_hash); + virtual ~GetPeersReq(); + + const Key & getInfoHash() const {return info_hash;} + virtual void apply(DHT* dh_table); + virtual void print(); + virtual void encode(QByteArray & arr); + protected: + Key info_hash; + }; + + class AnnounceReq : public GetPeersReq + { + public: + AnnounceReq(const Key & id,const Key & info_hash,bt::Uint16 port,const Key & token); + virtual ~AnnounceReq(); + + virtual void apply(DHT* dh_table); + virtual void print(); + virtual void encode(QByteArray & arr); + + const Key & getToken() const {return token;} + bt::Uint16 getPort() const {return port;} + private: + bt::Uint16 port; + Key token; + }; + + class PingRsp : public MsgBase + { + public: + PingRsp(Uint8 mtid,const Key & id); + virtual ~PingRsp(); + + virtual void apply(DHT* dh_table); + virtual void print(); + virtual void encode(QByteArray & arr); + }; + + + + class FindNodeRsp : public MsgBase + { + public: + FindNodeRsp(Uint8 mtid,const Key & id,const QByteArray & nodes); + virtual ~FindNodeRsp(); + + virtual void apply(DHT* dh_table); + virtual void print(); + virtual void encode(QByteArray & arr); + + const QByteArray & getNodes() const {return nodes;} + protected: + QByteArray nodes; + }; + + class GetPeersRsp : public MsgBase + { + public: + GetPeersRsp(Uint8 mtid,const Key & id,const QByteArray & data,const Key & token); + GetPeersRsp(Uint8 mtid,const Key & id,const DBItemList & values,const Key & token); + virtual ~GetPeersRsp(); + + virtual void apply(DHT* dh_table); + virtual void print(); + virtual void encode(QByteArray & arr); + + const QByteArray & getData() const {return data;} + const DBItemList & getItemList() const {return items;} + const Key & getToken() const {return token;} + bool containsNodes() const {return data.size() > 0;} + bool containsValues() const {return data.size() == 0;} + private: + Key token; + QByteArray data; + DBItemList items; + }; + + + class AnnounceRsp : public MsgBase + { + public: + AnnounceRsp(Uint8 mtid,const Key & id); + virtual ~AnnounceRsp(); + + virtual void apply(DHT* dh_table); + virtual void print(); + virtual void encode(QByteArray & arr); + }; + + +} + +#endif |