MetalinkParserStateMachine.cc 14 KB

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