mirror of https://github.com/aria2/aria2
Add DownloadHandle::getFiles() API function
parent
5e64d4c9a9
commit
2109ba23a8
109
src/aria2api.cc
109
src/aria2api.cc
|
@ -52,6 +52,9 @@
|
||||||
#include "LogFactory.h"
|
#include "LogFactory.h"
|
||||||
#include "PieceStorage.h"
|
#include "PieceStorage.h"
|
||||||
#include "DownloadContext.h"
|
#include "DownloadContext.h"
|
||||||
|
#include "FileEntry.h"
|
||||||
|
#include "BitfieldMan.h"
|
||||||
|
#include "DownloadContext.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -217,6 +220,93 @@ std::vector<A2Gid> getActiveDownload(Session* session)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template<typename OutputIterator, typename InputIterator>
|
||||||
|
void createUriEntry
|
||||||
|
(OutputIterator out,
|
||||||
|
InputIterator first, InputIterator last,
|
||||||
|
UriStatus status)
|
||||||
|
{
|
||||||
|
for(; first != last; ++first) {
|
||||||
|
UriData uriData;
|
||||||
|
uriData.uri = *first;
|
||||||
|
uriData.status = status;
|
||||||
|
out++ = uriData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template<typename OutputIterator>
|
||||||
|
void createUriEntry
|
||||||
|
(OutputIterator out, const SharedHandle<FileEntry>& file)
|
||||||
|
{
|
||||||
|
createUriEntry(out,
|
||||||
|
file->getSpentUris().begin(),
|
||||||
|
file->getSpentUris().end(),
|
||||||
|
URI_USED);
|
||||||
|
createUriEntry(out,
|
||||||
|
file->getRemainingUris().begin(),
|
||||||
|
file->getRemainingUris().end(),
|
||||||
|
URI_WAITING);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template<typename OutputIterator, typename InputIterator>
|
||||||
|
void createFileEntry
|
||||||
|
(OutputIterator out,
|
||||||
|
InputIterator first, InputIterator last,
|
||||||
|
const BitfieldMan* bf)
|
||||||
|
{
|
||||||
|
size_t index = 1;
|
||||||
|
for(; first != last; ++first) {
|
||||||
|
FileData file;
|
||||||
|
file.index = index++;
|
||||||
|
file.path = (*first)->getPath();
|
||||||
|
file.length = (*first)->getLength();
|
||||||
|
file.completedLength = bf->getOffsetCompletedLength
|
||||||
|
((*first)->getOffset(), (*first)->getLength());
|
||||||
|
file.selected = (*first)->isRequested();
|
||||||
|
createUriEntry(std::back_inserter(file.uris), *first);
|
||||||
|
out++ = file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template<typename OutputIterator, typename InputIterator>
|
||||||
|
void createFileEntry
|
||||||
|
(OutputIterator out,
|
||||||
|
InputIterator first, InputIterator last,
|
||||||
|
int64_t totalLength,
|
||||||
|
int32_t pieceLength,
|
||||||
|
const std::string& bitfield)
|
||||||
|
{
|
||||||
|
BitfieldMan bf(pieceLength, totalLength);
|
||||||
|
bf.setBitfield(reinterpret_cast<const unsigned char*>(bitfield.data()),
|
||||||
|
bitfield.size());
|
||||||
|
createFileEntry(out, first, last, &bf);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template<typename OutputIterator, typename InputIterator>
|
||||||
|
void createFileEntry
|
||||||
|
(OutputIterator out,
|
||||||
|
InputIterator first, InputIterator last,
|
||||||
|
int64_t totalLength,
|
||||||
|
int32_t pieceLength,
|
||||||
|
const SharedHandle<PieceStorage>& ps)
|
||||||
|
{
|
||||||
|
BitfieldMan bf(pieceLength, totalLength);
|
||||||
|
if(ps) {
|
||||||
|
bf.setBitfield(ps->getBitfield(), ps->getBitfieldLength());
|
||||||
|
}
|
||||||
|
createFileEntry(out, first, last, &bf);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct RequestGroupDH : public DownloadHandle {
|
struct RequestGroupDH : public DownloadHandle {
|
||||||
RequestGroupDH(const SharedHandle<RequestGroup>& group)
|
RequestGroupDH(const SharedHandle<RequestGroup>& group)
|
||||||
|
@ -290,6 +380,17 @@ struct RequestGroupDH : public DownloadHandle {
|
||||||
{
|
{
|
||||||
return group->getOption()->get(PREF_DIR);
|
return group->getOption()->get(PREF_DIR);
|
||||||
}
|
}
|
||||||
|
virtual std::vector<FileData> getFiles()
|
||||||
|
{
|
||||||
|
std::vector<FileData> res;
|
||||||
|
const SharedHandle<DownloadContext>& dctx = group->getDownloadContext();
|
||||||
|
createFileEntry(std::back_inserter(res),
|
||||||
|
dctx->getFileEntries().begin(),
|
||||||
|
dctx->getFileEntries().end(),
|
||||||
|
dctx->getTotalLength(), dctx->getPieceLength(),
|
||||||
|
group->getPieceStorage());
|
||||||
|
return res;
|
||||||
|
}
|
||||||
SharedHandle<RequestGroup> group;
|
SharedHandle<RequestGroup> group;
|
||||||
TransferStat ts;
|
TransferStat ts;
|
||||||
};
|
};
|
||||||
|
@ -360,6 +461,14 @@ struct DownloadResultDH : public DownloadHandle {
|
||||||
{
|
{
|
||||||
return dr->dir;
|
return dr->dir;
|
||||||
}
|
}
|
||||||
|
virtual std::vector<FileData> getFiles()
|
||||||
|
{
|
||||||
|
std::vector<FileData> res;
|
||||||
|
createFileEntry(std::back_inserter(res),
|
||||||
|
dr->fileEntries.begin(), dr->fileEntries.end(),
|
||||||
|
dr->totalLength, dr->pieceLength, dr->bitfield);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
SharedHandle<DownloadResult> dr;
|
SharedHandle<DownloadResult> dr;
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -134,6 +134,25 @@ int addUri(Session* session,
|
||||||
// Returns the array of active download GID.
|
// Returns the array of active download GID.
|
||||||
std::vector<A2Gid> getActiveDownload(Session* session);
|
std::vector<A2Gid> getActiveDownload(Session* session);
|
||||||
|
|
||||||
|
enum UriStatus {
|
||||||
|
URI_USED,
|
||||||
|
URI_WAITING
|
||||||
|
};
|
||||||
|
|
||||||
|
struct UriData {
|
||||||
|
std::string uri;
|
||||||
|
UriStatus status;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FileData {
|
||||||
|
int index;
|
||||||
|
std::string path;
|
||||||
|
int64_t length;
|
||||||
|
int64_t completedLength;
|
||||||
|
bool selected;
|
||||||
|
std::vector<UriData> uris;
|
||||||
|
};
|
||||||
|
|
||||||
enum DOWNLOAD_STATUS {
|
enum DOWNLOAD_STATUS {
|
||||||
DOWNLOAD_ACTIVE,
|
DOWNLOAD_ACTIVE,
|
||||||
DOWNLOAD_WAITING,
|
DOWNLOAD_WAITING,
|
||||||
|
@ -158,6 +177,7 @@ struct DownloadHandle {
|
||||||
virtual const std::vector<A2Gid>& getFollowedBy() = 0;
|
virtual const std::vector<A2Gid>& getFollowedBy() = 0;
|
||||||
virtual A2Gid getBelongsTo() = 0;
|
virtual A2Gid getBelongsTo() = 0;
|
||||||
virtual const std::string& getDir() = 0;
|
virtual const std::string& getDir() = 0;
|
||||||
|
virtual std::vector<FileData> getFiles() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Returns handle for the download denoted by the |gid|. The caller
|
// Returns handle for the download denoted by the |gid|. The caller
|
||||||
|
|
Loading…
Reference in New Issue