Added completedLength response key in aria2.getFiles RPC method.

pull/2/head
Tatsuhiro Tsujikawa 2011-08-23 18:47:27 +09:00
parent 4a0ac702ab
commit 09ce8960fd
2 changed files with 70 additions and 6 deletions

View File

@ -2157,6 +2157,7 @@ The following example gets information about download whose GID is
u'downloadSpeed': u'15158', u'downloadSpeed': u'15158',
u'files': [{u'index': u'1', u'files': [{u'index': u'1',
u'length': u'34896138', u'length': u'34896138',
u'completedLength': u'34896138',
u'path': u'/downloads/file', u'path': u'/downloads/file',
u'selected': u'true', u'selected': u'true',
u'uris': [{u'status': u'used', u'uris': [{u'status': u'used',
@ -2208,6 +2209,7 @@ The following example gets information about download whose GID is
'errorCode': '0', 'errorCode': '0',
'files': [{'index': '1', 'files': [{'index': '1',
'length': '34896138', 'length': '34896138',
'completedLength': '34896138',
'path': '/downloads/file', 'path': '/downloads/file',
'selected': 'true', 'selected': 'true',
'uris': [{'status': 'used', 'uris': [{'status': 'used',
@ -2302,6 +2304,18 @@ length::
File size in bytes. File size in bytes.
completedLength::
Completed length of this file in bytes. Please note that it is
possible that sum of completedLength is less than completedLength in
*<<aria2_rpc_aria2_tellStatus, aria2.tellStatus>>* method.
This is because completedLength in
*<<aria2_rpc_aria2_getFiles, aria2.getFiles>>*
only calculates completed pieces. On the other hand, completedLength
in
*<<aria2_rpc_aria2_tellStatus, aria2.tellStatus>>* takes into account
of partially completed piece.
selected:: selected::
"true" if this file is selected by *<<aria2_optref_select_file, --select-file>>* option. If "true" if this file is selected by *<<aria2_optref_select_file, --select-file>>* option. If
@ -2327,6 +2341,7 @@ JSON-RPC Example
u'jsonrpc': u'2.0', u'jsonrpc': u'2.0',
u'result': [{u'index': u'1', u'result': [{u'index': u'1',
u'length': u'34896138', u'length': u'34896138',
u'completedLength': u'34896138',
u'path': u'/downloads/file', u'path': u'/downloads/file',
u'selected': u'true', u'selected': u'true',
u'uris': [{u'status': u'used', u'uris': [{u'status': u'used',
@ -2344,6 +2359,7 @@ XML-RPC Example
>>> pprint(r) >>> pprint(r)
[{'index': '1', [{'index': '1',
'length': '34896138', 'length': '34896138',
'completedLength': '34896138',
'path': '/downloads/file', 'path': '/downloads/file',
'selected': 'true', 'selected': 'true',
'uris': [{'status': 'used', 'uris': [{'status': 'used',

View File

@ -64,6 +64,7 @@
#include "TimedHaltCommand.h" #include "TimedHaltCommand.h"
#include "PeerStat.h" #include "PeerStat.h"
#include "Base64.h" #include "Base64.h"
#include "BitfieldMan.h"
#ifdef ENABLE_MESSAGE_DIGEST #ifdef ENABLE_MESSAGE_DIGEST
# include "MessageDigest.h" # include "MessageDigest.h"
# include "message_digest_helper.h" # include "message_digest_helper.h"
@ -579,7 +580,9 @@ void createUriEntry
namespace { namespace {
template<typename InputIterator> template<typename InputIterator>
void createFileEntry void createFileEntry
(const SharedHandle<List>& files, InputIterator first, InputIterator last) (const SharedHandle<List>& files,
InputIterator first, InputIterator last,
const BitfieldMan* bf)
{ {
size_t index = 1; size_t index = 1;
for(; first != last; ++first, ++index) { for(; first != last; ++first, ++index) {
@ -588,6 +591,9 @@ void createFileEntry
entry->put(KEY_PATH, (*first)->getPath()); entry->put(KEY_PATH, (*first)->getPath());
entry->put(KEY_SELECTED, (*first)->isRequested()?VLB_TRUE:VLB_FALSE); entry->put(KEY_SELECTED, (*first)->isRequested()?VLB_TRUE:VLB_FALSE);
entry->put(KEY_LENGTH, util::uitos((*first)->getLength())); entry->put(KEY_LENGTH, util::uitos((*first)->getLength()));
uint64_t completedLength = bf->getOffsetCompletedLength
((*first)->getOffset(), (*first)->getLength());
entry->put(KEY_COMPLETED_LENGTH, util::uitos(completedLength));
SharedHandle<List> uriList = List::g(); SharedHandle<List> uriList = List::g();
createUriEntry(uriList, *first); createUriEntry(uriList, *first);
@ -597,6 +603,40 @@ void createFileEntry
} }
} // namespace } // namespace
namespace {
template<typename InputIterator>
void createFileEntry
(const SharedHandle<List>& files,
InputIterator first, InputIterator last,
uint64_t totalLength,
size_t pieceLength,
const std::string& bitfieldStr)
{
std::string bitfield = util::fromHex(bitfieldStr);
BitfieldMan bf(pieceLength, totalLength);
bf.setBitfield(reinterpret_cast<const unsigned char*>(bitfield.data()),
bitfield.size());
createFileEntry(files, first, last, &bf);
}
} // namespace
namespace {
template<typename InputIterator>
void createFileEntry
(const SharedHandle<List>& files,
InputIterator first, InputIterator last,
uint64_t totalLength,
size_t pieceLength,
const SharedHandle<PieceStorage>& ps)
{
BitfieldMan bf(pieceLength, totalLength);
if(ps) {
bf.setBitfield(ps->getBitfield(), ps->getBitfieldLength());
}
createFileEntry(files, first, last, &bf);
}
} // namespace
namespace { namespace {
bool requested_key bool requested_key
(const std::vector<std::string>& keys, const std::string& k) (const std::vector<std::string>& keys, const std::string& k)
@ -610,6 +650,7 @@ void gatherProgressCommon
const SharedHandle<RequestGroup>& group, const SharedHandle<RequestGroup>& group,
const std::vector<std::string>& keys) const std::vector<std::string>& keys)
{ {
const SharedHandle<PieceStorage>& ps = group->getPieceStorage();
if(requested_key(keys, KEY_GID)) { if(requested_key(keys, KEY_GID)) {
entryDict->put(KEY_GID, util::itos(group->getGID())); entryDict->put(KEY_GID, util::itos(group->getGID()));
} }
@ -637,7 +678,6 @@ void gatherProgressCommon
entryDict->put(KEY_CONNECTIONS, util::uitos(group->getNumConnection())); entryDict->put(KEY_CONNECTIONS, util::uitos(group->getNumConnection()));
} }
if(requested_key(keys, KEY_BITFIELD)) { if(requested_key(keys, KEY_BITFIELD)) {
SharedHandle<PieceStorage> ps = group->getPieceStorage();
if(ps) { if(ps) {
if(ps->getBitfieldLength() > 0) { if(ps->getBitfieldLength() > 0) {
entryDict->put(KEY_BITFIELD, entryDict->put(KEY_BITFIELD,
@ -671,7 +711,8 @@ void gatherProgressCommon
if(requested_key(keys, KEY_FILES)) { if(requested_key(keys, KEY_FILES)) {
SharedHandle<List> files = List::g(); SharedHandle<List> files = List::g();
createFileEntry createFileEntry
(files, dctx->getFileEntries().begin(), dctx->getFileEntries().end()); (files, dctx->getFileEntries().begin(), dctx->getFileEntries().end(),
dctx->getTotalLength(), dctx->getPieceLength(), ps);
entryDict->put(KEY_FILES, files); entryDict->put(KEY_FILES, files);
} }
if(requested_key(keys, KEY_DIR)) { if(requested_key(keys, KEY_DIR)) {
@ -829,7 +870,8 @@ void gatherStoppedDownload
} }
if(requested_key(keys, KEY_FILES)) { if(requested_key(keys, KEY_FILES)) {
SharedHandle<List> files = List::g(); SharedHandle<List> files = List::g();
createFileEntry(files, ds->fileEntries.begin(), ds->fileEntries.end()); createFileEntry(files, ds->fileEntries.begin(), ds->fileEntries.end(),
ds->totalLength, ds->pieceLength, ds->bitfieldStr);
entryDict->put(KEY_FILES, files); entryDict->put(KEY_FILES, files);
} }
if(requested_key(keys, KEY_TOTAL_LENGTH)) { if(requested_key(keys, KEY_TOTAL_LENGTH)) {
@ -889,12 +931,18 @@ SharedHandle<ValueBase> GetFilesRpcMethod::process
(fmt("No file data is available for GID#%s", (fmt("No file data is available for GID#%s",
util::itos(gid).c_str())); util::itos(gid).c_str()));
} else { } else {
createFileEntry(files, dr->fileEntries.begin(), dr->fileEntries.end()); createFileEntry(files, dr->fileEntries.begin(), dr->fileEntries.end(),
dr->totalLength, dr->pieceLength, dr->bitfieldStr);
} }
} else { } else {
const SharedHandle<PieceStorage>& ps = group->getPieceStorage();
const SharedHandle<DownloadContext>& dctx = group->getDownloadContext();
createFileEntry(files, createFileEntry(files,
group->getDownloadContext()->getFileEntries().begin(), group->getDownloadContext()->getFileEntries().begin(),
group->getDownloadContext()->getFileEntries().end()); group->getDownloadContext()->getFileEntries().end(),
dctx->getTotalLength(),
dctx->getPieceLength(),
ps);
} }
return files; return files;
} }