summaryrefslogtreecommitdiff
path: root/src/AbstractCommand.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/AbstractCommand.cc')
-rw-r--r--src/AbstractCommand.cc76
1 files changed, 60 insertions, 16 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc
index 0a2f78d3..6fe1d2ae 100644
--- a/src/AbstractCommand.cc
+++ b/src/AbstractCommand.cc
@@ -27,14 +27,14 @@
#include "Util.h"
#include "message.h"
#include "SleepCommand.h"
-
-#define TIMEOUT_SEC 5
+#include "prefs.h"
AbstractCommand::AbstractCommand(int cuid, Request* req, DownloadEngine* e, Socket* s):
Command(cuid), req(req), e(e), checkSocketIsReadable(false), checkSocketIsWritable(false) {
+
if(s != NULL) {
socket = new Socket(*s);
- e->addSocketForReadCheck(socket);
+ setReadCheckSocket(socket);
} else {
socket = NULL;
}
@@ -43,8 +43,8 @@ AbstractCommand::AbstractCommand(int cuid, Request* req, DownloadEngine* e, Sock
}
AbstractCommand::~AbstractCommand() {
- e->deleteSocketForReadCheck(socket);
- e->deleteSocketForWriteCheck(socket);
+ setReadCheckSocket(NULL);
+ setWriteCheckSocket(NULL);
if(socket != NULL) {
delete(socket);
}
@@ -58,10 +58,11 @@ bool AbstractCommand::isTimeoutDetected() {
struct timeval now;
gettimeofday(&now, NULL);
if(checkPoint.tv_sec == 0 && checkPoint.tv_usec == 0) {
+ checkPoint = now;
return false;
} else {
long long int elapsed = Util::difftv(now, checkPoint);
- if(elapsed >= TIMEOUT_SEC*1000000) {
+ if(elapsed >= e->option->getAsInt(PREF_TIMEOUT)*1000000) {
return true;
} else {
return false;
@@ -71,12 +72,11 @@ bool AbstractCommand::isTimeoutDetected() {
bool AbstractCommand::execute() {
try {
- if(checkSocketIsReadable && !socket->isReadable(0)
- || checkSocketIsWritable && !socket->isWritable(0)) {
+ if(checkSocketIsReadable && !readCheckTarget->isReadable(0)
+ || checkSocketIsWritable && !writeCheckTarget->isWritable(0)) {
if(isTimeoutDetected()) {
throw new DlRetryEx(EX_TIME_OUT);
}
- updateCheckPoint();
e->commands.push(this);
return false;
}
@@ -93,21 +93,21 @@ bool AbstractCommand::execute() {
return executeInternal(seg);
} catch(DlAbortEx* err) {
e->logger->error(MSG_DOWNLOAD_ABORTED, err, cuid);
- onError(err);
+ onAbort(err);
delete(err);
req->resetUrl();
return true;
} catch(DlRetryEx* err) {
e->logger->error(MSG_RESTARTING_DOWNLOAD, err, cuid);
- onError(err);
delete(err);
//req->resetUrl();
- req->addRetryCount();
- if(req->noMoreRetry()) {
- e->logger->error(MSG_MAX_RETRY, cuid);
+ req->addTryCount();
+ if(e->option->getAsInt(PREF_MAX_TRIES) != 0 &&
+ req->getTryCount() >= e->option->getAsInt(PREF_MAX_TRIES)) {
+ e->logger->error(MSG_MAX_TRY, cuid, req->getTryCount());
return true;
} else {
- return prepareForRetry(e->option->getAsInt("retry_wait"));
+ return prepareForRetry(e->option->getAsInt(PREF_RETRY_WAIT));
}
}
}
@@ -123,5 +123,49 @@ bool AbstractCommand::prepareForRetry(int wait) {
return true;
}
-void AbstractCommand::onError(Exception* e) {
+void AbstractCommand::onAbort(Exception* e) {
+}
+
+void AbstractCommand::setReadCheckSocket(Socket* socket) {
+ if(socket == NULL) {
+ if(checkSocketIsReadable) {
+ e->deleteSocketForReadCheck(readCheckTarget);
+ checkSocketIsReadable = false;
+ readCheckTarget = NULL;
+ }
+ } else {
+ if(checkSocketIsReadable) {
+ if(readCheckTarget != socket) {
+ e->deleteSocketForReadCheck(readCheckTarget);
+ e->addSocketForReadCheck(socket);
+ readCheckTarget = socket;
+ }
+ } else {
+ e->addSocketForReadCheck(socket);
+ checkSocketIsReadable = true;
+ readCheckTarget = socket;
+ }
+ }
+}
+
+void AbstractCommand::setWriteCheckSocket(Socket* socket) {
+ if(socket == NULL) {
+ if(checkSocketIsWritable) {
+ e->deleteSocketForWriteCheck(writeCheckTarget);
+ checkSocketIsWritable = false;
+ writeCheckTarget = NULL;
+ }
+ } else {
+ if(checkSocketIsWritable) {
+ if(writeCheckTarget != socket) {
+ e->deleteSocketForWriteCheck(writeCheckTarget);
+ e->addSocketForWriteCheck(socket);
+ writeCheckTarget = socket;
+ }
+ } else {
+ e->addSocketForWriteCheck(socket);
+ checkSocketIsWritable = true;
+ writeCheckTarget = socket;
+ }
+ }
}