OptionHandlerFactory.cc 26 KB

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