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

P2P编程

开发平台:

Visual C++

  1. // StorageWrapperEx.h: interface for the CStorageWrapperEx class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_STORAGEWRAPPEREX_H__52F46C21_CE25_4B36_B301_3C55E459E680__INCLUDED_)
  5. #define AFX_STORAGEWRAPPEREX_H__52F46C21_CE25_4B36_B301_3C55E459E680__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. class CDownloaderFeedback;
  10. class CStorageEx;
  11. class CDownloader;
  12. class CStorageWrapperEx
  13. {
  14. class CHashItem
  15. {
  16. public:
  17. CHashItem(const char* const pBuf)
  18. {
  19. memcpy(szBuf, pBuf, 20);
  20. }
  21. CHashItem()
  22. {
  23. memset(szBuf, 0, 20);
  24. }
  25. CHashItem& operator = (const char* const pother)
  26. {
  27. memcpy(szBuf, pother, 20);
  28. return *this;
  29. }
  30. CHashItem& operator = (const CHashItem& other)
  31. {
  32. memcpy(szBuf, other.szBuf, 20);
  33. return *this;
  34. }
  35. bool operator == (const unsigned char other [20])  const
  36. {
  37. return memcmp(szBuf, other, 20) == 0;
  38. }
  39. bool operator != (const unsigned char other [20])  const
  40. {
  41. return memcmp(szBuf, other, 20) != 0;
  42. }
  43. bool operator == (const CHashItem& other)  const
  44. {
  45. return memcmp(szBuf, other.szBuf, 20) == 0;
  46. }
  47. bool operator < (const CHashItem& other)  const
  48. {
  49. return memcmp(szBuf, other.szBuf, 20) < 0;
  50. }
  51. char  szBuf[20];
  52. };
  53. class size
  54. {
  55. public :
  56. size(long _x, long _y)
  57. {
  58. x = _x;
  59. y = _y;
  60. }
  61. bool operator == (const size& other)  const
  62. {
  63. return (x == other.x && y == other.y);
  64. }
  65. long x;
  66. long y;
  67. };
  68. public:
  69. //
  70. // Unneeded files.
  71. //
  72. // Called by gui.
  73. void SetUnNeededFilesInxs(const vector<CSize>& vUnNeededFileInxs = vector<CSize>());
  74. float GetPartCompletedPercent();
  75. BLONG get_total_legth_part();
  76. BLONG get_amount_left_part();
  77. BLONG get_amount_left_part_include_temp();
  78. CStorageWrapperEx( );
  79. virtual ~CStorageWrapperEx();
  80. enum eAllocType {eAllocNormal, eAllocSparse, eAllocPreAllocate, eAllocBackGound};
  81. bool Create(CDownloaderFeedback* pMain,
  82. HANDLE hevDone, HANDLE hevUnPause, CStorageEx* pStorageEx, CDownloader* pDownloader, vector<char*>& vPieces, bool check_hashes,
  83. long request_size, long piece_length,  
  84. eAllocType eAllocType = eAllocNormal, long lAllocateRate = 1, bool m_bDoubleCheck = false, bool m_bTripleCheck = false) throw (string);
  85. bool get_piece(long index, char* pPieceBuf, long begin, long length);
  86. void piece_came_in(long index, char *pPieceBuf, long begin,  long length);
  87. void new_request(long index, long& begin, long& length);
  88. void request_lost(long index, long begin, long length);
  89. bool do_I_have(long index);
  90. vector<bool>& get_have_list();
  91. BLONG get_total_legth();
  92. bool do_I_have_anything();
  93. bool is_everything_pending();
  94. void _make_inactive(long index);
  95. bool do_I_have_requests(long index);
  96. BLONG get_amount_left();
  97. void OnIdle();
  98. private:
  99. bool _MakeOffsetToTruePlace(const long index, const long n);
  100. bool _FindPlaceForNewComeIndex(long index, bool bFirst);
  101. bool _do_I_have_requests(long index);
  102. bool _get_piece(long index, char* pPieceBuf, long begin, long length);
  103. bool _piece_came_in(long index, char *pPieceBuf, long begin,  long length);
  104. bool CheckAfterMoveing(int iIndex, char* pszBuf);
  105. bool _check_single(long index, bool check);
  106. bool CheckFiles();
  107. bool bgalloc();
  108. bool _bgalloc();
  109. bool _doalloc();
  110. long _piecelen(int iPiece);
  111. void markgot(long iPiece,long lPos);
  112. bool _waspre(int iIndex);
  113. void ShowDetailsTest();
  114. CDownloaderFeedback* m_pMain;
  115. HANDLE m_hevDone;
  116. HANDLE m_hevUnPause;
  117. CStorageEx* m_pStorage;
  118. CDownloader* m_pDownloader;
  119. long m_request_size;
  120. long m_piece_length;
  121. BLONG m_lTotalLength;
  122. BLONG m_lAmountLeft;
  123. vector<size> m_vNone;
  124. vector<long> m_vNumActive;
  125. vector<vector<size> > m_vInactiveRequests;
  126. vector<CHashItem> m_vHashs;
  127. vector<bool> m_vHave;
  128. BLONG  m_lAmountInactive;
  129. bool m_bCheckHashes;
  130. bool m_bDoubleCheck;
  131. bool m_bTripleCheck;
  132. bool m_bBgallocEnabled;
  133. bool m_bBgallocActive;
  134. eAllocType  m_eAllocType;
  135. vector<bool> m_vWasChecked;
  136. map<long, long > m_mPlaces;
  137. vector<long> m_vHoles;
  138. vector<bool> m_vStatActive;
  139. vector<bool> m_vStatNew;
  140. vector<bool> m_vDirty;
  141. long m_lStatNumflunked;
  142. long m_lStatMumdownloaded;
  143. long m_lStatNumfound;
  144. time_t m_tLast;
  145. time_t m_tTimeSpan;
  146. // 
  147. // switch Unneedfiles.
  148. //
  149. bool _NormalizeUneedRange(BLONG & lbegPos, BLONG & lendPos);
  150. bool _ReadIndexData(char *pBuf, const BLONG lPos, const BLONG lAmount, bool bFlushFirst = false);
  151. bool _WriteIndexData(char *pBuf, const BLONG lPos, const BLONG lAmount );
  152. void _FormatRangeHoles();
  153. void _MakeUnNeededIndexs();
  154. bool _GetUnNeededFilesInxs(vector<CSize>& vUnNeededFileInxs);
  155. bool IsUnNeededIndex(long lIndex);
  156. // CSize _GetFileOffset(const long index);
  157. // long _GetMinHolesIndex(const long index);
  158. long _GetRequestSize(long index);
  159. long m_lPartAmountInactive;
  160. BLONG m_lPartTotalLength;
  161. BLONG m_lPartAmountLeft;
  162. bool m_bModified;
  163. vector<CSize> m_vUnNeededFileInxs;
  164. vector<CSize> m_vUnNeededIndexs;
  165. vector<long> m_vRangeHoles;
  166. vector<long> m_vFileOffset;
  167. vector<long> m_vOffsetTrueIndex;
  168. vector<bool> m_vFileOffsetPreAllocated;
  169. map<unsigned long , unsigned long> m_mPartAmountIncome;
  170. CCriticalSection m_criticalSection;
  171. };
  172. class CStorageWrapper : public CStorageWrapperEx
  173. {
  174. public:
  175. CStorageWrapper (const vector<CSize>& vUnNeededFileInxs = vector<CSize>());
  176. };
  177. #endif // !defined(AFX_STORAGEWRAPPEREX_H__52F46C21_CE25_4B36_B301_3C55E459E680__INCLUDED_)