00001 #ifndef GOSSIP_H
00002 #define GOSSIP_H
00003
00004
00005
00006 #include <boost/uuid/uuid.hpp>
00007 #include <boost/uuid/uuid_generators.hpp>
00008
00009 #include "kademlia_interface.h"
00010 #include "EventMessage.h"
00011
00012
00013
00014 #define GOSSIP_PROTO 0xC1
00015 #define MAXCHAR 1500
00016 #define MAX_FORWARD 3
00017
00018 #define MAX_GOSSIP_SEND 5
00019
00026 struct _TransactionLog{
00027
00028 time_t t;
00029 boost::uuids::uuid Tag;
00030 std::string sFileName;
00031 _TransactionLog(time_t time, boost::uuids::uuid id, const std::string& s):
00032 t(time),
00033 Tag(id),
00034 sFileName(s){
00035 }
00036 };
00037 typedef _TransactionLog TransactionLog;
00038
00039
00043 struct gossipPacket{
00044 uint8_t m_iProtocol;
00045 boost::uuids::uuid m_Tag;
00046
00047 uint8_t m_cPack[MAXCHAR];
00048
00049 };
00050 typedef struct gossipPacket GossipPacket;
00051
00052 typedef std::map<boost::uuids::uuid, std::vector< std::string > > MapFwHist;
00053
00054 class CBootStrapClient;
00055
00056
00061 class CGossip:public CKadInterface{
00062
00063 public:
00067 virtual ~CGossip();
00068
00069
00074 static CGossip* getGossipInstance(std::string);
00075
00080 void NotifyApp(const std::string& sFileName, uint8_t filetype, uint8_t relatedModule);
00081
00086 int GetTransactionLog(std::string& transList)const;
00087
00091 int FindMissingGossip(const std::string& sTransList, std::string& sMissingList)const;
00092
00097 int SendMissingGossip(const std::string& sMissingList, uint32_t ip, uint16_t port);
00098
00099
00100
00101 private:
00102 static bool bInstance;
00103 static CGossip* instance;
00108 CGossip(std::string sFileName);
00109
00110 private:
00114 void ProcessGossipPacket(const GossipPacket& gPack, uint32 ip, uint16 port, size_t length);
00115
00119 int SendGossipPacket(const GossipPacket& packet, int pktLen, uint32_t destinationHost, uint16_t destinationPort);
00120
00124 void OnPacketReceived(uint32 ip, uint16 port, byte* buffer, size_t length);
00125
00129 int OnCommandReceived(int iFd);
00130
00134 int SendCommand(const GossipPacket& gPack, int len, uint32_t srcIP, uint16_t srcPort);
00135
00140 int SendTcpCommand(const std::string& sFileToSend, const boost::uuids::uuid& Tag, uint32_t srcIP, uint16_t srcPort);
00141
00145 int SendCommand(const std::string& sCommand, bool bTcp = false, uint8_t module = MODULE_GOSSIP);
00146
00150 int NotifyCommand(const std::string&);
00151
00156 int GetTransactionID(const std::string& sFile, boost::uuids::uuid& id);
00157
00161 int SendTcpGossipPacket(const std::string& sFileName, uint32_t destinationHost, uint16_t destinationPort);
00162
00166 void ProcessTcpGossipPacket(const std::string& sFileName, uint32 ip, uint16 port, uint8_t module);
00167 std::string CopyFileToTmpDir(const std::string & sFile);
00168
00172 int GetKadBootstrapInfo(int iServerIP, int iPort);
00173
00178 int DoTransactionLog(const boost::uuids::uuid&Tag, const std::string& sFileName);
00179 std::string BackupFileToDownloadDir(const std::string & sFile, const boost::uuids::uuid& Tag);
00180
00184 int SendMissingGossip(const boost::uuids::uuid& Tag, uint32_t ip, uint16_t port);
00185
00186
00187
00188
00189 private:
00190
00191 MapFwHist mFwHist;
00192 MapFwHist mRecvHist;
00193
00194 typedef std::deque<CFileTransfer*> FileTransfer;
00195 FileTransfer m_gfiletrans;
00196 CBootStrapClient* m_pBootStrapClient;
00197
00198
00199 std::deque<TransactionLog> m_qTransactionLog;
00200
00201
00202
00203 };
00204
00205 #endif //GOSSIP_H
00206
00207