OptionHandlerFactory.cc 74 KB

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