From f3876ad9abe742b17147078be2301993e848b2c9 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 18 May 2013 16:13:56 +0900 Subject: [PATCH] Update libaria2ex.cc to use latest API --- examples/libaria2ex.cc | 83 +++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/examples/libaria2ex.cc b/examples/libaria2ex.cc index f4317988..a5b49ca9 100644 --- a/examples/libaria2ex.cc +++ b/examples/libaria2ex.cc @@ -43,33 +43,45 @@ int downloadEventCallback(aria2::Session* session, aria2::DownloadEvent event, const aria2::A2Gid& gid, void* userData) { - std::cout << "Download Event: "; switch(event) { - case aria2::EVENT_ON_DOWNLOAD_START: - std::cout << "START"; - break; - case aria2::EVENT_ON_DOWNLOAD_PAUSE: - std::cout << "PAUSE"; - break; - case aria2::EVENT_ON_DOWNLOAD_STOP: - std::cout << "STOP"; - break; case aria2::EVENT_ON_DOWNLOAD_COMPLETE: - std::cout << "COMPLETE"; + std::cerr << "COMPLETE"; break; case aria2::EVENT_ON_DOWNLOAD_ERROR: - std::cout << "ERROR"; - break; - case aria2::EVENT_ON_BT_DOWNLOAD_COMPLETE: - std::cout << "COMPLETE"; + std::cerr << "ERROR"; break; + default: + return 0; } - std::cout << " for [" << aria2::gidToHex(gid) << "]" << std::endl; + std::cerr << " [" << aria2::gidToHex(gid) << "] "; + aria2::DownloadHandle* dh = aria2::getDownloadHandle(session, gid); + if(!dh) return 0; + if(dh->getNumFiles() > 0) { + aria2::FileData f = dh->getFile(1); + // Path may be empty if the file name has not been determined yet. + if(f.path.empty()) { + if(!f.uris.empty()) { + std::cerr << f.uris[0].uri; + } + } else { + std::cerr << f.path; + } + } + aria2::deleteDownloadHandle(dh); + std::cerr << std::endl; return 0; } -int main() +int main(int argc, char** argv) { + int rv; + if(argc < 2) { + std::cerr << "Usage: libaria2ex URI [URI...]\n" + << "\n" + << " Download given URIs in parallel in the current directory." + << std::endl; + exit(EXIT_SUCCESS); + } aria2::libraryInit(); // session is actually singleton: 1 session per process aria2::Session* session; @@ -78,16 +90,18 @@ int main() // Add event callback config.downloadEventCallback = downloadEventCallback; session = aria2::sessionNew(aria2::KeyVals(), config); - std::vector uris = { - "http://localhost/" - }; - // Download files are stored in the current directory - aria2::KeyVals options = { std::make_pair("dir", ".") }; - // Add URI - aria2::addUri(session, 0, uris, options); + // Add download item to session + for(int i = 1; i < argc; ++i) { + std::vector uris = {argv[i]}; + aria2::KeyVals options; + rv = aria2::addUri(session, 0, uris, options); + if(rv < 0) { + std::cerr << "Failed to add download " << uris[0] << std::endl; + } + } auto start = std::chrono::steady_clock::now(); for(;;) { - int rv = aria2::run(session, aria2::RUN_ONCE); + rv = aria2::run(session, aria2::RUN_ONCE); if(rv != 1) { break; } @@ -96,16 +110,25 @@ int main() auto now = std::chrono::steady_clock::now(); auto count = std::chrono::duration_cast (now - start).count(); + // Print progress information once per 500ms if(count >= 500) { start = now; + aria2::GlobalStat gstat = aria2::getGlobalStat(session); + std::cerr << "Overall #Active:" << gstat.numActive + << " #waiting:" << gstat.numWaiting + << " D:" << gstat.downloadSpeed/1024 << "KiB/s" + << " U:"<< gstat.uploadSpeed/1024 << "KiB/s " << std::endl; std::vector gids = aria2::getActiveDownload(session); - std::cout << "== Active Download(s) ==" << std::endl; - for(auto gid : gids) { + for(const auto& gid : gids) { aria2::DownloadHandle* dh = aria2::getDownloadHandle(session, gid); if(dh) { - std::cout << "[" << aria2::gidToHex(gid) << "] " + std::cerr << " [" << aria2::gidToHex(gid) << "] " << dh->getCompletedLength() << "/" - << dh->getTotalLength() << " D:" + << dh->getTotalLength() << "(" + << (dh->getTotalLength() > 0 ? + (100*dh->getCompletedLength()/dh->getTotalLength()) + : 0) << "%)" + << " D:" << dh->getDownloadSpeed()/1024 << "KiB/s, U:" << dh->getUploadSpeed()/1024 << "KiB/s" << std::endl; @@ -114,7 +137,7 @@ int main() } } } - int rv = aria2::sessionFinal(session); + rv = aria2::sessionFinal(session); aria2::libraryDeinit(); return rv; }