OptionHandlerFactory.cc 24 KB

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