瀏覽代碼

Update libaria2ex.cc to use latest API

Tatsuhiro Tsujikawa 12 年之前
父節點
當前提交
f3876ad9ab
共有 1 個文件被更改,包括 53 次插入30 次删除
  1. 53 30
      examples/libaria2ex.cc

+ 53 - 30
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::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;
+    }
   }
-  std::cout << " for [" << aria2::gidToHex(gid) << "]" << std::endl;
+  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<std::string> 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<std::string> 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<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);
-      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;
 }