OptionHandlerFactory.cc 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905
  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. #include "OptionHandlerFactory.h"
  36. #include "prefs.h"
  37. #include "OptionHandlerImpl.h"
  38. #include "array_fun.h"
  39. #include "usage_text.h"
  40. #include "A2STR.h"
  41. #include "util.h"
  42. #include "help_tags.h"
  43. #include "a2functional.h"
  44. #include "File.h"
  45. namespace aria2 {
  46. std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
  47. {
  48. std::vector<OptionHandler*> handlers;
  49. static const std::string logLevels[] = {V_DEBUG, V_INFO, V_NOTICE, V_WARN,
  50. V_ERROR};
  51. // General Options
  52. {
  53. OptionHandler* op(new BooleanOptionHandler(PREF_ALLOW_OVERWRITE,
  54. TEXT_ALLOW_OVERWRITE, A2_V_FALSE,
  55. OptionHandler::OPT_ARG));
  56. op->addTag(TAG_ADVANCED);
  57. op->addTag(TAG_FILE);
  58. op->setInitialOption(true);
  59. op->setChangeGlobalOption(true);
  60. op->setChangeOptionForReserved(true);
  61. handlers.push_back(op);
  62. }
  63. {
  64. OptionHandler* op(new BooleanOptionHandler(
  65. PREF_ALLOW_PIECE_LENGTH_CHANGE, TEXT_ALLOW_PIECE_LENGTH_CHANGE,
  66. A2_V_FALSE, OptionHandler::OPT_ARG));
  67. op->addTag(TAG_ADVANCED);
  68. op->setInitialOption(true);
  69. op->setChangeGlobalOption(true);
  70. op->setChangeOptionForReserved(true);
  71. handlers.push_back(op);
  72. }
  73. {
  74. OptionHandler* op(new BooleanOptionHandler(PREF_ALWAYS_RESUME,
  75. TEXT_ALWAYS_RESUME, A2_V_TRUE,
  76. OptionHandler::OPT_ARG));
  77. op->addTag(TAG_ADVANCED);
  78. op->addTag(TAG_FTP);
  79. op->addTag(TAG_HTTP);
  80. op->setInitialOption(true);
  81. op->setChangeGlobalOption(true);
  82. op->setChangeOptionForReserved(true);
  83. handlers.push_back(op);
  84. }
  85. #ifdef ENABLE_ASYNC_DNS
  86. {
  87. OptionHandler* op(new BooleanOptionHandler(PREF_ASYNC_DNS, TEXT_ASYNC_DNS,
  88. #if defined(__ANDROID__) || defined(ANDROID)
  89. A2_V_FALSE,
  90. #else // !__ANDROID__ && !ANDROID
  91. A2_V_TRUE,
  92. #endif // !__ANDROID__ && !ANDROID
  93. OptionHandler::OPT_ARG));
  94. op->addTag(TAG_ADVANCED);
  95. op->setInitialOption(true);
  96. op->setChangeGlobalOption(true);
  97. op->setChangeOptionForReserved(true);
  98. handlers.push_back(op);
  99. }
  100. #if defined(HAVE_ARES_SET_SERVERS) && defined(HAVE_ARES_ADDR_NODE)
  101. {
  102. OptionHandler* op(new DefaultOptionHandler(
  103. PREF_ASYNC_DNS_SERVER, TEXT_ASYNC_DNS_SERVER, NO_DEFAULT_VALUE));
  104. op->addTag(TAG_ADVANCED);
  105. handlers.push_back(op);
  106. }
  107. #endif // HAVE_ARES_SET_SERVERS && HAVE_ARES_ADDR_NODE
  108. #endif // ENABLE_ASYNC_DNS
  109. {
  110. OptionHandler* op(new BooleanOptionHandler(
  111. PREF_AUTO_FILE_RENAMING, TEXT_AUTO_FILE_RENAMING, A2_V_TRUE,
  112. OptionHandler::OPT_ARG));
  113. op->addTag(TAG_ADVANCED);
  114. op->addTag(TAG_FILE);
  115. op->setInitialOption(true);
  116. op->setChangeGlobalOption(true);
  117. op->setChangeOptionForReserved(true);
  118. handlers.push_back(op);
  119. }
  120. {
  121. OptionHandler* op(new NumberOptionHandler(
  122. PREF_AUTO_SAVE_INTERVAL, TEXT_AUTO_SAVE_INTERVAL, "60", 0, 600));
  123. op->addTag(TAG_ADVANCED);
  124. handlers.push_back(op);
  125. }
  126. {
  127. OptionHandler* op(new BooleanOptionHandler(PREF_CHECK_INTEGRITY,
  128. TEXT_CHECK_INTEGRITY, A2_V_FALSE,
  129. OptionHandler::OPT_ARG, 'V'));
  130. op->addTag(TAG_BASIC);
  131. op->addTag(TAG_BITTORRENT);
  132. op->addTag(TAG_METALINK);
  133. op->addTag(TAG_FILE);
  134. op->addTag(TAG_CHECKSUM);
  135. op->setInitialOption(true);
  136. op->setChangeGlobalOption(true);
  137. op->setChangeOptionForReserved(true);
  138. handlers.push_back(op);
  139. }
  140. {
  141. OptionHandler* op(new BooleanOptionHandler(PREF_CONDITIONAL_GET,
  142. TEXT_CONDITIONAL_GET, A2_V_FALSE,
  143. OptionHandler::OPT_ARG));
  144. op->addTag(TAG_ADVANCED);
  145. op->addTag(TAG_HTTP);
  146. op->setInitialOption(true);
  147. op->setChangeGlobalOption(true);
  148. op->setChangeOptionForReserved(true);
  149. handlers.push_back(op);
  150. }
  151. {
  152. OptionHandler* op(new DefaultOptionHandler(
  153. PREF_CONF_PATH, TEXT_CONF_PATH, util::getConfigFile(), PATH_TO_FILE));
  154. op->addTag(TAG_ADVANCED);
  155. handlers.push_back(op);
  156. }
  157. {
  158. OptionHandler* op(new BooleanOptionHandler(
  159. PREF_CONTINUE, TEXT_CONTINUE, A2_V_FALSE, OptionHandler::OPT_ARG, 'c'));
  160. op->addTag(TAG_BASIC);
  161. op->addTag(TAG_FTP);
  162. op->addTag(TAG_HTTP);
  163. op->setInitialOption(true);
  164. op->setChangeGlobalOption(true);
  165. op->setChangeOptionForReserved(true);
  166. handlers.push_back(op);
  167. }
  168. {
  169. OptionHandler* op(new BooleanOptionHandler(
  170. PREF_DAEMON, TEXT_DAEMON, A2_V_FALSE, OptionHandler::OPT_ARG, 'D'));
  171. op->addTag(TAG_ADVANCED);
  172. handlers.push_back(op);
  173. }
  174. {
  175. OptionHandler* op(new UnitNumberOptionHandler(PREF_DISK_CACHE,
  176. TEXT_DISK_CACHE,
  177. #ifdef DEFAULT_DISK_CACHE
  178. DEFAULT_DISK_CACHE,
  179. #else
  180. "16M",
  181. #endif
  182. 0));
  183. op->addTag(TAG_ADVANCED);
  184. handlers.push_back(op);
  185. }
  186. {
  187. OptionHandler* op(new ParameterOptionHandler(
  188. PREF_CONSOLE_LOG_LEVEL, TEXT_CONSOLE_LOG_LEVEL, V_NOTICE,
  189. {std::begin(logLevels), std::end(logLevels)}));
  190. op->addTag(TAG_ADVANCED);
  191. handlers.push_back(op);
  192. }
  193. {
  194. OptionHandler* op(new BooleanOptionHandler(PREF_DEFERRED_INPUT,
  195. TEXT_DEFERRED_INPUT, A2_V_FALSE,
  196. OptionHandler::OPT_ARG));
  197. op->addTag(TAG_ADVANCED);
  198. handlers.push_back(op);
  199. }
  200. {
  201. OptionHandler* op(
  202. new DefaultOptionHandler(PREF_DIR, TEXT_DIR, File::getCurrentDir(),
  203. PATH_TO_DIR, OptionHandler::REQ_ARG, 'd'));
  204. op->addTag(TAG_BASIC);
  205. op->addTag(TAG_FILE);
  206. op->setInitialOption(true);
  207. op->setChangeGlobalOption(true);
  208. op->setChangeOptionForReserved(true);
  209. handlers.push_back(op);
  210. }
  211. {
  212. OptionHandler* op(new BooleanOptionHandler(PREF_DISABLE_IPV6,
  213. TEXT_DISABLE_IPV6,
  214. #if defined(__MINGW32__) && !defined(__MINGW64__)
  215. // Disable IPv6 by default for
  216. // MinGW build. This is because
  217. // numerous IPv6 routines are
  218. // available from Vista. Checking
  219. // getaddrinfo failed in
  220. // configure.
  221. A2_V_TRUE,
  222. #else // !defined(__MINGW32__) || defined(__MINGW64__)
  223. A2_V_FALSE,
  224. #endif // !defined(__MINGW32__) || defined(__MINGW64__)
  225. OptionHandler::OPT_ARG));
  226. op->addTag(TAG_ADVANCED);
  227. handlers.push_back(op);
  228. }
  229. {
  230. OptionHandler* op(
  231. new NumberOptionHandler(PREF_DNS_TIMEOUT, NO_DESCRIPTION, "30", 1, 60));
  232. op->hide();
  233. handlers.push_back(op);
  234. }
  235. {
  236. OptionHandler* op(
  237. new ParameterOptionHandler(PREF_DOWNLOAD_RESULT, TEXT_DOWNLOAD_RESULT,
  238. A2_V_DEFAULT, {A2_V_DEFAULT, A2_V_FULL}));
  239. op->addTag(TAG_ADVANCED);
  240. op->setChangeGlobalOption(true);
  241. handlers.push_back(op);
  242. }
  243. #ifdef ENABLE_ASYNC_DNS
  244. {
  245. // TODO Deprecated
  246. OptionHandler* op(new DeprecatedOptionHandler(
  247. new BooleanOptionHandler(PREF_ENABLE_ASYNC_DNS6, TEXT_ENABLE_ASYNC_DNS6,
  248. NO_DEFAULT_VALUE, OptionHandler::OPT_ARG)));
  249. op->addTag(TAG_ADVANCED);
  250. op->setInitialOption(true);
  251. op->setChangeGlobalOption(true);
  252. op->setChangeOptionForReserved(true);
  253. handlers.push_back(op);
  254. }
  255. #endif // ENABLE_ASYNC_DNS
  256. {
  257. OptionHandler* op(new BooleanOptionHandler(PREF_ENABLE_COLOR,
  258. TEXT_ENABLE_COLOR, A2_V_TRUE,
  259. OptionHandler::OPT_ARG));
  260. op->addTag(TAG_ADVANCED);
  261. handlers.push_back(op);
  262. }
  263. #if defined(HAVE_MMAP) || defined(__MINGW32__)
  264. {
  265. OptionHandler* op(new BooleanOptionHandler(PREF_ENABLE_MMAP,
  266. TEXT_ENABLE_MMAP, A2_V_FALSE,
  267. OptionHandler::OPT_ARG));
  268. op->addTag(TAG_ADVANCED);
  269. op->addTag(TAG_EXPERIMENTAL);
  270. op->setInitialOption(true);
  271. op->setChangeGlobalOption(true);
  272. op->setChangeOptionForReserved(true);
  273. handlers.push_back(op);
  274. }
  275. #endif // HAVE_MMAP || __MINGW32__
  276. {
  277. OptionHandler* op(new BooleanOptionHandler(
  278. PREF_ENABLE_RPC, TEXT_ENABLE_RPC, A2_V_FALSE, OptionHandler::OPT_ARG));
  279. op->addTag(TAG_RPC);
  280. handlers.push_back(op);
  281. }
  282. {
  283. OptionHandler* op(new ParameterOptionHandler(PREF_EVENT_POLL,
  284. TEXT_EVENT_POLL,
  285. #if defined(HAVE_EPOLL)
  286. V_EPOLL,
  287. #elif defined(HAVE_KQUEUE)
  288. V_KQUEUE,
  289. #elif defined(HAVE_PORT_ASSOCIATE)
  290. V_PORT,
  291. #elif defined(HAVE_LIBUV)
  292. V_LIBUV,
  293. #elif defined(HAVE_POLL)
  294. V_POLL,
  295. #else // defined(HAVE_EPOLL)
  296. V_SELECT,
  297. #endif // defined(HAVE_EPOLL)
  298. {
  299. #ifdef HAVE_EPOLL
  300. V_EPOLL,
  301. #endif // HAVE_EPOLL
  302. #ifdef HAVE_KQUEUE
  303. V_KQUEUE,
  304. #endif // HAVE_KQUEUE
  305. #ifdef HAVE_PORT_ASSOCIATE
  306. V_PORT,
  307. #endif // HAVE_PORT_ASSOCIATE
  308. #ifdef HAVE_LIBUV
  309. V_LIBUV,
  310. #endif // HAVE_LIBUV
  311. #ifdef HAVE_POLL
  312. V_POLL,
  313. #endif // HAVE_POLL
  314. V_SELECT}));
  315. op->addTag(TAG_ADVANCED);
  316. handlers.push_back(op);
  317. }
  318. {
  319. OptionHandler* op(
  320. new ParameterOptionHandler(PREF_FILE_ALLOCATION, TEXT_FILE_ALLOCATION,
  321. V_PREALLOC, {V_NONE, V_PREALLOC, V_TRUNC,
  322. #ifdef HAVE_SOME_FALLOCATE
  323. V_FALLOC
  324. #endif // HAVE_SOME_FALLOCATE
  325. },
  326. 'a'));
  327. op->addTag(TAG_BASIC);
  328. op->addTag(TAG_FILE);
  329. op->setInitialOption(true);
  330. op->setChangeGlobalOption(true);
  331. op->setChangeOptionForReserved(true);
  332. handlers.push_back(op);
  333. }
  334. {
  335. OptionHandler* op(new BooleanOptionHandler(
  336. PREF_FORCE_SAVE, TEXT_FORCE_SAVE, A2_V_FALSE, OptionHandler::OPT_ARG));
  337. op->addTag(TAG_ADVANCED);
  338. op->setInitialOption(true);
  339. op->setChangeOption(true);
  340. op->setChangeGlobalOption(true);
  341. op->setChangeOptionForReserved(true);
  342. handlers.push_back(op);
  343. }
  344. {
  345. OptionHandler* op(
  346. new BooleanOptionHandler(PREF_FORCE_SEQUENTIAL, TEXT_FORCE_SEQUENTIAL,
  347. A2_V_FALSE, OptionHandler::OPT_ARG, 'Z'));
  348. op->addTag(TAG_BASIC);
  349. handlers.push_back(op);
  350. }
  351. {
  352. OptionHandler* op(
  353. new DefaultOptionHandler(PREF_GID, TEXT_GID, NO_DEFAULT_VALUE));
  354. op->addTag(TAG_ADVANCED);
  355. op->setInitialOption(true);
  356. handlers.push_back(op);
  357. }
  358. {
  359. OptionHandler* op(new BooleanOptionHandler(PREF_HASH_CHECK_ONLY,
  360. TEXT_HASH_CHECK_ONLY, A2_V_FALSE,
  361. OptionHandler::OPT_ARG));
  362. op->addTag(TAG_ADVANCED);
  363. op->addTag(TAG_BITTORRENT);
  364. op->addTag(TAG_METALINK);
  365. op->addTag(TAG_FILE);
  366. op->addTag(TAG_CHECKSUM);
  367. op->setInitialOption(true);
  368. op->setChangeGlobalOption(true);
  369. op->setChangeOptionForReserved(true);
  370. handlers.push_back(op);
  371. }
  372. {
  373. OptionHandler* op(new BooleanOptionHandler(PREF_HUMAN_READABLE,
  374. TEXT_HUMAN_READABLE, A2_V_TRUE,
  375. OptionHandler::OPT_ARG));
  376. op->addTag(TAG_ADVANCED);
  377. handlers.push_back(op);
  378. }
  379. {
  380. OptionHandler* op(new DefaultOptionHandler(
  381. PREF_INPUT_FILE, TEXT_INPUT_FILE, NO_DEFAULT_VALUE, PATH_TO_FILE_STDIN,
  382. OptionHandler::REQ_ARG, 'i'));
  383. op->addTag(TAG_BASIC);
  384. handlers.push_back(op);
  385. }
  386. {
  387. OptionHandler* op(new DefaultOptionHandler(
  388. PREF_INTERFACE, TEXT_INTERFACE, NO_DEFAULT_VALUE,
  389. "interface, IP address, hostname", OptionHandler::REQ_ARG));
  390. op->addTag(TAG_ADVANCED);
  391. handlers.push_back(op);
  392. }
  393. {
  394. OptionHandler* op(new DefaultOptionHandler(
  395. PREF_LOG, TEXT_LOG, NO_DEFAULT_VALUE, PATH_TO_FILE_STDOUT,
  396. OptionHandler::REQ_ARG, 'l'));
  397. op->addTag(TAG_BASIC);
  398. op->setChangeGlobalOption(true);
  399. handlers.push_back(op);
  400. }
  401. {
  402. OptionHandler* op(new ParameterOptionHandler(
  403. PREF_LOG_LEVEL, TEXT_LOG_LEVEL, V_DEBUG,
  404. {std::begin(logLevels), std::end(logLevels)}));
  405. op->addTag(TAG_ADVANCED);
  406. op->setChangeGlobalOption(true);
  407. handlers.push_back(op);
  408. }
  409. {
  410. OptionHandler* op(new NumberOptionHandler(PREF_MAX_CONCURRENT_DOWNLOADS,
  411. TEXT_MAX_CONCURRENT_DOWNLOADS,
  412. "5", 1, -1, 'j'));
  413. op->addTag(TAG_BASIC);
  414. op->setChangeGlobalOption(true);
  415. handlers.push_back(op);
  416. }
  417. {
  418. OptionHandler* op(new NumberOptionHandler(PREF_MAX_CONNECTION_PER_SERVER,
  419. TEXT_MAX_CONNECTION_PER_SERVER,
  420. "1", 1, 16, 'x'));
  421. op->addTag(TAG_BASIC);
  422. op->addTag(TAG_FTP);
  423. op->addTag(TAG_HTTP);
  424. op->setInitialOption(true);
  425. op->setChangeGlobalOption(true);
  426. op->setChangeOptionForReserved(true);
  427. handlers.push_back(op);
  428. }
  429. {
  430. OptionHandler* op(new UnitNumberOptionHandler(
  431. PREF_MAX_DOWNLOAD_LIMIT, TEXT_MAX_DOWNLOAD_LIMIT, "0", 0));
  432. op->addTag(TAG_BITTORRENT);
  433. op->addTag(TAG_FTP);
  434. op->addTag(TAG_HTTP);
  435. op->setInitialOption(true);
  436. op->setChangeOption(true);
  437. op->setChangeGlobalOption(true);
  438. op->setChangeOptionForReserved(true);
  439. handlers.push_back(op);
  440. }
  441. {
  442. OptionHandler* op(new NumberOptionHandler(
  443. PREF_MAX_DOWNLOAD_RESULT, TEXT_MAX_DOWNLOAD_RESULT, "1000", 0));
  444. op->addTag(TAG_ADVANCED);
  445. op->setChangeGlobalOption(true);
  446. handlers.push_back(op);
  447. }
  448. {
  449. OptionHandler* op(
  450. new UnitNumberOptionHandler(PREF_MAX_OVERALL_DOWNLOAD_LIMIT,
  451. TEXT_MAX_OVERALL_DOWNLOAD_LIMIT, "0", 0));
  452. op->addTag(TAG_BITTORRENT);
  453. op->addTag(TAG_FTP);
  454. op->addTag(TAG_HTTP);
  455. op->setChangeGlobalOption(true);
  456. handlers.push_back(op);
  457. }
  458. {
  459. OptionHandler* op(new NumberOptionHandler(
  460. PREF_MAX_RESUME_FAILURE_TRIES, TEXT_MAX_RESUME_FAILURE_TRIES, "0", 0));
  461. op->addTag(TAG_ADVANCED);
  462. op->addTag(TAG_FTP);
  463. op->addTag(TAG_HTTP);
  464. op->setInitialOption(true);
  465. op->setChangeGlobalOption(true);
  466. op->setChangeOptionForReserved(true);
  467. handlers.push_back(op);
  468. }
  469. {
  470. OptionHandler* op(new UnitNumberOptionHandler(
  471. PREF_MIN_SPLIT_SIZE, TEXT_MIN_SPLIT_SIZE, "20M", 1_m, 1_g, 'k'));
  472. op->addTag(TAG_BASIC);
  473. op->addTag(TAG_FTP);
  474. op->addTag(TAG_HTTP);
  475. op->setInitialOption(true);
  476. op->setChangeGlobalOption(true);
  477. op->setChangeOptionForReserved(true);
  478. handlers.push_back(op);
  479. }
  480. #ifdef ENABLE_SSL
  481. {
  482. OptionHandler* op(new ParameterOptionHandler(
  483. PREF_MIN_TLS_VERSION, TEXT_MIN_TLS_VERSION, A2_V_TLS10,
  484. {A2_V_SSL3, A2_V_TLS10, A2_V_TLS11, A2_V_TLS12}));
  485. op->addTag(TAG_ADVANCED);
  486. handlers.push_back(op);
  487. }
  488. #endif // ENABLE_SSL
  489. {
  490. OptionHandler* op(new DefaultOptionHandler(
  491. PREF_MULTIPLE_INTERFACE, TEXT_MULTIPLE_INTERFACE, NO_DEFAULT_VALUE,
  492. "interface, IP address, hostname", OptionHandler::REQ_ARG));
  493. op->addTag(TAG_ADVANCED);
  494. handlers.push_back(op);
  495. }
  496. {
  497. OptionHandler* op(new BooleanOptionHandler(
  498. PREF_NO_CONF, TEXT_NO_CONF, A2_V_FALSE, OptionHandler::OPT_ARG));
  499. op->addTag(TAG_ADVANCED);
  500. handlers.push_back(op);
  501. }
  502. {
  503. OptionHandler* op(new UnitNumberOptionHandler(
  504. PREF_NO_FILE_ALLOCATION_LIMIT, TEXT_NO_FILE_ALLOCATION_LIMIT, "5M", 0));
  505. op->addTag(TAG_ADVANCED);
  506. op->addTag(TAG_FILE);
  507. op->setInitialOption(true);
  508. op->setChangeGlobalOption(true);
  509. op->setChangeOptionForReserved(true);
  510. handlers.push_back(op);
  511. }
  512. {
  513. OptionHandler* op(new DefaultOptionHandler(
  514. PREF_ON_DOWNLOAD_COMPLETE, TEXT_ON_DOWNLOAD_COMPLETE, NO_DEFAULT_VALUE,
  515. PATH_TO_COMMAND));
  516. op->addTag(TAG_ADVANCED);
  517. op->addTag(TAG_HOOK);
  518. handlers.push_back(op);
  519. }
  520. {
  521. OptionHandler* op(
  522. new DefaultOptionHandler(PREF_ON_DOWNLOAD_ERROR, TEXT_ON_DOWNLOAD_ERROR,
  523. NO_DEFAULT_VALUE, PATH_TO_COMMAND));
  524. op->addTag(TAG_ADVANCED);
  525. op->addTag(TAG_HOOK);
  526. handlers.push_back(op);
  527. }
  528. {
  529. OptionHandler* op(
  530. new DefaultOptionHandler(PREF_ON_DOWNLOAD_PAUSE, TEXT_ON_DOWNLOAD_PAUSE,
  531. NO_DEFAULT_VALUE, PATH_TO_COMMAND));
  532. op->addTag(TAG_ADVANCED);
  533. op->addTag(TAG_HOOK);
  534. handlers.push_back(op);
  535. }
  536. {
  537. OptionHandler* op(
  538. new DefaultOptionHandler(PREF_ON_DOWNLOAD_START, TEXT_ON_DOWNLOAD_START,
  539. NO_DEFAULT_VALUE, PATH_TO_COMMAND));
  540. op->addTag(TAG_ADVANCED);
  541. op->addTag(TAG_HOOK);
  542. handlers.push_back(op);
  543. }
  544. {
  545. OptionHandler* op(
  546. new DefaultOptionHandler(PREF_ON_DOWNLOAD_STOP, TEXT_ON_DOWNLOAD_STOP,
  547. NO_DEFAULT_VALUE, PATH_TO_COMMAND));
  548. op->addTag(TAG_ADVANCED);
  549. op->addTag(TAG_HOOK);
  550. handlers.push_back(op);
  551. }
  552. {
  553. OptionHandler* op(
  554. new BooleanOptionHandler(PREF_PARAMETERIZED_URI, TEXT_PARAMETERIZED_URI,
  555. A2_V_FALSE, OptionHandler::OPT_ARG, 'P'));
  556. op->addTag(TAG_ADVANCED);
  557. op->setInitialOption(true);
  558. op->setChangeGlobalOption(true);
  559. handlers.push_back(op);
  560. }
  561. {
  562. OptionHandler* op(new BooleanOptionHandler(
  563. PREF_PAUSE, TEXT_PAUSE, A2_V_FALSE, OptionHandler::OPT_ARG));
  564. op->addTag(TAG_ADVANCED);
  565. op->addTag(TAG_RPC);
  566. op->setInitialOption(true);
  567. handlers.push_back(op);
  568. }
  569. {
  570. OptionHandler* op(new BooleanOptionHandler(PREF_PAUSE_METADATA,
  571. TEXT_PAUSE_METADATA, A2_V_FALSE,
  572. OptionHandler::OPT_ARG));
  573. op->addTag(TAG_ADVANCED);
  574. op->addTag(TAG_RPC);
  575. op->setInitialOption(true);
  576. op->setChangeGlobalOption(true);
  577. op->setChangeOptionForReserved(true);
  578. handlers.push_back(op);
  579. }
  580. {
  581. OptionHandler* op(new BooleanOptionHandler(
  582. PREF_QUIET, TEXT_QUIET, A2_V_FALSE, OptionHandler::OPT_ARG, 'q'));
  583. op->addTag(TAG_ADVANCED);
  584. handlers.push_back(op);
  585. }
  586. {
  587. OptionHandler* op(new BooleanOptionHandler(
  588. PREF_REALTIME_CHUNK_CHECKSUM, TEXT_REALTIME_CHUNK_CHECKSUM, A2_V_TRUE,
  589. OptionHandler::OPT_ARG));
  590. op->addTag(TAG_METALINK);
  591. op->addTag(TAG_CHECKSUM);
  592. op->setInitialOption(true);
  593. op->setChangeGlobalOption(true);
  594. op->setChangeOptionForReserved(true);
  595. handlers.push_back(op);
  596. }
  597. {
  598. OptionHandler* op(new BooleanOptionHandler(
  599. PREF_REMOVE_CONTROL_FILE, TEXT_REMOVE_CONTROL_FILE, A2_V_FALSE,
  600. OptionHandler::OPT_ARG));
  601. op->addTag(TAG_ADVANCED);
  602. op->setInitialOption(true);
  603. op->setChangeGlobalOption(true);
  604. op->setChangeOptionForReserved(true);
  605. handlers.push_back(op);
  606. }
  607. {
  608. OptionHandler* op(new DefaultOptionHandler(
  609. PREF_SAVE_SESSION, TEXT_SAVE_SESSION, NO_DEFAULT_VALUE, PATH_TO_FILE));
  610. op->addTag(TAG_ADVANCED);
  611. op->setChangeGlobalOption(true);
  612. handlers.push_back(op);
  613. }
  614. {
  615. OptionHandler* op(new NumberOptionHandler(
  616. PREF_SAVE_SESSION_INTERVAL, TEXT_SAVE_SESSION_INTERVAL, "0", 0));
  617. op->addTag(TAG_ADVANCED);
  618. handlers.push_back(op);
  619. }
  620. {
  621. OptionHandler* op(new NumberOptionHandler(PREF_DSCP, TEXT_DSCP, "0", 0));
  622. op->addTag(TAG_ADVANCED);
  623. handlers.push_back(op);
  624. }
  625. #ifdef HAVE_SYS_RESOURCE_H
  626. {
  627. OptionHandler* op(new NumberOptionHandler(
  628. PREF_RLIMIT_NOFILE, TEXT_RLIMIT_NOFILE,
  629. // Somewhat sane default that most *nix use.
  630. // Some other *nix, like OSX, have insane defaults like
  631. // 256, hence better *not* get the default value from
  632. // getrlimit().
  633. "1024",
  634. // 1 should not be a problem in practise, since the code
  635. // will only adjust if the specified value > the current
  636. // soft limit.
  637. // And sane systems have a default soft limit > 1.
  638. 1));
  639. op->addTag(TAG_ADVANCED);
  640. handlers.push_back(op);
  641. }
  642. #endif // HAVE_SYS_RESOURCE_H
  643. {
  644. OptionHandler* op(new BooleanOptionHandler(PREF_SELECT_LEAST_USED_HOST,
  645. NO_DESCRIPTION, A2_V_TRUE));
  646. op->hide();
  647. handlers.push_back(op);
  648. }
  649. {
  650. OptionHandler* op(new BooleanOptionHandler(
  651. PREF_SHOW_CONSOLE_READOUT, TEXT_SHOW_CONSOLE_READOUT, A2_V_TRUE));
  652. op->addTag(TAG_ADVANCED);
  653. handlers.push_back(op);
  654. }
  655. {
  656. OptionHandler* op(new UnitNumberOptionHandler(PREF_SOCKET_RECV_BUFFER_SIZE,
  657. TEXT_SOCKET_RECV_BUFFER_SIZE,
  658. "0", 0, 16_m));
  659. op->addTag(TAG_ADVANCED);
  660. handlers.push_back(op);
  661. }
  662. {
  663. OptionHandler* op(
  664. new NumberOptionHandler(PREF_STOP, TEXT_STOP, "0", 0, INT32_MAX));
  665. op->addTag(TAG_ADVANCED);
  666. handlers.push_back(op);
  667. }
  668. {
  669. OptionHandler* op(new NumberOptionHandler(
  670. PREF_STOP_WITH_PROCESS, TEXT_STOP_WITH_PROCESS, NO_DEFAULT_VALUE, 0));
  671. op->addTag(TAG_ADVANCED);
  672. handlers.push_back(op);
  673. }
  674. {
  675. OptionHandler* op(new NumberOptionHandler(
  676. PREF_SUMMARY_INTERVAL, TEXT_SUMMARY_INTERVAL, "60", 0, INT32_MAX));
  677. op->addTag(TAG_ADVANCED);
  678. handlers.push_back(op);
  679. }
  680. {
  681. OptionHandler* op(new BooleanOptionHandler(
  682. PREF_TRUNCATE_CONSOLE_READOUT, TEXT_TRUNCATE_CONSOLE_READOUT, A2_V_TRUE,
  683. OptionHandler::OPT_ARG));
  684. op->addTag(TAG_ADVANCED);
  685. handlers.push_back(op);
  686. }
  687. {
  688. OptionHandler* op(new BooleanOptionHandler(
  689. PREF_RPC_ALLOW_ORIGIN_ALL, TEXT_RPC_ALLOW_ORIGIN_ALL, A2_V_FALSE,
  690. OptionHandler::OPT_ARG));
  691. op->addTag(TAG_RPC);
  692. handlers.push_back(op);
  693. }
  694. {
  695. OptionHandler* op(
  696. #ifdef HAVE_APPLETLS
  697. new DefaultOptionHandler(PREF_RPC_CERTIFICATE, TEXT_RPC_CERTIFICATE,
  698. NO_DEFAULT_VALUE)
  699. #else // HAVE_APPLETLS
  700. new LocalFilePathOptionHandler(
  701. PREF_RPC_CERTIFICATE, TEXT_RPC_CERTIFICATE, NO_DEFAULT_VALUE, false)
  702. #endif // HAVE_APPLETLS
  703. );
  704. op->addTag(TAG_RPC);
  705. handlers.push_back(op);
  706. }
  707. {
  708. OptionHandler* op(new BooleanOptionHandler(PREF_RPC_LISTEN_ALL,
  709. TEXT_RPC_LISTEN_ALL, A2_V_FALSE,
  710. OptionHandler::OPT_ARG));
  711. op->addTag(TAG_RPC);
  712. handlers.push_back(op);
  713. }
  714. {
  715. OptionHandler* op(new NumberOptionHandler(
  716. PREF_RPC_LISTEN_PORT, TEXT_RPC_LISTEN_PORT, "6800", 1024, UINT16_MAX));
  717. op->addTag(TAG_RPC);
  718. handlers.push_back(op);
  719. }
  720. {
  721. OptionHandler* op(new UnitNumberOptionHandler(
  722. PREF_RPC_MAX_REQUEST_SIZE, TEXT_RPC_MAX_REQUEST_SIZE, "2M", 0));
  723. op->addTag(TAG_RPC);
  724. handlers.push_back(op);
  725. }
  726. {
  727. OptionHandler* op(new LocalFilePathOptionHandler(
  728. PREF_RPC_PRIVATE_KEY, TEXT_RPC_PRIVATE_KEY, NO_DEFAULT_VALUE, false));
  729. op->addTag(TAG_RPC);
  730. handlers.push_back(op);
  731. }
  732. {
  733. OptionHandler* op(new BooleanOptionHandler(
  734. PREF_RPC_SAVE_UPLOAD_METADATA, TEXT_RPC_SAVE_UPLOAD_METADATA, A2_V_TRUE,
  735. OptionHandler::OPT_ARG));
  736. op->addTag(TAG_RPC);
  737. op->setInitialOption(true);
  738. op->setChangeGlobalOption(true);
  739. handlers.push_back(op);
  740. }
  741. {
  742. auto op = new DefaultOptionHandler(PREF_RPC_SECRET, TEXT_RPC_SECRET);
  743. op->addTag(TAG_RPC);
  744. op->setEraseAfterParse(true);
  745. op->setAllowEmpty(false);
  746. handlers.push_back(op);
  747. }
  748. {
  749. OptionHandler* op(new BooleanOptionHandler(
  750. PREF_RPC_SECURE, TEXT_RPC_SECURE, A2_V_FALSE, OptionHandler::OPT_ARG));
  751. op->addTag(TAG_RPC);
  752. handlers.push_back(op);
  753. }
  754. {
  755. OptionHandler* op(new DeprecatedOptionHandler(
  756. new DefaultOptionHandler(PREF_RPC_USER, TEXT_RPC_USER), nullptr, true,
  757. "Migrate to --rpc-secret option as soon as possible."));
  758. op->addTag(TAG_RPC);
  759. op->setEraseAfterParse(true);
  760. handlers.push_back(op);
  761. }
  762. {
  763. OptionHandler* op(new DeprecatedOptionHandler(
  764. new DefaultOptionHandler(PREF_RPC_PASSWD, TEXT_RPC_PASSWD), nullptr,
  765. true));
  766. op->addTag(TAG_RPC);
  767. op->setEraseAfterParse(true);
  768. handlers.push_back(op);
  769. }
  770. // HTTP/FTP options
  771. {
  772. OptionHandler* op(new ChecksumOptionHandler(PREF_CHECKSUM, TEXT_CHECKSUM));
  773. op->addTag(TAG_FTP);
  774. op->addTag(TAG_HTTP);
  775. op->addTag(TAG_CHECKSUM);
  776. op->setInitialOption(true);
  777. op->setChangeOptionForReserved(true);
  778. handlers.push_back(op);
  779. }
  780. {
  781. OptionHandler* op(new NumberOptionHandler(
  782. PREF_CONNECT_TIMEOUT, TEXT_CONNECT_TIMEOUT, "60", 1, 600));
  783. op->addTag(TAG_FTP);
  784. op->addTag(TAG_HTTP);
  785. op->setInitialOption(true);
  786. op->setChangeGlobalOption(true);
  787. op->setChangeOptionForReserved(true);
  788. handlers.push_back(op);
  789. }
  790. {
  791. OptionHandler* op(new BooleanOptionHandler(
  792. PREF_DRY_RUN, TEXT_DRY_RUN, A2_V_FALSE, OptionHandler::OPT_ARG));
  793. op->addTag(TAG_FTP);
  794. op->addTag(TAG_HTTP);
  795. op->setInitialOption(true);
  796. op->setChangeGlobalOption(true);
  797. handlers.push_back(op);
  798. }
  799. {
  800. OptionHandler* op(new UnitNumberOptionHandler(
  801. PREF_LOWEST_SPEED_LIMIT, TEXT_LOWEST_SPEED_LIMIT, "0", 0));
  802. op->addTag(TAG_FTP);
  803. op->addTag(TAG_HTTP);
  804. op->setInitialOption(true);
  805. op->setChangeGlobalOption(true);
  806. op->setChangeOptionForReserved(true);
  807. handlers.push_back(op);
  808. }
  809. {
  810. OptionHandler* op(new NumberOptionHandler(PREF_MAX_FILE_NOT_FOUND,
  811. TEXT_MAX_FILE_NOT_FOUND, "0", 0));
  812. op->addTag(TAG_FTP);
  813. op->addTag(TAG_HTTP);
  814. op->setInitialOption(true);
  815. op->setChangeGlobalOption(true);
  816. op->setChangeOptionForReserved(true);
  817. handlers.push_back(op);
  818. }
  819. {
  820. OptionHandler* op(new NumberOptionHandler(PREF_MAX_TRIES, TEXT_MAX_TRIES,
  821. "5", 0, -1, 'm'));
  822. op->addTag(TAG_FTP);
  823. op->addTag(TAG_HTTP);
  824. op->setInitialOption(true);
  825. op->setChangeGlobalOption(true);
  826. op->setChangeOptionForReserved(true);
  827. handlers.push_back(op);
  828. }
  829. {
  830. OptionHandler* op(new BooleanOptionHandler(
  831. PREF_NO_NETRC, TEXT_NO_NETRC, A2_V_FALSE, OptionHandler::OPT_ARG, 'n'));
  832. op->addTag(TAG_FTP);
  833. op->addTag(TAG_HTTP);
  834. op->setInitialOption(true);
  835. op->setChangeGlobalOption(true);
  836. op->setChangeOptionForReserved(true);
  837. handlers.push_back(op);
  838. }
  839. {
  840. OptionHandler* op(new DefaultOptionHandler(PREF_OUT, TEXT_OUT,
  841. NO_DEFAULT_VALUE, PATH_TO_FILE,
  842. OptionHandler::REQ_ARG, 'o'));
  843. op->addTag(TAG_BASIC);
  844. op->addTag(TAG_FTP);
  845. op->addTag(TAG_HTTP);
  846. op->addTag(TAG_FILE);
  847. op->setInitialOption(true);
  848. op->setChangeOptionForReserved(true);
  849. handlers.push_back(op);
  850. }
  851. {
  852. OptionHandler* op(new UnitNumberOptionHandler(
  853. PREF_PIECE_LENGTH, TEXT_PIECE_LENGTH, "1M", 1_m, 1_g));
  854. op->addTag(TAG_ADVANCED);
  855. op->addTag(TAG_FTP);
  856. op->addTag(TAG_HTTP);
  857. op->setInitialOption(true);
  858. op->setChangeGlobalOption(true);
  859. handlers.push_back(op);
  860. }
  861. {
  862. OptionHandler* op(new BooleanOptionHandler(PREF_REMOTE_TIME,
  863. TEXT_REMOTE_TIME, A2_V_FALSE,
  864. OptionHandler::OPT_ARG, 'R'));
  865. op->addTag(TAG_FTP);
  866. op->addTag(TAG_HTTP);
  867. op->setInitialOption(true);
  868. op->setChangeGlobalOption(true);
  869. op->setChangeOptionForReserved(true);
  870. handlers.push_back(op);
  871. }
  872. {
  873. OptionHandler* op(
  874. new NumberOptionHandler(PREF_RETRY_WAIT, TEXT_RETRY_WAIT, "0", 0, 600));
  875. op->addTag(TAG_FTP);
  876. op->addTag(TAG_HTTP);
  877. op->setInitialOption(true);
  878. op->setChangeGlobalOption(true);
  879. op->setChangeOptionForReserved(true);
  880. handlers.push_back(op);
  881. }
  882. {
  883. OptionHandler* op(new BooleanOptionHandler(
  884. PREF_REUSE_URI, TEXT_REUSE_URI, A2_V_TRUE, OptionHandler::OPT_ARG));
  885. op->addTag(TAG_FTP);
  886. op->addTag(TAG_HTTP);
  887. op->setInitialOption(true);
  888. op->setChangeGlobalOption(true);
  889. op->setChangeOptionForReserved(true);
  890. handlers.push_back(op);
  891. }
  892. {
  893. OptionHandler* op(new DefaultOptionHandler(PREF_SERVER_STAT_IF,
  894. TEXT_SERVER_STAT_IF,
  895. NO_DEFAULT_VALUE, PATH_TO_FILE));
  896. op->addTag(TAG_FTP);
  897. op->addTag(TAG_HTTP);
  898. handlers.push_back(op);
  899. }
  900. {
  901. OptionHandler* op(new DefaultOptionHandler(PREF_SERVER_STAT_OF,
  902. TEXT_SERVER_STAT_OF,
  903. NO_DEFAULT_VALUE, PATH_TO_FILE));
  904. op->addTag(TAG_FTP);
  905. op->addTag(TAG_HTTP);
  906. op->setChangeGlobalOption(true);
  907. handlers.push_back(op);
  908. }
  909. {
  910. OptionHandler* op(new NumberOptionHandler(PREF_SERVER_STAT_TIMEOUT,
  911. TEXT_SERVER_STAT_TIMEOUT, "86400",
  912. 0, INT32_MAX));
  913. op->addTag(TAG_FTP);
  914. op->addTag(TAG_HTTP);
  915. handlers.push_back(op);
  916. }
  917. {
  918. OptionHandler* op(
  919. new NumberOptionHandler(PREF_SPLIT, TEXT_SPLIT, "5", 1, -1, 's'));
  920. op->addTag(TAG_BASIC);
  921. op->addTag(TAG_FTP);
  922. op->addTag(TAG_HTTP);
  923. op->setInitialOption(true);
  924. op->setChangeGlobalOption(true);
  925. op->setChangeOptionForReserved(true);
  926. handlers.push_back(op);
  927. }
  928. {
  929. OptionHandler* op(new NumberOptionHandler(PREF_STARTUP_IDLE_TIME,
  930. NO_DESCRIPTION, "10", 1, 60));
  931. op->hide();
  932. handlers.push_back(op);
  933. }
  934. {
  935. OptionHandler* op(new ParameterOptionHandler(
  936. PREF_STREAM_PIECE_SELECTOR, TEXT_STREAM_PIECE_SELECTOR, A2_V_DEFAULT,
  937. {A2_V_DEFAULT, V_INORDER, A2_V_GEOM}));
  938. op->addTag(TAG_FTP);
  939. op->addTag(TAG_HTTP);
  940. op->setInitialOption(true);
  941. op->setChangeGlobalOption(true);
  942. op->setChangeOptionForReserved(true);
  943. handlers.push_back(op);
  944. }
  945. {
  946. OptionHandler* op(
  947. new NumberOptionHandler(PREF_TIMEOUT, TEXT_TIMEOUT, "60", 1, 600, 't'));
  948. op->addTag(TAG_FTP);
  949. op->addTag(TAG_HTTP);
  950. op->setInitialOption(true);
  951. op->setChangeGlobalOption(true);
  952. op->setChangeOptionForReserved(true);
  953. handlers.push_back(op);
  954. }
  955. {
  956. OptionHandler* op(new ParameterOptionHandler(
  957. PREF_URI_SELECTOR, TEXT_URI_SELECTOR, V_FEEDBACK,
  958. {V_INORDER, V_FEEDBACK, V_ADAPTIVE}));
  959. op->addTag(TAG_FTP);
  960. op->addTag(TAG_HTTP);
  961. op->setInitialOption(true);
  962. op->setChangeGlobalOption(true);
  963. op->setChangeOptionForReserved(true);
  964. handlers.push_back(op);
  965. }
  966. // HTTP Specific Options
  967. {
  968. OptionHandler* op(new DefaultOptionHandler(PREF_CA_CERTIFICATE,
  969. TEXT_CA_CERTIFICATE,
  970. #ifdef CA_BUNDLE
  971. CA_BUNDLE,
  972. #else
  973. "",
  974. #endif
  975. PATH_TO_FILE));
  976. op->addTag(TAG_HTTP);
  977. op->addTag(TAG_HTTPS);
  978. handlers.push_back(op);
  979. }
  980. {
  981. OptionHandler* op(
  982. #ifdef HAVE_APPLETLS
  983. new DefaultOptionHandler(PREF_CERTIFICATE, TEXT_CERTIFICATE,
  984. NO_DEFAULT_VALUE)
  985. #else // HAVE_APPLETLS
  986. new LocalFilePathOptionHandler(PREF_CERTIFICATE, TEXT_CERTIFICATE,
  987. NO_DEFAULT_VALUE, false)
  988. #endif // HAVE_APPLETLS
  989. );
  990. op->addTag(TAG_HTTP);
  991. op->addTag(TAG_HTTPS);
  992. handlers.push_back(op);
  993. }
  994. {
  995. OptionHandler* op(
  996. new BooleanOptionHandler(PREF_CHECK_CERTIFICATE, TEXT_CHECK_CERTIFICATE,
  997. A2_V_TRUE, OptionHandler::OPT_ARG));
  998. op->addTag(TAG_HTTP);
  999. op->addTag(TAG_HTTPS);
  1000. handlers.push_back(op);
  1001. }
  1002. {
  1003. OptionHandler* op(new BooleanOptionHandler(
  1004. PREF_ENABLE_HTTP_KEEP_ALIVE, TEXT_ENABLE_HTTP_KEEP_ALIVE, A2_V_TRUE,
  1005. OptionHandler::OPT_ARG));
  1006. op->addTag(TAG_HTTP);
  1007. op->setInitialOption(true);
  1008. op->setChangeGlobalOption(true);
  1009. op->setChangeOptionForReserved(true);
  1010. handlers.push_back(op);
  1011. }
  1012. {
  1013. OptionHandler* op(new BooleanOptionHandler(
  1014. PREF_ENABLE_HTTP_PIPELINING, TEXT_ENABLE_HTTP_PIPELINING, A2_V_FALSE,
  1015. OptionHandler::OPT_ARG));
  1016. op->addTag(TAG_HTTP);
  1017. op->setInitialOption(true);
  1018. op->setChangeGlobalOption(true);
  1019. op->setChangeOptionForReserved(true);
  1020. handlers.push_back(op);
  1021. }
  1022. {
  1023. OptionHandler* op(new CumulativeOptionHandler(PREF_HEADER, TEXT_HEADER,
  1024. NO_DEFAULT_VALUE, "\n"));
  1025. op->addTag(TAG_HTTP);
  1026. op->setInitialOption(true);
  1027. op->setCumulative(true);
  1028. op->setChangeGlobalOption(true);
  1029. op->setChangeOptionForReserved(true);
  1030. handlers.push_back(op);
  1031. }
  1032. {
  1033. OptionHandler* op(
  1034. new BooleanOptionHandler(PREF_HTTP_ACCEPT_GZIP, TEXT_HTTP_ACCEPT_GZIP,
  1035. A2_V_FALSE, OptionHandler::OPT_ARG));
  1036. op->addTag(TAG_HTTP);
  1037. op->setInitialOption(true);
  1038. op->setChangeGlobalOption(true);
  1039. op->setChangeOptionForReserved(true);
  1040. handlers.push_back(op);
  1041. }
  1042. {
  1043. OptionHandler* op(new BooleanOptionHandler(
  1044. PREF_HTTP_AUTH_CHALLENGE, TEXT_HTTP_AUTH_CHALLENGE, A2_V_FALSE,
  1045. OptionHandler::OPT_ARG));
  1046. op->addTag(TAG_HTTP);
  1047. op->setInitialOption(true);
  1048. op->setChangeGlobalOption(true);
  1049. op->setChangeOptionForReserved(true);
  1050. handlers.push_back(op);
  1051. }
  1052. {
  1053. OptionHandler* op(new BooleanOptionHandler(PREF_HTTP_NO_CACHE,
  1054. TEXT_HTTP_NO_CACHE, A2_V_FALSE,
  1055. OptionHandler::OPT_ARG));
  1056. op->addTag(TAG_HTTP);
  1057. op->setInitialOption(true);
  1058. op->setChangeGlobalOption(true);
  1059. op->setChangeOptionForReserved(true);
  1060. handlers.push_back(op);
  1061. }
  1062. {
  1063. OptionHandler* op(
  1064. new DefaultOptionHandler(PREF_HTTP_PASSWD, TEXT_HTTP_PASSWD));
  1065. op->addTag(TAG_BASIC);
  1066. op->addTag(TAG_HTTP);
  1067. op->setEraseAfterParse(true);
  1068. op->setInitialOption(true);
  1069. op->setChangeGlobalOption(true);
  1070. op->setChangeOptionForReserved(true);
  1071. handlers.push_back(op);
  1072. }
  1073. {
  1074. OptionHandler* op(new DefaultOptionHandler(PREF_HTTP_USER, TEXT_HTTP_USER));
  1075. op->addTag(TAG_BASIC);
  1076. op->addTag(TAG_HTTP);
  1077. op->setEraseAfterParse(true);
  1078. op->setInitialOption(true);
  1079. op->setChangeGlobalOption(true);
  1080. op->setChangeOptionForReserved(true);
  1081. handlers.push_back(op);
  1082. }
  1083. {
  1084. OptionHandler* op(new DefaultOptionHandler(
  1085. PREF_LOAD_COOKIES, TEXT_LOAD_COOKIES, NO_DEFAULT_VALUE, PATH_TO_FILE));
  1086. op->addTag(TAG_BASIC);
  1087. op->addTag(TAG_HTTP);
  1088. op->addTag(TAG_COOKIE);
  1089. handlers.push_back(op);
  1090. }
  1091. {
  1092. OptionHandler* op(new NumberOptionHandler(PREF_MAX_HTTP_PIPELINING,
  1093. NO_DESCRIPTION, "2", 1, 8));
  1094. op->hide();
  1095. handlers.push_back(op);
  1096. }
  1097. {
  1098. OptionHandler* op(new DefaultOptionHandler(PREF_METALINK_LOCATION,
  1099. TEXT_METALINK_LOCATION));
  1100. op->addTag(TAG_METALINK);
  1101. op->setInitialOption(true);
  1102. op->setChangeGlobalOption(true);
  1103. op->setChangeOptionForReserved(true);
  1104. handlers.push_back(op);
  1105. }
  1106. {
  1107. OptionHandler* op(new DefaultOptionHandler(
  1108. PREF_PRIVATE_KEY, TEXT_PRIVATE_KEY, NO_DEFAULT_VALUE, PATH_TO_FILE));
  1109. op->addTag(TAG_HTTP);
  1110. op->addTag(TAG_HTTPS);
  1111. handlers.push_back(op);
  1112. }
  1113. {
  1114. OptionHandler* op(new DefaultOptionHandler(PREF_REFERER, TEXT_REFERER));
  1115. op->addTag(TAG_HTTP);
  1116. op->setInitialOption(true);
  1117. op->setChangeGlobalOption(true);
  1118. op->setChangeOptionForReserved(true);
  1119. handlers.push_back(op);
  1120. }
  1121. {
  1122. OptionHandler* op(new DefaultOptionHandler(
  1123. PREF_SAVE_COOKIES, TEXT_SAVE_COOKIES, NO_DEFAULT_VALUE, PATH_TO_FILE));
  1124. op->addTag(TAG_HTTP);
  1125. op->addTag(TAG_COOKIE);
  1126. op->setChangeGlobalOption(true);
  1127. handlers.push_back(op);
  1128. }
  1129. {
  1130. OptionHandler* op(new BooleanOptionHandler(
  1131. PREF_USE_HEAD, TEXT_USE_HEAD, A2_V_FALSE, OptionHandler::OPT_ARG));
  1132. op->addTag(TAG_HTTP);
  1133. op->setInitialOption(true);
  1134. op->setChangeGlobalOption(true);
  1135. op->setChangeOptionForReserved(true);
  1136. handlers.push_back(op);
  1137. }
  1138. {
  1139. OptionHandler* op(new DefaultOptionHandler(
  1140. PREF_USER_AGENT, TEXT_USER_AGENT, "aria2/" PACKAGE_VERSION, A2STR::NIL,
  1141. OptionHandler::REQ_ARG, 'U'));
  1142. op->addTag(TAG_HTTP);
  1143. op->setInitialOption(true);
  1144. op->setChangeGlobalOption(true);
  1145. op->setChangeOptionForReserved(true);
  1146. handlers.push_back(op);
  1147. }
  1148. // FTP Specific Options
  1149. {
  1150. OptionHandler* op(
  1151. new DefaultOptionHandler(PREF_FTP_PASSWD, TEXT_FTP_PASSWD));
  1152. op->addTag(TAG_BASIC);
  1153. op->addTag(TAG_FTP);
  1154. op->setEraseAfterParse(true);
  1155. op->setInitialOption(true);
  1156. op->setChangeGlobalOption(true);
  1157. op->setChangeOptionForReserved(true);
  1158. handlers.push_back(op);
  1159. }
  1160. {
  1161. OptionHandler* op(new BooleanOptionHandler(
  1162. PREF_FTP_PASV, TEXT_FTP_PASV, A2_V_TRUE, OptionHandler::OPT_ARG, 'p'));
  1163. op->addTag(TAG_FTP);
  1164. op->setInitialOption(true);
  1165. op->setChangeGlobalOption(true);
  1166. op->setChangeOptionForReserved(true);
  1167. handlers.push_back(op);
  1168. }
  1169. {
  1170. OptionHandler* op(new BooleanOptionHandler(
  1171. PREF_FTP_REUSE_CONNECTION, TEXT_FTP_REUSE_CONNECTION, A2_V_TRUE,
  1172. OptionHandler::OPT_ARG));
  1173. op->addTag(TAG_FTP);
  1174. op->setInitialOption(true);
  1175. op->setChangeGlobalOption(true);
  1176. op->setChangeOptionForReserved(true);
  1177. handlers.push_back(op);
  1178. }
  1179. {
  1180. OptionHandler* op(new ParameterOptionHandler(
  1181. PREF_FTP_TYPE, TEXT_FTP_TYPE, V_BINARY, {V_BINARY, V_ASCII}));
  1182. op->addTag(TAG_FTP);
  1183. op->setInitialOption(true);
  1184. op->setChangeGlobalOption(true);
  1185. op->setChangeOptionForReserved(true);
  1186. handlers.push_back(op);
  1187. }
  1188. {
  1189. OptionHandler* op(new DefaultOptionHandler(PREF_FTP_USER, TEXT_FTP_USER));
  1190. op->addTag(TAG_BASIC);
  1191. op->addTag(TAG_FTP);
  1192. op->setEraseAfterParse(true);
  1193. op->setInitialOption(true);
  1194. op->setChangeGlobalOption(true);
  1195. op->setChangeOptionForReserved(true);
  1196. handlers.push_back(op);
  1197. }
  1198. {
  1199. OptionHandler* op(new ChecksumOptionHandler(
  1200. PREF_SSH_HOST_KEY_MD, TEXT_SSH_HOST_KEY_MD, {"sha-1", "md5"}));
  1201. op->addTag(TAG_FTP);
  1202. op->setInitialOption(true);
  1203. op->setChangeGlobalOption(true);
  1204. op->setChangeOptionForReserved(true);
  1205. handlers.push_back(op);
  1206. }
  1207. {
  1208. OptionHandler* op(new DefaultOptionHandler(PREF_NETRC_PATH, TEXT_NETRC_PATH,
  1209. util::getHomeDir() + "/.netrc",
  1210. PATH_TO_FILE));
  1211. handlers.push_back(op);
  1212. }
  1213. // Proxy options
  1214. {
  1215. OptionHandler* op(new HttpProxyOptionHandler(
  1216. PREF_HTTP_PROXY, TEXT_HTTP_PROXY, NO_DEFAULT_VALUE));
  1217. op->addTag(TAG_HTTP);
  1218. op->setInitialOption(true);
  1219. op->setChangeGlobalOption(true);
  1220. op->setChangeOptionForReserved(true);
  1221. handlers.push_back(op);
  1222. }
  1223. {
  1224. OptionHandler* op(new DefaultOptionHandler(
  1225. PREF_HTTP_PROXY_PASSWD, TEXT_HTTP_PROXY_PASSWD, NO_DEFAULT_VALUE));
  1226. op->addTag(TAG_HTTP);
  1227. op->setEraseAfterParse(true);
  1228. op->setInitialOption(true);
  1229. op->setChangeGlobalOption(true);
  1230. op->setChangeOptionForReserved(true);
  1231. handlers.push_back(op);
  1232. }
  1233. {
  1234. OptionHandler* op(new DefaultOptionHandler(
  1235. PREF_HTTP_PROXY_USER, TEXT_HTTP_PROXY_USER, NO_DEFAULT_VALUE));
  1236. op->addTag(TAG_HTTP);
  1237. op->setEraseAfterParse(true);
  1238. op->setInitialOption(true);
  1239. op->setChangeGlobalOption(true);
  1240. op->setChangeOptionForReserved(true);
  1241. handlers.push_back(op);
  1242. }
  1243. {
  1244. OptionHandler* op(new HttpProxyOptionHandler(
  1245. PREF_HTTPS_PROXY, TEXT_HTTPS_PROXY, NO_DEFAULT_VALUE));
  1246. op->addTag(TAG_HTTP);
  1247. op->addTag(TAG_HTTPS);
  1248. op->setInitialOption(true);
  1249. op->setChangeGlobalOption(true);
  1250. op->setChangeOptionForReserved(true);
  1251. handlers.push_back(op);
  1252. }
  1253. {
  1254. OptionHandler* op(new DefaultOptionHandler(
  1255. PREF_HTTPS_PROXY_PASSWD, TEXT_HTTPS_PROXY_PASSWD, NO_DEFAULT_VALUE));
  1256. op->addTag(TAG_HTTP);
  1257. op->addTag(TAG_HTTPS);
  1258. op->setEraseAfterParse(true);
  1259. op->setInitialOption(true);
  1260. op->setChangeGlobalOption(true);
  1261. op->setChangeOptionForReserved(true);
  1262. handlers.push_back(op);
  1263. }
  1264. {
  1265. OptionHandler* op(new DefaultOptionHandler(
  1266. PREF_HTTPS_PROXY_USER, TEXT_HTTPS_PROXY_USER, NO_DEFAULT_VALUE));
  1267. op->addTag(TAG_HTTP);
  1268. op->addTag(TAG_HTTPS);
  1269. op->setEraseAfterParse(true);
  1270. op->setInitialOption(true);
  1271. op->setChangeGlobalOption(true);
  1272. op->setChangeOptionForReserved(true);
  1273. handlers.push_back(op);
  1274. }
  1275. {
  1276. OptionHandler* op(new HttpProxyOptionHandler(PREF_FTP_PROXY, TEXT_FTP_PROXY,
  1277. NO_DEFAULT_VALUE));
  1278. op->addTag(TAG_FTP);
  1279. op->setInitialOption(true);
  1280. op->setChangeGlobalOption(true);
  1281. op->setChangeOptionForReserved(true);
  1282. handlers.push_back(op);
  1283. }
  1284. {
  1285. OptionHandler* op(new DefaultOptionHandler(
  1286. PREF_FTP_PROXY_PASSWD, TEXT_FTP_PROXY_PASSWD, NO_DEFAULT_VALUE));
  1287. op->addTag(TAG_FTP);
  1288. op->setEraseAfterParse(true);
  1289. op->setInitialOption(true);
  1290. op->setChangeGlobalOption(true);
  1291. op->setChangeOptionForReserved(true);
  1292. handlers.push_back(op);
  1293. }
  1294. {
  1295. OptionHandler* op(new DefaultOptionHandler(
  1296. PREF_FTP_PROXY_USER, TEXT_FTP_PROXY_USER, NO_DEFAULT_VALUE));
  1297. op->addTag(TAG_FTP);
  1298. op->setEraseAfterParse(true);
  1299. op->setInitialOption(true);
  1300. op->setChangeGlobalOption(true);
  1301. op->setChangeOptionForReserved(true);
  1302. handlers.push_back(op);
  1303. }
  1304. {
  1305. OptionHandler* op(new HttpProxyOptionHandler(PREF_ALL_PROXY, TEXT_ALL_PROXY,
  1306. NO_DEFAULT_VALUE));
  1307. op->addTag(TAG_FTP);
  1308. op->addTag(TAG_HTTP);
  1309. op->addTag(TAG_HTTPS);
  1310. op->setInitialOption(true);
  1311. op->setChangeGlobalOption(true);
  1312. op->setChangeOptionForReserved(true);
  1313. handlers.push_back(op);
  1314. }
  1315. {
  1316. OptionHandler* op(new DefaultOptionHandler(
  1317. PREF_ALL_PROXY_PASSWD, TEXT_ALL_PROXY_PASSWD, NO_DEFAULT_VALUE));
  1318. op->addTag(TAG_FTP);
  1319. op->addTag(TAG_HTTP);
  1320. op->addTag(TAG_HTTPS);
  1321. op->setEraseAfterParse(true);
  1322. op->setInitialOption(true);
  1323. op->setChangeGlobalOption(true);
  1324. op->setChangeOptionForReserved(true);
  1325. handlers.push_back(op);
  1326. }
  1327. {
  1328. OptionHandler* op(new DefaultOptionHandler(
  1329. PREF_ALL_PROXY_USER, TEXT_ALL_PROXY_USER, NO_DEFAULT_VALUE));
  1330. op->addTag(TAG_FTP);
  1331. op->addTag(TAG_HTTP);
  1332. op->addTag(TAG_HTTPS);
  1333. op->setEraseAfterParse(true);
  1334. op->setInitialOption(true);
  1335. op->setChangeGlobalOption(true);
  1336. op->setChangeOptionForReserved(true);
  1337. handlers.push_back(op);
  1338. }
  1339. {
  1340. OptionHandler* op(new DefaultOptionHandler(PREF_NO_PROXY, TEXT_NO_PROXY,
  1341. NO_DEFAULT_VALUE,
  1342. "HOSTNAME,DOMAIN,NETWORK/CIDR"));
  1343. op->addTag(TAG_FTP);
  1344. op->addTag(TAG_HTTP);
  1345. op->addTag(TAG_HTTPS);
  1346. op->setInitialOption(true);
  1347. op->setChangeGlobalOption(true);
  1348. op->setChangeOptionForReserved(true);
  1349. handlers.push_back(op);
  1350. }
  1351. {
  1352. OptionHandler* op(new ParameterOptionHandler(
  1353. PREF_PROXY_METHOD, TEXT_PROXY_METHOD, V_GET, {V_GET, V_TUNNEL}));
  1354. op->addTag(TAG_FTP);
  1355. op->addTag(TAG_HTTP);
  1356. op->setInitialOption(true);
  1357. op->setChangeGlobalOption(true);
  1358. op->setChangeOptionForReserved(true);
  1359. handlers.push_back(op);
  1360. }
  1361. // BitTorrent/Metalink Options
  1362. #if defined(ENABLE_BITTORRENT) || defined(ENABLE_METALINK)
  1363. {
  1364. OptionHandler* op(new IntegerRangeOptionHandler(
  1365. PREF_SELECT_FILE, TEXT_SELECT_FILE, NO_DEFAULT_VALUE, 1, 1_m));
  1366. op->addTag(TAG_BITTORRENT);
  1367. op->addTag(TAG_METALINK);
  1368. op->setInitialOption(true);
  1369. op->setChangeOptionForReserved(true);
  1370. handlers.push_back(op);
  1371. }
  1372. {
  1373. OptionHandler* op(new BooleanOptionHandler(PREF_SHOW_FILES, TEXT_SHOW_FILES,
  1374. A2_V_FALSE,
  1375. OptionHandler::OPT_ARG, 'S'));
  1376. op->addTag(TAG_BASIC);
  1377. op->addTag(TAG_BITTORRENT);
  1378. op->addTag(TAG_METALINK);
  1379. handlers.push_back(op);
  1380. }
  1381. #endif // ENABLE_BITTORRENT || ENABLE_METALINK
  1382. // BitTorrent Specific Options
  1383. #ifdef ENABLE_BITTORRENT
  1384. {
  1385. OptionHandler* op(new BooleanOptionHandler(
  1386. PREF_BT_DETACH_SEED_ONLY, TEXT_BT_DETACH_SEED_ONLY, A2_V_FALSE,
  1387. OptionHandler::OPT_ARG));
  1388. op->addTag(TAG_BITTORRENT);
  1389. handlers.push_back(op);
  1390. }
  1391. {
  1392. OptionHandler* op(
  1393. new BooleanOptionHandler(PREF_BT_ENABLE_HOOK_AFTER_HASH_CHECK,
  1394. TEXT_BT_ENABLE_HOOK_AFTER_HASH_CHECK,
  1395. A2_V_TRUE, OptionHandler::OPT_ARG));
  1396. op->addTag(TAG_BITTORRENT);
  1397. op->setInitialOption(true);
  1398. op->setChangeGlobalOption(true);
  1399. op->setChangeOptionForReserved(true);
  1400. handlers.push_back(op);
  1401. }
  1402. {
  1403. OptionHandler* op(new BooleanOptionHandler(PREF_BT_ENABLE_LPD,
  1404. TEXT_BT_ENABLE_LPD, A2_V_FALSE,
  1405. OptionHandler::OPT_ARG));
  1406. op->addTag(TAG_BITTORRENT);
  1407. op->setInitialOption(true);
  1408. op->setChangeGlobalOption(true);
  1409. op->setChangeOptionForReserved(true);
  1410. handlers.push_back(op);
  1411. }
  1412. {
  1413. OptionHandler* op(new DefaultOptionHandler(PREF_BT_EXCLUDE_TRACKER,
  1414. TEXT_BT_EXCLUDE_TRACKER,
  1415. NO_DESCRIPTION, "URI,... "
  1416. "or *"));
  1417. op->addTag(TAG_BITTORRENT);
  1418. op->setInitialOption(true);
  1419. op->setChangeGlobalOption(true);
  1420. op->setChangeOptionForReserved(true);
  1421. handlers.push_back(op);
  1422. }
  1423. {
  1424. OptionHandler* op(
  1425. new DefaultOptionHandler(PREF_BT_EXTERNAL_IP, TEXT_BT_EXTERNAL_IP,
  1426. NO_DEFAULT_VALUE, "a numeric IP address"));
  1427. op->addTag(TAG_BITTORRENT);
  1428. op->setInitialOption(true);
  1429. op->setChangeGlobalOption(true);
  1430. op->setChangeOptionForReserved(true);
  1431. handlers.push_back(op);
  1432. }
  1433. {
  1434. OptionHandler* op(new BooleanOptionHandler(
  1435. PREF_BT_FORCE_ENCRYPTION, TEXT_BT_FORCE_ENCRYPTION, A2_V_FALSE,
  1436. OptionHandler::OPT_ARG));
  1437. op->addTag(TAG_BITTORRENT);
  1438. op->setInitialOption(true);
  1439. op->setChangeGlobalOption(true);
  1440. op->setChangeOptionForReserved(true);
  1441. handlers.push_back(op);
  1442. }
  1443. {
  1444. OptionHandler* op(new NumberOptionHandler(PREF_BT_KEEP_ALIVE_INTERVAL,
  1445. NO_DESCRIPTION, "120", 1, 120));
  1446. op->hide();
  1447. handlers.push_back(op);
  1448. }
  1449. {
  1450. OptionHandler* op(new BooleanOptionHandler(
  1451. PREF_BT_HASH_CHECK_SEED, TEXT_BT_HASH_CHECK_SEED, A2_V_TRUE,
  1452. OptionHandler::OPT_ARG));
  1453. op->addTag(TAG_BITTORRENT);
  1454. op->addTag(TAG_CHECKSUM);
  1455. op->setInitialOption(true);
  1456. op->setChangeGlobalOption(true);
  1457. op->setChangeOptionForReserved(true);
  1458. handlers.push_back(op);
  1459. }
  1460. {
  1461. OptionHandler* op(new DefaultOptionHandler(
  1462. PREF_BT_LPD_INTERFACE, TEXT_BT_LPD_INTERFACE, NO_DEFAULT_VALUE,
  1463. "interface, IP address", OptionHandler::REQ_ARG));
  1464. op->addTag(TAG_BITTORRENT);
  1465. handlers.push_back(op);
  1466. }
  1467. {
  1468. OptionHandler* op(new NumberOptionHandler(
  1469. PREF_BT_MAX_OPEN_FILES, TEXT_BT_MAX_OPEN_FILES, "100", 1));
  1470. op->addTag(TAG_BITTORRENT);
  1471. op->setChangeGlobalOption(true);
  1472. handlers.push_back(op);
  1473. }
  1474. {
  1475. OptionHandler* op(
  1476. new NumberOptionHandler(PREF_BT_MAX_PEERS, TEXT_BT_MAX_PEERS, "55", 0));
  1477. op->addTag(TAG_BITTORRENT);
  1478. op->setInitialOption(true);
  1479. op->setChangeOption(true);
  1480. op->setChangeGlobalOption(true);
  1481. op->setChangeOptionForReserved(true);
  1482. handlers.push_back(op);
  1483. }
  1484. {
  1485. OptionHandler* op(
  1486. new BooleanOptionHandler(PREF_BT_METADATA_ONLY, TEXT_BT_METADATA_ONLY,
  1487. A2_V_FALSE, OptionHandler::OPT_ARG));
  1488. op->addTag(TAG_BITTORRENT);
  1489. op->setInitialOption(true);
  1490. op->setChangeGlobalOption(true);
  1491. op->setChangeOptionForReserved(true);
  1492. handlers.push_back(op);
  1493. }
  1494. {
  1495. OptionHandler* op(new ParameterOptionHandler(PREF_BT_MIN_CRYPTO_LEVEL,
  1496. TEXT_BT_MIN_CRYPTO_LEVEL,
  1497. V_PLAIN, {V_PLAIN, V_ARC4}));
  1498. op->addTag(TAG_BITTORRENT);
  1499. op->setInitialOption(true);
  1500. op->setChangeGlobalOption(true);
  1501. op->setChangeOptionForReserved(true);
  1502. handlers.push_back(op);
  1503. }
  1504. {
  1505. OptionHandler* op(new PrioritizePieceOptionHandler(
  1506. PREF_BT_PRIORITIZE_PIECE, TEXT_BT_PRIORITIZE_PIECE));
  1507. op->addTag(TAG_BITTORRENT);
  1508. op->setInitialOption(true);
  1509. op->setChangeGlobalOption(true);
  1510. op->setChangeOptionForReserved(true);
  1511. handlers.push_back(op);
  1512. }
  1513. {
  1514. OptionHandler* op(new BooleanOptionHandler(
  1515. PREF_BT_REMOVE_UNSELECTED_FILE, TEXT_BT_REMOVE_UNSELECTED_FILE,
  1516. A2_V_FALSE, OptionHandler::OPT_ARG));
  1517. op->addTag(TAG_BITTORRENT);
  1518. op->setInitialOption(true);
  1519. op->setChangeOption(true);
  1520. op->setChangeGlobalOption(true);
  1521. op->setChangeOptionForReserved(true);
  1522. handlers.push_back(op);
  1523. }
  1524. {
  1525. OptionHandler* op(new UnitNumberOptionHandler(
  1526. PREF_BT_REQUEST_PEER_SPEED_LIMIT, TEXT_BT_REQUEST_PEER_SPEED_LIMIT,
  1527. "50K", 0));
  1528. op->addTag(TAG_BITTORRENT);
  1529. op->setInitialOption(true);
  1530. op->setChangeOption(true);
  1531. op->setChangeGlobalOption(true);
  1532. op->setChangeOptionForReserved(true);
  1533. handlers.push_back(op);
  1534. }
  1535. {
  1536. OptionHandler* op(
  1537. new BooleanOptionHandler(PREF_BT_REQUIRE_CRYPTO, TEXT_BT_REQUIRE_CRYPTO,
  1538. A2_V_FALSE, OptionHandler::OPT_ARG));
  1539. op->addTag(TAG_BITTORRENT);
  1540. op->setInitialOption(true);
  1541. op->setChangeGlobalOption(true);
  1542. op->setChangeOptionForReserved(true);
  1543. handlers.push_back(op);
  1544. }
  1545. {
  1546. OptionHandler* op(new NumberOptionHandler(PREF_BT_REQUEST_TIMEOUT,
  1547. NO_DESCRIPTION, "60", 1, 600));
  1548. op->hide();
  1549. handlers.push_back(op);
  1550. }
  1551. {
  1552. OptionHandler* op(new BooleanOptionHandler(
  1553. PREF_BT_SEED_UNVERIFIED, TEXT_BT_SEED_UNVERIFIED, A2_V_FALSE,
  1554. OptionHandler::OPT_ARG));
  1555. op->addTag(TAG_BITTORRENT);
  1556. op->setInitialOption(true);
  1557. op->setChangeGlobalOption(true);
  1558. op->setChangeOptionForReserved(true);
  1559. handlers.push_back(op);
  1560. }
  1561. {
  1562. OptionHandler* op(
  1563. new BooleanOptionHandler(PREF_BT_SAVE_METADATA, TEXT_BT_SAVE_METADATA,
  1564. A2_V_FALSE, OptionHandler::OPT_ARG));
  1565. op->addTag(TAG_BITTORRENT);
  1566. op->setInitialOption(true);
  1567. op->setChangeGlobalOption(true);
  1568. op->setChangeOptionForReserved(true);
  1569. handlers.push_back(op);
  1570. }
  1571. {
  1572. OptionHandler* op(new NumberOptionHandler(PREF_BT_STOP_TIMEOUT,
  1573. TEXT_BT_STOP_TIMEOUT, "0", 0));
  1574. op->addTag(TAG_BITTORRENT);
  1575. op->setInitialOption(true);
  1576. op->setChangeGlobalOption(true);
  1577. op->setChangeOptionForReserved(true);
  1578. handlers.push_back(op);
  1579. }
  1580. {
  1581. OptionHandler* op(new NumberOptionHandler(PREF_BT_TIMEOUT, NO_DESCRIPTION,
  1582. "180", 1, 600));
  1583. op->hide();
  1584. handlers.push_back(op);
  1585. }
  1586. {
  1587. OptionHandler* op(new DefaultOptionHandler(PREF_BT_TRACKER, TEXT_BT_TRACKER,
  1588. NO_DESCRIPTION, "URI,..."));
  1589. op->addTag(TAG_BITTORRENT);
  1590. op->setInitialOption(true);
  1591. op->setChangeGlobalOption(true);
  1592. op->setChangeOptionForReserved(true);
  1593. handlers.push_back(op);
  1594. }
  1595. {
  1596. OptionHandler* op(new NumberOptionHandler(PREF_BT_TRACKER_CONNECT_TIMEOUT,
  1597. TEXT_BT_TRACKER_CONNECT_TIMEOUT,
  1598. "60", 1, 600));
  1599. op->addTag(TAG_BITTORRENT);
  1600. op->setInitialOption(true);
  1601. op->setChangeGlobalOption(true);
  1602. op->setChangeOptionForReserved(true);
  1603. handlers.push_back(op);
  1604. }
  1605. {
  1606. OptionHandler* op(new NumberOptionHandler(
  1607. PREF_BT_TRACKER_INTERVAL, TEXT_BT_TRACKER_INTERVAL, "0", 0));
  1608. op->addTag(TAG_BITTORRENT);
  1609. op->setInitialOption(true);
  1610. op->setChangeGlobalOption(true);
  1611. op->setChangeOptionForReserved(true);
  1612. handlers.push_back(op);
  1613. }
  1614. {
  1615. OptionHandler* op(new NumberOptionHandler(
  1616. PREF_BT_TRACKER_TIMEOUT, TEXT_BT_TRACKER_TIMEOUT, "60", 1, 600));
  1617. op->addTag(TAG_BITTORRENT);
  1618. op->setInitialOption(true);
  1619. op->setChangeGlobalOption(true);
  1620. op->setChangeOptionForReserved(true);
  1621. handlers.push_back(op);
  1622. }
  1623. {
  1624. OptionHandler* op(new HostPortOptionHandler(
  1625. PREF_DHT_ENTRY_POINT, TEXT_DHT_ENTRY_POINT, NO_DEFAULT_VALUE,
  1626. PREF_DHT_ENTRY_POINT_HOST, PREF_DHT_ENTRY_POINT_PORT));
  1627. op->addTag(TAG_BITTORRENT);
  1628. handlers.push_back(op);
  1629. }
  1630. {
  1631. OptionHandler* op(new HostPortOptionHandler(
  1632. PREF_DHT_ENTRY_POINT6, TEXT_DHT_ENTRY_POINT6, NO_DEFAULT_VALUE,
  1633. PREF_DHT_ENTRY_POINT_HOST6, PREF_DHT_ENTRY_POINT_PORT6));
  1634. op->addTag(TAG_BITTORRENT);
  1635. handlers.push_back(op);
  1636. }
  1637. {
  1638. OptionHandler* op(
  1639. new DefaultOptionHandler(PREF_DHT_FILE_PATH, TEXT_DHT_FILE_PATH,
  1640. util::getDHTFile(false), PATH_TO_FILE));
  1641. op->addTag(TAG_BITTORRENT);
  1642. handlers.push_back(op);
  1643. }
  1644. {
  1645. OptionHandler* op(
  1646. new DefaultOptionHandler(PREF_DHT_FILE_PATH6, TEXT_DHT_FILE_PATH6,
  1647. util::getDHTFile(true), PATH_TO_FILE));
  1648. op->addTag(TAG_BITTORRENT);
  1649. handlers.push_back(op);
  1650. }
  1651. {
  1652. OptionHandler* op(new DefaultOptionHandler(
  1653. PREF_DHT_LISTEN_ADDR, NO_DESCRIPTION, NO_DEFAULT_VALUE));
  1654. op->hide();
  1655. op->addTag(TAG_BASIC);
  1656. op->addTag(TAG_BITTORRENT);
  1657. handlers.push_back(op);
  1658. }
  1659. {
  1660. OptionHandler* op(new DefaultOptionHandler(
  1661. PREF_DHT_LISTEN_ADDR6, TEXT_DHT_LISTEN_ADDR6, NO_DEFAULT_VALUE));
  1662. op->addTag(TAG_BASIC);
  1663. op->addTag(TAG_BITTORRENT);
  1664. handlers.push_back(op);
  1665. }
  1666. {
  1667. OptionHandler* op(new IntegerRangeOptionHandler(
  1668. PREF_DHT_LISTEN_PORT, TEXT_DHT_LISTEN_PORT, "6881-6999", 1024,
  1669. UINT16_MAX));
  1670. op->addTag(TAG_BASIC);
  1671. op->addTag(TAG_BITTORRENT);
  1672. handlers.push_back(op);
  1673. }
  1674. {
  1675. OptionHandler* op(new NumberOptionHandler(
  1676. PREF_DHT_MESSAGE_TIMEOUT, TEXT_DHT_MESSAGE_TIMEOUT, "10", 1, 60));
  1677. op->addTag(TAG_BITTORRENT);
  1678. handlers.push_back(op);
  1679. }
  1680. {
  1681. OptionHandler* op(new BooleanOptionHandler(
  1682. PREF_ENABLE_DHT, TEXT_ENABLE_DHT, A2_V_TRUE, OptionHandler::OPT_ARG));
  1683. op->addTag(TAG_BASIC);
  1684. op->addTag(TAG_BITTORRENT);
  1685. handlers.push_back(op);
  1686. }
  1687. {
  1688. OptionHandler* op(new BooleanOptionHandler(PREF_ENABLE_DHT6,
  1689. TEXT_ENABLE_DHT6, A2_V_FALSE,
  1690. OptionHandler::OPT_ARG));
  1691. op->addTag(TAG_BASIC);
  1692. op->addTag(TAG_BITTORRENT);
  1693. handlers.push_back(op);
  1694. }
  1695. {
  1696. OptionHandler* op(new BooleanOptionHandler(
  1697. PREF_ENABLE_PEER_EXCHANGE, TEXT_ENABLE_PEER_EXCHANGE, A2_V_TRUE,
  1698. OptionHandler::OPT_ARG));
  1699. op->addTag(TAG_BITTORRENT);
  1700. op->setInitialOption(true);
  1701. op->setChangeGlobalOption(true);
  1702. op->setChangeOptionForReserved(true);
  1703. handlers.push_back(op);
  1704. }
  1705. {
  1706. OptionHandler* op(
  1707. new ParameterOptionHandler(PREF_FOLLOW_TORRENT, TEXT_FOLLOW_TORRENT,
  1708. A2_V_TRUE, {A2_V_TRUE, V_MEM, A2_V_FALSE}));
  1709. op->addTag(TAG_BITTORRENT);
  1710. op->setInitialOption(true);
  1711. op->setChangeGlobalOption(true);
  1712. op->setChangeOptionForReserved(true);
  1713. handlers.push_back(op);
  1714. }
  1715. {
  1716. OptionHandler* op(
  1717. new IndexOutOptionHandler(PREF_INDEX_OUT, TEXT_INDEX_OUT, 'O'));
  1718. op->addTag(TAG_BITTORRENT);
  1719. op->setInitialOption(true);
  1720. op->setCumulative(true);
  1721. op->setChangeOptionForReserved(true);
  1722. handlers.push_back(op);
  1723. }
  1724. {
  1725. OptionHandler* op(new IntegerRangeOptionHandler(
  1726. PREF_LISTEN_PORT, TEXT_LISTEN_PORT, "6881-6999", 1024, UINT16_MAX));
  1727. op->addTag(TAG_BASIC);
  1728. op->addTag(TAG_BITTORRENT);
  1729. handlers.push_back(op);
  1730. }
  1731. {
  1732. OptionHandler* op(new UnitNumberOptionHandler(
  1733. PREF_MAX_OVERALL_UPLOAD_LIMIT, TEXT_MAX_OVERALL_UPLOAD_LIMIT, "0", 0));
  1734. op->addTag(TAG_BASIC);
  1735. op->addTag(TAG_BITTORRENT);
  1736. op->setChangeGlobalOption(true);
  1737. handlers.push_back(op);
  1738. }
  1739. {
  1740. OptionHandler* op(new UnitNumberOptionHandler(
  1741. PREF_MAX_UPLOAD_LIMIT, TEXT_MAX_UPLOAD_LIMIT, "0", 0, -1, 'u'));
  1742. op->addTag(TAG_BASIC);
  1743. op->addTag(TAG_BITTORRENT);
  1744. op->setInitialOption(true);
  1745. op->setChangeOption(true);
  1746. op->setChangeGlobalOption(true);
  1747. op->setChangeOptionForReserved(true);
  1748. handlers.push_back(op);
  1749. }
  1750. {
  1751. OptionHandler* op(new DefaultOptionHandler(
  1752. PREF_ON_BT_DOWNLOAD_COMPLETE, TEXT_ON_BT_DOWNLOAD_COMPLETE,
  1753. NO_DEFAULT_VALUE, PATH_TO_COMMAND));
  1754. op->addTag(TAG_ADVANCED);
  1755. op->addTag(TAG_HOOK);
  1756. handlers.push_back(op);
  1757. }
  1758. {
  1759. OptionHandler* op(new NumberOptionHandler(PREF_PEER_CONNECTION_TIMEOUT,
  1760. NO_DESCRIPTION, "20", 1, 600));
  1761. op->hide();
  1762. handlers.push_back(op);
  1763. }
  1764. {
  1765. int major, minor, micro;
  1766. sscanf(PACKAGE_VERSION, "%d.%d.%d", &major, &minor, &micro);
  1767. char prefix[21];
  1768. snprintf(prefix, sizeof(prefix), "A2-%d-%d-%d-", major, minor, micro);
  1769. OptionHandler* op(new DefaultOptionHandler(PREF_PEER_ID_PREFIX,
  1770. TEXT_PEER_ID_PREFIX, prefix));
  1771. op->addTag(TAG_BITTORRENT);
  1772. handlers.push_back(op);
  1773. }
  1774. {
  1775. OptionHandler* op(new NumberOptionHandler(PREF_SEED_TIME, TEXT_SEED_TIME,
  1776. NO_DEFAULT_VALUE, 0));
  1777. op->addTag(TAG_BITTORRENT);
  1778. op->setInitialOption(true);
  1779. op->setChangeGlobalOption(true);
  1780. op->setChangeOptionForReserved(true);
  1781. handlers.push_back(op);
  1782. }
  1783. {
  1784. OptionHandler* op(new FloatNumberOptionHandler(
  1785. PREF_SEED_RATIO, TEXT_SEED_RATIO, "1.0", 0.0));
  1786. op->addTag(TAG_BITTORRENT);
  1787. op->setInitialOption(true);
  1788. op->setChangeGlobalOption(true);
  1789. op->setChangeOptionForReserved(true);
  1790. handlers.push_back(op);
  1791. }
  1792. {
  1793. OptionHandler* op(new LocalFilePathOptionHandler(
  1794. PREF_TORRENT_FILE, TEXT_TORRENT_FILE, NO_DEFAULT_VALUE, false, 'T'));
  1795. op->addTag(TAG_BASIC);
  1796. op->addTag(TAG_BITTORRENT);
  1797. handlers.push_back(op);
  1798. }
  1799. #endif // ENABLE_BITTORRENT
  1800. // Metalink Specific Options
  1801. #ifdef ENABLE_METALINK
  1802. {
  1803. OptionHandler* op(
  1804. new ParameterOptionHandler(PREF_FOLLOW_METALINK, TEXT_FOLLOW_METALINK,
  1805. A2_V_TRUE, {A2_V_TRUE, V_MEM, A2_V_FALSE}));
  1806. op->addTag(TAG_METALINK);
  1807. op->setInitialOption(true);
  1808. op->setChangeGlobalOption(true);
  1809. op->setChangeOptionForReserved(true);
  1810. handlers.push_back(op);
  1811. }
  1812. {
  1813. OptionHandler* op(new DefaultOptionHandler(
  1814. PREF_METALINK_BASE_URI, TEXT_METALINK_BASE_URI, NO_DEFAULT_VALUE));
  1815. op->addTag(TAG_METALINK);
  1816. op->setInitialOption(true);
  1817. op->setChangeGlobalOption(true);
  1818. handlers.push_back(op);
  1819. }
  1820. {
  1821. OptionHandler* op(
  1822. new BooleanOptionHandler(PREF_METALINK_ENABLE_UNIQUE_PROTOCOL,
  1823. TEXT_METALINK_ENABLE_UNIQUE_PROTOCOL,
  1824. A2_V_TRUE, OptionHandler::OPT_ARG));
  1825. op->addTag(TAG_METALINK);
  1826. op->setInitialOption(true);
  1827. op->setChangeGlobalOption(true);
  1828. op->setChangeOptionForReserved(true);
  1829. handlers.push_back(op);
  1830. }
  1831. {
  1832. OptionHandler* op(new LocalFilePathOptionHandler(
  1833. PREF_METALINK_FILE, TEXT_METALINK_FILE, NO_DEFAULT_VALUE, true, 'M'));
  1834. op->addTag(TAG_BASIC);
  1835. op->addTag(TAG_METALINK);
  1836. handlers.push_back(op);
  1837. }
  1838. {
  1839. OptionHandler* op(new DefaultOptionHandler(PREF_METALINK_LANGUAGE,
  1840. TEXT_METALINK_LANGUAGE));
  1841. op->addTag(TAG_METALINK);
  1842. op->setInitialOption(true);
  1843. op->setChangeGlobalOption(true);
  1844. op->setChangeOptionForReserved(true);
  1845. handlers.push_back(op);
  1846. }
  1847. {
  1848. OptionHandler* op(
  1849. new DefaultOptionHandler(PREF_METALINK_OS, TEXT_METALINK_OS));
  1850. op->addTag(TAG_METALINK);
  1851. op->setInitialOption(true);
  1852. op->setChangeGlobalOption(true);
  1853. op->setChangeOptionForReserved(true);
  1854. handlers.push_back(op);
  1855. }
  1856. {
  1857. OptionHandler* op(new ParameterOptionHandler(
  1858. PREF_METALINK_PREFERRED_PROTOCOL, TEXT_METALINK_PREFERRED_PROTOCOL,
  1859. V_NONE, {V_HTTP, V_HTTPS, V_FTP, V_NONE}));
  1860. op->addTag(TAG_METALINK);
  1861. op->setInitialOption(true);
  1862. op->setChangeGlobalOption(true);
  1863. op->setChangeOptionForReserved(true);
  1864. handlers.push_back(op);
  1865. }
  1866. {
  1867. OptionHandler* op(
  1868. new DefaultOptionHandler(PREF_METALINK_VERSION, TEXT_METALINK_VERSION));
  1869. op->addTag(TAG_METALINK);
  1870. op->setInitialOption(true);
  1871. op->setChangeGlobalOption(true);
  1872. op->setChangeOptionForReserved(true);
  1873. handlers.push_back(op);
  1874. }
  1875. #endif // ENABLE_METALINK
  1876. // Version Option
  1877. {
  1878. OptionHandler* op(new DefaultOptionHandler(PREF_VERSION, TEXT_VERSION,
  1879. NO_DEFAULT_VALUE, A2STR::NIL,
  1880. OptionHandler::NO_ARG, 'v'));
  1881. op->addTag(TAG_BASIC);
  1882. handlers.push_back(op);
  1883. }
  1884. // Help Option
  1885. {
  1886. std::string tagsStr;
  1887. for (int i = 0; i < MAX_HELP_TAG; ++i) {
  1888. tagsStr += strHelpTag(i);
  1889. tagsStr += ", ";
  1890. }
  1891. tagsStr += STR_TAG_ALL;
  1892. OptionHandler* op(new DefaultOptionHandler(PREF_HELP, TEXT_HELP,
  1893. strHelpTag(TAG_BASIC), tagsStr,
  1894. OptionHandler::OPT_ARG, 'h'));
  1895. op->addTag(TAG_BASIC);
  1896. op->addTag(TAG_HELP);
  1897. handlers.push_back(op);
  1898. }
  1899. return handlers;
  1900. }
  1901. } // namespace aria2