MetalinkParserStateMachine.cc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  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 "MetalinkParserStateMachine.h"
  36. #include <sstream>
  37. #include <iterator>
  38. #include "MetalinkParserStateImpl.h"
  39. #include "MetalinkParserStateV3Impl.h"
  40. #include "MetalinkParserStateV4Impl.h"
  41. #include "Metalinker.h"
  42. #include "MetalinkEntry.h"
  43. #include "a2functional.h"
  44. namespace aria2 {
  45. MetalinkParserState* MetalinkParserStateMachine::initialState_ =
  46. new InitialMetalinkParserState();
  47. MetalinkParserState* MetalinkParserStateMachine::skipTagState_ =
  48. new SkipTagMetalinkParserState();
  49. MetalinkParserState* MetalinkParserStateMachine::metalinkState_ =
  50. new MetalinkMetalinkParserState();
  51. MetalinkParserState* MetalinkParserStateMachine::filesState_ =
  52. new FilesMetalinkParserState();
  53. MetalinkParserState* MetalinkParserStateMachine::fileState_ =
  54. new FileMetalinkParserState();
  55. MetalinkParserState* MetalinkParserStateMachine::sizeState_ =
  56. new SizeMetalinkParserState();
  57. MetalinkParserState* MetalinkParserStateMachine::versionState_ =
  58. new VersionMetalinkParserState();
  59. MetalinkParserState* MetalinkParserStateMachine::languageState_ =
  60. new LanguageMetalinkParserState();
  61. MetalinkParserState* MetalinkParserStateMachine::osState_ =
  62. new OSMetalinkParserState();
  63. MetalinkParserState* MetalinkParserStateMachine::verificationState_ =
  64. new VerificationMetalinkParserState();
  65. MetalinkParserState* MetalinkParserStateMachine::hashState_ =
  66. new HashMetalinkParserState();
  67. MetalinkParserState* MetalinkParserStateMachine::piecesState_ =
  68. new PiecesMetalinkParserState();
  69. MetalinkParserState* MetalinkParserStateMachine::pieceHashState_ =
  70. new PieceHashMetalinkParserState();
  71. MetalinkParserState* MetalinkParserStateMachine::signatureState_ =
  72. new SignatureMetalinkParserState();
  73. MetalinkParserState* MetalinkParserStateMachine::resourcesState_ =
  74. new ResourcesMetalinkParserState();
  75. MetalinkParserState* MetalinkParserStateMachine::urlState_ =
  76. new URLMetalinkParserState();
  77. MetalinkParserState* MetalinkParserStateMachine::metalinkStateV4_ =
  78. new MetalinkMetalinkParserStateV4();
  79. MetalinkParserState* MetalinkParserStateMachine::fileStateV4_ =
  80. new FileMetalinkParserStateV4();
  81. MetalinkParserState* MetalinkParserStateMachine::sizeStateV4_ =
  82. new SizeMetalinkParserStateV4();
  83. MetalinkParserState* MetalinkParserStateMachine::versionStateV4_ =
  84. new VersionMetalinkParserStateV4();
  85. MetalinkParserState* MetalinkParserStateMachine::languageStateV4_ =
  86. new LanguageMetalinkParserStateV4();
  87. MetalinkParserState* MetalinkParserStateMachine::osStateV4_ =
  88. new OSMetalinkParserStateV4();
  89. MetalinkParserState* MetalinkParserStateMachine::hashStateV4_ =
  90. new HashMetalinkParserStateV4();
  91. MetalinkParserState* MetalinkParserStateMachine::piecesStateV4_ =
  92. new PiecesMetalinkParserStateV4();
  93. MetalinkParserState* MetalinkParserStateMachine::pieceHashStateV4_ =
  94. new PieceHashMetalinkParserStateV4();
  95. MetalinkParserState* MetalinkParserStateMachine::signatureStateV4_ =
  96. new SignatureMetalinkParserStateV4();
  97. MetalinkParserState* MetalinkParserStateMachine::urlStateV4_ =
  98. new URLMetalinkParserStateV4();
  99. MetalinkParserState* MetalinkParserStateMachine::metaurlStateV4_ =
  100. new MetaurlMetalinkParserStateV4();
  101. MetalinkParserStateMachine::MetalinkParserStateMachine()
  102. : ctrl_{make_unique<MetalinkParserController>()}
  103. {
  104. stateStack_.push(initialState_);
  105. }
  106. MetalinkParserStateMachine::~MetalinkParserStateMachine() = default;
  107. void MetalinkParserStateMachine::reset()
  108. {
  109. ctrl_->reset();
  110. errors_.clear();
  111. while (!stateStack_.empty()) {
  112. stateStack_.pop();
  113. }
  114. stateStack_.push(initialState_);
  115. }
  116. void MetalinkParserStateMachine::setMetalinkState()
  117. {
  118. stateStack_.push(metalinkState_);
  119. }
  120. void MetalinkParserStateMachine::setFilesState()
  121. {
  122. stateStack_.push(filesState_);
  123. }
  124. void MetalinkParserStateMachine::setFileState()
  125. {
  126. stateStack_.push(fileState_);
  127. }
  128. void MetalinkParserStateMachine::setSizeState()
  129. {
  130. stateStack_.push(sizeState_);
  131. }
  132. void MetalinkParserStateMachine::setVersionState()
  133. {
  134. stateStack_.push(versionState_);
  135. }
  136. void MetalinkParserStateMachine::setLanguageState()
  137. {
  138. stateStack_.push(languageState_);
  139. }
  140. void MetalinkParserStateMachine::setOSState() { stateStack_.push(osState_); }
  141. void MetalinkParserStateMachine::setVerificationState()
  142. {
  143. stateStack_.push(verificationState_);
  144. }
  145. void MetalinkParserStateMachine::setHashState()
  146. {
  147. stateStack_.push(hashState_);
  148. }
  149. void MetalinkParserStateMachine::setPiecesState()
  150. {
  151. stateStack_.push(piecesState_);
  152. }
  153. void MetalinkParserStateMachine::setPieceHashState()
  154. {
  155. stateStack_.push(pieceHashState_);
  156. }
  157. void MetalinkParserStateMachine::setSignatureState()
  158. {
  159. stateStack_.push(signatureState_);
  160. }
  161. void MetalinkParserStateMachine::setResourcesState()
  162. {
  163. stateStack_.push(resourcesState_);
  164. }
  165. void MetalinkParserStateMachine::setURLState() { stateStack_.push(urlState_); }
  166. void MetalinkParserStateMachine::setMetalinkStateV4()
  167. {
  168. stateStack_.push(metalinkStateV4_);
  169. }
  170. void MetalinkParserStateMachine::setFileStateV4()
  171. {
  172. stateStack_.push(fileStateV4_);
  173. }
  174. void MetalinkParserStateMachine::setSizeStateV4()
  175. {
  176. stateStack_.push(sizeStateV4_);
  177. }
  178. void MetalinkParserStateMachine::setVersionStateV4()
  179. {
  180. stateStack_.push(versionStateV4_);
  181. }
  182. void MetalinkParserStateMachine::setLanguageStateV4()
  183. {
  184. stateStack_.push(languageStateV4_);
  185. }
  186. void MetalinkParserStateMachine::setOSStateV4()
  187. {
  188. stateStack_.push(osStateV4_);
  189. }
  190. void MetalinkParserStateMachine::setHashStateV4()
  191. {
  192. stateStack_.push(hashStateV4_);
  193. }
  194. void MetalinkParserStateMachine::setPiecesStateV4()
  195. {
  196. stateStack_.push(piecesStateV4_);
  197. }
  198. void MetalinkParserStateMachine::setPieceHashStateV4()
  199. {
  200. stateStack_.push(pieceHashStateV4_);
  201. }
  202. void MetalinkParserStateMachine::setSignatureStateV4()
  203. {
  204. stateStack_.push(signatureStateV4_);
  205. }
  206. void MetalinkParserStateMachine::setURLStateV4()
  207. {
  208. stateStack_.push(urlStateV4_);
  209. }
  210. void MetalinkParserStateMachine::setMetaurlStateV4()
  211. {
  212. stateStack_.push(metaurlStateV4_);
  213. }
  214. void MetalinkParserStateMachine::setSkipTagState()
  215. {
  216. stateStack_.push(skipTagState_);
  217. }
  218. bool MetalinkParserStateMachine::finished() const
  219. {
  220. return stateStack_.top() == initialState_;
  221. }
  222. void MetalinkParserStateMachine::newEntryTransaction()
  223. {
  224. ctrl_->newEntryTransaction();
  225. }
  226. void MetalinkParserStateMachine::setFileNameOfEntry(std::string filename)
  227. {
  228. ctrl_->setFileNameOfEntry(std::move(filename));
  229. }
  230. void MetalinkParserStateMachine::setFileLengthOfEntry(int64_t length)
  231. {
  232. ctrl_->setFileLengthOfEntry(length);
  233. }
  234. void MetalinkParserStateMachine::setVersionOfEntry(std::string version)
  235. {
  236. ctrl_->setVersionOfEntry(std::move(version));
  237. }
  238. void MetalinkParserStateMachine::setLanguageOfEntry(std::string language)
  239. {
  240. ctrl_->setLanguageOfEntry(std::move(language));
  241. }
  242. void MetalinkParserStateMachine::setOSOfEntry(std::string os)
  243. {
  244. ctrl_->setOSOfEntry(std::move(os));
  245. }
  246. void MetalinkParserStateMachine::setMaxConnectionsOfEntry(int maxConnections)
  247. {
  248. ctrl_->setMaxConnectionsOfEntry(maxConnections);
  249. }
  250. void MetalinkParserStateMachine::commitEntryTransaction()
  251. {
  252. ctrl_->commitEntryTransaction();
  253. }
  254. void MetalinkParserStateMachine::cancelEntryTransaction()
  255. {
  256. ctrl_->cancelEntryTransaction();
  257. }
  258. void MetalinkParserStateMachine::newResourceTransaction()
  259. {
  260. ctrl_->newResourceTransaction();
  261. }
  262. void MetalinkParserStateMachine::setURLOfResource(std::string url)
  263. {
  264. ctrl_->setURLOfResource(std::move(url));
  265. }
  266. void MetalinkParserStateMachine::setTypeOfResource(std::string type)
  267. {
  268. ctrl_->setTypeOfResource(std::move(type));
  269. }
  270. void MetalinkParserStateMachine::setLocationOfResource(std::string location)
  271. {
  272. ctrl_->setLocationOfResource(std::move(location));
  273. }
  274. void MetalinkParserStateMachine::setPriorityOfResource(int priority)
  275. {
  276. ctrl_->setPriorityOfResource(priority);
  277. }
  278. void MetalinkParserStateMachine::setMaxConnectionsOfResource(int maxConnections)
  279. {
  280. ctrl_->setMaxConnectionsOfResource(maxConnections);
  281. }
  282. void MetalinkParserStateMachine::commitResourceTransaction()
  283. {
  284. ctrl_->commitResourceTransaction();
  285. }
  286. void MetalinkParserStateMachine::cancelResourceTransaction()
  287. {
  288. ctrl_->cancelResourceTransaction();
  289. }
  290. void MetalinkParserStateMachine::newChecksumTransaction()
  291. {
  292. ctrl_->newChecksumTransaction();
  293. }
  294. void MetalinkParserStateMachine::setTypeOfChecksum(std::string type)
  295. {
  296. ctrl_->setTypeOfChecksum(std::move(type));
  297. }
  298. void MetalinkParserStateMachine::setHashOfChecksum(std::string md)
  299. {
  300. ctrl_->setHashOfChecksum(std::move(md));
  301. }
  302. void MetalinkParserStateMachine::commitChecksumTransaction()
  303. {
  304. ctrl_->commitChecksumTransaction();
  305. }
  306. void MetalinkParserStateMachine::cancelChecksumTransaction()
  307. {
  308. ctrl_->cancelChecksumTransaction();
  309. }
  310. void MetalinkParserStateMachine::newChunkChecksumTransactionV4()
  311. {
  312. ctrl_->newChunkChecksumTransactionV4();
  313. }
  314. void MetalinkParserStateMachine::setLengthOfChunkChecksumV4(size_t length)
  315. {
  316. ctrl_->setLengthOfChunkChecksumV4(length);
  317. }
  318. void MetalinkParserStateMachine::setTypeOfChunkChecksumV4(std::string type)
  319. {
  320. ctrl_->setTypeOfChunkChecksumV4(std::move(type));
  321. }
  322. void MetalinkParserStateMachine::addHashOfChunkChecksumV4(std::string md)
  323. {
  324. ctrl_->addHashOfChunkChecksumV4(std::move(md));
  325. }
  326. void MetalinkParserStateMachine::commitChunkChecksumTransactionV4()
  327. {
  328. ctrl_->commitChunkChecksumTransactionV4();
  329. }
  330. void MetalinkParserStateMachine::cancelChunkChecksumTransactionV4()
  331. {
  332. ctrl_->cancelChunkChecksumTransactionV4();
  333. }
  334. void MetalinkParserStateMachine::newChunkChecksumTransaction()
  335. {
  336. ctrl_->newChunkChecksumTransaction();
  337. }
  338. void MetalinkParserStateMachine::setLengthOfChunkChecksum(size_t length)
  339. {
  340. ctrl_->setLengthOfChunkChecksum(length);
  341. }
  342. void MetalinkParserStateMachine::setTypeOfChunkChecksum(std::string type)
  343. {
  344. ctrl_->setTypeOfChunkChecksum(std::move(type));
  345. }
  346. void MetalinkParserStateMachine::createNewHashOfChunkChecksum(size_t order)
  347. {
  348. ctrl_->createNewHashOfChunkChecksum(order);
  349. }
  350. void MetalinkParserStateMachine::setMessageDigestOfChunkChecksum(std::string md)
  351. {
  352. ctrl_->setMessageDigestOfChunkChecksum(std::move(md));
  353. }
  354. void MetalinkParserStateMachine::addHashOfChunkChecksum()
  355. {
  356. ctrl_->addHashOfChunkChecksum();
  357. }
  358. void MetalinkParserStateMachine::commitChunkChecksumTransaction()
  359. {
  360. ctrl_->commitChunkChecksumTransaction();
  361. }
  362. void MetalinkParserStateMachine::cancelChunkChecksumTransaction()
  363. {
  364. ctrl_->cancelChunkChecksumTransaction();
  365. }
  366. void MetalinkParserStateMachine::newSignatureTransaction()
  367. {
  368. ctrl_->newSignatureTransaction();
  369. }
  370. void MetalinkParserStateMachine::setTypeOfSignature(std::string type)
  371. {
  372. ctrl_->setTypeOfSignature(std::move(type));
  373. }
  374. void MetalinkParserStateMachine::setFileOfSignature(std::string file)
  375. {
  376. ctrl_->setFileOfSignature(std::move(file));
  377. }
  378. void MetalinkParserStateMachine::setBodyOfSignature(std::string body)
  379. {
  380. ctrl_->setBodyOfSignature(std::move(body));
  381. }
  382. void MetalinkParserStateMachine::commitSignatureTransaction()
  383. {
  384. ctrl_->commitSignatureTransaction();
  385. }
  386. void MetalinkParserStateMachine::cancelSignatureTransaction()
  387. {
  388. ctrl_->cancelSignatureTransaction();
  389. }
  390. void MetalinkParserStateMachine::newMetaurlTransaction()
  391. {
  392. ctrl_->newMetaurlTransaction();
  393. }
  394. void MetalinkParserStateMachine::setURLOfMetaurl(std::string url)
  395. {
  396. ctrl_->setURLOfMetaurl(std::move(url));
  397. }
  398. void MetalinkParserStateMachine::setMediatypeOfMetaurl(std::string mediatype)
  399. {
  400. ctrl_->setMediatypeOfMetaurl(std::move(mediatype));
  401. }
  402. void MetalinkParserStateMachine::setPriorityOfMetaurl(int priority)
  403. {
  404. ctrl_->setPriorityOfMetaurl(priority);
  405. }
  406. void MetalinkParserStateMachine::setNameOfMetaurl(std::string name)
  407. {
  408. ctrl_->setNameOfMetaurl(std::move(name));
  409. }
  410. void MetalinkParserStateMachine::commitMetaurlTransaction()
  411. {
  412. ctrl_->commitMetaurlTransaction();
  413. }
  414. void MetalinkParserStateMachine::cancelMetaurlTransaction()
  415. {
  416. ctrl_->cancelMetaurlTransaction();
  417. }
  418. void MetalinkParserStateMachine::beginElement(const char* localname,
  419. const char* prefix,
  420. const char* nsUri,
  421. const std::vector<XmlAttr>& attrs)
  422. {
  423. stateStack_.top()->beginElement(this, localname, prefix, nsUri, attrs);
  424. }
  425. void MetalinkParserStateMachine::endElement(const char* localname,
  426. const char* prefix,
  427. const char* nsUri,
  428. std::string characters)
  429. {
  430. stateStack_.top()->endElement(this, localname, prefix, nsUri,
  431. std::move(characters));
  432. stateStack_.pop();
  433. }
  434. bool MetalinkParserStateMachine::needsCharactersBuffering() const
  435. {
  436. return stateStack_.top()->needsCharactersBuffering();
  437. }
  438. void MetalinkParserStateMachine::logError(std::string log)
  439. {
  440. if (errors_.size() < 10) {
  441. errors_.push_back(std::move(log));
  442. }
  443. }
  444. std::string MetalinkParserStateMachine::getErrorString() const
  445. {
  446. std::stringstream error;
  447. error << "Specification violation: ";
  448. std::copy(errors_.begin(), errors_.end(),
  449. std::ostream_iterator<std::string>(error, ", "));
  450. return error.str();
  451. }
  452. std::unique_ptr<Metalinker> MetalinkParserStateMachine::getResult()
  453. {
  454. return ctrl_->getResult();
  455. }
  456. void MetalinkParserStateMachine::setBaseUri(std::string uri)
  457. {
  458. ctrl_->setBaseUri(std::move(uri));
  459. }
  460. } // namespace aria2