mirror of https://github.com/aria2/aria2
Add GID => RequestGroup index for faster access to RequestGroup
parent
329a17b3f9
commit
2795176d79
|
@ -124,6 +124,7 @@ a2_gid_t RequestGroup::gidCounter_ = 0;
|
||||||
|
|
||||||
RequestGroup::RequestGroup(const SharedHandle<Option>& option)
|
RequestGroup::RequestGroup(const SharedHandle<Option>& option)
|
||||||
: gid_(newGID()),
|
: gid_(newGID()),
|
||||||
|
state_(STATE_WAITING),
|
||||||
option_(option),
|
option_(option),
|
||||||
numConcurrentCommand_(option->getAsInt(PREF_SPLIT)),
|
numConcurrentCommand_(option->getAsInt(PREF_SPLIT)),
|
||||||
numStreamConnection_(0),
|
numStreamConnection_(0),
|
||||||
|
|
|
@ -82,11 +82,19 @@ public:
|
||||||
SHUTDOWN_SIGNAL,
|
SHUTDOWN_SIGNAL,
|
||||||
USER_REQUEST
|
USER_REQUEST
|
||||||
};
|
};
|
||||||
|
enum State {
|
||||||
|
// Waiting in the reserved queue
|
||||||
|
STATE_WAITING,
|
||||||
|
// Download has begun
|
||||||
|
STATE_ACTIVE
|
||||||
|
};
|
||||||
private:
|
private:
|
||||||
static a2_gid_t gidCounter_;
|
static a2_gid_t gidCounter_;
|
||||||
|
|
||||||
a2_gid_t gid_;
|
a2_gid_t gid_;
|
||||||
|
|
||||||
|
int state_;
|
||||||
|
|
||||||
SharedHandle<Option> option_;
|
SharedHandle<Option> option_;
|
||||||
|
|
||||||
int numConcurrentCommand_;
|
int numConcurrentCommand_;
|
||||||
|
@ -550,6 +558,16 @@ public:
|
||||||
return metadataInfo_;
|
return metadataInfo_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getState() const
|
||||||
|
{
|
||||||
|
return state_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setState(int state)
|
||||||
|
{
|
||||||
|
state_ = state;
|
||||||
|
}
|
||||||
|
|
||||||
static void resetGIDCounter() { gidCounter_ = 0; }
|
static void resetGIDCounter() { gidCounter_ = 0; }
|
||||||
|
|
||||||
static a2_gid_t newGID();
|
static a2_gid_t newGID();
|
||||||
|
|
|
@ -101,7 +101,9 @@ RequestGroupMan::RequestGroupMan
|
||||||
removedErrorResult_(0),
|
removedErrorResult_(0),
|
||||||
removedLastErrorResult_(error_code::FINISHED),
|
removedLastErrorResult_(error_code::FINISHED),
|
||||||
maxDownloadResult_(option->getAsInt(PREF_MAX_DOWNLOAD_RESULT))
|
maxDownloadResult_(option->getAsInt(PREF_MAX_DOWNLOAD_RESULT))
|
||||||
{}
|
{
|
||||||
|
addRequestGroupIndex(requestGroups);
|
||||||
|
}
|
||||||
|
|
||||||
RequestGroupMan::~RequestGroupMan() {}
|
RequestGroupMan::~RequestGroupMan() {}
|
||||||
|
|
||||||
|
@ -123,6 +125,7 @@ void RequestGroupMan::addReservedGroup
|
||||||
(const std::vector<SharedHandle<RequestGroup> >& groups)
|
(const std::vector<SharedHandle<RequestGroup> >& groups)
|
||||||
{
|
{
|
||||||
requestQueueCheck();
|
requestQueueCheck();
|
||||||
|
addRequestGroupIndex(groups);
|
||||||
reservedGroups_.insert(reservedGroups_.end(), groups.begin(), groups.end());
|
reservedGroups_.insert(reservedGroups_.end(), groups.begin(), groups.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,6 +133,7 @@ void RequestGroupMan::addReservedGroup
|
||||||
(const SharedHandle<RequestGroup>& group)
|
(const SharedHandle<RequestGroup>& group)
|
||||||
{
|
{
|
||||||
requestQueueCheck();
|
requestQueueCheck();
|
||||||
|
addRequestGroupIndex(group);
|
||||||
reservedGroups_.push_back(group);
|
reservedGroups_.push_back(group);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,6 +141,7 @@ void RequestGroupMan::insertReservedGroup
|
||||||
(size_t pos, const std::vector<SharedHandle<RequestGroup> >& groups)
|
(size_t pos, const std::vector<SharedHandle<RequestGroup> >& groups)
|
||||||
{
|
{
|
||||||
requestQueueCheck();
|
requestQueueCheck();
|
||||||
|
addRequestGroupIndex(groups);
|
||||||
reservedGroups_.insert
|
reservedGroups_.insert
|
||||||
(reservedGroups_.begin()+std::min(reservedGroups_.size(), pos),
|
(reservedGroups_.begin()+std::min(reservedGroups_.size(), pos),
|
||||||
groups.begin(), groups.end());
|
groups.begin(), groups.end());
|
||||||
|
@ -146,10 +151,37 @@ void RequestGroupMan::insertReservedGroup
|
||||||
(size_t pos, const SharedHandle<RequestGroup>& group)
|
(size_t pos, const SharedHandle<RequestGroup>& group)
|
||||||
{
|
{
|
||||||
requestQueueCheck();
|
requestQueueCheck();
|
||||||
|
addRequestGroupIndex(group);
|
||||||
reservedGroups_.insert
|
reservedGroups_.insert
|
||||||
(reservedGroups_.begin()+std::min(reservedGroups_.size(), pos), group);
|
(reservedGroups_.begin()+std::min(reservedGroups_.size(), pos), group);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RequestGroupMan::addRequestGroupIndex
|
||||||
|
(const SharedHandle<RequestGroup>& group)
|
||||||
|
{
|
||||||
|
assert(groupIndex_.count(group->getGID()) == 0);
|
||||||
|
groupIndex_[group->getGID()] = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RequestGroupMan::addRequestGroupIndex
|
||||||
|
(const std::vector<SharedHandle<RequestGroup> >& groups)
|
||||||
|
{
|
||||||
|
for(std::vector<SharedHandle<RequestGroup> >::const_iterator i =
|
||||||
|
groups.begin(); i != groups.end(); ++i) {
|
||||||
|
addRequestGroupIndex(*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
void removeRequestGroupIndex
|
||||||
|
(std::map<a2_gid_t, SharedHandle<RequestGroup> >& groupIndex,
|
||||||
|
const SharedHandle<RequestGroup>& group)
|
||||||
|
{
|
||||||
|
assert(group->getGID() == 1);
|
||||||
|
groupIndex.erase(group->getGID());
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
size_t RequestGroupMan::countRequestGroup() const
|
size_t RequestGroupMan::countRequestGroup() const
|
||||||
{
|
{
|
||||||
return requestGroups_.size();
|
return requestGroups_.size();
|
||||||
|
@ -180,24 +212,41 @@ Iterator findByGID(Iterator first, Iterator last, a2_gid_t gid)
|
||||||
SharedHandle<RequestGroup>
|
SharedHandle<RequestGroup>
|
||||||
RequestGroupMan::findRequestGroup(a2_gid_t gid) const
|
RequestGroupMan::findRequestGroup(a2_gid_t gid) const
|
||||||
{
|
{
|
||||||
std::deque<SharedHandle<RequestGroup> >::const_iterator i =
|
SharedHandle<RequestGroup> res = findGroup(gid);
|
||||||
findByGID(requestGroups_.begin(), requestGroups_.end(), gid);
|
if(res) {
|
||||||
if(i == requestGroups_.end()) {
|
if(res->getState() == RequestGroup::STATE_ACTIVE) {
|
||||||
return SharedHandle<RequestGroup>();
|
return res;
|
||||||
} else {
|
} else {
|
||||||
return *i;
|
return SharedHandle<RequestGroup>();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<RequestGroup>
|
SharedHandle<RequestGroup>
|
||||||
RequestGroupMan::findReservedGroup(a2_gid_t gid) const
|
RequestGroupMan::findReservedGroup(a2_gid_t gid) const
|
||||||
{
|
{
|
||||||
std::deque<SharedHandle<RequestGroup> >::const_iterator i =
|
SharedHandle<RequestGroup> res = findGroup(gid);
|
||||||
findByGID(reservedGroups_.begin(), reservedGroups_.end(), gid);
|
if(res) {
|
||||||
if(i == reservedGroups_.end()) {
|
if(res->getState() == RequestGroup::STATE_WAITING) {
|
||||||
return SharedHandle<RequestGroup>();
|
return res;
|
||||||
} else {
|
} else {
|
||||||
return *i;
|
return SharedHandle<RequestGroup>();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedHandle<RequestGroup> RequestGroupMan::findGroup(a2_gid_t gid) const
|
||||||
|
{
|
||||||
|
std::map<a2_gid_t, SharedHandle<RequestGroup> >::const_iterator i =
|
||||||
|
groupIndex_.find(gid);
|
||||||
|
if(i != groupIndex_.end()) {
|
||||||
|
return (*i).second;
|
||||||
|
} else {
|
||||||
|
return SharedHandle<RequestGroup>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,6 +299,7 @@ bool RequestGroupMan::removeReservedGroup(a2_gid_t gid)
|
||||||
if(i == reservedGroups_.end()) {
|
if(i == reservedGroups_.end()) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
|
removeRequestGroupIndex(groupIndex_, *i);
|
||||||
reservedGroups_.erase(i);
|
reservedGroups_.erase(i);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -300,7 +350,7 @@ private:
|
||||||
DownloadEngine* e_;
|
DownloadEngine* e_;
|
||||||
std::deque<SharedHandle<DownloadResult> >& downloadResults_;
|
std::deque<SharedHandle<DownloadResult> >& downloadResults_;
|
||||||
std::deque<SharedHandle<RequestGroup> >& reservedGroups_;
|
std::deque<SharedHandle<RequestGroup> >& reservedGroups_;
|
||||||
Logger* logger_;
|
std::map<a2_gid_t, SharedHandle<RequestGroup> >& groupIndex_;
|
||||||
|
|
||||||
void saveSignature(const SharedHandle<RequestGroup>& group)
|
void saveSignature(const SharedHandle<RequestGroup>& group)
|
||||||
{
|
{
|
||||||
|
@ -321,10 +371,12 @@ public:
|
||||||
ProcessStoppedRequestGroup
|
ProcessStoppedRequestGroup
|
||||||
(DownloadEngine* e,
|
(DownloadEngine* e,
|
||||||
std::deque<SharedHandle<DownloadResult> >& downloadResults,
|
std::deque<SharedHandle<DownloadResult> >& downloadResults,
|
||||||
std::deque<SharedHandle<RequestGroup> >& reservedGroups)
|
std::deque<SharedHandle<RequestGroup> >& reservedGroups,
|
||||||
|
std::map<a2_gid_t, SharedHandle<RequestGroup> >& groupIndex)
|
||||||
: e_(e),
|
: e_(e),
|
||||||
downloadResults_(downloadResults),
|
downloadResults_(downloadResults),
|
||||||
reservedGroups_(reservedGroups)
|
reservedGroups_(reservedGroups),
|
||||||
|
groupIndex_(groupIndex)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void operator()(const SharedHandle<RequestGroup>& group)
|
void operator()(const SharedHandle<RequestGroup>& group)
|
||||||
|
@ -396,6 +448,7 @@ public:
|
||||||
A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, ex);
|
A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, ex);
|
||||||
}
|
}
|
||||||
if(group->isPauseRequested()) {
|
if(group->isPauseRequested()) {
|
||||||
|
group->setState(RequestGroup::STATE_WAITING);
|
||||||
reservedGroups_.push_front(group);
|
reservedGroups_.push_front(group);
|
||||||
group->releaseRuntimeResource(e_);
|
group->releaseRuntimeResource(e_);
|
||||||
group->setForceHaltRequested(false);
|
group->setForceHaltRequested(false);
|
||||||
|
@ -409,6 +462,7 @@ public:
|
||||||
e_->getRequestGroupMan()->addDownloadResult(dr);
|
e_->getRequestGroupMan()->addDownloadResult(dr);
|
||||||
executeStopHook(group, e_->getOption(), dr->result);
|
executeStopHook(group, e_->getOption(), dr->result);
|
||||||
group->releaseRuntimeResource(e_);
|
group->releaseRuntimeResource(e_);
|
||||||
|
removeRequestGroupIndex(groupIndex_, group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -482,7 +536,7 @@ void RequestGroupMan::removeStoppedGroup(DownloadEngine* e)
|
||||||
|
|
||||||
std::for_each(requestGroups_.begin(), requestGroups_.end(),
|
std::for_each(requestGroups_.begin(), requestGroups_.end(),
|
||||||
ProcessStoppedRequestGroup
|
ProcessStoppedRequestGroup
|
||||||
(e, downloadResults_, reservedGroups_));
|
(e, downloadResults_, reservedGroups_, groupIndex_));
|
||||||
std::deque<SharedHandle<RequestGroup> >::iterator i =
|
std::deque<SharedHandle<RequestGroup> >::iterator i =
|
||||||
std::remove_if(requestGroups_.begin(),
|
std::remove_if(requestGroups_.begin(),
|
||||||
requestGroups_.end(),
|
requestGroups_.end(),
|
||||||
|
@ -540,6 +594,7 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
|
||||||
bool ok = createRequestGroupFromUriListParser(groups, option_,
|
bool ok = createRequestGroupFromUriListParser(groups, option_,
|
||||||
uriListParser_.get());
|
uriListParser_.get());
|
||||||
if(ok) {
|
if(ok) {
|
||||||
|
addRequestGroupIndex(groups);
|
||||||
reservedGroups_.insert(reservedGroups_.end(), groups.begin(),
|
reservedGroups_.insert(reservedGroups_.end(), groups.begin(),
|
||||||
groups.end());
|
groups.end());
|
||||||
} else {
|
} else {
|
||||||
|
@ -567,6 +622,7 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
|
||||||
if(commands.empty()) {
|
if(commands.empty()) {
|
||||||
requestQueueCheck();
|
requestQueueCheck();
|
||||||
}
|
}
|
||||||
|
groupToAdd->setState(RequestGroup::STATE_ACTIVE);
|
||||||
requestGroups_.push_back(groupToAdd);
|
requestGroups_.push_back(groupToAdd);
|
||||||
++count;
|
++count;
|
||||||
e->addCommand(commands);
|
e->addCommand(commands);
|
||||||
|
@ -580,6 +636,7 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
|
||||||
groupToAdd->setLastErrorCode(ex.getErrorCode());
|
groupToAdd->setLastErrorCode(ex.getErrorCode());
|
||||||
// We add groupToAdd to e in order to it is processed in
|
// We add groupToAdd to e in order to it is processed in
|
||||||
// removeStoppedGroup().
|
// removeStoppedGroup().
|
||||||
|
groupToAdd->setState(RequestGroup::STATE_ACTIVE);
|
||||||
requestGroups_.push_back(groupToAdd);
|
requestGroups_.push_back(groupToAdd);
|
||||||
requestQueueCheck();
|
requestQueueCheck();
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#include "SharedHandle.h"
|
#include "SharedHandle.h"
|
||||||
#include "DownloadResult.h"
|
#include "DownloadResult.h"
|
||||||
|
@ -61,6 +62,8 @@ class RequestGroupMan {
|
||||||
private:
|
private:
|
||||||
std::deque<SharedHandle<RequestGroup> > requestGroups_;
|
std::deque<SharedHandle<RequestGroup> > requestGroups_;
|
||||||
std::deque<SharedHandle<RequestGroup> > reservedGroups_;
|
std::deque<SharedHandle<RequestGroup> > reservedGroups_;
|
||||||
|
// GID => RequestGroup index for faster retrieval.
|
||||||
|
std::map<a2_gid_t, SharedHandle<RequestGroup> > groupIndex_;
|
||||||
std::deque<SharedHandle<DownloadResult> > downloadResults_;
|
std::deque<SharedHandle<DownloadResult> > downloadResults_;
|
||||||
int maxSimultaneousDownloads_;
|
int maxSimultaneousDownloads_;
|
||||||
|
|
||||||
|
@ -100,6 +103,10 @@ private:
|
||||||
|
|
||||||
void configureRequestGroup
|
void configureRequestGroup
|
||||||
(const SharedHandle<RequestGroup>& requestGroup) const;
|
(const SharedHandle<RequestGroup>& requestGroup) const;
|
||||||
|
|
||||||
|
void addRequestGroupIndex(const SharedHandle<RequestGroup>& group);
|
||||||
|
void addRequestGroupIndex
|
||||||
|
(const std::vector<SharedHandle<RequestGroup> >& groups);
|
||||||
public:
|
public:
|
||||||
RequestGroupMan(const std::vector<SharedHandle<RequestGroup> >& requestGroups,
|
RequestGroupMan(const std::vector<SharedHandle<RequestGroup> >& requestGroups,
|
||||||
int maxSimultaneousDownloads,
|
int maxSimultaneousDownloads,
|
||||||
|
@ -121,6 +128,9 @@ public:
|
||||||
|
|
||||||
void fillRequestGroupFromReserver(DownloadEngine* e);
|
void fillRequestGroupFromReserver(DownloadEngine* e);
|
||||||
|
|
||||||
|
// Note that this method does not call addRequestGroupIndex(). This
|
||||||
|
// method should be considered as private, but exposed for unit
|
||||||
|
// testing purpose.
|
||||||
void addRequestGroup(const SharedHandle<RequestGroup>& group);
|
void addRequestGroup(const SharedHandle<RequestGroup>& group);
|
||||||
|
|
||||||
void addReservedGroup(const std::vector<SharedHandle<RequestGroup> >& groups);
|
void addReservedGroup(const std::vector<SharedHandle<RequestGroup> >& groups);
|
||||||
|
@ -141,6 +151,8 @@ public:
|
||||||
return requestGroups_;
|
return requestGroups_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: Use only for unit testing. Use findGroup() and test
|
||||||
|
// RequestGroup::getState() instead.
|
||||||
SharedHandle<RequestGroup> findRequestGroup(a2_gid_t gid) const;
|
SharedHandle<RequestGroup> findRequestGroup(a2_gid_t gid) const;
|
||||||
|
|
||||||
const std::deque<SharedHandle<RequestGroup> >& getReservedGroups() const
|
const std::deque<SharedHandle<RequestGroup> >& getReservedGroups() const
|
||||||
|
@ -148,8 +160,14 @@ public:
|
||||||
return reservedGroups_;
|
return reservedGroups_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: Use only for unit testing. Use findGroup() and test
|
||||||
|
// RequestGroup::getState() instead.
|
||||||
SharedHandle<RequestGroup> findReservedGroup(a2_gid_t gid) const;
|
SharedHandle<RequestGroup> findReservedGroup(a2_gid_t gid) const;
|
||||||
|
|
||||||
|
// Returns RequestGroup object whose gid is gid. This method returns
|
||||||
|
// RequestGroup either in requestGroups_ or reservedGroups_.
|
||||||
|
SharedHandle<RequestGroup> findGroup(a2_gid_t gid) const;
|
||||||
|
|
||||||
enum HOW {
|
enum HOW {
|
||||||
POS_SET,
|
POS_SET,
|
||||||
POS_CUR,
|
POS_CUR,
|
||||||
|
|
|
@ -167,18 +167,6 @@ addRequestGroup(const SharedHandle<RequestGroup>& group,
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace {
|
|
||||||
SharedHandle<RequestGroup>
|
|
||||||
findRequestGroup(const SharedHandle<RequestGroupMan>& rgman, a2_gid_t gid)
|
|
||||||
{
|
|
||||||
SharedHandle<RequestGroup> group = rgman->findRequestGroup(gid);
|
|
||||||
if(!group) {
|
|
||||||
group = rgman->findReservedGroup(gid);
|
|
||||||
}
|
|
||||||
return group;
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
bool checkPosParam(const Integer* posParam)
|
bool checkPosParam(const Integer* posParam)
|
||||||
{
|
{
|
||||||
|
@ -376,25 +364,25 @@ SharedHandle<ValueBase> removeDownload
|
||||||
const String* gidParam = checkRequiredParam<String>(req, 0);
|
const String* gidParam = checkRequiredParam<String>(req, 0);
|
||||||
|
|
||||||
a2_gid_t gid = str2Gid(gidParam);
|
a2_gid_t gid = str2Gid(gidParam);
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
e->getRequestGroupMan()->findRequestGroup(gid);
|
if(group) {
|
||||||
if(!group) {
|
if(group->getState() == RequestGroup::STATE_ACTIVE) {
|
||||||
group = e->getRequestGroupMan()->findReservedGroup(gid);
|
|
||||||
if(!group) {
|
|
||||||
throw DL_ABORT_EX(fmt("Active Download not found for GID#%" PRId64 "", gid));
|
|
||||||
}
|
|
||||||
if(group->isDependencyResolved()) {
|
|
||||||
e->getRequestGroupMan()->removeReservedGroup(gid);
|
|
||||||
} else {
|
|
||||||
throw DL_ABORT_EX(fmt("GID#%" PRId64 " cannot be removed now", gid));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(forceRemove) {
|
if(forceRemove) {
|
||||||
group->setForceHaltRequested(true, RequestGroup::USER_REQUEST);
|
group->setForceHaltRequested(true, RequestGroup::USER_REQUEST);
|
||||||
} else {
|
} else {
|
||||||
group->setHaltRequested(true, RequestGroup::USER_REQUEST);
|
group->setHaltRequested(true, RequestGroup::USER_REQUEST);
|
||||||
}
|
}
|
||||||
e->setRefreshInterval(0);
|
e->setRefreshInterval(0);
|
||||||
|
} else {
|
||||||
|
if(group->isDependencyResolved()) {
|
||||||
|
e->getRequestGroupMan()->removeReservedGroup(gid);
|
||||||
|
} else {
|
||||||
|
throw DL_ABORT_EX(fmt("GID#%" PRId64 " cannot be removed now", gid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw DL_ABORT_EX(fmt("Active Download not found for GID#%" PRId64,
|
||||||
|
gid));
|
||||||
}
|
}
|
||||||
return createGIDResponse(gid);
|
return createGIDResponse(gid);
|
||||||
}
|
}
|
||||||
|
@ -445,19 +433,15 @@ SharedHandle<ValueBase> pauseDownload
|
||||||
const String* gidParam = checkRequiredParam<String>(req, 0);
|
const String* gidParam = checkRequiredParam<String>(req, 0);
|
||||||
|
|
||||||
a2_gid_t gid = str2Gid(gidParam);
|
a2_gid_t gid = str2Gid(gidParam);
|
||||||
bool reserved = false;
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
SharedHandle<RequestGroup> group =
|
if(group) {
|
||||||
e->getRequestGroupMan()->findRequestGroup(gid);
|
bool reserved = group->getState() == RequestGroup::STATE_WAITING;
|
||||||
if(!group) {
|
if(pauseRequestGroup(group, reserved, forcePause)) {
|
||||||
reserved = true;
|
|
||||||
group = e->getRequestGroupMan()->findReservedGroup(gid);
|
|
||||||
}
|
|
||||||
if(group && pauseRequestGroup(group, reserved, forcePause)) {
|
|
||||||
e->setRefreshInterval(0);
|
e->setRefreshInterval(0);
|
||||||
return createGIDResponse(gid);
|
return createGIDResponse(gid);
|
||||||
} else {
|
|
||||||
throw DL_ABORT_EX(fmt("GID#%" PRId64 " cannot be paused now", gid));
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
throw DL_ABORT_EX(fmt("GID#%" PRId64 " cannot be paused now", gid));
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
@ -517,9 +501,10 @@ SharedHandle<ValueBase> UnpauseRpcMethod::process
|
||||||
const String* gidParam = checkRequiredParam<String>(req, 0);
|
const String* gidParam = checkRequiredParam<String>(req, 0);
|
||||||
|
|
||||||
a2_gid_t gid = str2Gid(gidParam);
|
a2_gid_t gid = str2Gid(gidParam);
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
e->getRequestGroupMan()->findReservedGroup(gid);
|
if(!group ||
|
||||||
if(!group || !group->isPauseRequested()) {
|
group->getState() != RequestGroup::STATE_WAITING ||
|
||||||
|
!group->isPauseRequested()) {
|
||||||
throw DL_ABORT_EX(fmt("GID#%" PRId64 " cannot be unpaused now", gid));
|
throw DL_ABORT_EX(fmt("GID#%" PRId64 " cannot be unpaused now", gid));
|
||||||
} else {
|
} else {
|
||||||
group->setPauseRequested(false);
|
group->setPauseRequested(false);
|
||||||
|
@ -917,13 +902,13 @@ SharedHandle<ValueBase> GetFilesRpcMethod::process
|
||||||
|
|
||||||
a2_gid_t gid = str2Gid(gidParam);
|
a2_gid_t gid = str2Gid(gidParam);
|
||||||
SharedHandle<List> files = List::g();
|
SharedHandle<List> files = List::g();
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
findRequestGroup(e->getRequestGroupMan(), gid);
|
|
||||||
if(!group) {
|
if(!group) {
|
||||||
SharedHandle<DownloadResult> dr =
|
SharedHandle<DownloadResult> dr =
|
||||||
e->getRequestGroupMan()->findDownloadResult(gid);
|
e->getRequestGroupMan()->findDownloadResult(gid);
|
||||||
if(!dr) {
|
if(!dr) {
|
||||||
throw DL_ABORT_EX(fmt("No file data is available for GID#%" PRId64 "", gid));
|
throw DL_ABORT_EX(fmt("No file data is available for GID#%" PRId64 "",
|
||||||
|
gid));
|
||||||
} else {
|
} else {
|
||||||
createFileEntry(files, dr->fileEntries.begin(), dr->fileEntries.end(),
|
createFileEntry(files, dr->fileEntries.begin(), dr->fileEntries.end(),
|
||||||
dr->totalLength, dr->pieceLength, dr->bitfield);
|
dr->totalLength, dr->pieceLength, dr->bitfield);
|
||||||
|
@ -947,10 +932,9 @@ SharedHandle<ValueBase> GetUrisRpcMethod::process
|
||||||
const String* gidParam = checkRequiredParam<String>(req, 0);
|
const String* gidParam = checkRequiredParam<String>(req, 0);
|
||||||
|
|
||||||
a2_gid_t gid = str2Gid(gidParam);
|
a2_gid_t gid = str2Gid(gidParam);
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
findRequestGroup(e->getRequestGroupMan(), gid);
|
|
||||||
if(!group) {
|
if(!group) {
|
||||||
throw DL_ABORT_EX(fmt("No URI data is available for GID#%" PRId64 "", gid));
|
throw DL_ABORT_EX(fmt("No URI data is available for GID#%" PRId64, gid));
|
||||||
}
|
}
|
||||||
SharedHandle<List> uriList = List::g();
|
SharedHandle<List> uriList = List::g();
|
||||||
// TODO Current implementation just returns first FileEntry's URIs.
|
// TODO Current implementation just returns first FileEntry's URIs.
|
||||||
|
@ -967,10 +951,9 @@ SharedHandle<ValueBase> GetPeersRpcMethod::process
|
||||||
const String* gidParam = checkRequiredParam<String>(req, 0);
|
const String* gidParam = checkRequiredParam<String>(req, 0);
|
||||||
|
|
||||||
a2_gid_t gid = str2Gid(gidParam);
|
a2_gid_t gid = str2Gid(gidParam);
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
findRequestGroup(e->getRequestGroupMan(), gid);
|
|
||||||
if(!group) {
|
if(!group) {
|
||||||
throw DL_ABORT_EX(fmt("No peer data is available for GID#%" PRId64 "", gid));
|
throw DL_ABORT_EX(fmt("No peer data is available for GID#%" PRId64, gid));
|
||||||
}
|
}
|
||||||
SharedHandle<List> peers = List::g();
|
SharedHandle<List> peers = List::g();
|
||||||
const SharedHandle<BtObject>& btObject =
|
const SharedHandle<BtObject>& btObject =
|
||||||
|
@ -993,12 +976,9 @@ SharedHandle<ValueBase> TellStatusRpcMethod::process
|
||||||
std::vector<std::string> keys;
|
std::vector<std::string> keys;
|
||||||
toStringList(std::back_inserter(keys), keysParam);
|
toStringList(std::back_inserter(keys), keysParam);
|
||||||
|
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
e->getRequestGroupMan()->findRequestGroup(gid);
|
|
||||||
|
|
||||||
SharedHandle<Dict> entryDict = Dict::g();
|
SharedHandle<Dict> entryDict = Dict::g();
|
||||||
if(!group) {
|
|
||||||
group = e->getRequestGroupMan()->findReservedGroup(gid);
|
|
||||||
if(!group) {
|
if(!group) {
|
||||||
SharedHandle<DownloadResult> ds =
|
SharedHandle<DownloadResult> ds =
|
||||||
e->getRequestGroupMan()->findDownloadResult(gid);
|
e->getRequestGroupMan()->findDownloadResult(gid);
|
||||||
|
@ -1008,17 +988,15 @@ SharedHandle<ValueBase> TellStatusRpcMethod::process
|
||||||
gatherStoppedDownload(entryDict, ds, keys);
|
gatherStoppedDownload(entryDict, ds, keys);
|
||||||
} else {
|
} else {
|
||||||
if(requested_key(keys, KEY_STATUS)) {
|
if(requested_key(keys, KEY_STATUS)) {
|
||||||
|
if(group->getState() == RequestGroup::STATE_ACTIVE) {
|
||||||
|
entryDict->put(KEY_STATUS, VLB_ACTIVE);
|
||||||
|
} else {
|
||||||
if(group->isPauseRequested()) {
|
if(group->isPauseRequested()) {
|
||||||
entryDict->put(KEY_STATUS, VLB_PAUSED);
|
entryDict->put(KEY_STATUS, VLB_PAUSED);
|
||||||
} else {
|
} else {
|
||||||
entryDict->put(KEY_STATUS, VLB_WAITING);
|
entryDict->put(KEY_STATUS, VLB_WAITING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gatherProgress(entryDict, group, e, keys);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(requested_key(keys, KEY_STATUS)) {
|
|
||||||
entryDict->put(KEY_STATUS, VLB_ACTIVE);
|
|
||||||
}
|
}
|
||||||
gatherProgress(entryDict, group, e, keys);
|
gatherProgress(entryDict, group, e, keys);
|
||||||
}
|
}
|
||||||
|
@ -1188,20 +1166,17 @@ SharedHandle<ValueBase> ChangeOptionRpcMethod::process
|
||||||
const Dict* optsParam = checkRequiredParam<Dict>(req, 1);
|
const Dict* optsParam = checkRequiredParam<Dict>(req, 1);
|
||||||
|
|
||||||
a2_gid_t gid = str2Gid(gidParam);
|
a2_gid_t gid = str2Gid(gidParam);
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
e->getRequestGroupMan()->findRequestGroup(gid);
|
|
||||||
Option option;
|
Option option;
|
||||||
if(group) {
|
if(group) {
|
||||||
|
if(group->getState() == RequestGroup::STATE_ACTIVE) {
|
||||||
gatherChangeableOption(&option, optsParam);
|
gatherChangeableOption(&option, optsParam);
|
||||||
changeOption(group, option, e);
|
|
||||||
} else {
|
} else {
|
||||||
group = e->getRequestGroupMan()->findReservedGroup(gid);
|
|
||||||
if(group) {
|
|
||||||
gatherChangeableOptionForReserved(&option, optsParam);
|
gatherChangeableOptionForReserved(&option, optsParam);
|
||||||
|
}
|
||||||
changeOption(group, option, e);
|
changeOption(group, option, e);
|
||||||
} else {
|
} else {
|
||||||
throw DL_ABORT_EX(fmt("Cannot change option for GID#%" PRId64 "", gid));
|
throw DL_ABORT_EX(fmt("Cannot change option for GID#%" PRId64, gid));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return VLB_OK;
|
return VLB_OK;
|
||||||
}
|
}
|
||||||
|
@ -1286,8 +1261,7 @@ SharedHandle<ValueBase> GetOptionRpcMethod::process
|
||||||
const String* gidParam = checkRequiredParam<String>(req, 0);
|
const String* gidParam = checkRequiredParam<String>(req, 0);
|
||||||
|
|
||||||
a2_gid_t gid = str2Gid(gidParam);
|
a2_gid_t gid = str2Gid(gidParam);
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
findRequestGroup(e->getRequestGroupMan(), gid);
|
|
||||||
if(!group) {
|
if(!group) {
|
||||||
throw DL_ABORT_EX(fmt("Cannot get option for GID#%" PRId64 "", gid));
|
throw DL_ABORT_EX(fmt("Cannot get option for GID#%" PRId64 "", gid));
|
||||||
}
|
}
|
||||||
|
@ -1354,10 +1328,9 @@ SharedHandle<ValueBase> GetServersRpcMethod::process
|
||||||
const String* gidParam = checkRequiredParam<String>(req, 0);
|
const String* gidParam = checkRequiredParam<String>(req, 0);
|
||||||
|
|
||||||
a2_gid_t gid = str2Gid(gidParam);
|
a2_gid_t gid = str2Gid(gidParam);
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
e->getRequestGroupMan()->findRequestGroup(gid);
|
if(!group || group->getState() != RequestGroup::STATE_ACTIVE) {
|
||||||
if(!group) {
|
throw DL_ABORT_EX(fmt("No active download for GID#%" PRId64, gid));
|
||||||
throw DL_ABORT_EX(fmt("No active download for GID#%" PRId64 "", gid));
|
|
||||||
}
|
}
|
||||||
const SharedHandle<DownloadContext>& dctx = group->getDownloadContext();
|
const SharedHandle<DownloadContext>& dctx = group->getDownloadContext();
|
||||||
const std::vector<SharedHandle<FileEntry> >& files = dctx->getFileEntries();
|
const std::vector<SharedHandle<FileEntry> >& files = dctx->getFileEntries();
|
||||||
|
@ -1401,8 +1374,7 @@ SharedHandle<ValueBase> ChangeUriRpcMethod::process
|
||||||
bool posGiven = checkPosParam(posParam);
|
bool posGiven = checkPosParam(posParam);
|
||||||
size_t pos = posGiven ? posParam->i() : 0;
|
size_t pos = posGiven ? posParam->i() : 0;
|
||||||
size_t index = indexParam->i()-1;
|
size_t index = indexParam->i()-1;
|
||||||
SharedHandle<RequestGroup> group =
|
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||||
findRequestGroup(e->getRequestGroupMan(), gid);
|
|
||||||
if(!group) {
|
if(!group) {
|
||||||
throw DL_ABORT_EX(fmt("Cannot remove URIs from GID#%" PRId64 "", gid));
|
throw DL_ABORT_EX(fmt("Cannot remove URIs from GID#%" PRId64 "", gid));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue