RequestGroup.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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. std::deque<std::string> _acceptTypes;
  89. const Option* _option;
  90. Logger* _logger;
  91. void validateFilename(const std::string& expectedFilename,
  92. const std::string& actualFilename) const;
  93. void validateTotalLength(uint64_t expectedTotalLength,
  94. uint64_t actualTotalLength) const;
  95. void initializePreDownloadHandler();
  96. void initializePostDownloadHandler();
  97. bool tryAutoFileRenaming();
  98. public:
  99. RequestGroup(const Option* option, const std::deque<std::string>& uris);
  100. ~RequestGroup();
  101. /**
  102. * Reinitializes SegmentMan based on current property values and
  103. * returns new one.
  104. */
  105. SharedHandle<SegmentMan> initSegmentMan();
  106. SharedHandle<SegmentMan> getSegmentMan() const;
  107. std::deque<Command*> createInitialCommand(DownloadEngine* e);
  108. std::deque<Command*> createNextCommandWithAdj(DownloadEngine* e, int numAdj);
  109. std::deque<Command*> createNextCommand(DownloadEngine* e, unsigned int numCommand, const std::string& method = "GET");
  110. void addURI(const std::string& uri)
  111. {
  112. _uris.push_back(uri);
  113. }
  114. bool downloadFinished() const;
  115. bool allDownloadFinished() const;
  116. void closeFile();
  117. std::string getFilePath() const;
  118. std::string getDir() const;
  119. uint64_t getTotalLength() const;
  120. uint64_t getCompletedLength() const;
  121. const std::deque<std::string>& getRemainingUris() const
  122. {
  123. return _uris;
  124. }
  125. const std::deque<std::string>& getSpentUris() const
  126. {
  127. return _spentUris;
  128. }
  129. std::deque<std::string> getUris() const;
  130. /**
  131. * Compares expected filename with specified actualFilename.
  132. * The expected filename refers to FileEntry::getBasename() of the first
  133. * element of DownloadContext::getFileEntries()
  134. */
  135. void validateFilename(const std::string& actualFilename) const;
  136. void validateTotalLength(uint64_t actualTotalLength) const;
  137. void setSegmentManFactory(const SharedHandle<SegmentManFactory>& segmentManFactory);
  138. void setNumConcurrentCommand(unsigned int num)
  139. {
  140. _numConcurrentCommand = num;
  141. }
  142. int32_t getGID() const
  143. {
  144. return _gid;
  145. }
  146. TransferStat calculateStat();
  147. SharedHandle<DownloadContext> getDownloadContext() const;
  148. void setDownloadContext(const SharedHandle<DownloadContext>& downloadContext);
  149. SharedHandle<PieceStorage> getPieceStorage() const;
  150. void setPieceStorage(const SharedHandle<PieceStorage>& pieceStorage);
  151. SharedHandle<BtProgressInfoFile> getProgressInfoFile() const;
  152. void setProgressInfoFile(const SharedHandle<BtProgressInfoFile>& progressInfoFile);
  153. void increaseStreamConnection();
  154. void decreaseStreamConnection();
  155. unsigned int getNumConnection() const;
  156. void increaseNumCommand();
  157. void decreaseNumCommand();
  158. unsigned int getNumCommand() const
  159. {
  160. return _numCommand;
  161. }
  162. // TODO is it better to move the following 2 methods to SingleFileDownloadContext?
  163. void setDiskWriterFactory(const SharedHandle<DiskWriterFactory>& diskWriterFactory);
  164. SharedHandle<DiskWriterFactory> getDiskWriterFactory() const;
  165. void setFileAllocationEnabled(bool f)
  166. {
  167. _fileAllocationEnabled = f;
  168. }
  169. bool isFileAllocationEnabled() const
  170. {
  171. return _fileAllocationEnabled;
  172. }
  173. bool needsFileAllocation() const;
  174. /**
  175. * Setting _preLocalFileCheckEnabled to false, then skip the check to see
  176. * if a file is already exists and control file exists etc.
  177. * Always open file with DiskAdaptor::initAndOpenFile()
  178. */
  179. void setPreLocalFileCheckEnabled(bool f)
  180. {
  181. _preLocalFileCheckEnabled = f;
  182. }
  183. bool isPreLocalFileCheckEnabled() const
  184. {
  185. return _preLocalFileCheckEnabled;
  186. }
  187. void setHaltRequested(bool f);
  188. void setForceHaltRequested(bool f);
  189. bool isHaltRequested() const
  190. {
  191. return _haltRequested;
  192. }
  193. bool isForceHaltRequested() const
  194. {
  195. return _forceHaltRequested;
  196. }
  197. void dependsOn(const SharedHandle<Dependency>& dep);
  198. bool isDependencyResolved();
  199. void releaseRuntimeResource();
  200. std::deque<SharedHandle<RequestGroup> > postDownloadProcessing();
  201. void addPostDownloadHandler(const SharedHandle<PostDownloadHandler>& handler);
  202. void clearPostDowloadHandler();
  203. void preDownloadProcessing();
  204. void addPreDownloadHandler(const SharedHandle<PreDownloadHandler>& handler);
  205. void clearPreDowloadHandler();
  206. std::deque<Command*>
  207. processCheckIntegrityEntry(const SharedHandle<CheckIntegrityEntry>& entry,
  208. DownloadEngine* e);
  209. void initPieceStorage();
  210. bool downloadFinishedByFileLength();
  211. void loadAndOpenFile(const SharedHandle<BtProgressInfoFile>& progressInfoFile);
  212. void shouldCancelDownloadForSafety();
  213. SharedHandle<DownloadResult> createDownloadResult() const;
  214. const Option* getOption() const
  215. {
  216. return _option;
  217. }
  218. bool isSingleHostMultiConnectionEnabled() const
  219. {
  220. return _singleHostMultiConnectionEnabled;
  221. }
  222. void setSingleHostMultiConnectionEnabled(bool f)
  223. {
  224. _singleHostMultiConnectionEnabled = f;
  225. }
  226. /**
  227. * Registers given ServerHost.
  228. */
  229. void registerServerHost(const SharedHandle<ServerHost>& serverHost);
  230. /**
  231. * Returns ServerHost whose cuid is given cuid. If it is not found, returns
  232. * 0.
  233. */
  234. SharedHandle<ServerHost> searchServerHost(int32_t cuid) const;
  235. SharedHandle<ServerHost> searchServerHost(const std::string& hostname) const;
  236. void removeServerHost(int32_t cuid);
  237. void removeURIWhoseHostnameIs(const std::string& hostname);
  238. void reportDownloadFinished();
  239. const std::deque<std::string>& getAcceptFeatures() const;
  240. void addAcceptFeatureHeader(const std::string& feature);
  241. void removeAcceptFeatureHeader(const std::string& feature);
  242. const std::deque<std::string>& getAcceptTypes() const;
  243. void addAcceptType(const std::string& type);
  244. void removeAcceptType(const std::string& type);
  245. static const std::string ACCEPT_METALINK;
  246. };
  247. typedef SharedHandle<RequestGroup> RequestGroupHandle;
  248. typedef WeakHandle<RequestGroup> RequestGroupWeakHandle;
  249. typedef std::deque<RequestGroupHandle> RequestGroups;
  250. } // namespace aria2
  251. #endif // _D_REQUEST_GROUP_H_