OptionHandlerFactory.cc 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361
  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 BooleanOptionHandler
  598. (PREF_NO_CONF,
  599. TEXT_NO_CONF,
  600. A2_V_FALSE,
  601. OptionHandler::OPT_ARG));
  602. op->addTag(TAG_ADVANCED);
  603. handlers.push_back(op);
  604. }
  605. {
  606. OptionHandler* op(new UnitNumberOptionHandler
  607. (PREF_NO_FILE_ALLOCATION_LIMIT,
  608. TEXT_NO_FILE_ALLOCATION_LIMIT,
  609. "5M",
  610. 0));
  611. op->addTag(TAG_ADVANCED);
  612. op->addTag(TAG_FILE);
  613. op->setInitialOption(true);
  614. op->setChangeGlobalOption(true);
  615. op->setChangeOptionForReserved(true);
  616. handlers.push_back(op);
  617. }
  618. {
  619. OptionHandler* op(new DefaultOptionHandler
  620. (PREF_ON_DOWNLOAD_COMPLETE,
  621. TEXT_ON_DOWNLOAD_COMPLETE,
  622. NO_DEFAULT_VALUE,
  623. PATH_TO_COMMAND));
  624. op->addTag(TAG_ADVANCED);
  625. op->addTag(TAG_HOOK);
  626. handlers.push_back(op);
  627. }
  628. {
  629. OptionHandler* op(new DefaultOptionHandler
  630. (PREF_ON_DOWNLOAD_ERROR,
  631. TEXT_ON_DOWNLOAD_ERROR,
  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_PAUSE,
  641. TEXT_ON_DOWNLOAD_PAUSE,
  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_START,
  651. TEXT_ON_DOWNLOAD_START,
  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_STOP,
  661. TEXT_ON_DOWNLOAD_STOP,
  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 BooleanOptionHandler
  670. (PREF_PARAMETERIZED_URI,
  671. TEXT_PARAMETERIZED_URI,
  672. A2_V_FALSE,
  673. OptionHandler::OPT_ARG,
  674. 'P'));
  675. op->addTag(TAG_ADVANCED);
  676. op->setInitialOption(true);
  677. op->setChangeGlobalOption(true);
  678. handlers.push_back(op);
  679. }
  680. {
  681. OptionHandler* op(new BooleanOptionHandler
  682. (PREF_PAUSE,
  683. TEXT_PAUSE,
  684. A2_V_FALSE,
  685. OptionHandler::OPT_ARG));
  686. op->addTag(TAG_ADVANCED);
  687. op->addTag(TAG_RPC);
  688. op->setInitialOption(true);
  689. handlers.push_back(op);
  690. }
  691. {
  692. OptionHandler* op(new BooleanOptionHandler
  693. (PREF_PAUSE_METADATA,
  694. TEXT_PAUSE_METADATA,
  695. A2_V_FALSE,
  696. OptionHandler::OPT_ARG));
  697. op->addTag(TAG_ADVANCED);
  698. op->addTag(TAG_RPC);
  699. op->setInitialOption(true);
  700. op->setChangeGlobalOption(true);
  701. op->setChangeOptionForReserved(true);
  702. handlers.push_back(op);
  703. }
  704. {
  705. OptionHandler* op(new BooleanOptionHandler
  706. (PREF_QUIET,
  707. TEXT_QUIET,
  708. A2_V_FALSE,
  709. OptionHandler::OPT_ARG,
  710. 'q'));
  711. op->addTag(TAG_ADVANCED);
  712. handlers.push_back(op);
  713. }
  714. {
  715. OptionHandler* op(new BooleanOptionHandler
  716. (PREF_REALTIME_CHUNK_CHECKSUM,
  717. TEXT_REALTIME_CHUNK_CHECKSUM,
  718. A2_V_TRUE,
  719. OptionHandler::OPT_ARG));
  720. op->addTag(TAG_METALINK);
  721. op->addTag(TAG_CHECKSUM);
  722. op->setInitialOption(true);
  723. op->setChangeGlobalOption(true);
  724. op->setChangeOptionForReserved(true);
  725. handlers.push_back(op);
  726. }
  727. {
  728. OptionHandler* op(new BooleanOptionHandler
  729. (PREF_REMOVE_CONTROL_FILE,
  730. TEXT_REMOVE_CONTROL_FILE,
  731. A2_V_FALSE,
  732. OptionHandler::OPT_ARG));
  733. op->addTag(TAG_ADVANCED);
  734. op->setInitialOption(true);
  735. op->setChangeGlobalOption(true);
  736. op->setChangeOptionForReserved(true);
  737. handlers.push_back(op);
  738. }
  739. {
  740. OptionHandler* op(new DefaultOptionHandler
  741. (PREF_SAVE_SESSION,
  742. TEXT_SAVE_SESSION,
  743. NO_DEFAULT_VALUE,
  744. PATH_TO_FILE));
  745. op->addTag(TAG_ADVANCED);
  746. op->setChangeGlobalOption(true);
  747. handlers.push_back(op);
  748. }
  749. {
  750. OptionHandler* op(new NumberOptionHandler
  751. (PREF_SAVE_SESSION_INTERVAL,
  752. TEXT_SAVE_SESSION_INTERVAL,
  753. "0",
  754. 0));
  755. op->addTag(TAG_ADVANCED);
  756. handlers.push_back(op);
  757. }
  758. {
  759. OptionHandler* op(new NumberOptionHandler
  760. (PREF_DSCP,
  761. TEXT_DSCP,
  762. "0",
  763. 0));
  764. op->addTag(TAG_ADVANCED);
  765. handlers.push_back(op);
  766. }
  767. #ifdef HAVE_SYS_RESOURCE_H
  768. {
  769. OptionHandler* op(new NumberOptionHandler
  770. (PREF_RLIMIT_NOFILE,
  771. TEXT_RLIMIT_NOFILE,
  772. // Somewhat sane default that most *nix use.
  773. // Some other *nix, like OSX, have insane defaults like
  774. // 256, hence better *not* get the default value from
  775. // getrlimit().
  776. "1024",
  777. // 1 should not be a problem in practise, since the code
  778. // will only adjust if the specified value > the current
  779. // soft limit.
  780. // And sane systems have a default soft limit > 1.
  781. 1));
  782. op->addTag(TAG_ADVANCED);
  783. handlers.push_back(op);
  784. }
  785. #endif // HAVE_SYS_RESOURCE_H
  786. {
  787. OptionHandler* op(new BooleanOptionHandler
  788. (PREF_SELECT_LEAST_USED_HOST,
  789. NO_DESCRIPTION,
  790. A2_V_TRUE));
  791. op->hide();
  792. handlers.push_back(op);
  793. }
  794. {
  795. OptionHandler* op(new BooleanOptionHandler
  796. (PREF_SHOW_CONSOLE_READOUT,
  797. TEXT_SHOW_CONSOLE_READOUT,
  798. A2_V_TRUE));
  799. op->addTag(TAG_ADVANCED);
  800. handlers.push_back(op);
  801. }
  802. {
  803. OptionHandler* op(new NumberOptionHandler
  804. (PREF_STOP,
  805. TEXT_STOP,
  806. "0",
  807. 0, INT32_MAX));
  808. op->addTag(TAG_ADVANCED);
  809. handlers.push_back(op);
  810. }
  811. {
  812. OptionHandler* op(new NumberOptionHandler
  813. (PREF_STOP_WITH_PROCESS,
  814. TEXT_STOP_WITH_PROCESS,
  815. NO_DEFAULT_VALUE,
  816. 0));
  817. op->addTag(TAG_ADVANCED);
  818. handlers.push_back(op);
  819. }
  820. {
  821. OptionHandler* op(new NumberOptionHandler
  822. (PREF_SUMMARY_INTERVAL,
  823. TEXT_SUMMARY_INTERVAL,
  824. "60",
  825. 0, INT32_MAX));
  826. op->addTag(TAG_ADVANCED);
  827. handlers.push_back(op);
  828. }
  829. {
  830. OptionHandler* op(new BooleanOptionHandler
  831. (PREF_TRUNCATE_CONSOLE_READOUT,
  832. TEXT_TRUNCATE_CONSOLE_READOUT,
  833. A2_V_TRUE,
  834. OptionHandler::OPT_ARG));
  835. op->addTag(TAG_ADVANCED);
  836. handlers.push_back(op);
  837. }
  838. {
  839. OptionHandler* op(new BooleanOptionHandler
  840. (PREF_RPC_ALLOW_ORIGIN_ALL,
  841. TEXT_RPC_ALLOW_ORIGIN_ALL,
  842. A2_V_FALSE,
  843. OptionHandler::OPT_ARG));
  844. op->addTag(TAG_RPC);
  845. handlers.push_back(op);
  846. }
  847. {
  848. OptionHandler* op(
  849. #ifdef HAVE_APPLETLS
  850. new DefaultOptionHandler
  851. (PREF_RPC_CERTIFICATE,
  852. TEXT_RPC_CERTIFICATE,
  853. NO_DEFAULT_VALUE)
  854. #else // HAVE_APPLETLS
  855. new LocalFilePathOptionHandler
  856. (PREF_RPC_CERTIFICATE,
  857. TEXT_RPC_CERTIFICATE,
  858. NO_DEFAULT_VALUE,
  859. false)
  860. #endif // HAVE_APPLETLS
  861. );
  862. op->addTag(TAG_RPC);
  863. handlers.push_back(op);
  864. }
  865. {
  866. OptionHandler* op(new BooleanOptionHandler
  867. (PREF_RPC_LISTEN_ALL,
  868. TEXT_RPC_LISTEN_ALL,
  869. A2_V_FALSE,
  870. OptionHandler::OPT_ARG));
  871. op->addTag(TAG_RPC);
  872. handlers.push_back(op);
  873. }
  874. {
  875. OptionHandler* op(new NumberOptionHandler
  876. (PREF_RPC_LISTEN_PORT,
  877. TEXT_RPC_LISTEN_PORT,
  878. "6800",
  879. 1024, UINT16_MAX));
  880. op->addTag(TAG_RPC);
  881. handlers.push_back(op);
  882. }
  883. {
  884. OptionHandler* op(new UnitNumberOptionHandler
  885. (PREF_RPC_MAX_REQUEST_SIZE,
  886. TEXT_RPC_MAX_REQUEST_SIZE,
  887. "2M",
  888. 0));
  889. op->addTag(TAG_RPC);
  890. handlers.push_back(op);
  891. }
  892. {
  893. OptionHandler* op(new LocalFilePathOptionHandler
  894. (PREF_RPC_PRIVATE_KEY,
  895. TEXT_RPC_PRIVATE_KEY,
  896. NO_DEFAULT_VALUE,
  897. false));
  898. op->addTag(TAG_RPC);
  899. handlers.push_back(op);
  900. }
  901. {
  902. OptionHandler* op(new BooleanOptionHandler
  903. (PREF_RPC_SAVE_UPLOAD_METADATA,
  904. TEXT_RPC_SAVE_UPLOAD_METADATA,
  905. A2_V_TRUE,
  906. OptionHandler::OPT_ARG));
  907. op->addTag(TAG_RPC);
  908. op->setInitialOption(true);
  909. op->setChangeGlobalOption(true);
  910. handlers.push_back(op);
  911. }
  912. {
  913. auto op = new DefaultOptionHandler
  914. (PREF_RPC_SECRET,
  915. TEXT_RPC_SECRET);
  916. op->addTag(TAG_RPC);
  917. op->setEraseAfterParse(true);
  918. op->setAllowEmpty(false);
  919. handlers.push_back(op);
  920. }
  921. {
  922. OptionHandler* op(new BooleanOptionHandler
  923. (PREF_RPC_SECURE,
  924. TEXT_RPC_SECURE,
  925. A2_V_FALSE,
  926. OptionHandler::OPT_ARG));
  927. op->addTag(TAG_RPC);
  928. handlers.push_back(op);
  929. }
  930. {
  931. OptionHandler* op(new DeprecatedOptionHandler
  932. (new DefaultOptionHandler
  933. (PREF_RPC_USER,
  934. TEXT_RPC_USER),
  935. nullptr, true,
  936. "Migrate to --rpc-secret option as soon as possible."));
  937. op->addTag(TAG_RPC);
  938. op->setEraseAfterParse(true);
  939. handlers.push_back(op);
  940. }
  941. {
  942. OptionHandler* op(new DeprecatedOptionHandler
  943. (new DefaultOptionHandler
  944. (PREF_RPC_PASSWD,
  945. TEXT_RPC_PASSWD),
  946. nullptr, true));
  947. op->addTag(TAG_RPC);
  948. op->setEraseAfterParse(true);
  949. handlers.push_back(op);
  950. }
  951. // HTTP/FTP options
  952. {
  953. OptionHandler* op(new ChecksumOptionHandler
  954. (PREF_CHECKSUM,
  955. TEXT_CHECKSUM));
  956. op->addTag(TAG_FTP);
  957. op->addTag(TAG_HTTP);
  958. op->addTag(TAG_CHECKSUM);
  959. op->setInitialOption(true);
  960. op->setChangeOptionForReserved(true);
  961. handlers.push_back(op);
  962. }
  963. {
  964. OptionHandler* op(new NumberOptionHandler
  965. (PREF_CONNECT_TIMEOUT,
  966. TEXT_CONNECT_TIMEOUT,
  967. "60",
  968. 1, 600));
  969. op->addTag(TAG_FTP);
  970. op->addTag(TAG_HTTP);
  971. op->setInitialOption(true);
  972. op->setChangeGlobalOption(true);
  973. op->setChangeOptionForReserved(true);
  974. handlers.push_back(op);
  975. }
  976. {
  977. OptionHandler* op(new BooleanOptionHandler
  978. (PREF_DRY_RUN,
  979. TEXT_DRY_RUN,
  980. A2_V_FALSE,
  981. OptionHandler::OPT_ARG));
  982. op->addTag(TAG_FTP);
  983. op->addTag(TAG_HTTP);
  984. op->setInitialOption(true);
  985. op->setChangeGlobalOption(true);
  986. handlers.push_back(op);
  987. }
  988. {
  989. OptionHandler* op(new UnitNumberOptionHandler
  990. (PREF_LOWEST_SPEED_LIMIT,
  991. TEXT_LOWEST_SPEED_LIMIT,
  992. "0",
  993. 0));
  994. op->addTag(TAG_FTP);
  995. op->addTag(TAG_HTTP);
  996. op->setInitialOption(true);
  997. op->setChangeGlobalOption(true);
  998. op->setChangeOptionForReserved(true);
  999. handlers.push_back(op);
  1000. }
  1001. {
  1002. OptionHandler* op(new NumberOptionHandler
  1003. (PREF_MAX_FILE_NOT_FOUND,
  1004. TEXT_MAX_FILE_NOT_FOUND,
  1005. "0",
  1006. 0));
  1007. op->addTag(TAG_FTP);
  1008. op->addTag(TAG_HTTP);
  1009. op->setInitialOption(true);
  1010. op->setChangeGlobalOption(true);
  1011. op->setChangeOptionForReserved(true);
  1012. handlers.push_back(op);
  1013. }
  1014. {
  1015. OptionHandler* op(new NumberOptionHandler
  1016. (PREF_MAX_TRIES,
  1017. TEXT_MAX_TRIES,
  1018. "5",
  1019. 0, -1,
  1020. 'm'));
  1021. op->addTag(TAG_FTP);
  1022. op->addTag(TAG_HTTP);
  1023. op->setInitialOption(true);
  1024. op->setChangeGlobalOption(true);
  1025. op->setChangeOptionForReserved(true);
  1026. handlers.push_back(op);
  1027. }
  1028. {
  1029. OptionHandler* op(new BooleanOptionHandler
  1030. (PREF_NO_NETRC,
  1031. TEXT_NO_NETRC,
  1032. A2_V_FALSE,
  1033. OptionHandler::OPT_ARG,
  1034. 'n'));
  1035. op->addTag(TAG_FTP);
  1036. op->addTag(TAG_HTTP);
  1037. op->setInitialOption(true);
  1038. op->setChangeGlobalOption(true);
  1039. op->setChangeOptionForReserved(true);
  1040. handlers.push_back(op);
  1041. }
  1042. {
  1043. OptionHandler* op(new DefaultOptionHandler
  1044. (PREF_OUT,
  1045. TEXT_OUT,
  1046. NO_DEFAULT_VALUE,
  1047. PATH_TO_FILE,
  1048. OptionHandler::REQ_ARG,
  1049. 'o'));
  1050. op->addTag(TAG_BASIC);
  1051. op->addTag(TAG_FTP);
  1052. op->addTag(TAG_HTTP);
  1053. op->addTag(TAG_FILE);
  1054. op->setInitialOption(true);
  1055. op->setChangeOptionForReserved(true);
  1056. handlers.push_back(op);
  1057. }
  1058. {
  1059. OptionHandler* op(new UnitNumberOptionHandler
  1060. (PREF_PIECE_LENGTH,
  1061. TEXT_PIECE_LENGTH,
  1062. "1M",
  1063. 1024*1024,
  1064. 1024*1024*1024));
  1065. op->addTag(TAG_ADVANCED);
  1066. op->addTag(TAG_FTP);
  1067. op->addTag(TAG_HTTP);
  1068. op->setInitialOption(true);
  1069. op->setChangeGlobalOption(true);
  1070. handlers.push_back(op);
  1071. }
  1072. {
  1073. OptionHandler* op(new BooleanOptionHandler
  1074. (PREF_REMOTE_TIME,
  1075. TEXT_REMOTE_TIME,
  1076. A2_V_FALSE,
  1077. OptionHandler::OPT_ARG,
  1078. 'R'));
  1079. op->addTag(TAG_FTP);
  1080. op->addTag(TAG_HTTP);
  1081. op->setInitialOption(true);
  1082. op->setChangeGlobalOption(true);
  1083. op->setChangeOptionForReserved(true);
  1084. handlers.push_back(op);
  1085. }
  1086. {
  1087. OptionHandler* op(new NumberOptionHandler
  1088. (PREF_RETRY_WAIT,
  1089. TEXT_RETRY_WAIT,
  1090. "0",
  1091. 0, 600));
  1092. op->addTag(TAG_FTP);
  1093. op->addTag(TAG_HTTP);
  1094. op->setInitialOption(true);
  1095. op->setChangeGlobalOption(true);
  1096. op->setChangeOptionForReserved(true);
  1097. handlers.push_back(op);
  1098. }
  1099. {
  1100. OptionHandler* op(new BooleanOptionHandler
  1101. (PREF_REUSE_URI,
  1102. TEXT_REUSE_URI,
  1103. A2_V_TRUE,
  1104. OptionHandler::OPT_ARG));
  1105. op->addTag(TAG_FTP);
  1106. op->addTag(TAG_HTTP);
  1107. op->setInitialOption(true);
  1108. op->setChangeGlobalOption(true);
  1109. op->setChangeOptionForReserved(true);
  1110. handlers.push_back(op);
  1111. }
  1112. {
  1113. OptionHandler* op(new DefaultOptionHandler
  1114. (PREF_SERVER_STAT_IF,
  1115. TEXT_SERVER_STAT_IF,
  1116. NO_DEFAULT_VALUE,
  1117. PATH_TO_FILE));
  1118. op->addTag(TAG_FTP);
  1119. op->addTag(TAG_HTTP);
  1120. handlers.push_back(op);
  1121. }
  1122. {
  1123. OptionHandler* op(new DefaultOptionHandler
  1124. (PREF_SERVER_STAT_OF,
  1125. TEXT_SERVER_STAT_OF,
  1126. NO_DEFAULT_VALUE,
  1127. PATH_TO_FILE));
  1128. op->addTag(TAG_FTP);
  1129. op->addTag(TAG_HTTP);
  1130. op->setChangeGlobalOption(true);
  1131. handlers.push_back(op);
  1132. }
  1133. {
  1134. OptionHandler* op(new NumberOptionHandler
  1135. (PREF_SERVER_STAT_TIMEOUT,
  1136. TEXT_SERVER_STAT_TIMEOUT,
  1137. "86400",
  1138. 0, INT32_MAX));
  1139. op->addTag(TAG_FTP);
  1140. op->addTag(TAG_HTTP);
  1141. handlers.push_back(op);
  1142. }
  1143. {
  1144. OptionHandler* op(new NumberOptionHandler
  1145. (PREF_SPLIT,
  1146. TEXT_SPLIT,
  1147. "5",
  1148. 1, -1,
  1149. 's'));
  1150. op->addTag(TAG_BASIC);
  1151. op->addTag(TAG_FTP);
  1152. op->addTag(TAG_HTTP);
  1153. op->setInitialOption(true);
  1154. op->setChangeGlobalOption(true);
  1155. op->setChangeOptionForReserved(true);
  1156. handlers.push_back(op);
  1157. }
  1158. {
  1159. OptionHandler* op(new NumberOptionHandler
  1160. (PREF_STARTUP_IDLE_TIME,
  1161. NO_DESCRIPTION,
  1162. "10",
  1163. 1, 60));
  1164. op->hide();
  1165. handlers.push_back(op);
  1166. }
  1167. {
  1168. OptionHandler* op(new ParameterOptionHandler
  1169. (PREF_STREAM_PIECE_SELECTOR,
  1170. TEXT_STREAM_PIECE_SELECTOR,
  1171. A2_V_DEFAULT,
  1172. { A2_V_DEFAULT, V_INORDER, A2_V_RANDOM, A2_V_GEOM }));
  1173. op->addTag(TAG_FTP);
  1174. op->addTag(TAG_HTTP);
  1175. op->setInitialOption(true);
  1176. op->setChangeGlobalOption(true);
  1177. op->setChangeOptionForReserved(true);
  1178. handlers.push_back(op);
  1179. }
  1180. {
  1181. OptionHandler* op(new NumberOptionHandler
  1182. (PREF_TIMEOUT,
  1183. TEXT_TIMEOUT,
  1184. "60",
  1185. 1, 600,
  1186. 't'));
  1187. op->addTag(TAG_FTP);
  1188. op->addTag(TAG_HTTP);
  1189. op->setInitialOption(true);
  1190. op->setChangeGlobalOption(true);
  1191. op->setChangeOptionForReserved(true);
  1192. handlers.push_back(op);
  1193. }
  1194. {
  1195. OptionHandler* op(new ParameterOptionHandler
  1196. (PREF_URI_SELECTOR,
  1197. TEXT_URI_SELECTOR,
  1198. V_FEEDBACK,
  1199. { V_INORDER, V_FEEDBACK, V_ADAPTIVE }));
  1200. op->addTag(TAG_FTP);
  1201. op->addTag(TAG_HTTP);
  1202. op->setInitialOption(true);
  1203. op->setChangeGlobalOption(true);
  1204. op->setChangeOptionForReserved(true);
  1205. handlers.push_back(op);
  1206. }
  1207. // HTTP Specific Options
  1208. {
  1209. OptionHandler* op(new DefaultOptionHandler
  1210. (PREF_CA_CERTIFICATE,
  1211. TEXT_CA_CERTIFICATE,
  1212. #ifdef CA_BUNDLE
  1213. CA_BUNDLE,
  1214. #else
  1215. "",
  1216. #endif
  1217. PATH_TO_FILE));
  1218. op->addTag(TAG_HTTP);
  1219. op->addTag(TAG_HTTPS);
  1220. handlers.push_back(op);
  1221. }
  1222. {
  1223. OptionHandler* op(
  1224. #ifdef HAVE_APPLETLS
  1225. new DefaultOptionHandler
  1226. (PREF_CERTIFICATE,
  1227. TEXT_CERTIFICATE,
  1228. NO_DEFAULT_VALUE)
  1229. #else // HAVE_APPLETLS
  1230. new LocalFilePathOptionHandler
  1231. (PREF_CERTIFICATE,
  1232. TEXT_CERTIFICATE,
  1233. NO_DEFAULT_VALUE,
  1234. false)
  1235. #endif // HAVE_APPLETLS
  1236. );
  1237. op->addTag(TAG_HTTP);
  1238. op->addTag(TAG_HTTPS);
  1239. handlers.push_back(op);
  1240. }
  1241. {
  1242. OptionHandler* op(new BooleanOptionHandler
  1243. (PREF_CHECK_CERTIFICATE,
  1244. TEXT_CHECK_CERTIFICATE,
  1245. A2_V_TRUE,
  1246. OptionHandler::OPT_ARG));
  1247. op->addTag(TAG_HTTP);
  1248. op->addTag(TAG_HTTPS);
  1249. handlers.push_back(op);
  1250. }
  1251. {
  1252. OptionHandler* op(new BooleanOptionHandler
  1253. (PREF_ENABLE_HTTP_KEEP_ALIVE,
  1254. TEXT_ENABLE_HTTP_KEEP_ALIVE,
  1255. A2_V_TRUE,
  1256. OptionHandler::OPT_ARG));
  1257. op->addTag(TAG_HTTP);
  1258. op->setInitialOption(true);
  1259. op->setChangeGlobalOption(true);
  1260. op->setChangeOptionForReserved(true);
  1261. handlers.push_back(op);
  1262. }
  1263. {
  1264. OptionHandler* op(new BooleanOptionHandler
  1265. (PREF_ENABLE_HTTP_PIPELINING,
  1266. TEXT_ENABLE_HTTP_PIPELINING,
  1267. A2_V_FALSE,
  1268. OptionHandler::OPT_ARG));
  1269. op->addTag(TAG_HTTP);
  1270. op->setInitialOption(true);
  1271. op->setChangeGlobalOption(true);
  1272. op->setChangeOptionForReserved(true);
  1273. handlers.push_back(op);
  1274. }
  1275. {
  1276. OptionHandler* op(new CumulativeOptionHandler
  1277. (PREF_HEADER,
  1278. TEXT_HEADER,
  1279. NO_DEFAULT_VALUE,
  1280. "\n"));
  1281. op->addTag(TAG_HTTP);
  1282. op->setInitialOption(true);
  1283. op->setCumulative(true);
  1284. op->setChangeGlobalOption(true);
  1285. op->setChangeOptionForReserved(true);
  1286. handlers.push_back(op);
  1287. }
  1288. {
  1289. OptionHandler* op(new BooleanOptionHandler
  1290. (PREF_HTTP_ACCEPT_GZIP,
  1291. TEXT_HTTP_ACCEPT_GZIP,
  1292. A2_V_FALSE,
  1293. OptionHandler::OPT_ARG));
  1294. op->addTag(TAG_HTTP);
  1295. op->setInitialOption(true);
  1296. op->setChangeGlobalOption(true);
  1297. op->setChangeOptionForReserved(true);
  1298. handlers.push_back(op);
  1299. }
  1300. {
  1301. OptionHandler* op(new BooleanOptionHandler
  1302. (PREF_HTTP_AUTH_CHALLENGE,
  1303. TEXT_HTTP_AUTH_CHALLENGE,
  1304. A2_V_FALSE,
  1305. OptionHandler::OPT_ARG));
  1306. op->addTag(TAG_HTTP);
  1307. op->setInitialOption(true);
  1308. op->setChangeGlobalOption(true);
  1309. op->setChangeOptionForReserved(true);
  1310. handlers.push_back(op);
  1311. }
  1312. {
  1313. OptionHandler* op(new BooleanOptionHandler
  1314. (PREF_HTTP_NO_CACHE,
  1315. TEXT_HTTP_NO_CACHE,
  1316. A2_V_FALSE,
  1317. OptionHandler::OPT_ARG));
  1318. op->addTag(TAG_HTTP);
  1319. op->setInitialOption(true);
  1320. op->setChangeGlobalOption(true);
  1321. op->setChangeOptionForReserved(true);
  1322. handlers.push_back(op);
  1323. }
  1324. {
  1325. OptionHandler* op(new DefaultOptionHandler
  1326. (PREF_HTTP_PASSWD,
  1327. TEXT_HTTP_PASSWD));
  1328. op->addTag(TAG_BASIC);
  1329. op->addTag(TAG_HTTP);
  1330. op->setEraseAfterParse(true);
  1331. op->setInitialOption(true);
  1332. op->setChangeGlobalOption(true);
  1333. op->setChangeOptionForReserved(true);
  1334. handlers.push_back(op);
  1335. }
  1336. {
  1337. OptionHandler* op(new DefaultOptionHandler
  1338. (PREF_HTTP_USER,
  1339. TEXT_HTTP_USER));
  1340. op->addTag(TAG_BASIC);
  1341. op->addTag(TAG_HTTP);
  1342. op->setEraseAfterParse(true);
  1343. op->setInitialOption(true);
  1344. op->setChangeGlobalOption(true);
  1345. op->setChangeOptionForReserved(true);
  1346. handlers.push_back(op);
  1347. }
  1348. {
  1349. OptionHandler* op(new DefaultOptionHandler
  1350. (PREF_LOAD_COOKIES,
  1351. TEXT_LOAD_COOKIES,
  1352. NO_DEFAULT_VALUE,
  1353. PATH_TO_FILE));
  1354. op->addTag(TAG_BASIC);
  1355. op->addTag(TAG_HTTP);
  1356. op->addTag(TAG_COOKIE);
  1357. handlers.push_back(op);
  1358. }
  1359. {
  1360. OptionHandler* op(new NumberOptionHandler
  1361. (PREF_MAX_HTTP_PIPELINING,
  1362. NO_DESCRIPTION,
  1363. "2",
  1364. 1, 8));
  1365. op->hide();
  1366. handlers.push_back(op);
  1367. }
  1368. {
  1369. OptionHandler* op(new DefaultOptionHandler
  1370. (PREF_METALINK_LOCATION,
  1371. TEXT_METALINK_LOCATION));
  1372. op->addTag(TAG_METALINK);
  1373. op->setInitialOption(true);
  1374. op->setChangeGlobalOption(true);
  1375. op->setChangeOptionForReserved(true);
  1376. handlers.push_back(op);
  1377. }
  1378. {
  1379. OptionHandler* op(new DefaultOptionHandler
  1380. (PREF_PRIVATE_KEY,
  1381. TEXT_PRIVATE_KEY,
  1382. NO_DEFAULT_VALUE,
  1383. PATH_TO_FILE));
  1384. op->addTag(TAG_HTTP);
  1385. op->addTag(TAG_HTTPS);
  1386. handlers.push_back(op);
  1387. }
  1388. {
  1389. OptionHandler* op(new DefaultOptionHandler
  1390. (PREF_REFERER,
  1391. TEXT_REFERER));
  1392. op->addTag(TAG_HTTP);
  1393. op->setInitialOption(true);
  1394. op->setChangeGlobalOption(true);
  1395. op->setChangeOptionForReserved(true);
  1396. handlers.push_back(op);
  1397. }
  1398. {
  1399. OptionHandler* op(new DefaultOptionHandler
  1400. (PREF_SAVE_COOKIES,
  1401. TEXT_SAVE_COOKIES,
  1402. NO_DEFAULT_VALUE,
  1403. PATH_TO_FILE));
  1404. op->addTag(TAG_HTTP);
  1405. op->addTag(TAG_COOKIE);
  1406. op->setChangeGlobalOption(true);
  1407. handlers.push_back(op);
  1408. }
  1409. {
  1410. OptionHandler* op(new BooleanOptionHandler
  1411. (PREF_USE_HEAD,
  1412. TEXT_USE_HEAD,
  1413. A2_V_FALSE,
  1414. OptionHandler::OPT_ARG));
  1415. op->addTag(TAG_HTTP);
  1416. op->setInitialOption(true);
  1417. op->setChangeGlobalOption(true);
  1418. op->setChangeOptionForReserved(true);
  1419. handlers.push_back(op);
  1420. }
  1421. {
  1422. OptionHandler* op(new DefaultOptionHandler
  1423. (PREF_USER_AGENT,
  1424. TEXT_USER_AGENT,
  1425. "aria2/" PACKAGE_VERSION,
  1426. A2STR::NIL,
  1427. OptionHandler::REQ_ARG,
  1428. 'U'));
  1429. op->addTag(TAG_HTTP);
  1430. op->setInitialOption(true);
  1431. op->setChangeGlobalOption(true);
  1432. op->setChangeOptionForReserved(true);
  1433. handlers.push_back(op);
  1434. }
  1435. // FTP Specific Options
  1436. {
  1437. OptionHandler* op(new DefaultOptionHandler
  1438. (PREF_FTP_PASSWD,
  1439. TEXT_FTP_PASSWD));
  1440. op->addTag(TAG_BASIC);
  1441. op->addTag(TAG_FTP);
  1442. op->setEraseAfterParse(true);
  1443. op->setInitialOption(true);
  1444. op->setChangeGlobalOption(true);
  1445. op->setChangeOptionForReserved(true);
  1446. handlers.push_back(op);
  1447. }
  1448. {
  1449. OptionHandler* op(new BooleanOptionHandler
  1450. (PREF_FTP_PASV,
  1451. TEXT_FTP_PASV,
  1452. A2_V_TRUE,
  1453. OptionHandler::OPT_ARG,
  1454. 'p'));
  1455. op->addTag(TAG_FTP);
  1456. op->setInitialOption(true);
  1457. op->setChangeGlobalOption(true);
  1458. op->setChangeOptionForReserved(true);
  1459. handlers.push_back(op);
  1460. }
  1461. {
  1462. OptionHandler* op(new BooleanOptionHandler
  1463. (PREF_FTP_REUSE_CONNECTION,
  1464. TEXT_FTP_REUSE_CONNECTION,
  1465. A2_V_TRUE,
  1466. OptionHandler::OPT_ARG));
  1467. op->addTag(TAG_FTP);
  1468. op->setInitialOption(true);
  1469. op->setChangeGlobalOption(true);
  1470. op->setChangeOptionForReserved(true);
  1471. handlers.push_back(op);
  1472. }
  1473. {
  1474. OptionHandler* op(new ParameterOptionHandler
  1475. (PREF_FTP_TYPE,
  1476. TEXT_FTP_TYPE,
  1477. V_BINARY,
  1478. { V_BINARY, V_ASCII }));
  1479. op->addTag(TAG_FTP);
  1480. op->setInitialOption(true);
  1481. op->setChangeGlobalOption(true);
  1482. op->setChangeOptionForReserved(true);
  1483. handlers.push_back(op);
  1484. }
  1485. {
  1486. OptionHandler* op(new DefaultOptionHandler
  1487. (PREF_FTP_USER,
  1488. TEXT_FTP_USER));
  1489. op->addTag(TAG_BASIC);
  1490. op->addTag(TAG_FTP);
  1491. op->setEraseAfterParse(true);
  1492. op->setInitialOption(true);
  1493. op->setChangeGlobalOption(true);
  1494. op->setChangeOptionForReserved(true);
  1495. handlers.push_back(op);
  1496. }
  1497. {
  1498. OptionHandler* op(new DefaultOptionHandler
  1499. (PREF_NETRC_PATH,
  1500. NO_DESCRIPTION,
  1501. util::getHomeDir()+"/.netrc",
  1502. PATH_TO_FILE));
  1503. op->hide();
  1504. handlers.push_back(op);
  1505. }
  1506. // Proxy options
  1507. {
  1508. OptionHandler* op(new HttpProxyOptionHandler
  1509. (PREF_HTTP_PROXY,
  1510. TEXT_HTTP_PROXY,
  1511. NO_DEFAULT_VALUE));
  1512. op->addTag(TAG_HTTP);
  1513. op->setInitialOption(true);
  1514. op->setChangeGlobalOption(true);
  1515. op->setChangeOptionForReserved(true);
  1516. handlers.push_back(op);
  1517. }
  1518. {
  1519. OptionHandler* op(new DefaultOptionHandler
  1520. (PREF_HTTP_PROXY_PASSWD,
  1521. TEXT_HTTP_PROXY_PASSWD,
  1522. NO_DEFAULT_VALUE));
  1523. op->addTag(TAG_HTTP);
  1524. op->setEraseAfterParse(true);
  1525. op->setInitialOption(true);
  1526. op->setChangeGlobalOption(true);
  1527. op->setChangeOptionForReserved(true);
  1528. handlers.push_back(op);
  1529. }
  1530. {
  1531. OptionHandler* op(new DefaultOptionHandler
  1532. (PREF_HTTP_PROXY_USER,
  1533. TEXT_HTTP_PROXY_USER,
  1534. NO_DEFAULT_VALUE));
  1535. op->addTag(TAG_HTTP);
  1536. op->setEraseAfterParse(true);
  1537. op->setInitialOption(true);
  1538. op->setChangeGlobalOption(true);
  1539. op->setChangeOptionForReserved(true);
  1540. handlers.push_back(op);
  1541. }
  1542. {
  1543. OptionHandler* op(new HttpProxyOptionHandler
  1544. (PREF_HTTPS_PROXY,
  1545. TEXT_HTTPS_PROXY,
  1546. NO_DEFAULT_VALUE));
  1547. op->addTag(TAG_HTTP);
  1548. op->addTag(TAG_HTTPS);
  1549. op->setInitialOption(true);
  1550. op->setChangeGlobalOption(true);
  1551. op->setChangeOptionForReserved(true);
  1552. handlers.push_back(op);
  1553. }
  1554. {
  1555. OptionHandler* op(new DefaultOptionHandler
  1556. (PREF_HTTPS_PROXY_PASSWD,
  1557. TEXT_HTTPS_PROXY_PASSWD,
  1558. NO_DEFAULT_VALUE));
  1559. op->addTag(TAG_HTTP);
  1560. op->addTag(TAG_HTTPS);
  1561. op->setEraseAfterParse(true);
  1562. op->setInitialOption(true);
  1563. op->setChangeGlobalOption(true);
  1564. op->setChangeOptionForReserved(true);
  1565. handlers.push_back(op);
  1566. }
  1567. {
  1568. OptionHandler* op(new DefaultOptionHandler
  1569. (PREF_HTTPS_PROXY_USER,
  1570. TEXT_HTTPS_PROXY_USER,
  1571. NO_DEFAULT_VALUE));
  1572. op->addTag(TAG_HTTP);
  1573. op->addTag(TAG_HTTPS);
  1574. op->setEraseAfterParse(true);
  1575. op->setInitialOption(true);
  1576. op->setChangeGlobalOption(true);
  1577. op->setChangeOptionForReserved(true);
  1578. handlers.push_back(op);
  1579. }
  1580. {
  1581. OptionHandler* op(new HttpProxyOptionHandler
  1582. (PREF_FTP_PROXY,
  1583. TEXT_FTP_PROXY,
  1584. NO_DEFAULT_VALUE));
  1585. op->addTag(TAG_FTP);
  1586. op->setInitialOption(true);
  1587. op->setChangeGlobalOption(true);
  1588. op->setChangeOptionForReserved(true);
  1589. handlers.push_back(op);
  1590. }
  1591. {
  1592. OptionHandler* op(new DefaultOptionHandler
  1593. (PREF_FTP_PROXY_PASSWD,
  1594. TEXT_FTP_PROXY_PASSWD,
  1595. NO_DEFAULT_VALUE));
  1596. op->addTag(TAG_FTP);
  1597. op->setEraseAfterParse(true);
  1598. op->setInitialOption(true);
  1599. op->setChangeGlobalOption(true);
  1600. op->setChangeOptionForReserved(true);
  1601. handlers.push_back(op);
  1602. }
  1603. {
  1604. OptionHandler* op(new DefaultOptionHandler
  1605. (PREF_FTP_PROXY_USER,
  1606. TEXT_FTP_PROXY_USER,
  1607. NO_DEFAULT_VALUE));
  1608. op->addTag(TAG_FTP);
  1609. op->setEraseAfterParse(true);
  1610. op->setInitialOption(true);
  1611. op->setChangeGlobalOption(true);
  1612. op->setChangeOptionForReserved(true);
  1613. handlers.push_back(op);
  1614. }
  1615. {
  1616. OptionHandler* op(new HttpProxyOptionHandler
  1617. (PREF_ALL_PROXY,
  1618. TEXT_ALL_PROXY,
  1619. NO_DEFAULT_VALUE));
  1620. op->addTag(TAG_FTP);
  1621. op->addTag(TAG_HTTP);
  1622. op->addTag(TAG_HTTPS);
  1623. op->setInitialOption(true);
  1624. op->setChangeGlobalOption(true);
  1625. op->setChangeOptionForReserved(true);
  1626. handlers.push_back(op);
  1627. }
  1628. {
  1629. OptionHandler* op(new DefaultOptionHandler
  1630. (PREF_ALL_PROXY_PASSWD,
  1631. TEXT_ALL_PROXY_PASSWD,
  1632. NO_DEFAULT_VALUE));
  1633. op->addTag(TAG_FTP);
  1634. op->addTag(TAG_HTTP);
  1635. op->addTag(TAG_HTTPS);
  1636. op->setEraseAfterParse(true);
  1637. op->setInitialOption(true);
  1638. op->setChangeGlobalOption(true);
  1639. op->setChangeOptionForReserved(true);
  1640. handlers.push_back(op);
  1641. }
  1642. {
  1643. OptionHandler* op(new DefaultOptionHandler
  1644. (PREF_ALL_PROXY_USER,
  1645. TEXT_ALL_PROXY_USER,
  1646. NO_DEFAULT_VALUE));
  1647. op->addTag(TAG_FTP);
  1648. op->addTag(TAG_HTTP);
  1649. op->addTag(TAG_HTTPS);
  1650. op->setEraseAfterParse(true);
  1651. op->setInitialOption(true);
  1652. op->setChangeGlobalOption(true);
  1653. op->setChangeOptionForReserved(true);
  1654. handlers.push_back(op);
  1655. }
  1656. {
  1657. OptionHandler* op(new DefaultOptionHandler
  1658. (PREF_NO_PROXY,
  1659. TEXT_NO_PROXY,
  1660. NO_DEFAULT_VALUE,
  1661. "HOSTNAME,DOMAIN,NETWORK/CIDR"));
  1662. op->addTag(TAG_FTP);
  1663. op->addTag(TAG_HTTP);
  1664. op->addTag(TAG_HTTPS);
  1665. op->setInitialOption(true);
  1666. op->setChangeGlobalOption(true);
  1667. op->setChangeOptionForReserved(true);
  1668. handlers.push_back(op);
  1669. }
  1670. {
  1671. OptionHandler* op(new ParameterOptionHandler
  1672. (PREF_PROXY_METHOD,
  1673. TEXT_PROXY_METHOD,
  1674. V_GET,
  1675. { V_GET, V_TUNNEL }));
  1676. op->addTag(TAG_FTP);
  1677. op->addTag(TAG_HTTP);
  1678. op->setInitialOption(true);
  1679. op->setChangeGlobalOption(true);
  1680. op->setChangeOptionForReserved(true);
  1681. handlers.push_back(op);
  1682. }
  1683. // BitTorrent/Metalink Options
  1684. #if defined(ENABLE_BITTORRENT) || defined(ENABLE_METALINK)
  1685. {
  1686. OptionHandler* op(new IntegerRangeOptionHandler
  1687. (PREF_SELECT_FILE,
  1688. TEXT_SELECT_FILE,
  1689. NO_DEFAULT_VALUE,
  1690. 1, 65535));
  1691. op->addTag(TAG_BITTORRENT);
  1692. op->addTag(TAG_METALINK);
  1693. op->setInitialOption(true);
  1694. op->setChangeOptionForReserved(true);
  1695. handlers.push_back(op);
  1696. }
  1697. {
  1698. OptionHandler* op(new BooleanOptionHandler
  1699. (PREF_SHOW_FILES,
  1700. TEXT_SHOW_FILES,
  1701. A2_V_FALSE,
  1702. OptionHandler::OPT_ARG,
  1703. 'S'));
  1704. op->addTag(TAG_BASIC);
  1705. op->addTag(TAG_BITTORRENT);
  1706. op->addTag(TAG_METALINK);
  1707. handlers.push_back(op);
  1708. }
  1709. #endif // ENABLE_BITTORRENT || ENABLE_METALINK
  1710. // BitTorrent Specific Options
  1711. #ifdef ENABLE_BITTORRENT
  1712. {
  1713. OptionHandler* op(new BooleanOptionHandler
  1714. (PREF_BT_DETACH_SEED_ONLY,
  1715. TEXT_BT_DETACH_SEED_ONLY,
  1716. A2_V_FALSE,
  1717. OptionHandler::OPT_ARG));
  1718. op->addTag(TAG_BITTORRENT);
  1719. handlers.push_back(op);
  1720. }
  1721. {
  1722. OptionHandler* op(new BooleanOptionHandler
  1723. (PREF_BT_ENABLE_LPD,
  1724. TEXT_BT_ENABLE_LPD,
  1725. A2_V_FALSE,
  1726. OptionHandler::OPT_ARG));
  1727. op->addTag(TAG_BITTORRENT);
  1728. op->setInitialOption(true);
  1729. op->setChangeGlobalOption(true);
  1730. op->setChangeOptionForReserved(true);
  1731. handlers.push_back(op);
  1732. }
  1733. {
  1734. OptionHandler* op(new DefaultOptionHandler
  1735. (PREF_BT_EXCLUDE_TRACKER,
  1736. TEXT_BT_EXCLUDE_TRACKER,
  1737. NO_DESCRIPTION,
  1738. "URI,... "
  1739. "or *"));
  1740. op->addTag(TAG_BITTORRENT);
  1741. op->setInitialOption(true);
  1742. op->setChangeGlobalOption(true);
  1743. op->setChangeOptionForReserved(true);
  1744. handlers.push_back(op);
  1745. }
  1746. {
  1747. OptionHandler* op(new DefaultOptionHandler
  1748. (PREF_BT_EXTERNAL_IP,
  1749. TEXT_BT_EXTERNAL_IP,
  1750. NO_DEFAULT_VALUE,
  1751. "a numeric IP address"));
  1752. op->addTag(TAG_BITTORRENT);
  1753. op->setInitialOption(true);
  1754. op->setChangeGlobalOption(true);
  1755. op->setChangeOptionForReserved(true);
  1756. handlers.push_back(op);
  1757. }
  1758. {
  1759. OptionHandler* op(new BooleanOptionHandler
  1760. (PREF_BT_FORCE_ENCRYPTION,
  1761. TEXT_BT_FORCE_ENCRYPTION,
  1762. A2_V_FALSE,
  1763. OptionHandler::OPT_ARG));
  1764. op->addTag(TAG_BITTORRENT);
  1765. op->setInitialOption(true);
  1766. op->setChangeGlobalOption(true);
  1767. op->setChangeOptionForReserved(true);
  1768. handlers.push_back(op);
  1769. }
  1770. {
  1771. OptionHandler* op(new NumberOptionHandler
  1772. (PREF_BT_KEEP_ALIVE_INTERVAL,
  1773. NO_DESCRIPTION,
  1774. "120",
  1775. 1, 120));
  1776. op->hide();
  1777. handlers.push_back(op);
  1778. }
  1779. {
  1780. OptionHandler* op(new BooleanOptionHandler
  1781. (PREF_BT_HASH_CHECK_SEED,
  1782. TEXT_BT_HASH_CHECK_SEED,
  1783. A2_V_TRUE,
  1784. OptionHandler::OPT_ARG));
  1785. op->addTag(TAG_BITTORRENT);
  1786. op->addTag(TAG_CHECKSUM);
  1787. op->setInitialOption(true);
  1788. op->setChangeGlobalOption(true);
  1789. op->setChangeOptionForReserved(true);
  1790. handlers.push_back(op);
  1791. }
  1792. {
  1793. OptionHandler* op(new DefaultOptionHandler
  1794. (PREF_BT_LPD_INTERFACE,
  1795. TEXT_BT_LPD_INTERFACE,
  1796. NO_DEFAULT_VALUE,
  1797. "interface, IP address",
  1798. OptionHandler::REQ_ARG));
  1799. op->addTag(TAG_BITTORRENT);
  1800. handlers.push_back(op);
  1801. }
  1802. {
  1803. OptionHandler* op(new NumberOptionHandler
  1804. (PREF_BT_MAX_OPEN_FILES,
  1805. TEXT_BT_MAX_OPEN_FILES,
  1806. "100",
  1807. 1));
  1808. op->addTag(TAG_BITTORRENT);
  1809. op->setChangeGlobalOption(true);
  1810. handlers.push_back(op);
  1811. }
  1812. {
  1813. OptionHandler* op(new NumberOptionHandler
  1814. (PREF_BT_MAX_PEERS,
  1815. TEXT_BT_MAX_PEERS,
  1816. "55",
  1817. 0));
  1818. op->addTag(TAG_BITTORRENT);
  1819. op->setInitialOption(true);
  1820. op->setChangeOption(true);
  1821. op->setChangeGlobalOption(true);
  1822. op->setChangeOptionForReserved(true);
  1823. handlers.push_back(op);
  1824. }
  1825. {
  1826. OptionHandler* op(new BooleanOptionHandler
  1827. (PREF_BT_METADATA_ONLY,
  1828. TEXT_BT_METADATA_ONLY,
  1829. A2_V_FALSE,
  1830. OptionHandler::OPT_ARG));
  1831. op->addTag(TAG_BITTORRENT);
  1832. op->setInitialOption(true);
  1833. op->setChangeGlobalOption(true);
  1834. op->setChangeOptionForReserved(true);
  1835. handlers.push_back(op);
  1836. }
  1837. {
  1838. OptionHandler* op(new ParameterOptionHandler
  1839. (PREF_BT_MIN_CRYPTO_LEVEL,
  1840. TEXT_BT_MIN_CRYPTO_LEVEL,
  1841. V_PLAIN,
  1842. { V_PLAIN, V_ARC4 }));
  1843. op->addTag(TAG_BITTORRENT);
  1844. op->setInitialOption(true);
  1845. op->setChangeGlobalOption(true);
  1846. op->setChangeOptionForReserved(true);
  1847. handlers.push_back(op);
  1848. }
  1849. {
  1850. OptionHandler* op(new PrioritizePieceOptionHandler
  1851. (PREF_BT_PRIORITIZE_PIECE,
  1852. TEXT_BT_PRIORITIZE_PIECE));
  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 BooleanOptionHandler
  1861. (PREF_BT_REMOVE_UNSELECTED_FILE,
  1862. TEXT_BT_REMOVE_UNSELECTED_FILE,
  1863. A2_V_FALSE,
  1864. OptionHandler::OPT_ARG));
  1865. op->addTag(TAG_BITTORRENT);
  1866. op->setInitialOption(true);
  1867. op->setChangeOption(true);
  1868. op->setChangeGlobalOption(true);
  1869. op->setChangeOptionForReserved(true);
  1870. handlers.push_back(op);
  1871. }
  1872. {
  1873. OptionHandler* op(new UnitNumberOptionHandler
  1874. (PREF_BT_REQUEST_PEER_SPEED_LIMIT,
  1875. TEXT_BT_REQUEST_PEER_SPEED_LIMIT,
  1876. "50K",
  1877. 0));
  1878. op->addTag(TAG_BITTORRENT);
  1879. op->setInitialOption(true);
  1880. op->setChangeOption(true);
  1881. op->setChangeGlobalOption(true);
  1882. op->setChangeOptionForReserved(true);
  1883. handlers.push_back(op);
  1884. }
  1885. {
  1886. OptionHandler* op(new BooleanOptionHandler
  1887. (PREF_BT_REQUIRE_CRYPTO,
  1888. TEXT_BT_REQUIRE_CRYPTO,
  1889. A2_V_FALSE,
  1890. OptionHandler::OPT_ARG));
  1891. op->addTag(TAG_BITTORRENT);
  1892. op->setInitialOption(true);
  1893. op->setChangeGlobalOption(true);
  1894. op->setChangeOptionForReserved(true);
  1895. handlers.push_back(op);
  1896. }
  1897. {
  1898. OptionHandler* op(new NumberOptionHandler
  1899. (PREF_BT_REQUEST_TIMEOUT,
  1900. NO_DESCRIPTION,
  1901. "60",
  1902. 1, 600));
  1903. op->hide();
  1904. handlers.push_back(op);
  1905. }
  1906. {
  1907. OptionHandler* op(new BooleanOptionHandler
  1908. (PREF_BT_SEED_UNVERIFIED,
  1909. TEXT_BT_SEED_UNVERIFIED,
  1910. A2_V_FALSE,
  1911. OptionHandler::OPT_ARG));
  1912. op->addTag(TAG_BITTORRENT);
  1913. op->setInitialOption(true);
  1914. op->setChangeGlobalOption(true);
  1915. op->setChangeOptionForReserved(true);
  1916. handlers.push_back(op);
  1917. }
  1918. {
  1919. OptionHandler* op(new BooleanOptionHandler
  1920. (PREF_BT_SAVE_METADATA,
  1921. TEXT_BT_SAVE_METADATA,
  1922. A2_V_FALSE,
  1923. OptionHandler::OPT_ARG));
  1924. op->addTag(TAG_BITTORRENT);
  1925. op->setInitialOption(true);
  1926. op->setChangeGlobalOption(true);
  1927. op->setChangeOptionForReserved(true);
  1928. handlers.push_back(op);
  1929. }
  1930. {
  1931. OptionHandler* op(new NumberOptionHandler
  1932. (PREF_BT_STOP_TIMEOUT,
  1933. TEXT_BT_STOP_TIMEOUT,
  1934. "0",
  1935. 0));
  1936. op->addTag(TAG_BITTORRENT);
  1937. op->setInitialOption(true);
  1938. op->setChangeGlobalOption(true);
  1939. op->setChangeOptionForReserved(true);
  1940. handlers.push_back(op);
  1941. }
  1942. {
  1943. OptionHandler* op(new NumberOptionHandler
  1944. (PREF_BT_TIMEOUT,
  1945. NO_DESCRIPTION,
  1946. "180",
  1947. 1, 600));
  1948. op->hide();
  1949. handlers.push_back(op);
  1950. }
  1951. {
  1952. OptionHandler* op(new DefaultOptionHandler
  1953. (PREF_BT_TRACKER,
  1954. TEXT_BT_TRACKER,
  1955. NO_DESCRIPTION,
  1956. "URI,..."));
  1957. op->addTag(TAG_BITTORRENT);
  1958. op->setInitialOption(true);
  1959. op->setChangeGlobalOption(true);
  1960. op->setChangeOptionForReserved(true);
  1961. handlers.push_back(op);
  1962. }
  1963. {
  1964. OptionHandler* op(new NumberOptionHandler
  1965. (PREF_BT_TRACKER_CONNECT_TIMEOUT,
  1966. TEXT_BT_TRACKER_CONNECT_TIMEOUT,
  1967. "60",
  1968. 1, 600));
  1969. op->addTag(TAG_BITTORRENT);
  1970. op->setInitialOption(true);
  1971. op->setChangeGlobalOption(true);
  1972. op->setChangeOptionForReserved(true);
  1973. handlers.push_back(op);
  1974. }
  1975. {
  1976. OptionHandler* op(new NumberOptionHandler
  1977. (PREF_BT_TRACKER_INTERVAL,
  1978. TEXT_BT_TRACKER_INTERVAL,
  1979. "0",
  1980. 0));
  1981. op->addTag(TAG_BITTORRENT);
  1982. op->setInitialOption(true);
  1983. op->setChangeGlobalOption(true);
  1984. op->setChangeOptionForReserved(true);
  1985. handlers.push_back(op);
  1986. }
  1987. {
  1988. OptionHandler* op(new NumberOptionHandler
  1989. (PREF_BT_TRACKER_TIMEOUT,
  1990. TEXT_BT_TRACKER_TIMEOUT,
  1991. "60",
  1992. 1, 600));
  1993. op->addTag(TAG_BITTORRENT);
  1994. op->setInitialOption(true);
  1995. op->setChangeGlobalOption(true);
  1996. op->setChangeOptionForReserved(true);
  1997. handlers.push_back(op);
  1998. }
  1999. {
  2000. OptionHandler* op(new HostPortOptionHandler
  2001. (PREF_DHT_ENTRY_POINT,
  2002. TEXT_DHT_ENTRY_POINT,
  2003. NO_DEFAULT_VALUE,
  2004. PREF_DHT_ENTRY_POINT_HOST,
  2005. PREF_DHT_ENTRY_POINT_PORT));
  2006. op->addTag(TAG_BITTORRENT);
  2007. handlers.push_back(op);
  2008. }
  2009. {
  2010. OptionHandler* op(new HostPortOptionHandler
  2011. (PREF_DHT_ENTRY_POINT6,
  2012. TEXT_DHT_ENTRY_POINT6,
  2013. NO_DEFAULT_VALUE,
  2014. PREF_DHT_ENTRY_POINT_HOST6,
  2015. PREF_DHT_ENTRY_POINT_PORT6));
  2016. op->addTag(TAG_BITTORRENT);
  2017. handlers.push_back(op);
  2018. }
  2019. {
  2020. OptionHandler* op(new DefaultOptionHandler
  2021. (PREF_DHT_FILE_PATH,
  2022. TEXT_DHT_FILE_PATH,
  2023. util::getHomeDir()+"/.aria2/dht.dat",
  2024. PATH_TO_FILE));
  2025. op->addTag(TAG_BITTORRENT);
  2026. handlers.push_back(op);
  2027. }
  2028. {
  2029. OptionHandler* op(new DefaultOptionHandler
  2030. (PREF_DHT_FILE_PATH6,
  2031. TEXT_DHT_FILE_PATH6,
  2032. util::getHomeDir()+"/.aria2/dht6.dat",
  2033. PATH_TO_FILE));
  2034. op->addTag(TAG_BITTORRENT);
  2035. handlers.push_back(op);
  2036. }
  2037. {
  2038. OptionHandler* op(new DefaultOptionHandler
  2039. (PREF_DHT_LISTEN_ADDR,
  2040. NO_DESCRIPTION,
  2041. NO_DEFAULT_VALUE));
  2042. op->hide();
  2043. op->addTag(TAG_BASIC);
  2044. op->addTag(TAG_BITTORRENT);
  2045. handlers.push_back(op);
  2046. }
  2047. {
  2048. OptionHandler* op(new DefaultOptionHandler
  2049. (PREF_DHT_LISTEN_ADDR6,
  2050. TEXT_DHT_LISTEN_ADDR6,
  2051. NO_DEFAULT_VALUE));
  2052. op->addTag(TAG_BASIC);
  2053. op->addTag(TAG_BITTORRENT);
  2054. handlers.push_back(op);
  2055. }
  2056. {
  2057. OptionHandler* op(new IntegerRangeOptionHandler
  2058. (PREF_DHT_LISTEN_PORT,
  2059. TEXT_DHT_LISTEN_PORT,
  2060. "6881-6999",
  2061. 1024, UINT16_MAX));
  2062. op->addTag(TAG_BASIC);
  2063. op->addTag(TAG_BITTORRENT);
  2064. handlers.push_back(op);
  2065. }
  2066. {
  2067. OptionHandler* op(new NumberOptionHandler
  2068. (PREF_DHT_MESSAGE_TIMEOUT,
  2069. TEXT_DHT_MESSAGE_TIMEOUT,
  2070. "10",
  2071. 1, 60));
  2072. op->addTag(TAG_BITTORRENT);
  2073. handlers.push_back(op);
  2074. }
  2075. {
  2076. OptionHandler* op(new BooleanOptionHandler
  2077. (PREF_ENABLE_DHT,
  2078. TEXT_ENABLE_DHT,
  2079. A2_V_TRUE,
  2080. OptionHandler::OPT_ARG));
  2081. op->addTag(TAG_BASIC);
  2082. op->addTag(TAG_BITTORRENT);
  2083. handlers.push_back(op);
  2084. }
  2085. {
  2086. OptionHandler* op(new BooleanOptionHandler
  2087. (PREF_ENABLE_DHT6,
  2088. TEXT_ENABLE_DHT6,
  2089. A2_V_FALSE,
  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_PEER_EXCHANGE,
  2098. TEXT_ENABLE_PEER_EXCHANGE,
  2099. A2_V_TRUE,
  2100. OptionHandler::OPT_ARG));
  2101. op->addTag(TAG_BITTORRENT);
  2102. op->setInitialOption(true);
  2103. op->setChangeGlobalOption(true);
  2104. op->setChangeOptionForReserved(true);
  2105. handlers.push_back(op);
  2106. }
  2107. {
  2108. OptionHandler* op(new ParameterOptionHandler
  2109. (PREF_FOLLOW_TORRENT,
  2110. TEXT_FOLLOW_TORRENT,
  2111. A2_V_TRUE,
  2112. { A2_V_TRUE, V_MEM, A2_V_FALSE }));
  2113. op->addTag(TAG_BITTORRENT);
  2114. op->setInitialOption(true);
  2115. op->setChangeGlobalOption(true);
  2116. op->setChangeOptionForReserved(true);
  2117. handlers.push_back(op);
  2118. }
  2119. {
  2120. OptionHandler* op(new IndexOutOptionHandler
  2121. (PREF_INDEX_OUT,
  2122. TEXT_INDEX_OUT,
  2123. 'O'));
  2124. op->addTag(TAG_BITTORRENT);
  2125. op->setInitialOption(true);
  2126. op->setCumulative(true);
  2127. op->setChangeOptionForReserved(true);
  2128. handlers.push_back(op);
  2129. }
  2130. {
  2131. OptionHandler* op(new IntegerRangeOptionHandler
  2132. (PREF_LISTEN_PORT,
  2133. TEXT_LISTEN_PORT,
  2134. "6881-6999",
  2135. 1024, UINT16_MAX));
  2136. op->addTag(TAG_BASIC);
  2137. op->addTag(TAG_BITTORRENT);
  2138. handlers.push_back(op);
  2139. }
  2140. {
  2141. OptionHandler* op(new UnitNumberOptionHandler
  2142. (PREF_MAX_OVERALL_UPLOAD_LIMIT,
  2143. TEXT_MAX_OVERALL_UPLOAD_LIMIT,
  2144. "0",
  2145. 0));
  2146. op->addTag(TAG_BASIC);
  2147. op->addTag(TAG_BITTORRENT);
  2148. op->setChangeGlobalOption(true);
  2149. handlers.push_back(op);
  2150. }
  2151. {
  2152. OptionHandler* op(new UnitNumberOptionHandler
  2153. (PREF_MAX_UPLOAD_LIMIT,
  2154. TEXT_MAX_UPLOAD_LIMIT,
  2155. "0",
  2156. 0, -1,
  2157. 'u'));
  2158. op->addTag(TAG_BASIC);
  2159. op->addTag(TAG_BITTORRENT);
  2160. op->setInitialOption(true);
  2161. op->setChangeOption(true);
  2162. op->setChangeGlobalOption(true);
  2163. op->setChangeOptionForReserved(true);
  2164. handlers.push_back(op);
  2165. }
  2166. {
  2167. OptionHandler* op(new DefaultOptionHandler
  2168. (PREF_ON_BT_DOWNLOAD_COMPLETE,
  2169. TEXT_ON_BT_DOWNLOAD_COMPLETE,
  2170. NO_DEFAULT_VALUE,
  2171. PATH_TO_COMMAND));
  2172. op->addTag(TAG_ADVANCED);
  2173. op->addTag(TAG_HOOK);
  2174. handlers.push_back(op);
  2175. }
  2176. {
  2177. OptionHandler* op(new NumberOptionHandler
  2178. (PREF_PEER_CONNECTION_TIMEOUT,
  2179. NO_DESCRIPTION,
  2180. "20",
  2181. 1, 600));
  2182. op->hide();
  2183. handlers.push_back(op);
  2184. }
  2185. {
  2186. int major, minor, micro;
  2187. sscanf(PACKAGE_VERSION, "%d.%d.%d", &major, &minor, &micro);
  2188. char prefix[21];
  2189. snprintf(prefix, sizeof(prefix), "A2-%d-%d-%d-", major, minor, micro);
  2190. OptionHandler* op(new DefaultOptionHandler
  2191. (PREF_PEER_ID_PREFIX,
  2192. TEXT_PEER_ID_PREFIX,
  2193. prefix));
  2194. op->addTag(TAG_BITTORRENT);
  2195. handlers.push_back(op);
  2196. }
  2197. {
  2198. OptionHandler* op(new NumberOptionHandler
  2199. (PREF_SEED_TIME,
  2200. TEXT_SEED_TIME,
  2201. NO_DEFAULT_VALUE,
  2202. 0));
  2203. op->addTag(TAG_BITTORRENT);
  2204. op->setInitialOption(true);
  2205. op->setChangeGlobalOption(true);
  2206. op->setChangeOptionForReserved(true);
  2207. handlers.push_back(op);
  2208. }
  2209. {
  2210. OptionHandler* op(new FloatNumberOptionHandler
  2211. (PREF_SEED_RATIO,
  2212. TEXT_SEED_RATIO,
  2213. "1.0",
  2214. 0.0));
  2215. op->addTag(TAG_BITTORRENT);
  2216. op->setInitialOption(true);
  2217. op->setChangeGlobalOption(true);
  2218. op->setChangeOptionForReserved(true);
  2219. handlers.push_back(op);
  2220. }
  2221. {
  2222. OptionHandler* op(new LocalFilePathOptionHandler
  2223. (PREF_TORRENT_FILE,
  2224. TEXT_TORRENT_FILE,
  2225. NO_DEFAULT_VALUE,
  2226. false,
  2227. 'T'));
  2228. op->addTag(TAG_BASIC);
  2229. op->addTag(TAG_BITTORRENT);
  2230. handlers.push_back(op);
  2231. }
  2232. #endif // ENABLE_BITTORRENT
  2233. // Metalink Specific Options
  2234. #ifdef ENABLE_METALINK
  2235. {
  2236. OptionHandler* op(new ParameterOptionHandler
  2237. (PREF_FOLLOW_METALINK,
  2238. TEXT_FOLLOW_METALINK,
  2239. A2_V_TRUE,
  2240. { A2_V_TRUE, V_MEM, A2_V_FALSE }));
  2241. op->addTag(TAG_METALINK);
  2242. op->setInitialOption(true);
  2243. op->setChangeGlobalOption(true);
  2244. op->setChangeOptionForReserved(true);
  2245. handlers.push_back(op);
  2246. }
  2247. {
  2248. OptionHandler* op(new DefaultOptionHandler
  2249. (PREF_METALINK_BASE_URI,
  2250. TEXT_METALINK_BASE_URI,
  2251. NO_DEFAULT_VALUE));
  2252. op->addTag(TAG_METALINK);
  2253. op->setInitialOption(true);
  2254. op->setChangeGlobalOption(true);
  2255. handlers.push_back(op);
  2256. }
  2257. {
  2258. OptionHandler* op(new BooleanOptionHandler
  2259. (PREF_METALINK_ENABLE_UNIQUE_PROTOCOL,
  2260. TEXT_METALINK_ENABLE_UNIQUE_PROTOCOL,
  2261. A2_V_TRUE,
  2262. OptionHandler::OPT_ARG));
  2263. op->addTag(TAG_METALINK);
  2264. op->setInitialOption(true);
  2265. op->setChangeGlobalOption(true);
  2266. op->setChangeOptionForReserved(true);
  2267. handlers.push_back(op);
  2268. }
  2269. {
  2270. OptionHandler* op(new LocalFilePathOptionHandler
  2271. (PREF_METALINK_FILE,
  2272. TEXT_METALINK_FILE,
  2273. NO_DEFAULT_VALUE,
  2274. true,
  2275. 'M'));
  2276. op->addTag(TAG_BASIC);
  2277. op->addTag(TAG_METALINK);
  2278. handlers.push_back(op);
  2279. }
  2280. {
  2281. OptionHandler* op(new DefaultOptionHandler
  2282. (PREF_METALINK_LANGUAGE,
  2283. TEXT_METALINK_LANGUAGE));
  2284. op->addTag(TAG_METALINK);
  2285. op->setInitialOption(true);
  2286. op->setChangeGlobalOption(true);
  2287. op->setChangeOptionForReserved(true);
  2288. handlers.push_back(op);
  2289. }
  2290. {
  2291. OptionHandler* op(new DefaultOptionHandler
  2292. (PREF_METALINK_OS,
  2293. TEXT_METALINK_OS));
  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 ParameterOptionHandler
  2302. (PREF_METALINK_PREFERRED_PROTOCOL,
  2303. TEXT_METALINK_PREFERRED_PROTOCOL,
  2304. V_NONE,
  2305. { V_HTTP, V_HTTPS, V_FTP, V_NONE }));
  2306. op->addTag(TAG_METALINK);
  2307. op->setInitialOption(true);
  2308. op->setChangeGlobalOption(true);
  2309. op->setChangeOptionForReserved(true);
  2310. handlers.push_back(op);
  2311. }
  2312. {
  2313. OptionHandler* op(new DefaultOptionHandler
  2314. (PREF_METALINK_VERSION,
  2315. TEXT_METALINK_VERSION));
  2316. op->addTag(TAG_METALINK);
  2317. op->setInitialOption(true);
  2318. op->setChangeGlobalOption(true);
  2319. op->setChangeOptionForReserved(true);
  2320. handlers.push_back(op);
  2321. }
  2322. #endif // ENABLE_METALINK
  2323. // Version Option
  2324. {
  2325. OptionHandler* op(new DefaultOptionHandler
  2326. (PREF_VERSION,
  2327. TEXT_VERSION,
  2328. NO_DEFAULT_VALUE,
  2329. A2STR::NIL,
  2330. OptionHandler::NO_ARG,
  2331. 'v'));
  2332. op->addTag(TAG_BASIC);
  2333. handlers.push_back(op);
  2334. }
  2335. // Help Option
  2336. {
  2337. std::string tagsStr;
  2338. for(int i = 0; i < MAX_HELP_TAG; ++i) {
  2339. tagsStr += strHelpTag(i);
  2340. tagsStr += ", ";
  2341. }
  2342. tagsStr += STR_TAG_ALL;
  2343. OptionHandler* op(new DefaultOptionHandler
  2344. (PREF_HELP,
  2345. TEXT_HELP,
  2346. strHelpTag(TAG_BASIC),
  2347. tagsStr,
  2348. OptionHandler::OPT_ARG,
  2349. 'h'));
  2350. op->addTag(TAG_BASIC);
  2351. op->addTag(TAG_HELP);
  2352. handlers.push_back(op);
  2353. }
  2354. return handlers;
  2355. }
  2356. } // namespace aria2