MetalinkParserStateMachine.cc 14 KB

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