summaryrefslogtreecommitdiff
path: root/src/FileEntry.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-03-06 14:21:43 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-03-06 14:21:43 +0000
commitb1713e63738839e861f0b10ef6ad58f0e93aef3e (patch)
treef10b44c5e2b06ceb3cbe756fbbc865485c018702 /src/FileEntry.cc
parent61b2b88c29accbc5a4b04471abbd5cc7e38c4baf (diff)
2010-03-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added changeUri XML-RPC method. This method removes/adds URIs dynamically. * doc/aria2c.1.txt * src/AbstractCommand.cc * src/DownloadContext.cc * src/DownloadContext.h * src/FileEntry.cc * src/FileEntry.h * src/Request.cc * src/Request.h * src/RequestGroup.cc * src/RequestGroupMan.cc * src/XmlRpcMethodFactory.cc * src/XmlRpcMethodImpl.cc * src/XmlRpcMethodImpl.h * test/FileEntryTest.cc * test/XmlRpcMethodTest.cc
Diffstat (limited to 'src/FileEntry.cc')
-rw-r--r--src/FileEntry.cc49
1 files changed, 48 insertions, 1 deletions
diff --git a/src/FileEntry.cc b/src/FileEntry.cc
index adc12da4..db0ff1b9 100644
--- a/src/FileEntry.cc
+++ b/src/FileEntry.cc
@@ -218,7 +218,9 @@ void FileEntry::storePool(const SharedHandle<Request>& request)
void FileEntry::poolRequest(const SharedHandle<Request>& request)
{
removeRequest(request);
- storePool(request);
+ if(!request->removalRequested()) {
+ storePool(request);
+ }
}
bool FileEntry::removeRequest(const SharedHandle<Request>& request)
@@ -330,4 +332,49 @@ void FileEntry::releaseRuntimeResource()
_uriResults.clear();
}
+template<typename InputIterator, typename T>
+static InputIterator findRequestByUri
+(InputIterator first, InputIterator last, const T& uri)
+{
+ for(; first != last; ++first) {
+ if(!(*first)->removalRequested() && (*first)->getUrl() == uri) {
+ return first;
+ }
+ }
+ return last;
+}
+
+bool FileEntry::removeUri(const std::string& uri)
+{
+ std::deque<std::string>::iterator itr =
+ std::find(_spentUris.begin(), _spentUris.end(), uri);
+ if(itr == _spentUris.end()) {
+ itr = std::find(_uris.begin(), _uris.end(), uri);
+ if(itr == _uris.end()) {
+ return false;
+ } else {
+ _uris.erase(itr);
+ return true;
+ }
+ } else {
+ _spentUris.erase(itr);
+ SharedHandle<Request> req;
+ std::deque<SharedHandle<Request> >::iterator riter =
+ findRequestByUri(_inFlightRequests.begin(), _inFlightRequests.end(), uri);
+ if(riter == _inFlightRequests.end()) {
+ riter = findRequestByUri(_requestPool.begin(), _requestPool.end(), uri);
+ if(riter == _requestPool.end()) {
+ return true;
+ } else {
+ req = *riter;
+ _requestPool.erase(riter);
+ }
+ } else {
+ req = *riter;
+ }
+ req->requestRemoval();
+ return true;
+ }
+}
+
} // namespace aria2