diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2013-04-27 00:57:18 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2013-04-27 00:57:18 +0900 |
| commit | 0ef5f4eea13ab25ef47ff312001bc02fa638b93e (patch) | |
| tree | ea7dacc8bbd04621ea1fcb2263f51a188961eceb | |
| parent | 6fcf274f279603db02a1abc45fc8c0a34f37033b (diff) | |
Add getDownloadHandle API
| -rw-r--r-- | src/aria2api.cc | 137 | ||||
| -rw-r--r-- | src/aria2api.h | 10 | ||||
| -rw-r--r-- | src/includes/aria2/aria2.h | 46 | ||||
| -rw-r--r-- | src/option_processing.cc | 4 |
4 files changed, 197 insertions, 0 deletions
diff --git a/src/aria2api.cc b/src/aria2api.cc index 0d1e984a..2943b591 100644 --- a/src/aria2api.cc +++ b/src/aria2api.cc @@ -182,4 +182,141 @@ int addUri(Session* session, return 0; } +namespace { +struct RequestGroupDH : public DownloadHandle { + RequestGroupDH(const SharedHandle<RequestGroup>& group) + : group(group), + ts(group->calculateStat()) + {} + virtual ~RequestGroupDH() {} + virtual DOWNLOAD_STATUS getStatus() + { + if(group->getState() == RequestGroup::STATE_ACTIVE) { + return DOWNLOAD_ACTIVE; + } else { + if(group->isPauseRequested()) { + return DOWNLOAD_PAUSED; + } else { + return DOWNLOAD_WAITING; + } + } + } + virtual int64_t getTotalLength() + { + return group->getTotalLength(); + } + virtual int64_t getCompletedLength() + { + return group->getCompletedLength(); + } + virtual int64_t getUploadLength() + { + return ts.allTimeUploadLength; + } + virtual int getDownloadSpeed() + { + return ts.downloadSpeed; + } + virtual int getUploadSpeed() + { + return ts.uploadSpeed; + } + SharedHandle<RequestGroup> group; + TransferStat ts; +}; +} // namespace + +namespace { +struct DownloadResultDH : public DownloadHandle { + DownloadResultDH(const SharedHandle<DownloadResult>& dr) + : dr(dr) + {} + virtual ~DownloadResultDH() {} + virtual DOWNLOAD_STATUS getStatus() + { + switch(dr->result) { + case error_code::FINISHED: + return DOWNLOAD_COMPLETE; + case error_code::REMOVED: + return DOWNLOAD_REMOVED; + default: + return DOWNLOAD_ERROR; + } + } + virtual int64_t getTotalLength() + { + return dr->totalLength; + } + virtual int64_t getCompletedLength() + { + return dr->completedLength; + } + virtual int64_t getUploadLength() + { + return dr->uploadLength; + } + virtual int getDownloadSpeed() + { + return 0; + } + virtual int getUploadSpeed() + { + return 0; + } + SharedHandle<DownloadResult> dr; +}; +} // namespace + +DownloadHandle* getDownloadHandle(Session* session, const A2Gid& gid) +{ + const SharedHandle<DownloadEngine>& e = + session->context->reqinfo->getDownloadEngine(); + const SharedHandle<RequestGroupMan>& rgman = e->getRequestGroupMan(); + SharedHandle<RequestGroup> group = rgman->findGroup(gid); + if(group) { + return new RequestGroupDH(group); + } else { + SharedHandle<DownloadResult> ds = rgman->findDownloadResult(gid); + if(ds) { + return new DownloadResultDH(ds); + } + } + return 0; +} + +void deleteDownloadHandle(DownloadHandle* dh) +{ + delete dh; +} + +DOWNLOAD_STATUS downloadGetStatus(DownloadHandle* dh) +{ + return dh->getStatus(); +} + +int64_t downloadGetTotalLength(DownloadHandle* dh) +{ + return dh->getTotalLength(); +} + +int64_t downloadGetCompletedLength(DownloadHandle* dh) +{ + return dh->getCompletedLength(); +} + +int64_t downloadGetUploadLength(DownloadHandle* dh) +{ + return dh->getUploadLength(); +} + +int downloadGetDownloadSpeed(DownloadHandle* dh) +{ + return dh->getDownloadSpeed(); +} + +int downloadGetUploadSpeed(DownloadHandle* dh) +{ + return dh->getUploadSpeed(); +} + } // namespace aria2 diff --git a/src/aria2api.h b/src/aria2api.h index 29fe529e..82fb7436 100644 --- a/src/aria2api.h +++ b/src/aria2api.h @@ -50,6 +50,16 @@ struct Session { SharedHandle<Context> context; }; +struct DownloadHandle { + virtual ~DownloadHandle() {} + virtual DOWNLOAD_STATUS getStatus() = 0; + virtual int64_t getTotalLength() = 0; + virtual int64_t getCompletedLength() = 0; + virtual int64_t getUploadLength() = 0; + virtual int getDownloadSpeed() = 0; + virtual int getUploadSpeed() = 0; +}; + } // namespace aria2 #endif // ARIA2_API_H diff --git a/src/includes/aria2/aria2.h b/src/includes/aria2/aria2.h index 625c1ec3..fb4a2c14 100644 --- a/src/includes/aria2/aria2.h +++ b/src/includes/aria2/aria2.h @@ -42,6 +42,15 @@ #include <string> #include <vector> +// Libaria2: The aim of this library is provide same functionality +// available in RPC methods. The function signatures are not +// necessarily the same, because we can take advantage of the direct, +// no latency, access to the aria2 core. +// +// Therefore, this library is not meant to be the fine-grained, +// customizable, complete HTTP/FTP/BitTorrent library. If you are +// looking for such library for HTTP/FTP access, consider libcurl. + namespace aria2 { struct Session; @@ -49,10 +58,14 @@ struct Session; // Initializes the global data. It also initializes // underlying libraries libaria2 depends on. This function returns 0 // if it succeeds, or -1. +// +// Call this function only once before calling any other API functions. int libraryInit(); // Releases the global data. This function returns 0 if // it succeeds, or -1. +// +// Call this function only once at the end of the application. int libraryDeinit(); // type of GID @@ -65,6 +78,9 @@ typedef std::vector<std::pair<std::string, std::string> > KeyVals; // parameters. The |options| is treated as if they are specified in // command-line to aria2c(1). This function returns the pointer to the // newly created Session object if it succeeds, or NULL. +// +// Please note that only one Session object can be created per +// process. Session* sessionNew(const KeyVals& options); // Performs post-download action, including saving sessions etc and @@ -108,6 +124,36 @@ int addUri(Session* session, const KeyVals& options, int position = -1); +// Query download +enum DOWNLOAD_STATUS { + DOWNLOAD_ACTIVE, + DOWNLOAD_WAITING, + DOWNLOAD_PAUSED, + DOWNLOAD_COMPLETE, + DOWNLOAD_ERROR, + DOWNLOAD_REMOVED +}; + +struct DownloadHandle; + +// Returns handle for the download denoted by the |gid|. The caller +// can retrieve various information of the download via returned +// handle. The lifetime of the returned handle is before the next call +// of run() or sessionFinal(). This function returns NULL if no +// download denoted by the |gid| is present. The caller must call +// deleteDownloadHandle() to delete the acquired handle. +DownloadHandle* getDownloadHandle(Session* session, const A2Gid& gid); + +// Deallocates the |dh|. Calling this function with NULL is safe. +void deleteDownloadHandle(DownloadHandle* dh); + +DOWNLOAD_STATUS downloadGetStatus(DownloadHandle* dh); +int64_t downloadGetTotalLength(DownloadHandle* dh); +int64_t downloadGetCompletedLength(DownloadHandle* dh); +int64_t downloadGetUploadLength(DownloadHandle* dh); +int downloadGetDownloadSpeed(DownloadHandle* dh); +int downloadGetUploadSpeed(DownloadHandle* dh); + } // namespace aria2 #endif // ARIA2_H diff --git a/src/option_processing.cc b/src/option_processing.cc index 53689d13..c84aa6e1 100644 --- a/src/option_processing.cc +++ b/src/option_processing.cc @@ -274,6 +274,10 @@ void option_processing(Option& op, bool standalone, overrideWithEnv(*confOption, oparser, PREF_FTP_PROXY, "ftp_proxy"); overrideWithEnv(*confOption, oparser, PREF_ALL_PROXY, "all_proxy"); overrideWithEnv(*confOption, oparser, PREF_NO_PROXY, "no_proxy"); + // For non-standalone mode, set PREF_QUIET to true to suppress + // output. The caller can override this by including PREF_QUIET in + // options argument. + confOption->put(PREF_QUIET, A2_V_TRUE); // we must clear eof bit and seek to the beginning of the buffer. cmdstream.clear(); |
