SingleDownload.h
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:3k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // SingleDownload.h: interface for the CSingleDownload class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_SINGLEDOWNLOAD_H__ED8FB68A_724C_4B21_AB2A_DE37B7932B3C__INCLUDED_)
  5. #define AFX_SINGLEDOWNLOAD_H__ED8FB68A_724C_4B21_AB2A_DE37B7932B3C__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include "Measure.h"
  10. class CDownloader;
  11. class CConnection;
  12. class CDownloaderFeedback;
  13. class CRequestsItem
  14. {
  15. public:
  16. CRequestsItem(long index, long begin, long length)
  17. {
  18. m_index = index;
  19. m_begin = begin;
  20. m_length = length;
  21. }
  22. bool operator == (CRequestsItem& other)
  23. {
  24. if (m_index == other.m_index && 
  25. m_begin == other.m_begin &&
  26. m_length == other.m_length)
  27. return true;
  28. return false;
  29. }
  30. long m_index;
  31. long m_begin;
  32. long m_length;
  33. };
  34. class CSingleDownload  
  35. {
  36. public:
  37. CSingleDownload(CDownloaderFeedback* pDownloaderFeedback,CDownloader* pDownloader, CConnection* pConnection);
  38. virtual ~CSingleDownload();
  39. void got_have_bitfield(vector<bool>& vHave);
  40. void got_have(long index);
  41. bool got_piece(long index,long begin, memstream& memPiece);
  42. void got_unchoke();
  43. void got_choke();
  44. void disconnected();
  45. bool is_snubbed();
  46. long get_rate();
  47. long get_total();
  48. bool is_interested();
  49. bool is_choked();
  50. float GetHaveCountPercent();
  51. void get_have(vector<bool>& vHave) ;
  52. long get_have_count() const;
  53. void get_new_have(vector<bool>& vHave);
  54. void download_more(vector<long>& vPieces = vector<long>());
  55. // for endgame.
  56. void cancel_endgame();
  57. void make_endgame(vector<CRequestsItem>& vRequests);
  58. void mak_endgameflush();
  59. private:
  60. void _check_interest(vector<long>& vHit);
  61. void _lost_interest(vector<long>& vHit);
  62. void _d(vector<long>&vPieces, vector<long>& vHit);
  63. void _letgo();
  64. CDownloader* m_pDownloader;
  65. CConnection* m_pConnection;
  66. bool m_bChoked;
  67. bool m_bInterested;
  68. vector<CRequestsItem> m_vActiveRequests;
  69. CMeasure m_measure;
  70. vector<bool> m_vHave;
  71. time_t m_tLast;
  72. // for endgame.
  73. void send_request_end(long index, long begin, long length);
  74. void got_have_bitfield_end(vector<bool>& vHave);
  75. void got_have_end(long index);
  76. bool got_piece_end(long index,long begin, memstream& memPiece);
  77. void got_unchoke_end();
  78. void got_choke_end();
  79. void disconnected_end();
  80. void SendCancel(long index, long begin, long length, CSingleDownload* pOwner);
  81. bool m_bEndgame;
  82. long m_lHave;
  83. // for feedback
  84. CDownloaderFeedback* m_pDownloaderFeedback;
  85. long m_lAddr;
  86. short m_sPort;
  87. vector<long> m_vNewHave;
  88. };
  89. #endif // !defined(AFX_SINGLEDOWNLOAD_H__ED8FB68A_724C_4B21_AB2A_DE37B7932B3C__INCLUDED_)