OptionHandlerFactory.cc 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691
  1. /* <!-- copyright */
  2. /*
  3. * aria2 - The high speed download utility
  4. *
  5. * Copyright (C) 2006 Tatsuhiro Tsujikawa
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * In addition, as a special exception, the copyright holders give
  22. * permission to link the code of portions of this program with the
  23. * OpenSSL library under certain conditions as described in each
  24. * individual source file, and distribute linked combinations
  25. * including the two.
  26. * You must obey the GNU General Public License in all respects
  27. * for all of the code used other than OpenSSL. If you modify
  28. * file(s) with this exception, you may extend this exception to your
  29. * version of the file(s), but you are not obligated to do so. If you
  30. * do not wish to do so, delete this exception statement from your
  31. * version. If you delete this exception statement from all source
  32. * files in the program, then also delete it here.
  33. */
  34. /* copyright --> */
  35. #include "OptionHandlerFactory.h"
  36. #include "prefs.h"
  37. #include "OptionHandlerImpl.h"
  38. #include "array_fun.h"
  39. #include "usage_text.h"
  40. #include "A2STR.h"
  41. #include "util.h"
  42. #include "help_tags.h"
  43. #include "a2functional.h"
  44. #include "File.h"
  45. namespace aria2 {
  46. OptionHandlers OptionHandlerFactory::createOptionHandlers()
  47. {
  48. OptionHandlers handlers;
  49. // General Options
  50. {
  51. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  52. (PREF_ALLOW_OVERWRITE,
  53. TEXT_ALLOW_OVERWRITE,
  54. A2_V_FALSE,
  55. OptionHandler::OPT_ARG));
  56. op->addTag(TAG_ADVANCED);
  57. op->addTag(TAG_FILE);
  58. handlers.push_back(op);
  59. }
  60. {
  61. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  62. (PREF_ALLOW_PIECE_LENGTH_CHANGE,
  63. TEXT_ALLOW_PIECE_LENGTH_CHANGE,
  64. A2_V_FALSE,
  65. OptionHandler::OPT_ARG));
  66. op->addTag(TAG_ADVANCED);
  67. handlers.push_back(op);
  68. }
  69. {
  70. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  71. (PREF_ALWAYS_RESUME,
  72. TEXT_ALWAYS_RESUME,
  73. A2_V_TRUE,
  74. OptionHandler::OPT_ARG));
  75. op->addTag(TAG_ADVANCED);
  76. op->addTag(TAG_FTP);
  77. op->addTag(TAG_HTTP);
  78. handlers.push_back(op);
  79. }
  80. #ifdef ENABLE_ASYNC_DNS
  81. {
  82. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  83. (PREF_ASYNC_DNS,
  84. TEXT_ASYNC_DNS,
  85. A2_V_TRUE,
  86. OptionHandler::OPT_ARG));
  87. op->addTag(TAG_ADVANCED);
  88. handlers.push_back(op);
  89. }
  90. #endif // ENABLE_ASYNC_DNS
  91. {
  92. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  93. (PREF_AUTO_FILE_RENAMING,
  94. TEXT_AUTO_FILE_RENAMING,
  95. A2_V_TRUE,
  96. OptionHandler::OPT_ARG));
  97. op->addTag(TAG_ADVANCED);
  98. op->addTag(TAG_FILE);
  99. handlers.push_back(op);
  100. }
  101. {
  102. SharedHandle<OptionHandler> op(new NumberOptionHandler
  103. (PREF_AUTO_SAVE_INTERVAL,
  104. TEXT_AUTO_SAVE_INTERVAL,
  105. "60",
  106. 0, 600));
  107. op->addTag(TAG_ADVANCED);
  108. handlers.push_back(op);
  109. }
  110. #ifdef ENABLE_MESSAGE_DIGEST
  111. {
  112. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  113. (PREF_CHECK_INTEGRITY,
  114. TEXT_CHECK_INTEGRITY,
  115. A2_V_FALSE,
  116. OptionHandler::OPT_ARG,
  117. 'V'));
  118. op->addTag(TAG_BASIC);
  119. op->addTag(TAG_BITTORRENT);
  120. op->addTag(TAG_METALINK);
  121. op->addTag(TAG_FILE);
  122. handlers.push_back(op);
  123. }
  124. #endif // ENABLE_MESSAGE_DIGEST
  125. {
  126. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  127. (PREF_CONDITIONAL_GET,
  128. TEXT_CONDITIONAL_GET,
  129. A2_V_FALSE,
  130. OptionHandler::OPT_ARG));
  131. op->addTag(TAG_ADVANCED);
  132. op->addTag(TAG_HTTP);
  133. handlers.push_back(op);
  134. }
  135. {
  136. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  137. (PREF_CONF_PATH,
  138. TEXT_CONF_PATH,
  139. util::getHomeDir()+"/.aria2/aria2.conf"));
  140. op->addTag(TAG_ADVANCED);
  141. handlers.push_back(op);
  142. }
  143. {
  144. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  145. (PREF_CONTINUE,
  146. TEXT_CONTINUE,
  147. A2_V_FALSE,
  148. OptionHandler::OPT_ARG,
  149. 'c'));
  150. op->addTag(TAG_BASIC);
  151. op->addTag(TAG_FTP);
  152. op->addTag(TAG_HTTP);
  153. handlers.push_back(op);
  154. }
  155. {
  156. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  157. (PREF_DAEMON,
  158. TEXT_DAEMON,
  159. A2_V_FALSE,
  160. OptionHandler::OPT_ARG,
  161. 'D'));
  162. op->addTag(TAG_ADVANCED);
  163. handlers.push_back(op);
  164. }
  165. {
  166. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  167. (PREF_DIR,
  168. TEXT_DIR,
  169. File::getCurrentDir(),
  170. A2STR::NIL,
  171. OptionHandler::REQ_ARG,
  172. 'd'));
  173. op->addTag(TAG_BASIC);
  174. op->addTag(TAG_FILE);
  175. handlers.push_back(op);
  176. }
  177. {
  178. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  179. (PREF_DISABLE_IPV6,
  180. TEXT_DISABLE_IPV6,
  181. A2_V_FALSE,
  182. OptionHandler::OPT_ARG));
  183. op->addTag(TAG_ADVANCED);
  184. handlers.push_back(op);
  185. }
  186. {
  187. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  188. (PREF_DNS_TIMEOUT,
  189. NO_DESCRIPTION,
  190. "30",
  191. 1, 60));
  192. op->hide();
  193. handlers.push_back(op);
  194. }
  195. #ifdef ENABLE_ASYNC_DNS
  196. {
  197. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  198. (PREF_ENABLE_ASYNC_DNS6,
  199. TEXT_ENABLE_ASYNC_DNS6,
  200. A2_V_FALSE,
  201. OptionHandler::OPT_ARG));
  202. op->addTag(TAG_ADVANCED);
  203. handlers.push_back(op);
  204. }
  205. #endif // ENABLE_ASYNC_DNS
  206. #ifdef ENABLE_DIRECT_IO
  207. {
  208. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  209. (PREF_ENABLE_DIRECT_IO,
  210. TEXT_ENABLE_DIRECT_IO,
  211. A2_V_TRUE,
  212. OptionHandler::OPT_ARG));
  213. op->addTag(TAG_ADVANCED);
  214. op->addTag(TAG_FILE);
  215. handlers.push_back(op);
  216. }
  217. #endif // ENABLE_DIRECT_IO
  218. #ifdef ENABLE_XML_RPC
  219. {
  220. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  221. (PREF_ENABLE_XML_RPC,
  222. TEXT_ENABLE_XML_RPC,
  223. A2_V_FALSE,
  224. OptionHandler::OPT_ARG));
  225. op->addTag(TAG_XML_RPC);
  226. handlers.push_back(op);
  227. }
  228. #endif // ENABLE_XML_RPC
  229. {
  230. std::string params[] = {
  231. #ifdef HAVE_EPOLL
  232. V_EPOLL,
  233. #endif // HAVE_EPOLL
  234. #ifdef HAVE_KQUEUE
  235. V_KQUEUE,
  236. #endif // HAVE_KQUEUE
  237. #ifdef HAVE_PORT_ASSOCIATE
  238. V_PORT,
  239. #endif // HAVE_PORT_ASSOCIATE
  240. #ifdef HAVE_POLL
  241. V_POLL,
  242. #endif // HAVE_POLL
  243. V_SELECT
  244. };
  245. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  246. (PREF_EVENT_POLL,
  247. TEXT_EVENT_POLL,
  248. #ifdef HAVE_EPOLL
  249. V_EPOLL,
  250. #elif HAVE_KQUEUE
  251. V_KQUEUE,
  252. #elif HAVE_PORT_ASSOCIATE
  253. V_PORT,
  254. #else
  255. V_SELECT,
  256. #endif // !HAVE_EPOLL
  257. std::vector<std::string>
  258. (vbegin(params), vend(params))));
  259. op->addTag(TAG_ADVANCED);
  260. handlers.push_back(op);
  261. }
  262. {
  263. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  264. (PREF_FILE_ALLOCATION,
  265. TEXT_FILE_ALLOCATION,
  266. V_PREALLOC,
  267. V_NONE, V_PREALLOC,
  268. #ifdef HAVE_SOME_FALLOCATE
  269. V_FALLOC,
  270. #endif // HAVE_SOME_FALLOCATE
  271. 'a'));
  272. op->addTag(TAG_BASIC);
  273. op->addTag(TAG_FILE);
  274. handlers.push_back(op);
  275. }
  276. {
  277. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  278. (PREF_FORCE_SEQUENTIAL,
  279. TEXT_FORCE_SEQUENTIAL,
  280. A2_V_FALSE,
  281. OptionHandler::OPT_ARG,
  282. 'Z'));
  283. op->addTag(TAG_BASIC);
  284. handlers.push_back(op);
  285. }
  286. {
  287. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  288. (PREF_HUMAN_READABLE,
  289. TEXT_HUMAN_READABLE,
  290. A2_V_TRUE,
  291. OptionHandler::OPT_ARG));
  292. op->addTag(TAG_ADVANCED);
  293. handlers.push_back(op);
  294. }
  295. {
  296. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  297. (PREF_INPUT_FILE,
  298. TEXT_INPUT_FILE,
  299. NO_DEFAULT_VALUE,
  300. "FILENAME,-",
  301. OptionHandler::REQ_ARG,
  302. 'i'));
  303. op->addTag(TAG_BASIC);
  304. handlers.push_back(op);
  305. }
  306. {
  307. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  308. (PREF_INTERFACE,
  309. TEXT_INTERFACE,
  310. NO_DEFAULT_VALUE,
  311. "interface, IP address, hostname",
  312. OptionHandler::REQ_ARG));
  313. op->addTag(TAG_ADVANCED);
  314. handlers.push_back(op);
  315. }
  316. {
  317. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  318. (PREF_LOG,
  319. TEXT_LOG,
  320. NO_DEFAULT_VALUE,
  321. "FILENAME,-",
  322. OptionHandler::REQ_ARG,
  323. 'l'));
  324. op->addTag(TAG_BASIC);
  325. handlers.push_back(op);
  326. }
  327. {
  328. const std::string params[] = { V_DEBUG, V_INFO, V_NOTICE, V_WARN, V_ERROR };
  329. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  330. (PREF_LOG_LEVEL,
  331. TEXT_LOG_LEVEL,
  332. V_DEBUG,
  333. std::vector<std::string>
  334. (vbegin(params), vend(params))));
  335. op->addTag(TAG_ADVANCED);
  336. handlers.push_back(op);
  337. }
  338. {
  339. SharedHandle<OptionHandler> op(new NumberOptionHandler
  340. (PREF_MAX_CONCURRENT_DOWNLOADS,
  341. TEXT_MAX_CONCURRENT_DOWNLOADS,
  342. "5",
  343. 1, -1,
  344. 'j'));
  345. op->addTag(TAG_BASIC);
  346. handlers.push_back(op);
  347. }
  348. {
  349. SharedHandle<OptionHandler> op(new NumberOptionHandler
  350. (PREF_MAX_CONNECTION_PER_SERVER,
  351. TEXT_MAX_CONNECTION_PER_SERVER,
  352. "1",
  353. 1, 16,
  354. 'x'));
  355. op->addTag(TAG_BASIC);
  356. op->addTag(TAG_FTP);
  357. op->addTag(TAG_HTTP);
  358. handlers.push_back(op);
  359. }
  360. {
  361. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  362. (PREF_MAX_DOWNLOAD_LIMIT,
  363. TEXT_MAX_DOWNLOAD_LIMIT,
  364. "0",
  365. 0));
  366. op->addTag(TAG_BITTORRENT);
  367. op->addTag(TAG_FTP);
  368. op->addTag(TAG_HTTP);
  369. handlers.push_back(op);
  370. }
  371. {
  372. SharedHandle<OptionHandler> op(new NumberOptionHandler
  373. (PREF_MAX_DOWNLOAD_RESULT,
  374. TEXT_MAX_DOWNLOAD_RESULT,
  375. "1000",
  376. 0));
  377. op->addTag(TAG_ADVANCED);
  378. handlers.push_back(op);
  379. }
  380. {
  381. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  382. (PREF_MAX_OVERALL_DOWNLOAD_LIMIT,
  383. TEXT_MAX_OVERALL_DOWNLOAD_LIMIT,
  384. "0",
  385. 0));
  386. op->addTag(TAG_BITTORRENT);
  387. op->addTag(TAG_FTP);
  388. op->addTag(TAG_HTTP);
  389. handlers.push_back(op);
  390. }
  391. {
  392. SharedHandle<OptionHandler> op(new NumberOptionHandler
  393. (PREF_MAX_RESUME_FAILURE_TRIES,
  394. TEXT_MAX_RESUME_FAILURE_TRIES,
  395. "0",
  396. 0));
  397. op->addTag(TAG_ADVANCED);
  398. op->addTag(TAG_FTP);
  399. op->addTag(TAG_HTTP);
  400. handlers.push_back(op);
  401. }
  402. {
  403. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  404. (PREF_MIN_SPLIT_SIZE,
  405. TEXT_MIN_SPLIT_SIZE,
  406. "20M",
  407. 1024*1024, 1024*1024*1024,
  408. 'k'));
  409. op->addTag(TAG_BASIC);
  410. op->addTag(TAG_FTP);
  411. op->addTag(TAG_HTTP);
  412. handlers.push_back(op);
  413. }
  414. {
  415. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  416. (PREF_NO_CONF,
  417. TEXT_NO_CONF,
  418. A2_V_FALSE,
  419. OptionHandler::OPT_ARG));
  420. op->addTag(TAG_ADVANCED);
  421. handlers.push_back(op);
  422. }
  423. {
  424. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  425. (PREF_NO_FILE_ALLOCATION_LIMIT,
  426. TEXT_NO_FILE_ALLOCATION_LIMIT,
  427. "5M",
  428. 0));
  429. op->addTag(TAG_ADVANCED);
  430. op->addTag(TAG_FILE);
  431. handlers.push_back(op);
  432. }
  433. {
  434. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  435. (PREF_ON_DOWNLOAD_COMPLETE,
  436. TEXT_ON_DOWNLOAD_COMPLETE,
  437. NO_DEFAULT_VALUE,
  438. "/path/to/command"));
  439. op->addTag(TAG_ADVANCED);
  440. op->addTag(TAG_HOOK);
  441. handlers.push_back(op);
  442. }
  443. {
  444. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  445. (PREF_ON_DOWNLOAD_ERROR,
  446. TEXT_ON_DOWNLOAD_ERROR,
  447. NO_DEFAULT_VALUE,
  448. "/path/to/command"));
  449. op->addTag(TAG_ADVANCED);
  450. op->addTag(TAG_HOOK);
  451. handlers.push_back(op);
  452. }
  453. {
  454. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  455. (PREF_ON_DOWNLOAD_PAUSE,
  456. TEXT_ON_DOWNLOAD_PAUSE,
  457. NO_DEFAULT_VALUE,
  458. "/path/to/command"));
  459. op->addTag(TAG_ADVANCED);
  460. op->addTag(TAG_HOOK);
  461. handlers.push_back(op);
  462. }
  463. {
  464. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  465. (PREF_ON_DOWNLOAD_START,
  466. TEXT_ON_DOWNLOAD_START,
  467. NO_DEFAULT_VALUE,
  468. "/path/to/command"));
  469. op->addTag(TAG_ADVANCED);
  470. op->addTag(TAG_HOOK);
  471. handlers.push_back(op);
  472. }
  473. {
  474. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  475. (PREF_ON_DOWNLOAD_STOP,
  476. TEXT_ON_DOWNLOAD_STOP,
  477. NO_DEFAULT_VALUE,
  478. "/path/to/command"));
  479. op->addTag(TAG_ADVANCED);
  480. op->addTag(TAG_HOOK);
  481. handlers.push_back(op);
  482. }
  483. {
  484. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  485. (PREF_PARAMETERIZED_URI,
  486. TEXT_PARAMETERIZED_URI,
  487. A2_V_FALSE,
  488. OptionHandler::OPT_ARG,
  489. 'P'));
  490. op->addTag(TAG_ADVANCED);
  491. handlers.push_back(op);
  492. }
  493. {
  494. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  495. (PREF_QUIET,
  496. TEXT_QUIET,
  497. A2_V_FALSE,
  498. OptionHandler::OPT_ARG,
  499. 'q'));
  500. op->addTag(TAG_ADVANCED);
  501. handlers.push_back(op);
  502. }
  503. #ifdef ENABLE_MESSAGE_DIGEST
  504. {
  505. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  506. (PREF_REALTIME_CHUNK_CHECKSUM,
  507. TEXT_REALTIME_CHUNK_CHECKSUM,
  508. A2_V_TRUE,
  509. OptionHandler::OPT_ARG));
  510. op->addTag(TAG_METALINK);
  511. handlers.push_back(op);
  512. }
  513. #endif // ENABLE_MESSAGE_DIGEST
  514. {
  515. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  516. (PREF_REMOVE_CONTROL_FILE,
  517. TEXT_REMOVE_CONTROL_FILE,
  518. A2_V_FALSE,
  519. OptionHandler::OPT_ARG));
  520. op->addTag(TAG_ADVANCED);
  521. handlers.push_back(op);
  522. }
  523. {
  524. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  525. (PREF_SAVE_SESSION,
  526. TEXT_SAVE_SESSION,
  527. NO_DEFAULT_VALUE,
  528. "FILENAME"));
  529. op->addTag(TAG_ADVANCED);
  530. handlers.push_back(op);
  531. }
  532. {
  533. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  534. (PREF_SELECT_LEAST_USED_HOST,
  535. NO_DEFAULT_VALUE,
  536. A2_V_TRUE));
  537. op->hide();
  538. handlers.push_back(op);
  539. }
  540. {
  541. SharedHandle<OptionHandler> op(new NumberOptionHandler
  542. (PREF_STOP,
  543. TEXT_STOP,
  544. "0",
  545. 0, INT32_MAX));
  546. op->addTag(TAG_ADVANCED);
  547. handlers.push_back(op);
  548. }
  549. {
  550. SharedHandle<OptionHandler> op(new NumberOptionHandler
  551. (PREF_SUMMARY_INTERVAL,
  552. TEXT_SUMMARY_INTERVAL,
  553. "60",
  554. 0, INT32_MAX));
  555. op->addTag(TAG_ADVANCED);
  556. handlers.push_back(op);
  557. }
  558. #ifdef ENABLE_XML_RPC
  559. {
  560. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  561. (PREF_XML_RPC_LISTEN_ALL,
  562. TEXT_XML_RPC_LISTEN_ALL,
  563. A2_V_FALSE,
  564. OptionHandler::OPT_ARG));
  565. op->addTag(TAG_XML_RPC);
  566. handlers.push_back(op);
  567. }
  568. {
  569. SharedHandle<OptionHandler> op(new NumberOptionHandler
  570. (PREF_XML_RPC_LISTEN_PORT,
  571. TEXT_XML_RPC_LISTEN_PORT,
  572. "6800",
  573. 1024, UINT16_MAX));
  574. op->addTag(TAG_XML_RPC);
  575. handlers.push_back(op);
  576. }
  577. {
  578. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  579. (PREF_XML_RPC_MAX_REQUEST_SIZE,
  580. TEXT_XML_RPC_MAX_REQUEST_SIZE,
  581. "2M",
  582. 0));
  583. op->addTag(TAG_XML_RPC);
  584. handlers.push_back(op);
  585. }
  586. {
  587. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  588. (PREF_XML_RPC_USER,
  589. TEXT_XML_RPC_USER));
  590. op->addTag(TAG_XML_RPC);
  591. handlers.push_back(op);
  592. }
  593. {
  594. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  595. (PREF_XML_RPC_PASSWD,
  596. TEXT_XML_RPC_PASSWD));
  597. op->addTag(TAG_XML_RPC);
  598. handlers.push_back(op);
  599. }
  600. #endif // ENABLE_XML_RPC
  601. // HTTP/FTP options
  602. {
  603. SharedHandle<OptionHandler> op(new NumberOptionHandler
  604. (PREF_CONNECT_TIMEOUT,
  605. TEXT_CONNECT_TIMEOUT,
  606. "60",
  607. 1, 600));
  608. op->addTag(TAG_FTP);
  609. op->addTag(TAG_HTTP);
  610. handlers.push_back(op);
  611. }
  612. {
  613. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  614. (PREF_DRY_RUN,
  615. TEXT_DRY_RUN,
  616. A2_V_FALSE,
  617. OptionHandler::OPT_ARG));
  618. op->addTag(TAG_FTP);
  619. op->addTag(TAG_HTTP);
  620. handlers.push_back(op);
  621. }
  622. {
  623. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  624. (PREF_LOWEST_SPEED_LIMIT,
  625. TEXT_LOWEST_SPEED_LIMIT,
  626. "0",
  627. 0));
  628. op->addTag(TAG_FTP);
  629. op->addTag(TAG_HTTP);
  630. handlers.push_back(op);
  631. }
  632. {
  633. SharedHandle<OptionHandler> op(new NumberOptionHandler
  634. (PREF_MAX_FILE_NOT_FOUND,
  635. TEXT_MAX_FILE_NOT_FOUND,
  636. "0",
  637. 0));
  638. op->addTag(TAG_FTP);
  639. op->addTag(TAG_HTTP);
  640. handlers.push_back(op);
  641. }
  642. {
  643. SharedHandle<OptionHandler> op(new NumberOptionHandler
  644. (PREF_MAX_TRIES,
  645. TEXT_MAX_TRIES,
  646. "5",
  647. 0, -1,
  648. 'm'));
  649. op->addTag(TAG_FTP);
  650. op->addTag(TAG_HTTP);
  651. handlers.push_back(op);
  652. }
  653. {
  654. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  655. (PREF_NO_NETRC,
  656. TEXT_NO_NETRC,
  657. A2_V_FALSE,
  658. OptionHandler::OPT_ARG,
  659. 'n'));
  660. op->addTag(TAG_FTP);
  661. op->addTag(TAG_HTTP);
  662. handlers.push_back(op);
  663. }
  664. {
  665. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  666. (PREF_OUT,
  667. TEXT_OUT,
  668. NO_DEFAULT_VALUE,
  669. "FILENAME",
  670. OptionHandler::REQ_ARG,
  671. 'o'));
  672. op->addTag(TAG_BASIC);
  673. op->addTag(TAG_FTP);
  674. op->addTag(TAG_HTTP);
  675. op->addTag(TAG_FILE);
  676. handlers.push_back(op);
  677. }
  678. {
  679. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  680. (PREF_REMOTE_TIME,
  681. TEXT_REMOTE_TIME,
  682. A2_V_FALSE,
  683. OptionHandler::OPT_ARG,
  684. 'R'));
  685. op->addTag(TAG_FTP);
  686. op->addTag(TAG_HTTP);
  687. handlers.push_back(op);
  688. }
  689. {
  690. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  691. (PREF_REUSE_URI,
  692. TEXT_REUSE_URI,
  693. A2_V_TRUE,
  694. OptionHandler::OPT_ARG));
  695. op->addTag(TAG_FTP);
  696. op->addTag(TAG_HTTP);
  697. handlers.push_back(op);
  698. }
  699. {
  700. SharedHandle<UnitNumberOptionHandler> op(new UnitNumberOptionHandler
  701. (PREF_SEGMENT_SIZE,
  702. NO_DESCRIPTION,
  703. "1M",
  704. 1024, -1));
  705. op->hide();
  706. handlers.push_back(op);
  707. }
  708. {
  709. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  710. (PREF_SERVER_STAT_IF,
  711. TEXT_SERVER_STAT_IF,
  712. NO_DEFAULT_VALUE,
  713. "FILENAME"));
  714. op->addTag(TAG_FTP);
  715. op->addTag(TAG_HTTP);
  716. handlers.push_back(op);
  717. }
  718. {
  719. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  720. (PREF_SERVER_STAT_OF,
  721. TEXT_SERVER_STAT_OF,
  722. NO_DEFAULT_VALUE,
  723. "FILENAME"));
  724. op->addTag(TAG_FTP);
  725. op->addTag(TAG_HTTP);
  726. handlers.push_back(op);
  727. }
  728. {
  729. SharedHandle<OptionHandler> op(new NumberOptionHandler
  730. (PREF_SERVER_STAT_TIMEOUT,
  731. TEXT_SERVER_STAT_TIMEOUT,
  732. "86400",
  733. 0, INT32_MAX));
  734. op->addTag(TAG_FTP);
  735. op->addTag(TAG_HTTP);
  736. handlers.push_back(op);
  737. }
  738. {
  739. SharedHandle<OptionHandler> op(new NumberOptionHandler
  740. (PREF_SPLIT,
  741. TEXT_SPLIT,
  742. "5",
  743. 1, -1,
  744. 's'));
  745. op->addTag(TAG_BASIC);
  746. op->addTag(TAG_FTP);
  747. op->addTag(TAG_HTTP);
  748. handlers.push_back(op);
  749. }
  750. {
  751. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  752. (PREF_STARTUP_IDLE_TIME,
  753. NO_DESCRIPTION,
  754. "10",
  755. 1, 60));
  756. op->hide();
  757. handlers.push_back(op);
  758. }
  759. {
  760. SharedHandle<OptionHandler> op(new NumberOptionHandler
  761. (PREF_TIMEOUT,
  762. TEXT_TIMEOUT,
  763. "60",
  764. 1, 600,
  765. 't'));
  766. op->addTag(TAG_FTP);
  767. op->addTag(TAG_HTTP);
  768. handlers.push_back(op);
  769. }
  770. {
  771. const std::string params[] = { V_INORDER, V_FEEDBACK, V_ADAPTIVE };
  772. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  773. (PREF_URI_SELECTOR,
  774. TEXT_URI_SELECTOR,
  775. V_FEEDBACK,
  776. std::vector<std::string>
  777. (vbegin(params), vend(params))));
  778. op->addTag(TAG_FTP);
  779. op->addTag(TAG_HTTP);
  780. handlers.push_back(op);
  781. }
  782. // HTTP Specific Options
  783. {
  784. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  785. (PREF_CA_CERTIFICATE,
  786. TEXT_CA_CERTIFICATE,
  787. CA_BUNDLE));
  788. op->addTag(TAG_HTTP);
  789. op->addTag(TAG_HTTPS);
  790. handlers.push_back(op);
  791. }
  792. {
  793. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  794. (PREF_CERTIFICATE,
  795. TEXT_CERTIFICATE));
  796. op->addTag(TAG_HTTP);
  797. op->addTag(TAG_HTTPS);
  798. handlers.push_back(op);
  799. }
  800. {
  801. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  802. (PREF_CHECK_CERTIFICATE,
  803. TEXT_CHECK_CERTIFICATE,
  804. A2_V_TRUE,
  805. OptionHandler::OPT_ARG));
  806. op->addTag(TAG_HTTP);
  807. op->addTag(TAG_HTTPS);
  808. handlers.push_back(op);
  809. }
  810. {
  811. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  812. (PREF_ENABLE_HTTP_KEEP_ALIVE,
  813. TEXT_ENABLE_HTTP_KEEP_ALIVE,
  814. A2_V_TRUE,
  815. OptionHandler::OPT_ARG));
  816. op->addTag(TAG_HTTP);
  817. handlers.push_back(op);
  818. }
  819. {
  820. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  821. (PREF_ENABLE_HTTP_PIPELINING,
  822. TEXT_ENABLE_HTTP_PIPELINING,
  823. A2_V_FALSE,
  824. OptionHandler::OPT_ARG));
  825. op->addTag(TAG_HTTP);
  826. handlers.push_back(op);
  827. }
  828. {
  829. SharedHandle<OptionHandler> op(new CumulativeOptionHandler
  830. (PREF_HEADER,
  831. TEXT_HEADER,
  832. NO_DEFAULT_VALUE,
  833. "\n"));
  834. op->addTag(TAG_HTTP);
  835. handlers.push_back(op);
  836. }
  837. {
  838. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  839. (PREF_HTTP_ACCEPT_GZIP,
  840. TEXT_HTTP_ACCEPT_GZIP,
  841. A2_V_FALSE,
  842. OptionHandler::OPT_ARG));
  843. op->addTag(TAG_HTTP);
  844. handlers.push_back(op);
  845. }
  846. {
  847. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  848. (PREF_HTTP_AUTH_CHALLENGE,
  849. TEXT_HTTP_AUTH_CHALLENGE,
  850. A2_V_FALSE,
  851. OptionHandler::OPT_ARG));
  852. op->addTag(TAG_HTTP);
  853. handlers.push_back(op);
  854. }
  855. {
  856. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  857. (PREF_HTTP_NO_CACHE,
  858. TEXT_HTTP_NO_CACHE,
  859. A2_V_TRUE,
  860. OptionHandler::OPT_ARG));
  861. op->addTag(TAG_HTTP);
  862. handlers.push_back(op);
  863. }
  864. {
  865. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  866. (PREF_HTTP_PASSWD,
  867. TEXT_HTTP_PASSWD));
  868. op->addTag(TAG_BASIC);
  869. op->addTag(TAG_HTTP);
  870. handlers.push_back(op);
  871. }
  872. {
  873. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  874. (PREF_HTTP_USER,
  875. TEXT_HTTP_USER));
  876. op->addTag(TAG_BASIC);
  877. op->addTag(TAG_HTTP);
  878. handlers.push_back(op);
  879. }
  880. {
  881. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  882. (PREF_LOAD_COOKIES,
  883. TEXT_LOAD_COOKIES,
  884. NO_DEFAULT_VALUE,
  885. "/path/to/file"));
  886. op->addTag(TAG_BASIC);
  887. op->addTag(TAG_HTTP);
  888. op->addTag(TAG_COOKIE);
  889. handlers.push_back(op);
  890. }
  891. {
  892. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  893. (PREF_MAX_HTTP_PIPELINING,
  894. NO_DESCRIPTION,
  895. "2",
  896. 1, 8));
  897. op->hide();
  898. handlers.push_back(op);
  899. }
  900. {
  901. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  902. (PREF_PRIVATE_KEY,
  903. TEXT_PRIVATE_KEY));
  904. op->addTag(TAG_HTTP);
  905. op->addTag(TAG_HTTPS);
  906. handlers.push_back(op);
  907. }
  908. {
  909. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  910. (PREF_REFERER,
  911. TEXT_REFERER));
  912. op->addTag(TAG_HTTP);
  913. handlers.push_back(op);
  914. }
  915. {
  916. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  917. (PREF_SAVE_COOKIES,
  918. TEXT_SAVE_COOKIES,
  919. NO_DEFAULT_VALUE,
  920. "/path/to/file"));
  921. op->addTag(TAG_HTTP);
  922. op->addTag(TAG_COOKIE);
  923. handlers.push_back(op);
  924. }
  925. {
  926. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  927. (PREF_USE_HEAD,
  928. TEXT_USE_HEAD,
  929. A2_V_FALSE,
  930. OptionHandler::OPT_ARG));
  931. op->addTag(TAG_HTTP);
  932. handlers.push_back(op);
  933. }
  934. {
  935. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  936. (PREF_USER_AGENT,
  937. TEXT_USER_AGENT,
  938. "aria2/"PACKAGE_VERSION,
  939. A2STR::NIL,
  940. OptionHandler::REQ_ARG,
  941. 'U'));
  942. op->addTag(TAG_HTTP);
  943. handlers.push_back(op);
  944. }
  945. // FTP Specific Options
  946. {
  947. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  948. (PREF_FTP_PASSWD,
  949. TEXT_FTP_PASSWD));
  950. op->addTag(TAG_BASIC);
  951. op->addTag(TAG_FTP);
  952. handlers.push_back(op);
  953. }
  954. {
  955. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  956. (PREF_FTP_PASV,
  957. TEXT_FTP_PASV,
  958. A2_V_TRUE,
  959. OptionHandler::OPT_ARG,
  960. 'p'));
  961. op->addTag(TAG_FTP);
  962. handlers.push_back(op);
  963. }
  964. {
  965. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  966. (PREF_FTP_REUSE_CONNECTION,
  967. TEXT_FTP_REUSE_CONNECTION,
  968. A2_V_TRUE,
  969. OptionHandler::OPT_ARG));
  970. op->addTag(TAG_FTP);
  971. handlers.push_back(op);
  972. }
  973. {
  974. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  975. (PREF_FTP_TYPE,
  976. TEXT_FTP_TYPE,
  977. V_BINARY,
  978. V_BINARY, V_ASCII));
  979. op->addTag(TAG_FTP);
  980. handlers.push_back(op);
  981. }
  982. {
  983. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  984. (PREF_FTP_USER,
  985. TEXT_FTP_USER));
  986. op->addTag(TAG_BASIC);
  987. op->addTag(TAG_FTP);
  988. handlers.push_back(op);
  989. }
  990. {
  991. SharedHandle<DefaultOptionHandler> op(new DefaultOptionHandler
  992. (PREF_NETRC_PATH,
  993. NO_DESCRIPTION,
  994. util::getHomeDir()+"/.netrc",
  995. "/PATH/TO/NETRC"));
  996. op->hide();
  997. handlers.push_back(op);
  998. }
  999. // Proxy options
  1000. {
  1001. SharedHandle<OptionHandler> op(new HttpProxyOptionHandler
  1002. (PREF_HTTP_PROXY,
  1003. TEXT_HTTP_PROXY,
  1004. NO_DEFAULT_VALUE));
  1005. op->addTag(TAG_HTTP);
  1006. handlers.push_back(op);
  1007. }
  1008. {
  1009. SharedHandle<OptionHandler> op(new HttpProxyPasswdOptionHandler
  1010. (PREF_HTTP_PROXY_PASSWD,
  1011. TEXT_HTTP_PROXY_PASSWD,
  1012. NO_DEFAULT_VALUE));
  1013. op->addTag(TAG_HTTP);
  1014. handlers.push_back(op);
  1015. }
  1016. {
  1017. SharedHandle<OptionHandler> op(new HttpProxyUserOptionHandler
  1018. (PREF_HTTP_PROXY_USER,
  1019. TEXT_HTTP_PROXY_USER,
  1020. NO_DEFAULT_VALUE));
  1021. op->addTag(TAG_HTTP);
  1022. handlers.push_back(op);
  1023. }
  1024. {
  1025. SharedHandle<OptionHandler> op(new HttpProxyOptionHandler
  1026. (PREF_HTTPS_PROXY,
  1027. TEXT_HTTPS_PROXY,
  1028. NO_DEFAULT_VALUE));
  1029. op->addTag(TAG_HTTP);
  1030. op->addTag(TAG_HTTPS);
  1031. handlers.push_back(op);
  1032. }
  1033. {
  1034. SharedHandle<OptionHandler> op(new HttpProxyPasswdOptionHandler
  1035. (PREF_HTTPS_PROXY_PASSWD,
  1036. TEXT_HTTPS_PROXY_PASSWD,
  1037. NO_DEFAULT_VALUE));
  1038. op->addTag(TAG_HTTP);
  1039. op->addTag(TAG_HTTPS);
  1040. handlers.push_back(op);
  1041. }
  1042. {
  1043. SharedHandle<OptionHandler> op(new HttpProxyUserOptionHandler
  1044. (PREF_HTTPS_PROXY_USER,
  1045. TEXT_HTTPS_PROXY_USER,
  1046. NO_DEFAULT_VALUE));
  1047. op->addTag(TAG_HTTP);
  1048. op->addTag(TAG_HTTPS);
  1049. handlers.push_back(op);
  1050. }
  1051. {
  1052. SharedHandle<OptionHandler> op(new HttpProxyOptionHandler
  1053. (PREF_FTP_PROXY,
  1054. TEXT_FTP_PROXY,
  1055. NO_DEFAULT_VALUE));
  1056. op->addTag(TAG_FTP);
  1057. handlers.push_back(op);
  1058. }
  1059. {
  1060. SharedHandle<OptionHandler> op(new HttpProxyPasswdOptionHandler
  1061. (PREF_FTP_PROXY_PASSWD,
  1062. TEXT_FTP_PROXY_PASSWD,
  1063. NO_DEFAULT_VALUE));
  1064. op->addTag(TAG_FTP);
  1065. handlers.push_back(op);
  1066. }
  1067. {
  1068. SharedHandle<OptionHandler> op(new HttpProxyUserOptionHandler
  1069. (PREF_FTP_PROXY_USER,
  1070. TEXT_FTP_PROXY_USER,
  1071. NO_DEFAULT_VALUE));
  1072. op->addTag(TAG_FTP);
  1073. handlers.push_back(op);
  1074. }
  1075. {
  1076. SharedHandle<OptionHandler> op(new HttpProxyOptionHandler
  1077. (PREF_ALL_PROXY,
  1078. TEXT_ALL_PROXY,
  1079. NO_DEFAULT_VALUE));
  1080. op->addTag(TAG_FTP);
  1081. op->addTag(TAG_HTTP);
  1082. op->addTag(TAG_HTTPS);
  1083. handlers.push_back(op);
  1084. }
  1085. {
  1086. SharedHandle<OptionHandler> op(new HttpProxyPasswdOptionHandler
  1087. (PREF_ALL_PROXY_PASSWD,
  1088. TEXT_ALL_PROXY_PASSWD,
  1089. NO_DEFAULT_VALUE));
  1090. op->addTag(TAG_FTP);
  1091. op->addTag(TAG_HTTP);
  1092. op->addTag(TAG_HTTPS);
  1093. handlers.push_back(op);
  1094. }
  1095. {
  1096. SharedHandle<OptionHandler> op(new HttpProxyUserOptionHandler
  1097. (PREF_ALL_PROXY_USER,
  1098. TEXT_ALL_PROXY_USER,
  1099. NO_DEFAULT_VALUE));
  1100. op->addTag(TAG_FTP);
  1101. op->addTag(TAG_HTTP);
  1102. op->addTag(TAG_HTTPS);
  1103. handlers.push_back(op);
  1104. }
  1105. {
  1106. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1107. (PREF_NO_PROXY,
  1108. TEXT_NO_PROXY,
  1109. NO_DEFAULT_VALUE,
  1110. "HOSTNAME,DOMAIN,NETWORK/CIDR"));
  1111. op->addTag(TAG_FTP);
  1112. op->addTag(TAG_HTTP);
  1113. op->addTag(TAG_HTTPS);
  1114. handlers.push_back(op);
  1115. }
  1116. {
  1117. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  1118. (PREF_PROXY_METHOD,
  1119. TEXT_PROXY_METHOD,
  1120. V_GET,
  1121. V_GET, V_TUNNEL));
  1122. op->addTag(TAG_FTP);
  1123. op->addTag(TAG_HTTP);
  1124. handlers.push_back(op);
  1125. }
  1126. // BitTorrent/Metalink Options
  1127. #if defined ENABLE_BITTORRENT || defined ENABLE_METALINK
  1128. {
  1129. SharedHandle<OptionHandler> op(new IntegerRangeOptionHandler
  1130. (PREF_SELECT_FILE,
  1131. TEXT_SELECT_FILE,
  1132. NO_DEFAULT_VALUE,
  1133. 1, INT32_MAX));
  1134. op->addTag(TAG_BITTORRENT);
  1135. op->addTag(TAG_METALINK);
  1136. handlers.push_back(op);
  1137. }
  1138. {
  1139. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1140. (PREF_SHOW_FILES,
  1141. TEXT_SHOW_FILES,
  1142. A2_V_FALSE,
  1143. OptionHandler::OPT_ARG,
  1144. 'S'));
  1145. op->addTag(TAG_BASIC);
  1146. op->addTag(TAG_BITTORRENT);
  1147. op->addTag(TAG_METALINK);
  1148. handlers.push_back(op);
  1149. }
  1150. #endif // ENABLE_BITTORRENT || ENABLE_METALINK
  1151. // BitTorrent Specific Options
  1152. #ifdef ENABLE_BITTORRENT
  1153. {
  1154. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1155. (PREF_BT_ENABLE_LPD,
  1156. TEXT_BT_ENABLE_LPD,
  1157. A2_V_FALSE,
  1158. OptionHandler::OPT_ARG));
  1159. op->addTag(TAG_BITTORRENT);
  1160. handlers.push_back(op);
  1161. }
  1162. {
  1163. SharedHandle<DefaultOptionHandler> op(new DefaultOptionHandler
  1164. (PREF_BT_EXCLUDE_TRACKER,
  1165. TEXT_BT_EXCLUDE_TRACKER,
  1166. NO_DESCRIPTION,
  1167. "URI,... "
  1168. "or *"));
  1169. op->addTag(TAG_BITTORRENT);
  1170. handlers.push_back(op);
  1171. }
  1172. {
  1173. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1174. (PREF_BT_EXTERNAL_IP,
  1175. TEXT_BT_EXTERNAL_IP,
  1176. NO_DEFAULT_VALUE,
  1177. "a numeric IP address"));
  1178. op->addTag(TAG_BITTORRENT);
  1179. handlers.push_back(op);
  1180. }
  1181. {
  1182. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  1183. (PREF_BT_KEEP_ALIVE_INTERVAL,
  1184. NO_DESCRIPTION,
  1185. "120",
  1186. 1, 120));
  1187. op->hide();
  1188. handlers.push_back(op);
  1189. }
  1190. {
  1191. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1192. (PREF_BT_HASH_CHECK_SEED,
  1193. TEXT_BT_HASH_CHECK_SEED,
  1194. A2_V_TRUE,
  1195. OptionHandler::OPT_ARG));
  1196. op->addTag(TAG_BITTORRENT);
  1197. handlers.push_back(op);
  1198. }
  1199. {
  1200. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1201. (PREF_BT_LPD_INTERFACE,
  1202. TEXT_BT_LPD_INTERFACE,
  1203. NO_DEFAULT_VALUE,
  1204. "interface, IP address",
  1205. OptionHandler::REQ_ARG));
  1206. op->addTag(TAG_BITTORRENT);
  1207. handlers.push_back(op);
  1208. }
  1209. {
  1210. SharedHandle<OptionHandler> op(new NumberOptionHandler
  1211. (PREF_BT_MAX_OPEN_FILES,
  1212. TEXT_BT_MAX_OPEN_FILES,
  1213. "100",
  1214. 1));
  1215. op->addTag(TAG_BITTORRENT);
  1216. handlers.push_back(op);
  1217. }
  1218. {
  1219. SharedHandle<OptionHandler> op(new NumberOptionHandler
  1220. (PREF_BT_MAX_PEERS,
  1221. TEXT_BT_MAX_PEERS,
  1222. "55",
  1223. 0));
  1224. op->addTag(TAG_BITTORRENT);
  1225. handlers.push_back(op);
  1226. }
  1227. {
  1228. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1229. (PREF_BT_METADATA_ONLY,
  1230. TEXT_BT_METADATA_ONLY,
  1231. A2_V_FALSE,
  1232. OptionHandler::OPT_ARG));
  1233. op->addTag(TAG_BITTORRENT);
  1234. handlers.push_back(op);
  1235. }
  1236. {
  1237. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  1238. (PREF_BT_MIN_CRYPTO_LEVEL,
  1239. TEXT_BT_MIN_CRYPTO_LEVEL,
  1240. V_PLAIN,
  1241. V_PLAIN, V_ARC4));
  1242. op->addTag(TAG_BITTORRENT);
  1243. handlers.push_back(op);
  1244. }
  1245. {
  1246. SharedHandle<OptionHandler> op(new PrioritizePieceOptionHandler
  1247. (PREF_BT_PRIORITIZE_PIECE,
  1248. TEXT_BT_PRIORITIZE_PIECE));
  1249. op->addTag(TAG_BITTORRENT);
  1250. handlers.push_back(op);
  1251. }
  1252. {
  1253. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  1254. (PREF_BT_REQUEST_PEER_SPEED_LIMIT,
  1255. TEXT_BT_REQUEST_PEER_SPEED_LIMIT,
  1256. "50K",
  1257. 0));
  1258. op->addTag(TAG_BITTORRENT);
  1259. handlers.push_back(op);
  1260. }
  1261. {
  1262. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1263. (PREF_BT_REQUIRE_CRYPTO,
  1264. TEXT_BT_REQUIRE_CRYPTO,
  1265. A2_V_FALSE,
  1266. OptionHandler::OPT_ARG));
  1267. op->addTag(TAG_BITTORRENT);
  1268. handlers.push_back(op);
  1269. }
  1270. {
  1271. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  1272. (PREF_BT_REQUEST_TIMEOUT,
  1273. NO_DESCRIPTION,
  1274. "60",
  1275. 1, 600));
  1276. op->hide();
  1277. handlers.push_back(op);
  1278. }
  1279. {
  1280. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1281. (PREF_BT_SEED_UNVERIFIED,
  1282. TEXT_BT_SEED_UNVERIFIED,
  1283. A2_V_FALSE,
  1284. OptionHandler::OPT_ARG));
  1285. op->addTag(TAG_BITTORRENT);
  1286. handlers.push_back(op);
  1287. }
  1288. {
  1289. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1290. (PREF_BT_SAVE_METADATA,
  1291. TEXT_BT_SAVE_METADATA,
  1292. A2_V_FALSE,
  1293. OptionHandler::OPT_ARG));
  1294. op->addTag(TAG_BITTORRENT);
  1295. handlers.push_back(op);
  1296. }
  1297. {
  1298. SharedHandle<OptionHandler> op(new NumberOptionHandler
  1299. (PREF_BT_STOP_TIMEOUT,
  1300. TEXT_BT_STOP_TIMEOUT,
  1301. "0",
  1302. 0));
  1303. op->addTag(TAG_BITTORRENT);
  1304. handlers.push_back(op);
  1305. }
  1306. {
  1307. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  1308. (PREF_BT_TIMEOUT,
  1309. NO_DESCRIPTION,
  1310. "180",
  1311. 1, 600));
  1312. op->hide();
  1313. handlers.push_back(op);
  1314. }
  1315. {
  1316. SharedHandle<DefaultOptionHandler> op(new DefaultOptionHandler
  1317. (PREF_BT_TRACKER,
  1318. TEXT_BT_TRACKER,
  1319. NO_DESCRIPTION,
  1320. "URI,..."));
  1321. op->addTag(TAG_BITTORRENT);
  1322. handlers.push_back(op);
  1323. }
  1324. {
  1325. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  1326. (PREF_BT_TRACKER_CONNECT_TIMEOUT,
  1327. TEXT_BT_TRACKER_CONNECT_TIMEOUT,
  1328. "60",
  1329. 1, 600));
  1330. op->addTag(TAG_BITTORRENT);
  1331. handlers.push_back(op);
  1332. }
  1333. {
  1334. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  1335. (PREF_BT_TRACKER_INTERVAL,
  1336. TEXT_BT_TRACKER_INTERVAL,
  1337. "0",
  1338. 0));
  1339. op->addTag(TAG_BITTORRENT);
  1340. handlers.push_back(op);
  1341. }
  1342. {
  1343. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  1344. (PREF_BT_TRACKER_TIMEOUT,
  1345. TEXT_BT_TRACKER_TIMEOUT,
  1346. "60",
  1347. 1, 600));
  1348. op->addTag(TAG_BITTORRENT);
  1349. handlers.push_back(op);
  1350. }
  1351. {
  1352. SharedHandle<OptionHandler> op(new HostPortOptionHandler
  1353. (PREF_DHT_ENTRY_POINT,
  1354. TEXT_DHT_ENTRY_POINT,
  1355. NO_DEFAULT_VALUE,
  1356. PREF_DHT_ENTRY_POINT_HOST,
  1357. PREF_DHT_ENTRY_POINT_PORT));
  1358. op->addTag(TAG_BITTORRENT);
  1359. handlers.push_back(op);
  1360. }
  1361. {
  1362. SharedHandle<OptionHandler> op(new HostPortOptionHandler
  1363. (PREF_DHT_ENTRY_POINT6,
  1364. TEXT_DHT_ENTRY_POINT6,
  1365. NO_DEFAULT_VALUE,
  1366. PREF_DHT_ENTRY_POINT_HOST6,
  1367. PREF_DHT_ENTRY_POINT_PORT6));
  1368. op->addTag(TAG_BITTORRENT);
  1369. handlers.push_back(op);
  1370. }
  1371. {
  1372. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1373. (PREF_DHT_FILE_PATH,
  1374. TEXT_DHT_FILE_PATH,
  1375. util::getHomeDir()+"/.aria2/dht.dat",
  1376. "/PATH/TO/DHT_DAT"));
  1377. op->addTag(TAG_BITTORRENT);
  1378. handlers.push_back(op);
  1379. }
  1380. {
  1381. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1382. (PREF_DHT_FILE_PATH6,
  1383. TEXT_DHT_FILE_PATH6,
  1384. util::getHomeDir()+"/.aria2/dht6.dat",
  1385. "/PATH/TO/DHT_DAT"));
  1386. op->addTag(TAG_BITTORRENT);
  1387. handlers.push_back(op);
  1388. }
  1389. {
  1390. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1391. (PREF_DHT_LISTEN_ADDR,
  1392. NO_DESCRIPTION,
  1393. NO_DEFAULT_VALUE));
  1394. op->hide();
  1395. op->addTag(TAG_BASIC);
  1396. op->addTag(TAG_BITTORRENT);
  1397. handlers.push_back(op);
  1398. }
  1399. {
  1400. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1401. (PREF_DHT_LISTEN_ADDR6,
  1402. TEXT_DHT_LISTEN_ADDR6,
  1403. NO_DEFAULT_VALUE));
  1404. op->addTag(TAG_BASIC);
  1405. op->addTag(TAG_BITTORRENT);
  1406. handlers.push_back(op);
  1407. }
  1408. {
  1409. SharedHandle<OptionHandler> op(new IntegerRangeOptionHandler
  1410. (PREF_DHT_LISTEN_PORT,
  1411. TEXT_DHT_LISTEN_PORT,
  1412. "6881-6999",
  1413. 1024, UINT16_MAX));
  1414. op->addTag(TAG_BASIC);
  1415. op->addTag(TAG_BITTORRENT);
  1416. handlers.push_back(op);
  1417. }
  1418. {
  1419. SharedHandle<OptionHandler> op(new NumberOptionHandler
  1420. (PREF_DHT_MESSAGE_TIMEOUT,
  1421. TEXT_DHT_MESSAGE_TIMEOUT,
  1422. "10",
  1423. 1, 60));
  1424. op->addTag(TAG_BITTORRENT);
  1425. handlers.push_back(op);
  1426. }
  1427. {
  1428. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1429. (PREF_ENABLE_DHT,
  1430. TEXT_ENABLE_DHT,
  1431. A2_V_TRUE,
  1432. OptionHandler::OPT_ARG));
  1433. op->addTag(TAG_BASIC);
  1434. op->addTag(TAG_BITTORRENT);
  1435. handlers.push_back(op);
  1436. }
  1437. {
  1438. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1439. (PREF_ENABLE_DHT6,
  1440. TEXT_ENABLE_DHT6,
  1441. A2_V_FALSE,
  1442. OptionHandler::OPT_ARG));
  1443. op->addTag(TAG_BASIC);
  1444. op->addTag(TAG_BITTORRENT);
  1445. handlers.push_back(op);
  1446. }
  1447. {
  1448. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1449. (PREF_ENABLE_PEER_EXCHANGE,
  1450. TEXT_ENABLE_PEER_EXCHANGE,
  1451. A2_V_TRUE,
  1452. OptionHandler::OPT_ARG));
  1453. op->addTag(TAG_BITTORRENT);
  1454. handlers.push_back(op);
  1455. }
  1456. {
  1457. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  1458. (PREF_FOLLOW_TORRENT,
  1459. TEXT_FOLLOW_TORRENT,
  1460. A2_V_TRUE,
  1461. A2_V_TRUE, V_MEM, A2_V_FALSE));
  1462. op->addTag(TAG_BITTORRENT);
  1463. handlers.push_back(op);
  1464. }
  1465. {
  1466. SharedHandle<OptionHandler> op(new IndexOutOptionHandler
  1467. (PREF_INDEX_OUT,
  1468. TEXT_INDEX_OUT,
  1469. 'O'));
  1470. op->addTag(TAG_BITTORRENT);
  1471. handlers.push_back(op);
  1472. }
  1473. {
  1474. SharedHandle<OptionHandler> op(new IntegerRangeOptionHandler
  1475. (PREF_LISTEN_PORT,
  1476. TEXT_LISTEN_PORT,
  1477. "6881-6999",
  1478. 1024, UINT16_MAX));
  1479. op->addTag(TAG_BASIC);
  1480. op->addTag(TAG_BITTORRENT);
  1481. handlers.push_back(op);
  1482. }
  1483. {
  1484. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  1485. (PREF_MAX_OVERALL_UPLOAD_LIMIT,
  1486. TEXT_MAX_OVERALL_UPLOAD_LIMIT,
  1487. "0",
  1488. 0));
  1489. op->addTag(TAG_BASIC);
  1490. op->addTag(TAG_BITTORRENT);
  1491. handlers.push_back(op);
  1492. }
  1493. {
  1494. SharedHandle<OptionHandler> op(new UnitNumberOptionHandler
  1495. (PREF_MAX_UPLOAD_LIMIT,
  1496. TEXT_MAX_UPLOAD_LIMIT,
  1497. "0",
  1498. 0, -1,
  1499. 'u'));
  1500. op->addTag(TAG_BASIC);
  1501. op->addTag(TAG_BITTORRENT);
  1502. handlers.push_back(op);
  1503. }
  1504. {
  1505. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1506. (PREF_ON_BT_DOWNLOAD_COMPLETE,
  1507. TEXT_ON_BT_DOWNLOAD_COMPLETE,
  1508. NO_DEFAULT_VALUE,
  1509. "/path/to/command"));
  1510. op->addTag(TAG_ADVANCED);
  1511. op->addTag(TAG_HOOK);
  1512. handlers.push_back(op);
  1513. }
  1514. {
  1515. SharedHandle<NumberOptionHandler> op(new NumberOptionHandler
  1516. (PREF_PEER_CONNECTION_TIMEOUT,
  1517. NO_DESCRIPTION,
  1518. "20",
  1519. 1, 600));
  1520. op->hide();
  1521. handlers.push_back(op);
  1522. }
  1523. {
  1524. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1525. (PREF_PEER_ID_PREFIX,
  1526. TEXT_PEER_ID_PREFIX,
  1527. "aria2/"PACKAGE_VERSION"-"));
  1528. op->addTag(TAG_BITTORRENT);
  1529. handlers.push_back(op);
  1530. }
  1531. {
  1532. SharedHandle<OptionHandler> op(new NumberOptionHandler
  1533. (PREF_SEED_TIME,
  1534. TEXT_SEED_TIME,
  1535. NO_DEFAULT_VALUE,
  1536. 0));
  1537. op->addTag(TAG_BITTORRENT);
  1538. handlers.push_back(op);
  1539. }
  1540. {
  1541. SharedHandle<OptionHandler> op(new FloatNumberOptionHandler
  1542. (PREF_SEED_RATIO,
  1543. TEXT_SEED_RATIO,
  1544. "1.0",
  1545. 0.0));
  1546. op->addTag(TAG_BITTORRENT);
  1547. handlers.push_back(op);
  1548. }
  1549. {
  1550. SharedHandle<OptionHandler> op(new LocalFilePathOptionHandler
  1551. (PREF_TORRENT_FILE,
  1552. TEXT_TORRENT_FILE,
  1553. NO_DEFAULT_VALUE,
  1554. false,
  1555. 'T'));
  1556. op->addTag(TAG_BASIC);
  1557. op->addTag(TAG_BITTORRENT);
  1558. handlers.push_back(op);
  1559. }
  1560. #endif // ENABLE_BITTORRENT
  1561. // Metalink Specific Options
  1562. #ifdef ENABLE_METALINK
  1563. {
  1564. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  1565. (PREF_FOLLOW_METALINK,
  1566. TEXT_FOLLOW_METALINK,
  1567. A2_V_TRUE,
  1568. A2_V_TRUE, V_MEM, A2_V_FALSE));
  1569. op->addTag(TAG_METALINK);
  1570. handlers.push_back(op);
  1571. }
  1572. {
  1573. SharedHandle<OptionHandler> op(new BooleanOptionHandler
  1574. (PREF_METALINK_ENABLE_UNIQUE_PROTOCOL,
  1575. TEXT_METALINK_ENABLE_UNIQUE_PROTOCOL,
  1576. A2_V_TRUE,
  1577. OptionHandler::OPT_ARG));
  1578. op->addTag(TAG_METALINK);
  1579. handlers.push_back(op);
  1580. }
  1581. {
  1582. SharedHandle<OptionHandler> op(new LocalFilePathOptionHandler
  1583. (PREF_METALINK_FILE,
  1584. TEXT_METALINK_FILE,
  1585. NO_DEFAULT_VALUE,
  1586. true,
  1587. 'M'));
  1588. op->addTag(TAG_BASIC);
  1589. op->addTag(TAG_METALINK);
  1590. handlers.push_back(op);
  1591. }
  1592. {
  1593. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1594. (PREF_METALINK_LANGUAGE,
  1595. TEXT_METALINK_LANGUAGE));
  1596. op->addTag(TAG_METALINK);
  1597. handlers.push_back(op);
  1598. }
  1599. {
  1600. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1601. (PREF_METALINK_LOCATION,
  1602. TEXT_METALINK_LOCATION));
  1603. op->addTag(TAG_METALINK);
  1604. handlers.push_back(op);
  1605. }
  1606. {
  1607. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1608. (PREF_METALINK_OS,
  1609. TEXT_METALINK_OS));
  1610. op->addTag(TAG_METALINK);
  1611. handlers.push_back(op);
  1612. }
  1613. {
  1614. const std::string params[] = { V_HTTP, V_HTTPS, V_FTP, V_NONE };
  1615. SharedHandle<OptionHandler> op(new ParameterOptionHandler
  1616. (PREF_METALINK_PREFERRED_PROTOCOL,
  1617. TEXT_METALINK_PREFERRED_PROTOCOL,
  1618. V_NONE,
  1619. std::vector<std::string>
  1620. (vbegin(params), vend(params))));
  1621. op->addTag(TAG_METALINK);
  1622. handlers.push_back(op);
  1623. }
  1624. {
  1625. SharedHandle<OptionHandler> op(new NumberOptionHandler
  1626. (PREF_METALINK_SERVERS,
  1627. TEXT_METALINK_SERVERS,
  1628. "5",
  1629. 1, -1,
  1630. 'C'));
  1631. op->addTag(TAG_METALINK);
  1632. handlers.push_back(op);
  1633. }
  1634. {
  1635. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1636. (PREF_METALINK_VERSION,
  1637. TEXT_METALINK_VERSION));
  1638. op->addTag(TAG_METALINK);
  1639. handlers.push_back(op);
  1640. }
  1641. #endif // ENABLE_METALINK
  1642. // Version Option
  1643. {
  1644. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1645. ("version",
  1646. TEXT_VERSION,
  1647. NO_DEFAULT_VALUE,
  1648. A2STR::NIL,
  1649. OptionHandler::NO_ARG,
  1650. 'v'));
  1651. op->addTag(TAG_BASIC);
  1652. handlers.push_back(op);
  1653. }
  1654. // Help Option
  1655. {
  1656. static std::string tags[] = {
  1657. TAG_BASIC,
  1658. TAG_ADVANCED,
  1659. TAG_HTTP,
  1660. TAG_HTTPS,
  1661. TAG_FTP,
  1662. TAG_METALINK,
  1663. TAG_BITTORRENT,
  1664. TAG_COOKIE,
  1665. TAG_HOOK,
  1666. TAG_FILE,
  1667. TAG_XML_RPC,
  1668. TAG_EXPERIMENTAL,
  1669. TAG_HELP,
  1670. TAG_ALL
  1671. };
  1672. static std::string tagsStr = strjoin(vbegin(tags), vend(tags), ", ");
  1673. SharedHandle<OptionHandler> op(new DefaultOptionHandler
  1674. ("help",
  1675. TEXT_HELP,
  1676. TAG_BASIC,
  1677. tagsStr,
  1678. OptionHandler::OPT_ARG,
  1679. 'h'));
  1680. op->addTag(TAG_BASIC);
  1681. op->addTag(TAG_HELP);
  1682. handlers.push_back(op);
  1683. }
  1684. return handlers;
  1685. }
  1686. } // namespace aria2