diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-08-14 13:48:31 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-08-14 13:48:31 +0000 |
| commit | 2f14fec78dfc96b88a905621d35f1d726df0791d (patch) | |
| tree | 8eb4dc9cf94f021ccbdf77dca88924c2c9bf4cea /src/UrlRequestInfo.cc | |
| parent | 43dae4fd916bb35bf7fd8554fc86ce34c3e7a31b (diff) | |
| parent | 7ca1b43eddd1aba1c71a38dfb46b5ac5685b43d0 (diff) | |
Tagging 0.7.0 release of aria2release-0.7.0
Diffstat (limited to 'src/UrlRequestInfo.cc')
| -rw-r--r-- | src/UrlRequestInfo.cc | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/UrlRequestInfo.cc b/src/UrlRequestInfo.cc new file mode 100644 index 00000000..986dbc97 --- /dev/null +++ b/src/UrlRequestInfo.cc @@ -0,0 +1,146 @@ +/* <!-- copyright */ +/* + * aria2 - a simple utility for downloading files faster + * + * Copyright (C) 2006 Tatsuhiro Tsujikawa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* copyright --> */ +#include "UrlRequestInfo.h" +#include "TorrentRequestInfo.h" +#include "MetalinkRequestInfo.h" +#include "prefs.h" +#include "DownloadEngineFactory.h" + +extern RequestInfo* requestInfo; +extern void setSignalHander(int signal, void (*handler)(int), int flags); + +void UrlRequestInfo::adjustRequestSize(Requests& requests, + Requests& reserved, + int maxConnections) const +{ + if(maxConnections > 0 && (int)requests.size() > maxConnections) { + copy(requests.begin()+maxConnections, requests.end(), + back_inserter(reserved)); + //insert_iterator<Requests>(reserved, reserved.end())); + requests.erase(requests.begin()+maxConnections, requests.end()); + } +} + +RequestInfo* UrlRequestInfo::createNextRequestInfo() const +{ +#ifdef ENABLE_BITTORRENT + if(op->getAsBool(PREF_FOLLOW_TORRENT) && + Util::endsWith(fileInfo.filename, ".torrent")) { + return new TorrentRequestInfo(fileInfo.filename, op); + } else +#endif // ENABLE_BITTORRENT +#ifdef ENABLE_METALINK + if(op->getAsBool(PREF_FOLLOW_METALINK) && + Util::endsWith(fileInfo.filename, ".metalink")) { + return new MetalinkRequestInfo(fileInfo.filename, op); + } else +#endif // ENABLE_METALINK + { + return 0; + } +} + +void handler(int signal) { + printf(_("\nstopping application...\n")); + fflush(stdout); + requestInfo->getDownloadEngine()->segmentMan->save(); + requestInfo->getDownloadEngine()->segmentMan->diskWriter->closeFile(); + delete requestInfo->getDownloadEngine(); + printf(_("done\n")); + exit(EXIT_SUCCESS); +} + +class CreateRequest { +private: + Requests* requestsPtr; + string referer; + int split; +public: + CreateRequest(Requests* requestsPtr, + const string& referer, + int split) + :requestsPtr(requestsPtr), + referer(referer), + split(split) {} + + void operator()(const string& url) { + for(int s = 1; s <= split; s++) { + Request* req = new Request(); + req->setReferer(referer); + if(req->setUrl(url)) { + requestsPtr->push_back(req); + } else { + fprintf(stderr, _("Unrecognized URL or unsupported protocol: %s\n"), + req->getUrl().c_str()); + delete req; + } + } + } +}; + +RequestInfo* UrlRequestInfo::execute() { + Requests requests; + Requests reserved; + for_each(urls.begin(), urls.end(), + CreateRequest(&requests, + op->get(PREF_REFERER), + op->getAsInt(PREF_SPLIT))); + + adjustRequestSize(requests, reserved, maxConnections); + + e = DownloadEngineFactory::newConsoleEngine(op, requests, reserved); + + setSignalHander(SIGINT, handler, 0); + setSignalHander(SIGTERM, handler, 0); + + RequestInfo* next = 0; + try { + e->run(); + + if(e->segmentMan->finished()) { + printDownloadCompeleteMessage(e->segmentMan->getFilePath()); + fileInfo.filename = e->segmentMan->getFilePath(); + fileInfo.length = e->segmentMan->totalSize; + fileInfo.checksum = checksum; + + next = createNextRequestInfo(); + } else { + e->segmentMan->save(); + e->segmentMan->diskWriter->closeFile(); + printDownloadAbortMessage(); + } + } catch(Exception *e) { + logger->error("Exception caught", e); + delete e; + fail = true; + } + for_each(requests.begin(), requests.end(), Deleter()); + for_each(reserved.begin(), reserved.end(), Deleter()); + + setSignalHander(SIGINT, SIG_DFL, 0); + setSignalHander(SIGTERM, SIG_DFL, 0); + + delete e; + e = 0; + + return next; +} |
