diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-02-25 14:40:18 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-02-25 14:40:18 +0000 |
| commit | 3880a5f71b1ffde3779b3cad3519e150341bfda7 (patch) | |
| tree | 2d6de19d1a5c042610796a7d4b63783c77c2faf3 /src/MetalinkParserController.cc | |
| parent | fa6fd758afc1dea263a43c3e21ed7b1b8ad0773c (diff) | |
2010-02-25 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added Metalink4 support. Currently, name attribute of
metalink::metaurl is ignored and multi-file torrent cannot be used
with Metalink4.
* doc/aria2c.1.txt
* src/DownloadHandlerConstants.cc
* src/ExpatMetalinkProcessor.cc
* src/Makefile.am
* src/Metalink2RequestGroup.cc
* src/MetalinkEntry.cc
* src/MetalinkEntry.h
* src/MetalinkParserController.cc
* src/MetalinkParserController.h
* src/MetalinkParserState.h
* src/MetalinkParserStateImpl.cc
* src/MetalinkParserStateImpl.h
* src/MetalinkParserStateMachine.cc
* src/MetalinkParserStateMachine.h
* src/MetalinkParserStateV3Impl.cc
* src/MetalinkParserStateV3Impl.h
* src/MetalinkParserStateV4Impl.cc
* src/MetalinkParserStateV4Impl.h
* src/MetalinkResource.cc
* src/MetalinkResource.h
* src/Metalinker.cc
* src/RequestGroup.cc
* src/RequestGroup.h
* src/XML2SAXMetalinkProcessor.cc
* src/messageDigest.cc
* src/util.cc
* src/util.h
* test/Makefile.am
* test/MetalinkEntryTest.cc
* test/MetalinkParserControllerTest.cc
* test/MetalinkProcessorTest.cc
* test/MetalinkerTest.cc
* test/UtilTest.cc
* test/metalink4-attrs.xml
* test/metalink4-dirtraversal.xml
* test/metalink4.xml
Diffstat (limited to 'src/MetalinkParserController.cc')
| -rw-r--r-- | src/MetalinkParserController.cc | 103 |
1 files changed, 96 insertions, 7 deletions
diff --git a/src/MetalinkParserController.cc b/src/MetalinkParserController.cc index e6309b3e..91333b57 100644 --- a/src/MetalinkParserController.cc +++ b/src/MetalinkParserController.cc @@ -53,7 +53,7 @@ namespace aria2 { -const std::string MetalinkParserController::SHA1("sha1"); +const std::string MetalinkParserController::SHA1("sha1");// Metalink3Spec MetalinkParserController::MetalinkParserController(): _metalinker(new Metalinker()) @@ -67,6 +67,7 @@ void MetalinkParserController::newEntryTransaction() _tResource.reset(); #ifdef ENABLE_MESSAGE_DIGEST _tChecksum.reset(); + _tChunkChecksumV4.reset(); _tChunkChecksum.reset(); #endif // ENABLE_MESSAGE_DIGEST } @@ -112,7 +113,7 @@ void MetalinkParserController::setLanguageOfEntry(const std::string& language) if(_tEntry.isNull()) { return; } - _tEntry->language = language; + _tEntry->languages.push_back(language); } void MetalinkParserController::setOSOfEntry(const std::string& os) @@ -120,7 +121,7 @@ void MetalinkParserController::setOSOfEntry(const std::string& os) if(_tEntry.isNull()) { return; } - _tEntry->os = os; + _tEntry->oses.push_back(os); } void MetalinkParserController::setMaxConnectionsOfEntry(int maxConnections) @@ -138,6 +139,7 @@ void MetalinkParserController::commitEntryTransaction() } commitResourceTransaction(); commitChecksumTransaction(); + commitChunkChecksumTransactionV4(); commitChunkChecksumTransaction(); commitSignatureTransaction(); _metalinker->entries.push_back(_tEntry); @@ -148,6 +150,7 @@ void MetalinkParserController::cancelEntryTransaction() { cancelResourceTransaction(); cancelChecksumTransaction(); + cancelChunkChecksumTransactionV4(); cancelChunkChecksumTransaction(); cancelSignatureTransaction(); _tEntry.reset(); @@ -167,6 +170,14 @@ void MetalinkParserController::setURLOfResource(const std::string& url) return; } _tResource->url = url; + // Metalink4Spec + if(_tResource->type == MetalinkResource::TYPE_UNKNOWN) { + // guess from URI sheme + std::string::size_type pos = url.find("://"); + if(pos != std::string::npos) { + setTypeOfResource(url.substr(0, pos)); + } + } } void MetalinkParserController::setTypeOfResource(const std::string& type) @@ -182,6 +193,8 @@ void MetalinkParserController::setTypeOfResource(const std::string& type) _tResource->type = MetalinkResource::TYPE_HTTPS; } else if(type == MetalinkResource::BITTORRENT) { _tResource->type = MetalinkResource::TYPE_BITTORRENT; + } else if(type == MetalinkResource::TORRENT) { // Metalink4Spec + _tResource->type = MetalinkResource::TYPE_BITTORRENT; } else { _tResource->type = MetalinkResource::TYPE_NOT_SUPPORTED; } @@ -195,12 +208,12 @@ void MetalinkParserController::setLocationOfResource(const std::string& location _tResource->location = location; } -void MetalinkParserController::setPreferenceOfResource(int preference) +void MetalinkParserController::setPriorityOfResource(int priority) { if(_tResource.isNull()) { return; } - _tResource->preference = preference; + _tResource->priority = priority; } void MetalinkParserController::setMaxConnectionsOfResource(int maxConnections) @@ -266,7 +279,10 @@ void MetalinkParserController::commitChecksumTransaction() return; } if(_tEntry->checksum.isNull() || - _tEntry->checksum->getAlgo() != MetalinkParserController::SHA1) { + // Metalink3Spec + (_tEntry->checksum->getAlgo() != MetalinkParserController::SHA1 && + // Metalink4Spec + _tEntry->checksum->getAlgo() != MessageDigestContext::SHA1)) { _tEntry->checksum = _tChecksum; } _tChecksum.reset(); @@ -279,7 +295,80 @@ void MetalinkParserController::cancelChecksumTransaction() _tChecksum.reset(); #endif // ENABLE_MESSAGE_DIGEST } - + +void MetalinkParserController::newChunkChecksumTransactionV4() +{ +#ifdef ENABLE_MESSAGE_DIGEST + if(_tEntry.isNull()) { + return; + } + _tChunkChecksumV4.reset(new ChunkChecksum()); + _tempChunkChecksumsV4.clear(); +#endif // ENABLE_MESSAGE_DIGEST +} + +void MetalinkParserController::setTypeOfChunkChecksumV4(const std::string& type) +{ +#ifdef ENABLE_MESSAGE_DIGEST + if(_tChunkChecksumV4.isNull()) { + return; + } + if(MessageDigestContext::supports(type)) { + _tChunkChecksumV4->setAlgo(type); + } else { + cancelChunkChecksumTransactionV4(); + } +#endif // ENABLE_MESSAGE_DIGEST +} + +void MetalinkParserController::setLengthOfChunkChecksumV4(size_t length) +{ +#ifdef ENABLE_MESSAGE_DIGEST + if(_tChunkChecksumV4.isNull()) { + return; + } + if(length > 0) { + _tChunkChecksumV4->setChecksumLength(length); + } else { + cancelChunkChecksumTransactionV4(); + } +#endif // ENABLE_MESSAGE_DIGEST +} + +void MetalinkParserController::addHashOfChunkChecksumV4(const std::string& md) +{ +#ifdef ENABLE_MESSAGE_DIGEST + if(_tChunkChecksumV4.isNull()) { + return; + } + _tempChunkChecksumsV4.push_back(md); +#endif // ENABLE_MESSAGE_DIGEST +} + +void MetalinkParserController::commitChunkChecksumTransactionV4() +{ +#ifdef ENABLE_MESSAGE_DIGEST + if(_tChunkChecksumV4.isNull()) { + return; + } + if(_tEntry->chunkChecksum.isNull() || + _tEntry->chunkChecksum->getAlgo() != MessageDigestContext::SHA1) { + std::deque<std::string> checksums(_tempChunkChecksumsV4.begin(), + _tempChunkChecksumsV4.end()); + _tChunkChecksumV4->setChecksums(checksums); + _tEntry->chunkChecksum = _tChunkChecksumV4; + } + _tChunkChecksumV4.reset(); +#endif // ENABLE_MESSAGE_DIGEST +} + +void MetalinkParserController::cancelChunkChecksumTransactionV4() +{ +#ifdef ENABLE_MESSAGE_DIGEST + _tChunkChecksumV4.reset(); +#endif // ENABLE_MESSAGE_DIGEST +} + void MetalinkParserController::newChunkChecksumTransaction() { #ifdef ENABLE_MESSAGE_DIGEST |
