OptionHandlerFactory.cc 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209
  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 "StringFormat.h"
  44. namespace aria2 {
  45. OptionHandlers OptionHandlerFactory::createOptionHandlers()
  46. {
  47. OptionHandlers handlers;
  48. // General Options
  49. {
  50. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  51. (PREF_ALLOW_OVERWRITE,
  52. TEXT_ALLOW_OVERWRITE,
  53. V_FALSE));
  54. op->addTag(TAG_ADVANCED);
  55. handlers.push_back(op);
  56. }
  57. {
  58. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  59. (PREF_ALLOW_PIECE_LENGTH_CHANGE,
  60. TEXT_ALLOW_PIECE_LENGTH_CHANGE,
  61. V_FALSE));
  62. op->addTag(TAG_ADVANCED);
  63. handlers.push_back(op);
  64. }
  65. #ifdef ENABLE_ASYNC_DNS
  66. {
  67. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  68. (PREF_ASYNC_DNS,
  69. TEXT_ASYNC_DNS,
  70. V_TRUE,
  71. OptionHandler::OPT_ARG));
  72. op->addTag(TAG_ADVANCED);
  73. handlers.push_back(op);
  74. }
  75. #endif // ENABLE_ASYNC_DNS
  76. {
  77. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  78. (PREF_AUTO_FILE_RENAMING,
  79. TEXT_AUTO_FILE_RENAMING,
  80. V_TRUE,
  81. OptionHandler::OPT_ARG));
  82. op->addTag(TAG_ADVANCED);
  83. handlers.push_back(op);
  84. }
  85. {
  86. SharedHandle<OptionHandler> op(new NumberOptionHandler
  87. (PREF_AUTO_SAVE_INTERVAL,
  88. TEXT_AUTO_SAVE_INTERVAL,
  89. "60",
  90. 0, 600));
  91. op->addTag(TAG_ADVANCED);
  92. handlers.push_back(op);
  93. }
  94. #ifdef ENABLE_MESSAGE_DIGEST
  95. {
  96. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  97. (PREF_CHECK_INTEGRITY,
  98. TEXT_CHECK_INTEGRITY,
  99. V_FALSE,
  100. OptionHandler::OPT_ARG,
  101. 'V'));
  102. op->addTag(TAG_BASIC);
  103. op->addTag(TAG_BITTORRENT);
  104. op->addTag(TAG_METALINK);
  105. handlers.push_back(op);
  106. }
  107. #endif // ENABLE_MESSAGE_DIGEST
  108. {
  109. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  110. (PREF_CONF_PATH,
  111. TEXT_CONF_PATH,
  112. Util::getHomeDir()+"/.aria2/aria2.conf"));
  113. op->addTag(TAG_ADVANCED);
  114. handlers.push_back(op);
  115. }
  116. {
  117. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  118. (PREF_CONTINUE,
  119. TEXT_CONTINUE,
  120. V_FALSE, // TODO ommit?
  121. OptionHandler::NO_ARG,
  122. 'c'));
  123. op->addTag(TAG_BASIC);
  124. op->addTag(TAG_FTP);
  125. op->addTag(TAG_HTTP);
  126. handlers.push_back(op);
  127. }
  128. {
  129. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  130. (PREF_DAEMON,
  131. TEXT_DAEMON,
  132. V_FALSE,
  133. OptionHandler::NO_ARG,
  134. 'D')); // TODO ommit?
  135. op->addTag(TAG_ADVANCED);
  136. handlers.push_back(op);
  137. }
  138. {
  139. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  140. (PREF_DIR,
  141. TEXT_DIR,
  142. ".",
  143. A2STR::NIL,
  144. OptionHandler::REQ_ARG,
  145. 'd'));
  146. op->addTag(TAG_BASIC);
  147. handlers.push_back(op);
  148. }
  149. {
  150. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  151. (PREF_DNS_TIMEOUT,
  152. NO_DESCRIPTION,
  153. "30",
  154. 1, 60));
  155. op->hide();
  156. handlers.push_back(op);
  157. }
  158. #ifdef ENABLE_DIRECT_IO
  159. {
  160. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  161. (PREF_ENABLE_DIRECT_IO,
  162. TEXT_ENABLE_DIRECT_IO,
  163. V_TRUE,
  164. OptionHandler::OPT_ARG));
  165. op->addTag(TAG_ADVANCED);
  166. handlers.push_back(op);
  167. }
  168. #endif // ENABLE_DIRECT_IO
  169. {
  170. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  171. (PREF_ENABLE_HTTP_SERVER,
  172. TEXT_ENABLE_HTTP_SERVER,
  173. V_FALSE,
  174. OptionHandler::OPT_ARG));
  175. op->addTag(TAG_EXPERIMENTAL);
  176. handlers.push_back(op);
  177. }
  178. {
  179. std::string params[] = {
  180. #ifdef HAVE_EPOLL
  181. V_EPOLL,
  182. #endif // HAVE_EPOLL
  183. V_SELECT
  184. };
  185. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  186. (PREF_EVENT_POLL,
  187. TEXT_EVENT_POLL,
  188. #ifdef HAVE_EPOLL
  189. V_EPOLL,
  190. #else // !HAVE_EPOLL
  191. V_SELECT,
  192. #endif // !HAVE_EPOLL
  193. std::deque<std::string>
  194. (&params[0],&params[arrayLength(params)])));
  195. op->addTag(TAG_ADVANCED);
  196. handlers.push_back(op);
  197. }
  198. {
  199. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  200. (PREF_FILE_ALLOCATION,
  201. TEXT_FILE_ALLOCATION,
  202. V_PREALLOC,
  203. V_NONE, V_PREALLOC,
  204. #ifdef HAVE_POSIX_FALLOCATE
  205. V_FALLOC,
  206. #endif // HAVE_POSIX_FALLOCATE
  207. 'a'));
  208. op->addTag(TAG_BASIC);
  209. handlers.push_back(op);
  210. }
  211. {
  212. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  213. (PREF_FORCE_SEQUENTIAL,
  214. TEXT_FORCE_SEQUENTIAL,
  215. V_FALSE,
  216. OptionHandler::OPT_ARG,
  217. 'Z'));
  218. op->addTag(TAG_BASIC);
  219. handlers.push_back(op);
  220. }
  221. {
  222. SharedHandle<OptionHandler> op(new NumberOptionHandler
  223. (PREF_HTTP_SERVER_LISTEN_PORT,
  224. TEXT_HTTP_SERVER_LISTEN_PORT,
  225. "6800",
  226. 1024, UINT16_MAX));
  227. op->addTag(TAG_EXPERIMENTAL);
  228. handlers.push_back(op);
  229. }
  230. {
  231. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  232. (PREF_INPUT_FILE,
  233. TEXT_INPUT_FILE,
  234. NO_DEFAULT_VALUE,
  235. "FILENAME,-",
  236. OptionHandler::REQ_ARG,
  237. 'i'));
  238. op->addTag(TAG_BASIC);
  239. handlers.push_back(op);
  240. }
  241. {
  242. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  243. (PREF_LOG,
  244. TEXT_LOG,
  245. NO_DEFAULT_VALUE,
  246. "FILENAME,-",
  247. OptionHandler::REQ_ARG,
  248. 'l'));
  249. op->addTag(TAG_BASIC);
  250. handlers.push_back(op);
  251. }
  252. {
  253. const std::string params[] = { V_DEBUG, V_INFO, V_NOTICE, V_WARN, V_ERROR };
  254. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  255. (PREF_LOG_LEVEL,
  256. TEXT_LOG_LEVEL,
  257. V_DEBUG,
  258. std::deque<std::string>
  259. (&params[0],
  260. &params[arrayLength(params)])));
  261. op->addTag(TAG_ADVANCED);
  262. handlers.push_back(op);
  263. }
  264. {
  265. SharedHandle<OptionHandler> op(new NumberOptionHandler
  266. (PREF_MAX_CONCURRENT_DOWNLOADS,
  267. TEXT_MAX_CONCURRENT_DOWNLOADS,
  268. "5",
  269. 1, -1,
  270. 'j'));
  271. op->addTag(TAG_BASIC);
  272. handlers.push_back(op);
  273. }
  274. {
  275. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  276. (PREF_MAX_DOWNLOAD_LIMIT,
  277. TEXT_MAX_DOWNLOAD_LIMIT,
  278. "0",
  279. 0));
  280. op->addTag(TAG_BITTORRENT);
  281. op->addTag(TAG_FTP);
  282. op->addTag(TAG_HTTP);
  283. handlers.push_back(op);
  284. }
  285. {
  286. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  287. (PREF_MAX_OVERALL_DOWNLOAD_LIMIT,
  288. TEXT_MAX_OVERALL_DOWNLOAD_LIMIT,
  289. "0",
  290. 0));
  291. op->addTag(TAG_BITTORRENT);
  292. op->addTag(TAG_FTP);
  293. op->addTag(TAG_HTTP);
  294. handlers.push_back(op);
  295. }
  296. {
  297. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  298. (PREF_NO_CONF,
  299. TEXT_NO_CONF,
  300. V_FALSE,
  301. OptionHandler::NO_ARG));
  302. op->addTag(TAG_ADVANCED);
  303. handlers.push_back(op);
  304. }
  305. {
  306. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  307. (PREF_NO_FILE_ALLOCATION_LIMIT,
  308. TEXT_NO_FILE_ALLOCATION_LIMIT,
  309. "5M",
  310. 0));
  311. op->addTag(TAG_ADVANCED);
  312. handlers.push_back(op);
  313. }
  314. {
  315. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  316. (PREF_PARAMETERIZED_URI,
  317. TEXT_PARAMETERIZED_URI,
  318. V_FALSE,
  319. OptionHandler::OPT_ARG,
  320. 'P'));
  321. op->addTag(TAG_ADVANCED);
  322. handlers.push_back(op);
  323. }
  324. {
  325. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  326. (PREF_QUIET,
  327. TEXT_QUIET,
  328. V_FALSE,
  329. OptionHandler::OPT_ARG,
  330. 'q'));
  331. op->addTag(TAG_ADVANCED);
  332. handlers.push_back(op);
  333. }
  334. #ifdef ENABLE_MESSAGE_DIGEST
  335. {
  336. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  337. (PREF_REALTIME_CHUNK_CHECKSUM,
  338. TEXT_REALTIME_CHUNK_CHECKSUM,
  339. V_TRUE));
  340. op->addTag(TAG_METALINK);
  341. handlers.push_back(op);
  342. }
  343. #endif // ENABLE_MESSAGE_DIGEST
  344. {
  345. SharedHandle<OptionHandler> op(new NumberOptionHandler
  346. (PREF_STOP,
  347. TEXT_STOP,
  348. "0",
  349. 0, INT32_MAX));
  350. op->addTag(TAG_ADVANCED);
  351. handlers.push_back(op);
  352. }
  353. {
  354. SharedHandle<OptionHandler> op(new NumberOptionHandler
  355. (PREF_SUMMARY_INTERVAL,
  356. TEXT_SUMMARY_INTERVAL,
  357. "60",
  358. 0, INT32_MAX));
  359. op->addTag(TAG_ADVANCED);
  360. handlers.push_back(op);
  361. }
  362. // HTTP/FTP options
  363. {
  364. SharedHandle<OptionHandler> op(new NumberOptionHandler
  365. (PREF_CONNECT_TIMEOUT,
  366. TEXT_CONNECT_TIMEOUT,
  367. "60",
  368. 1, 600));
  369. op->addTag(TAG_FTP);
  370. op->addTag(TAG_HTTP);
  371. handlers.push_back(op);
  372. }
  373. {
  374. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  375. (PREF_DRY_RUN,
  376. TEXT_DRY_RUN,
  377. V_FALSE,
  378. OptionHandler::OPT_ARG));
  379. op->addTag(TAG_FTP);
  380. op->addTag(TAG_HTTP);
  381. handlers.push_back(op);
  382. }
  383. {
  384. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  385. (PREF_LOWEST_SPEED_LIMIT,
  386. TEXT_LOWEST_SPEED_LIMIT,
  387. "0",
  388. 0));
  389. op->addTag(TAG_FTP);
  390. op->addTag(TAG_HTTP);
  391. handlers.push_back(op);
  392. }
  393. {
  394. SharedHandle<OptionHandler> op(new NumberOptionHandler
  395. (PREF_MAX_FILE_NOT_FOUND,
  396. TEXT_MAX_FILE_NOT_FOUND,
  397. "0",
  398. 0));
  399. op->addTag(TAG_FTP);
  400. op->addTag(TAG_HTTP);
  401. handlers.push_back(op);
  402. }
  403. {
  404. SharedHandle<OptionHandler> op(new NumberOptionHandler
  405. (PREF_MAX_TRIES,
  406. TEXT_MAX_TRIES,
  407. "5",
  408. 0, -1,
  409. 'm'));
  410. op->addTag(TAG_FTP);
  411. op->addTag(TAG_HTTP);
  412. handlers.push_back(op);
  413. }
  414. {
  415. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  416. (PREF_OUT,
  417. TEXT_OUT,
  418. NO_DEFAULT_VALUE,
  419. "FILENAME",
  420. OptionHandler::REQ_ARG,
  421. 'o'));
  422. op->addTag(TAG_BASIC);
  423. op->addTag(TAG_FTP);
  424. op->addTag(TAG_HTTP);
  425. handlers.push_back(op);
  426. }
  427. {
  428. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  429. (PREF_REMOTE_TIME,
  430. TEXT_REMOTE_TIME,
  431. V_FALSE,
  432. OptionHandler::OPT_ARG,
  433. 'R'));
  434. op->addTag(TAG_FTP);
  435. op->addTag(TAG_HTTP);
  436. handlers.push_back(op);
  437. }
  438. {
  439. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  440. (PREF_RESET_URI,
  441. NO_DESCRIPTION,
  442. V_FALSE,
  443. OptionHandler::OPT_ARG));
  444. op->hide();
  445. handlers.push_back(op);
  446. }
  447. {
  448. SharedHandle<OptionHandler> op(new NumberOptionHandler
  449. (PREF_RETRY_WAIT,
  450. TEXT_RETRY_WAIT,
  451. "5",
  452. 0, 60));
  453. op->addTag(TAG_FTP);
  454. op->addTag(TAG_HTTP);
  455. handlers.push_back(op);
  456. }
  457. {
  458. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  459. (PREF_REUSE_URI,
  460. NO_DESCRIPTION,
  461. V_TRUE));
  462. op->hide();
  463. handlers.push_back(op);
  464. }
  465. {
  466. SharedHandle<UnitNumberOptionHandler> op(new UnitNumberOptionHandler
  467. (PREF_SEGMENT_SIZE,
  468. NO_DESCRIPTION,
  469. "1M",
  470. 1024, -1));
  471. op->hide();
  472. handlers.push_back(op);
  473. }
  474. {
  475. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  476. (PREF_SERVER_STAT_IF,
  477. TEXT_SERVER_STAT_IF,
  478. NO_DEFAULT_VALUE,
  479. "FILENAME"));
  480. op->addTag(TAG_FTP);
  481. op->addTag(TAG_HTTP);
  482. handlers.push_back(op);
  483. }
  484. {
  485. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  486. (PREF_SERVER_STAT_OF,
  487. TEXT_SERVER_STAT_OF,
  488. NO_DEFAULT_VALUE,
  489. "FILENAME"));
  490. op->addTag(TAG_FTP);
  491. op->addTag(TAG_HTTP);
  492. handlers.push_back(op);
  493. }
  494. {
  495. SharedHandle<OptionHandler> op(new NumberOptionHandler
  496. (PREF_SERVER_STAT_TIMEOUT,
  497. TEXT_SERVER_STAT_TIMEOUT,
  498. "86400",
  499. 0, INT32_MAX));
  500. op->addTag(TAG_FTP);
  501. op->addTag(TAG_HTTP);
  502. handlers.push_back(op);
  503. }
  504. {
  505. SharedHandle<OptionHandler> op(new NumberOptionHandler
  506. (PREF_SPLIT,
  507. TEXT_SPLIT,
  508. "5",
  509. 1, -1,
  510. 's'));
  511. op->addTag(TAG_BASIC);
  512. op->addTag(TAG_FTP);
  513. op->addTag(TAG_HTTP);
  514. handlers.push_back(op);
  515. }
  516. {
  517. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  518. (PREF_STARTUP_IDLE_TIME,
  519. NO_DESCRIPTION,
  520. "10",
  521. 1, 60));
  522. op->hide();
  523. handlers.push_back(op);
  524. }
  525. {
  526. SharedHandle<OptionHandler> op(new NumberOptionHandler
  527. (PREF_TIMEOUT,
  528. TEXT_TIMEOUT,
  529. "60",
  530. 1, 600,
  531. 't'));
  532. op->addTag(TAG_FTP);
  533. op->addTag(TAG_HTTP);
  534. handlers.push_back(op);
  535. }
  536. {
  537. const std::string params[] = { V_INORDER, V_FEEDBACK, V_ADAPTIVE };
  538. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  539. (PREF_URI_SELECTOR,
  540. TEXT_URI_SELECTOR,
  541. V_FEEDBACK,
  542. std::deque<std::string>
  543. (&params[0], &params[arrayLength(params)])));
  544. op->addTag(TAG_FTP);
  545. op->addTag(TAG_HTTP);
  546. handlers.push_back(op);
  547. }
  548. // HTTP Specific Options
  549. {
  550. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  551. (PREF_CA_CERTIFICATE,
  552. TEXT_CA_CERTIFICATE,
  553. CA_BUNDLE));
  554. op->addTag(TAG_HTTP);
  555. op->addTag(TAG_HTTPS);
  556. handlers.push_back(op);
  557. }
  558. {
  559. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  560. (PREF_CERTIFICATE,
  561. TEXT_CERTIFICATE));
  562. op->addTag(TAG_HTTP);
  563. op->addTag(TAG_HTTPS);
  564. handlers.push_back(op);
  565. }
  566. {
  567. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  568. (PREF_CHECK_CERTIFICATE,
  569. TEXT_CHECK_CERTIFICATE,
  570. V_TRUE,
  571. OptionHandler::OPT_ARG));
  572. op->addTag(TAG_HTTP);
  573. op->addTag(TAG_HTTPS);
  574. handlers.push_back(op);
  575. }
  576. {
  577. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  578. (PREF_ENABLE_HTTP_KEEP_ALIVE,
  579. TEXT_ENABLE_HTTP_KEEP_ALIVE,
  580. V_TRUE,
  581. OptionHandler::OPT_ARG));
  582. op->addTag(TAG_HTTP);
  583. handlers.push_back(op);
  584. }
  585. {
  586. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  587. (PREF_ENABLE_HTTP_PIPELINING,
  588. TEXT_ENABLE_HTTP_PIPELINING,
  589. V_FALSE,
  590. OptionHandler::OPT_ARG));
  591. op->addTag(TAG_HTTP);
  592. handlers.push_back(op);
  593. }
  594. {
  595. SharedHandle<OptionHandler> op(new CumulativeOptionHandler
  596. (PREF_HEADER,
  597. TEXT_HEADER,
  598. NO_DEFAULT_VALUE,
  599. "\n"));
  600. op->addTag(TAG_HTTP);
  601. handlers.push_back(op);
  602. }
  603. {
  604. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  605. (PREF_HTTP_AUTH_CHALLENGE,
  606. TEXT_HTTP_AUTH_CHALLENGE,
  607. V_FALSE,
  608. OptionHandler::OPT_ARG));
  609. op->addTag(TAG_HTTP);
  610. handlers.push_back(op);
  611. }
  612. {
  613. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  614. (PREF_HTTP_AUTH_SCHEME,
  615. TEXT_HTTP_AUTH_SCHEME,
  616. V_BASIC,
  617. V_BASIC));
  618. op->addTag(TAG_HTTP);
  619. handlers.push_back(op);
  620. }
  621. {
  622. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  623. (PREF_HTTP_PASSWD,
  624. TEXT_HTTP_PASSWD));
  625. op->addTag(TAG_BASIC);
  626. op->addTag(TAG_HTTP);
  627. handlers.push_back(op);
  628. }
  629. {
  630. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  631. (PREF_HTTP_USER,
  632. TEXT_HTTP_USER));
  633. op->addTag(TAG_BASIC);
  634. op->addTag(TAG_HTTP);
  635. handlers.push_back(op);
  636. }
  637. {
  638. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  639. (PREF_LOAD_COOKIES,
  640. TEXT_LOAD_COOKIES,
  641. NO_DEFAULT_VALUE,
  642. "FILENAME"));
  643. op->addTag(TAG_BASIC);
  644. op->addTag(TAG_HTTP);
  645. handlers.push_back(op);
  646. }
  647. {
  648. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  649. (PREF_MAX_HTTP_PIPELINING,
  650. NO_DESCRIPTION,
  651. "2",
  652. 1, 8));
  653. op->hide();
  654. handlers.push_back(op);
  655. }
  656. {
  657. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  658. (PREF_PRIVATE_KEY,
  659. TEXT_PRIVATE_KEY));
  660. op->addTag(TAG_HTTP);
  661. op->addTag(TAG_HTTPS);
  662. handlers.push_back(op);
  663. }
  664. {
  665. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  666. (PREF_REFERER,
  667. TEXT_REFERER));
  668. op->addTag(TAG_HTTP);
  669. handlers.push_back(op);
  670. }
  671. {
  672. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  673. (PREF_USE_HEAD,
  674. TEXT_USE_HEAD,
  675. V_TRUE,
  676. OptionHandler::OPT_ARG));
  677. op->addTag(TAG_HTTP);
  678. handlers.push_back(op);
  679. }
  680. {
  681. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  682. (PREF_USER_AGENT,
  683. TEXT_USER_AGENT,
  684. "aria2",
  685. A2STR::NIL,
  686. OptionHandler::REQ_ARG,
  687. 'U'));
  688. op->addTag(TAG_HTTP);
  689. handlers.push_back(op);
  690. }
  691. // FTP Specific Options
  692. {
  693. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  694. (PREF_FTP_PASSWD,
  695. TEXT_FTP_PASSWD));
  696. op->addTag(TAG_BASIC);
  697. op->addTag(TAG_FTP);
  698. handlers.push_back(op);
  699. }
  700. {
  701. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  702. (PREF_FTP_PASV,
  703. TEXT_FTP_PASV,
  704. V_TRUE,
  705. OptionHandler::OPT_ARG,
  706. 'p'));
  707. op->addTag(TAG_FTP);
  708. handlers.push_back(op);
  709. }
  710. {
  711. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  712. (PREF_FTP_REUSE_CONNECTION,
  713. TEXT_FTP_REUSE_CONNECTION,
  714. V_TRUE,
  715. OptionHandler::OPT_ARG));
  716. op->addTag(TAG_FTP);
  717. handlers.push_back(op);
  718. }
  719. {
  720. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  721. (PREF_FTP_TYPE,
  722. TEXT_FTP_TYPE,
  723. V_BINARY,
  724. V_BINARY, V_ASCII));
  725. op->addTag(TAG_FTP);
  726. handlers.push_back(op);
  727. }
  728. {
  729. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  730. (PREF_FTP_USER,
  731. TEXT_FTP_USER));
  732. op->addTag(TAG_BASIC);
  733. op->addTag(TAG_FTP);
  734. handlers.push_back(op);
  735. }
  736. {
  737. SharedHandle<DefaultOptionHandler> op(new DefaultOptionHandler
  738. (PREF_NETRC_PATH,
  739. NO_DESCRIPTION,
  740. Util::getHomeDir()+"/.netrc",
  741. "/PATH/TO/NETRC"));
  742. op->hide();
  743. handlers.push_back(op);
  744. }
  745. {
  746. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  747. (PREF_NO_NETRC,
  748. TEXT_NO_NETRC,
  749. V_FALSE, // TODO ommit?
  750. OptionHandler::NO_ARG,
  751. 'n'));
  752. op->addTag(TAG_FTP);
  753. op->addTag(TAG_HTTP);
  754. handlers.push_back(op);
  755. }
  756. // Proxy options
  757. {
  758. SharedHandle<OptionHandler> op(new HttpProxyOptionHandler
  759. (PREF_HTTP_PROXY,
  760. TEXT_HTTP_PROXY,
  761. NO_DEFAULT_VALUE));
  762. op->addTag(TAG_HTTP);
  763. handlers.push_back(op);
  764. }
  765. {
  766. SharedHandle<OptionHandler> op(new HttpProxyOptionHandler
  767. (PREF_HTTPS_PROXY,
  768. TEXT_HTTPS_PROXY,
  769. NO_DEFAULT_VALUE));
  770. op->addTag(TAG_HTTP);
  771. handlers.push_back(op);
  772. }
  773. {
  774. SharedHandle<OptionHandler> op(new HttpProxyOptionHandler
  775. (PREF_FTP_PROXY,
  776. TEXT_FTP_PROXY,
  777. NO_DEFAULT_VALUE));
  778. op->addTag(TAG_FTP);
  779. handlers.push_back(op);
  780. }
  781. {
  782. SharedHandle<OptionHandler> op(new HttpProxyOptionHandler
  783. (PREF_ALL_PROXY,
  784. TEXT_ALL_PROXY,
  785. NO_DEFAULT_VALUE));
  786. op->addTag(TAG_FTP);
  787. op->addTag(TAG_HTTP);
  788. handlers.push_back(op);
  789. }
  790. {
  791. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  792. (PREF_NO_PROXY,
  793. TEXT_NO_PROXY));
  794. op->addTag(TAG_FTP);
  795. op->addTag(TAG_HTTP);
  796. handlers.push_back(op);
  797. }
  798. {
  799. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  800. (PREF_PROXY_METHOD,
  801. TEXT_PROXY_METHOD,
  802. V_GET,
  803. V_GET, V_TUNNEL));
  804. op->addTag(TAG_FTP);
  805. op->addTag(TAG_HTTP);
  806. handlers.push_back(op);
  807. }
  808. // BitTorrent/Metalink Options
  809. #if defined ENABLE_BITTORRENT || defined ENABLE_METALINK
  810. {
  811. SharedHandle<OptionHandler> op(new IntegerRangeOptionHandler
  812. (PREF_SELECT_FILE,
  813. TEXT_SELECT_FILE,
  814. NO_DEFAULT_VALUE,
  815. 1, INT32_MAX));
  816. op->addTag(TAG_BITTORRENT);
  817. op->addTag(TAG_METALINK);
  818. handlers.push_back(op);
  819. }
  820. {
  821. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  822. (PREF_SHOW_FILES,
  823. TEXT_SHOW_FILES,
  824. V_FALSE, // TODO ommit?
  825. OptionHandler::NO_ARG,
  826. 'S'));
  827. op->addTag(TAG_BASIC);
  828. op->addTag(TAG_BITTORRENT);
  829. op->addTag(TAG_METALINK);
  830. handlers.push_back(op);
  831. }
  832. #endif // ENABLE_BITTORRENT || ENABLE_METALINK
  833. // BitTorrent Specific Options
  834. #ifdef ENABLE_BITTORRENT
  835. {
  836. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  837. (PREF_BT_EXTERNAL_IP,
  838. TEXT_BT_EXTERNAL_IP,
  839. NO_DEFAULT_VALUE,
  840. "a numeric IP address"));
  841. op->addTag(TAG_BITTORRENT);
  842. handlers.push_back(op);
  843. }
  844. {
  845. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  846. (PREF_BT_KEEP_ALIVE_INTERVAL,
  847. NO_DESCRIPTION,
  848. "120",
  849. 1, 120));
  850. op->hide();
  851. handlers.push_back(op);
  852. }
  853. {
  854. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  855. (PREF_BT_HASH_CHECK_SEED,
  856. TEXT_BT_HASH_CHECK_SEED,
  857. V_TRUE,
  858. OptionHandler::OPT_ARG));
  859. op->addTag(TAG_BITTORRENT);
  860. handlers.push_back(op);
  861. }
  862. {
  863. SharedHandle<OptionHandler> op(new NumberOptionHandler
  864. (PREF_BT_MAX_OPEN_FILES,
  865. TEXT_BT_MAX_OPEN_FILES,
  866. "100",
  867. 1));
  868. op->addTag(TAG_BITTORRENT);
  869. handlers.push_back(op);
  870. }
  871. {
  872. SharedHandle<OptionHandler> op(new NumberOptionHandler
  873. (PREF_BT_MAX_PEERS,
  874. TEXT_BT_MAX_PEERS,
  875. "55",
  876. 0));
  877. op->addTag(TAG_BITTORRENT);
  878. handlers.push_back(op);
  879. }
  880. {
  881. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  882. (PREF_BT_MIN_CRYPTO_LEVEL,
  883. TEXT_BT_MIN_CRYPTO_LEVEL,
  884. V_PLAIN,
  885. V_PLAIN, V_ARC4));
  886. op->addTag(TAG_BITTORRENT);
  887. handlers.push_back(op);
  888. }
  889. {
  890. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  891. (PREF_BT_REQUEST_PEER_SPEED_LIMIT,
  892. TEXT_BT_REQUEST_PEER_SPEED_LIMIT,
  893. "50K",
  894. 0));
  895. op->addTag(TAG_BITTORRENT);
  896. handlers.push_back(op);
  897. }
  898. {
  899. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  900. (PREF_BT_REQUIRE_CRYPTO,
  901. TEXT_BT_REQUIRE_CRYPTO,
  902. V_FALSE));
  903. op->addTag(TAG_BITTORRENT);
  904. handlers.push_back(op);
  905. }
  906. {
  907. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  908. (PREF_BT_REQUEST_TIMEOUT,
  909. NO_DESCRIPTION,
  910. "60",
  911. 1, 600));
  912. op->hide();
  913. handlers.push_back(op);
  914. }
  915. {
  916. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  917. (PREF_BT_SEED_UNVERIFIED,
  918. TEXT_BT_SEED_UNVERIFIED,
  919. V_FALSE,
  920. OptionHandler::OPT_ARG));
  921. op->addTag(TAG_BITTORRENT);
  922. handlers.push_back(op);
  923. }
  924. {
  925. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  926. (PREF_BT_TIMEOUT,
  927. NO_DESCRIPTION,
  928. "180",
  929. 1, 600));
  930. op->hide();
  931. handlers.push_back(op);
  932. }
  933. {
  934. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  935. (PREF_BT_TRACKER_INTERVAL,
  936. TEXT_BT_TRACKER_INTERVAL,
  937. "0",
  938. 0));
  939. op->addTag(TAG_BITTORRENT);
  940. handlers.push_back(op);
  941. }
  942. {
  943. SharedHandle<OptionHandler> op(new HostPortOptionHandler
  944. (PREF_DHT_ENTRY_POINT,
  945. TEXT_DHT_ENTRY_POINT,
  946. NO_DEFAULT_VALUE,
  947. PREF_DHT_ENTRY_POINT_HOST,
  948. PREF_DHT_ENTRY_POINT_PORT));
  949. op->addTag(TAG_BITTORRENT);
  950. handlers.push_back(op);
  951. }
  952. {
  953. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  954. (PREF_DHT_FILE_PATH,
  955. TEXT_DHT_FILE_PATH,
  956. Util::getHomeDir()+"/.aria2/dht.dat",
  957. "/PATH/TO/DHT_DAT"));
  958. op->addTag(TAG_BITTORRENT);
  959. handlers.push_back(op);
  960. }
  961. {
  962. SharedHandle<OptionHandler> op(new IntegerRangeOptionHandler
  963. (PREF_DHT_LISTEN_PORT,
  964. TEXT_DHT_LISTEN_PORT,
  965. "6881-6999",
  966. 1024, UINT16_MAX));
  967. op->addTag(TAG_BASIC);
  968. op->addTag(TAG_BITTORRENT);
  969. handlers.push_back(op);
  970. }
  971. {
  972. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  973. (PREF_ENABLE_DHT,
  974. TEXT_ENABLE_DHT,
  975. V_FALSE,
  976. OptionHandler::OPT_ARG));
  977. op->addTag(TAG_BASIC);
  978. op->addTag(TAG_BITTORRENT);
  979. handlers.push_back(op);
  980. }
  981. {
  982. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  983. (PREF_ENABLE_PEER_EXCHANGE,
  984. TEXT_ENABLE_PEER_EXCHANGE,
  985. V_TRUE,
  986. OptionHandler::OPT_ARG));
  987. op->addTag(TAG_BITTORRENT);
  988. handlers.push_back(op);
  989. }
  990. {
  991. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  992. (PREF_FOLLOW_TORRENT,
  993. TEXT_FOLLOW_TORRENT,
  994. V_TRUE,
  995. V_TRUE, V_MEM, V_FALSE));
  996. op->addTag(TAG_BITTORRENT);
  997. handlers.push_back(op);
  998. }
  999. {
  1000. SharedHandle<OptionHandler> op(new IndexOutOptionHandler
  1001. (PREF_INDEX_OUT,
  1002. TEXT_INDEX_OUT,
  1003. 'O'));
  1004. op->addTag(TAG_BITTORRENT);
  1005. handlers.push_back(op);
  1006. }
  1007. {
  1008. SharedHandle<OptionHandler> op(new IntegerRangeOptionHandler
  1009. (PREF_LISTEN_PORT,
  1010. TEXT_LISTEN_PORT,
  1011. "6881-6999",
  1012. 1024, UINT16_MAX));
  1013. op->addTag(TAG_BASIC);
  1014. op->addTag(TAG_BITTORRENT);
  1015. handlers.push_back(op);
  1016. }
  1017. {
  1018. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  1019. (PREF_MAX_OVERALL_UPLOAD_LIMIT,
  1020. TEXT_MAX_OVERALL_UPLOAD_LIMIT,
  1021. "0",
  1022. 0));
  1023. op->addTag(TAG_BASIC);
  1024. op->addTag(TAG_BITTORRENT);
  1025. handlers.push_back(op);
  1026. }
  1027. {
  1028. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  1029. (PREF_MAX_UPLOAD_LIMIT,
  1030. TEXT_MAX_UPLOAD_LIMIT,
  1031. "0",
  1032. 0, -1,
  1033. 'u'));
  1034. op->addTag(TAG_BASIC);
  1035. op->addTag(TAG_BITTORRENT);
  1036. handlers.push_back(op);
  1037. }
  1038. {
  1039. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  1040. (PREF_PEER_CONNECTION_TIMEOUT,
  1041. NO_DESCRIPTION,
  1042. "20",
  1043. 1, 600));
  1044. op->hide();
  1045. handlers.push_back(op);
  1046. }
  1047. {
  1048. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1049. (PREF_PEER_ID_PREFIX,
  1050. TEXT_PEER_ID_PREFIX,
  1051. "-aria2-"));
  1052. op->addTag(TAG_BITTORRENT);
  1053. handlers.push_back(op);
  1054. }
  1055. {
  1056. SharedHandle<OptionHandler> op(new NumberOptionHandler
  1057. (PREF_SEED_TIME,
  1058. TEXT_SEED_TIME,
  1059. NO_DEFAULT_VALUE,
  1060. 0));
  1061. op->addTag(TAG_BITTORRENT);
  1062. handlers.push_back(op);
  1063. }
  1064. {
  1065. SharedHandle<OptionHandler> op(new FloatNumberOptionHandler
  1066. (PREF_SEED_RATIO,
  1067. TEXT_SEED_RATIO,
  1068. "1.0",
  1069. 0.0));
  1070. op->addTag(TAG_BITTORRENT);
  1071. handlers.push_back(op);
  1072. }
  1073. {
  1074. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1075. (PREF_TORRENT_FILE,
  1076. TEXT_TORRENT_FILE,
  1077. NO_DEFAULT_VALUE,
  1078. A2STR::NIL,
  1079. OptionHandler::REQ_ARG,
  1080. 'T'));
  1081. op->addTag(TAG_BASIC);
  1082. op->addTag(TAG_BITTORRENT);
  1083. handlers.push_back(op);
  1084. }
  1085. #endif // ENABLE_BITTORRENT
  1086. // Metalink Specific Options
  1087. #ifdef ENABLE_METALINK
  1088. {
  1089. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  1090. (PREF_FOLLOW_METALINK,
  1091. TEXT_FOLLOW_METALINK,
  1092. V_TRUE,
  1093. V_TRUE, V_MEM, V_FALSE));
  1094. op->addTag(TAG_METALINK);
  1095. handlers.push_back(op);
  1096. }
  1097. {
  1098. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1099. (PREF_METALINK_ENABLE_UNIQUE_PROTOCOL,
  1100. TEXT_METALINK_ENABLE_UNIQUE_PROTOCOL,
  1101. V_TRUE,
  1102. OptionHandler::OPT_ARG));
  1103. op->addTag(TAG_METALINK);
  1104. handlers.push_back(op);
  1105. }
  1106. {
  1107. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1108. (PREF_METALINK_FILE,
  1109. TEXT_METALINK_FILE,
  1110. NO_DEFAULT_VALUE,
  1111. A2STR::NIL,
  1112. OptionHandler::REQ_ARG,
  1113. 'M'));
  1114. op->addTag(TAG_BASIC);
  1115. op->addTag(TAG_METALINK);
  1116. handlers.push_back(op);
  1117. }
  1118. {
  1119. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1120. (PREF_METALINK_LANGUAGE,
  1121. TEXT_METALINK_LANGUAGE));
  1122. op->addTag(TAG_METALINK);
  1123. handlers.push_back(op);
  1124. }
  1125. {
  1126. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1127. (PREF_METALINK_LOCATION,
  1128. TEXT_METALINK_LOCATION));
  1129. op->addTag(TAG_METALINK);
  1130. handlers.push_back(op);
  1131. }
  1132. {
  1133. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1134. (PREF_METALINK_OS,
  1135. TEXT_METALINK_OS));
  1136. op->addTag(TAG_METALINK);
  1137. handlers.push_back(op);
  1138. }
  1139. {
  1140. const std::string params[] = { V_HTTP, V_HTTPS, V_FTP, V_NONE };
  1141. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  1142. (PREF_METALINK_PREFERRED_PROTOCOL,
  1143. TEXT_METALINK_PREFERRED_PROTOCOL,
  1144. V_NONE,
  1145. std::deque<std::string>
  1146. (&params[0], &params[arrayLength(params)])));
  1147. op->addTag(TAG_METALINK);
  1148. handlers.push_back(op);
  1149. }
  1150. {
  1151. SharedHandle<OptionHandler> op(new NumberOptionHandler
  1152. (PREF_METALINK_SERVERS,
  1153. TEXT_METALINK_SERVERS,
  1154. "5",
  1155. 1, -1,
  1156. 'C'));
  1157. op->addTag(TAG_METALINK);
  1158. handlers.push_back(op);
  1159. }
  1160. {
  1161. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1162. (PREF_METALINK_VERSION,
  1163. TEXT_METALINK_VERSION));
  1164. op->addTag(TAG_METALINK);
  1165. handlers.push_back(op);
  1166. }
  1167. #endif // ENABLE_METALINK
  1168. // Version Option
  1169. {
  1170. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1171. ("version",
  1172. TEXT_VERSION,
  1173. NO_DEFAULT_VALUE,
  1174. A2STR::NIL,
  1175. OptionHandler::NO_ARG,
  1176. 'v'));
  1177. op->addTag(TAG_BASIC);
  1178. handlers.push_back(op);
  1179. }
  1180. // Help Option
  1181. {
  1182. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1183. ("help",
  1184. TEXT_HELP,
  1185. TAG_BASIC,
  1186. StringFormat("%s,%s,%s,%s,%s,%s,%s,%s,%s,all",
  1187. TAG_BASIC,
  1188. TAG_ADVANCED,
  1189. TAG_HTTP,
  1190. TAG_HTTPS,
  1191. TAG_FTP,
  1192. TAG_METALINK,
  1193. TAG_BITTORRENT,
  1194. TAG_EXPERIMENTAL,
  1195. TAG_HELP).str(),
  1196. OptionHandler::OPT_ARG,
  1197. 'h'));
  1198. op->addTag(TAG_BASIC);
  1199. op->addTag(TAG_HELP);
  1200. handlers.push_back(op);
  1201. }
  1202. return handlers;
  1203. }
  1204. } // namespace aria2