| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | /* <!-- copyright *//* * aria2 - The high speed download utility * * Copyright (C) 2013 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL.  If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so.  If you * do not wish to do so, delete this exception statement from your * version.  If you delete this exception statement from all source * files in the program, then also delete it here. *//* copyright --> *///// Compile and link like this:// $ g++ -Wall -O2 -g -std=c++11 -o libaria2ex libaria2ex.cc -laria2#include <iostream>#include <chrono>#include <aria2/aria2.h>int downloadEventCallback(aria2::Session* session, aria2::DownloadEvent event,                          aria2::A2Gid gid, void* userData){  switch (event) {  case aria2::EVENT_ON_DOWNLOAD_COMPLETE:    std::cerr << "COMPLETE";    break;  case aria2::EVENT_ON_DOWNLOAD_ERROR:    std::cerr << "ERROR";    break;  default:    return 0;  }  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 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;  // Create default configuration. The libaria2 takes care of signal  // handling.  aria2::SessionConfig config;  // Add event callback  config.downloadEventCallback = downloadEventCallback;  session = aria2::sessionNew(aria2::KeyVals(), config);  // Add download item to session  for (int i = 1; i < argc; ++i) {    std::vector<std::string> uris = {argv[i]};    aria2::KeyVals options;    rv = aria2::addUri(session, nullptr, uris, options);    if (rv < 0) {      std::cerr << "Failed to add download " << uris[0] << std::endl;    }  }  auto start = std::chrono::steady_clock::now();  for (;;) {    rv = aria2::run(session, aria2::RUN_ONCE);    if (rv != 1) {      break;    }    // the application can call aria2 API to add URI or query progress    // here    auto now = std::chrono::steady_clock::now();    auto count =        std::chrono::duration_cast<std::chrono::milliseconds>(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<aria2::A2Gid> gids = aria2::getActiveDownload(session);      for (const auto& gid : gids) {        aria2::DownloadHandle* dh = aria2::getDownloadHandle(session, gid);        if (dh) {          std::cerr << "    [" << aria2::gidToHex(gid) << "] "                    << dh->getCompletedLength() << "/" << 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;          aria2::deleteDownloadHandle(dh);        }      }    }  }  rv = aria2::sessionFinal(session);  aria2::libraryDeinit();  return rv;}
 |