RequestGroup.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. /* <!-- copyright */
  2. /*
  3. * aria2 - The high speed download utility
  4. *
  5. * Copyright (C) 2006 Tatsuhiro Tsujikawa
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * In addition, as a special exception, the copyright holders give
  22. * permission to link the code of portions of this program with the
  23. * OpenSSL library under certain conditions as described in each
  24. * individual source file, and distribute linked combinations
  25. * including the two.
  26. * You must obey the GNU General Public License in all respects
  27. * for all of the code used other than OpenSSL. If you modify
  28. * file(s) with this exception, you may extend this exception to your
  29. * version of the file(s), but you are not obligated to do so. If you
  30. * do not wish to do so, delete this exception statement from your
  31. * version. If you delete this exception statement from all source
  32. * files in the program, then also delete it here.
  33. */
  34. /* copyright --> */
  35. #ifndef _D_REQUEST_GROUP_H_
  36. #define _D_REQUEST_GROUP_H_
  37. #include "common.h"
  38. #include "SharedHandle.h"
  39. #include "TransferStat.h"
  40. #include <string>
  41. #include <deque>
  42. namespace aria2 {
  43. class DownloadEngine;
  44. class SegmentMan;
  45. class SegmentManFactory;
  46. class Command;
  47. class DownloadContext;
  48. class PieceStorage;
  49. class BtProgressInfoFile;
  50. class Dependency;
  51. class PreDownloadHandler;
  52. class PostDownloadHandler;
  53. class DiskWriterFactory;
  54. class Option;
  55. class Logger;
  56. class RequestGroup;
  57. class CheckIntegrityEntry;
  58. class DownloadResult;
  59. class ServerHost;
  60. class RequestGroup {
  61. private:
  62. static int32_t _gidCounter;
  63. int32_t _gid;
  64. std::deque<std::string> _uris;
  65. std::deque<std::string> _spentUris;
  66. unsigned int _numConcurrentCommand;
  67. /**
  68. * This is the number of connections used in streaming protocol(http/ftp)
  69. */
  70. unsigned int _numStreamConnection;
  71. unsigned int _numCommand;
  72. SharedHandle<SegmentMan> _segmentMan;
  73. SharedHandle<SegmentManFactory> _segmentManFactory;
  74. SharedHandle<DownloadContext> _downloadContext;
  75. SharedHandle<PieceStorage> _pieceStorage;
  76. SharedHandle<BtProgressInfoFile> _progressInfoFile;
  77. SharedHandle<DiskWriterFactory> _diskWriterFactory;
  78. SharedHandle<Dependency> _dependency;
  79. std::deque<SharedHandle<ServerHost> > _serverHosts;
  80. bool _fileAllocationEnabled;
  81. bool _preLocalFileCheckEnabled;
  82. bool _haltRequested;
  83. bool _forceHaltRequested;
  84. bool _singleHostMultiConnectionEnabled;
  85. std::deque<SharedHandle<PreDownloadHandler> > _preDownloadHandlers;
  86. std::deque<SharedHandle<PostDownloadHandler> > _postDownloadHandlers;
  87. std::deque<std::string> _acceptFeatures;
  88. const Option* _option;
  89. Logger* _logger;
  90. void validateFilename(const std::string& expectedFilename,
  91. const std::string& actualFilename) const;
  92. void validateTotalLength(uint64_t expectedTotalLength,
  93. uint64_t actualTotalLength) const;
  94. void initializePreDownloadHandler();
  95. void initializePostDownloadHandler();
  96. bool tryAutoFileRenaming();
  97. public:
  98. RequestGroup(const Option* option, const std::deque<std::string>& uris);
  99. ~RequestGroup();
  100. /**
  101. * Reinitializes SegmentMan based on current property values and
  102. * returns new one.
  103. */
  104. SharedHandle<SegmentMan> initSegmentMan();
  105. SharedHandle<SegmentMan> getSegmentMan() const;
  106. std::deque<Command*> createInitialCommand(DownloadEngine* e);
  107. std::deque<Command*> createNextCommandWithAdj(DownloadEngine* e, int numAdj);
  108. std::deque<Command*> createNextCommand(DownloadEngine* e, unsigned int numCommand, const std::string& method = "GET");
  109. void addURI(const std::string& uri)
  110. {
  111. _uris.push_back(uri);
  112. }
  113. bool downloadFinished() const;
  114. bool allDownloadFinished() const;
  115. void closeFile();
  116. std::string getFilePath() const;
  117. std::string getDir() const;
  118. uint64_t getTotalLength() const;
  119. uint64_t getCompletedLength() const;
  120. const std::deque<std::string>& getRemainingUris() const
  121. {
  122. return _uris;
  123. }
  124. const std::deque<std::string>& getSpentUris() const
  125. {
  126. return _spentUris;
  127. }
  128. std::deque<std::string> getUris() const;
  129. /**
  130. * Compares expected filename with specified actualFilename.
  131. * The expected filename refers to FileEntry::getBasename() of the first
  132. * element of DownloadContext::getFileEntries()
  133. */
  134. void validateFilename(const std::string& actualFilename) const;
  135. void validateTotalLength(uint64_t actualTotalLength) const;
  136. void setSegmentManFactory(const SharedHandle<SegmentManFactory>& segmentManFactory);
  137. void setNumConcurrentCommand(unsigned int num)
  138. {
  139. _numConcurrentCommand = num;
  140. }
  141. int32_t getGID() const
  142. {
  143. return _gid;
  144. }
  145. TransferStat calculateStat();
  146. SharedHandle<DownloadContext> getDownloadContext() const;
  147. void setDownloadContext(const SharedHandle<DownloadContext>& downloadContext);
  148. SharedHandle<PieceStorage> getPieceStorage() const;
  149. void setPieceStorage(const SharedHandle<PieceStorage>& pieceStorage);
  150. SharedHandle<BtProgressInfoFile> getProgressInfoFile() const;
  151. void setProgressInfoFile(const SharedHandle<BtProgressInfoFile>& progressInfoFile);
  152. void increaseStreamConnection();
  153. void decreaseStreamConnection();
  154. unsigned int getNumConnection() const;
  155. void increaseNumCommand();
  156. void decreaseNumCommand();
  157. unsigned int getNumCommand() const
  158. {
  159. return _numCommand;
  160. }
  161. // TODO is it better to move the following 2 methods to SingleFileDownloadContext?
  162. void setDiskWriterFactory(const SharedHandle<DiskWriterFactory>& diskWriterFactory);
  163. SharedHandle<DiskWriterFactory> getDiskWriterFactory() const;
  164. void setFileAllocationEnabled(bool f)
  165. {
  166. _fileAllocationEnabled = f;
  167. }
  168. bool isFileAllocationEnabled() const
  169. {
  170. return _fileAllocationEnabled;
  171. }
  172. bool needsFileAllocation() const;
  173. /**
  174. * Setting _preLocalFileCheckEnabled to false, then skip the check to see
  175. * if a file is already exists and control file exists etc.
  176. * Always open file with DiskAdaptor::initAndOpenFile()
  177. */
  178. void setPreLocalFileCheckEnabled(bool f)
  179. {
  180. _preLocalFileCheckEnabled = f;
  181. }
  182. bool isPreLocalFileCheckEnabled() const
  183. {
  184. return _preLocalFileCheckEnabled;
  185. }
  186. void setHaltRequested(bool f);
  187. void setForceHaltRequested(bool f);
  188. bool isHaltRequested() const
  189. {
  190. return _haltRequested;
  191. }
  192. bool isForceHaltRequested() const
  193. {
  194. return _forceHaltRequested;
  195. }
  196. void dependsOn(const SharedHandle<Dependency>& dep);
  197. bool isDependencyResolved();
  198. void releaseRuntimeResource();
  199. std::deque<SharedHandle<RequestGroup> > postDownloadProcessing();
  200. void addPostDownloadHandler(const SharedHandle<PostDownloadHandler>& handler);
  201. void clearPostDowloadHandler();
  202. void preDownloadProcessing();
  203. void addPreDownloadHandler(const SharedHandle<PreDownloadHandler>& handler);
  204. void clearPreDowloadHandler();
  205. std::deque<Command*>
  206. processCheckIntegrityEntry(const SharedHandle<CheckIntegrityEntry>& entry,
  207. DownloadEngine* e);
  208. void initPieceStorage();
  209. bool downloadFinishedByFileLength();
  210. void loadAndOpenFile(const SharedHandle<BtProgressInfoFile>& progressInfoFile);
  211. void shouldCancelDownloadForSafety();
  212. SharedHandle<DownloadResult> createDownloadResult() const;
  213. const Option* getOption() const
  214. {
  215. return _option;
  216. }
  217. bool isSingleHostMultiConnectionEnabled() const
  218. {
  219. return _singleHostMultiConnectionEnabled;
  220. }
  221. void setSingleHostMultiConnectionEnabled(bool f)
  222. {
  223. _singleHostMultiConnectionEnabled = f;
  224. }
  225. /**
  226. * Registers given ServerHost.
  227. */
  228. void registerServerHost(const SharedHandle<ServerHost>& serverHost);
  229. /**
  230. * Returns ServerHost whose cuid is given cuid. If it is not found, returns
  231. * 0.
  232. */
  233. SharedHandle<ServerHost> searchServerHost(int32_t cuid) const;
  234. SharedHandle<ServerHost> searchServerHost(const std::string& hostname) const;
  235. void removeServerHost(int32_t cuid);
  236. void removeURIWhoseHostnameIs(const std::string& hostname);
  237. void reportDownloadFinished();
  238. const std::deque<std::string>& getAcceptFeatures() const;
  239. void addAcceptFeatureHeader(const std::string& feature);
  240. void removeAcceptFeatureHeader(const std::string& feature);
  241. static const std::string FEATURE_METALINK;
  242. };
  243. typedef SharedHandle<RequestGroup> RequestGroupHandle;
  244. typedef WeakHandle<RequestGroup> RequestGroupWeakHandle;
  245. typedef std::deque<RequestGroupHandle> RequestGroups;
  246. } // namespace aria2
  247. #endif // _D_REQUEST_GROUP_H_