00001 #ifndef KADEMLIA_INTERFACE_H
00002 #define KADEMLIA_INTERFACE_H
00003
00004
00005 #include "../kademlia/kademlia/Kademlia.h"
00006 #include "../kademlia/kademlia/Prefs.h"
00007 #include "Logger.h"
00008 #include "../kademlia/utils/KadUDPKey.h"
00009 #include "multicast.h"
00010
00011
00012
00013 class CKnownFileList;
00014 class CSharedFileList;
00015 class CSearchList;
00016 class CSearchFile;
00017 class CPartFile;
00018 class CFileTransfer;
00019 class CMulticast;
00020
00021 typedef std::pair<uint32_t, uint16_t> AddrPortPair;
00022
00032 class CKadInterface{
00033
00034 public:
00035
00042 CKadInterface(std::string sFilename);
00043
00047 virtual ~CKadInterface();
00048
00054 int Run();
00055
00059 void StartKad();
00060
00064 void StopKad();
00065
00069 void BootstrapKad();
00070
00075 void GetAllContacts() ;
00076 void FindNodeByID(const uint8_t* nodeID);
00077 uint32_t GetPublicIP(bool ignorelocal) ;
00078 int GetSockFd(){return m_iSockFd;}
00079 int GetDaemonSockFd(){return m_iDaemonSockFd;}
00080 int GetClientTcpSockFd(){return m_iClientTcpSockFd;}
00081 int GetPeerSockFd(){return m_iPeerSockFd;}
00082 void SetPeerSockFd(int iFd){m_iPeerSockFd=iFd;}
00083
00087 void CleanUp();
00088
00092 void SearchSrcKad(CSearchFile* toadd);
00093
00097 void KademliaSearchFile(uint32_t searchID, const Kademlia::CUInt128* pcontactID, const Kademlia::CUInt128* pbuddyID, uint8_t type, uint32_t ip, uint16_t tcp, uint16_t udp, uint32_t buddyip, uint16_t buddyport, uint8_t byCryptOptions);
00098 CPartFile* GetFileByID(const CMD4Hash& filehash) const;
00099
00106 std::string GetSharedDir(){return m_sSharedDir;}
00107
00113 std::string GetDownloadDir(){return m_sDownloadDir;}
00114 const int* GetSocketPair(){return m_iSockPairFd;}
00115
00119 void PublishFile(const std::string& sFile);
00120
00124 void SearchKeyKad(const std::string& sSearchStr);
00125
00129 void AddSource(uint32_t searchID, uint32_t ip, uint16_t port);
00130
00135 int CheckFileTransferStatus(int iFd);
00136 std::string MakeAbsPath(const std::string& sPath);
00137
00141 void SetDownloadDir(const std::string& sPath);
00142
00146 CMulticast* GetMulticastInstance(){return m_pMulticast;}
00147
00152 bool IsGossipEnable(){return m_bGossipEnable;}
00153
00158 bool IsMulticastEnable(){return m_bMulticastEnable;}
00159
00163 void BootstrapKad(uint32_t ip, uint16_t port);
00164
00165
00166
00167
00168
00169 private:
00178 void StartNetworkThread();
00179 void SetLogger();
00180 static void *ThreadCallback(void *arg);
00181
00185 int CreateSocket();
00186
00190 int CreateDaemonSocket();
00191
00195 int CreateClientTcpSocket();
00196
00197 void CheckEvent(int iFd);
00198 int CheckDaemonEvent(int iFd);
00199 void DestroySocket();
00200
00205 int ParseConfig();
00206 std::string GetString(const std::vector<std::string>& vConf, const std::string& sLine);
00207 void StrTrim(std::string&)const;
00208
00214 void OnTimer();
00215 void SetSharedDir(const std::string& sPath);
00216
00220 virtual void OnPacketReceived(uint32_t ip, uint16_t port, byte* buffer, size_t length);
00221
00227 virtual int OnCommandReceived(int iFd){std::cout<<"i am in kad\n"; return 0;}
00228
00233 virtual void NotifyApp(const std::string& sFileName, uint8_t filetype, uint8_t relatedModule );
00234
00238 virtual void ProcessTcpGossipPacket(const std::string& sFileName, uint32 ip, uint16 port, uint8_t module);
00239
00240 CPartFile* GetFileByKadFileSearchID(uint32 id) const;
00241 CFileTransfer* CheckFileTransByID(const int iSearchID) const;
00242 CFileTransfer* CheckFileTransByHash(const CMD4Hash& fHash) const;
00243 int InitSocketPair();
00244
00249 void RetrySource(int iSearchID);
00250
00254 void MakeDirs();
00255 void ShutdownNetworkThread();
00256
00257
00258 private:
00259 int m_iSockFd;
00260 int m_iDaemonSockFd;
00261 int m_iPeerSockFd;
00262 int m_iClientTcpSockFd;
00263
00264 std::string m_sConfigFileName;
00265 std::string m_sClientName;
00266 bool m_bBootstrapEnable;
00267 bool m_bKadLogEnable;
00268 uint32_t m_uClientIP;
00269 uint16_t m_uClientPort;
00270 uint32_t m_uBootIP;
00271 uint16_t m_uBootPort;
00272 pthread_t m_Thread;
00273 uint16_t m_uDaemonTcpPort;
00274 uint16_t m_uClientTcpPort;
00275
00276 CKnownFileList* knownfiles;
00277
00278 typedef std::deque<CPartFile*> FileQueue;
00279 FileQueue m_filelist;
00280
00281 std::string m_sSharedDir;
00282 std::string m_sDownloadDir;
00283 int m_iSockPairFd[2];
00284
00285 std::map<int, std::vector<AddrPortPair> > m_SourceMap;
00286
00287
00288 bool m_bMulticastEnable;
00289 bool m_bGossipEnable;
00290 std::string m_sMulticastInterface;
00291 uint32_t m_uMulticastIP;
00292 uint16_t m_uMulticastPort;
00293
00294 CMulticast *m_pMulticast;
00295 bool m_bInit;
00296
00297 public:
00298 typedef std::deque<CFileTransfer*> FileTransfer;
00299 FileTransfer m_filetrans;
00300
00301 CSharedFileList* sharedfiles;
00302 CSearchList* searchlist ;
00303 };
00304
00305
00306
00307
00308
00309
00310 #endif //KADEMLIA_INTERFACE_H
00311