summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-07-16 14:22:57 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-07-16 14:22:57 +0000
commitb7e4018e45f98469670f05b2f12a28d91abc527a (patch)
treea5efc89b6a751cec4b625b0af6f3f7ccecd03d23 /src
parent906215317ac105d6dce718d9faf4b045637f923e (diff)
2010-07-16 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Moved executeHook and executeHookByOptName to util. * src/RequestGroupMan.cc * src/util.cc * src/util.h
Diffstat (limited to 'src')
-rw-r--r--src/RequestGroupMan.cc66
-rw-r--r--src/util.cc56
-rw-r--r--src/util.h7
3 files changed, 70 insertions, 59 deletions
diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc
index 8f8d2573..a1a8f6a4 100644
--- a/src/RequestGroupMan.cc
+++ b/src/RequestGroupMan.cc
@@ -250,71 +250,17 @@ bool RequestGroupMan::removeReservedGroup(gid_t gid)
}
}
-static void executeHook(const std::string& command, gid_t gid)
-{
- LogFactory::getInstance()->info("Executing user command: %s %s",
- command.c_str(), util::itos(gid).c_str());
-#ifndef __MINGW32__
- pid_t cpid = fork();
- if(cpid == -1) {
- LogFactory::getInstance()->error("fork() failed."
- " Cannot execute user command.");
- } else if(cpid == 0) {
- execl(command.c_str(), command.c_str(), util::itos(gid).c_str(),
- reinterpret_cast<char*>(0));
- perror(("Could not execute user command: "+command).c_str());
- exit(EXIT_FAILURE);
- }
-#else
- PROCESS_INFORMATION pi;
- STARTUPINFO si;
-
- memset(&si, 0, sizeof (si));
- si.cb = sizeof(STARTUPINFO);
-
- memset(&pi, 0, sizeof (pi));
-
- std::string cmdline = command;
- strappend(cmdline, " ", util::itos(gid));
-
- DWORD rc = CreateProcess(
- NULL,
- (LPSTR)cmdline.c_str(),
- NULL,
- NULL,
- true,
- NULL,
- NULL,
- 0,
- &si,
- &pi);
-
- if(!rc)
- LogFactory::getInstance()->error("CreateProcess() failed."
- " Cannot execute user command.");
-#endif
-}
-
-static void executeHookByOptName
-(const SharedHandle<RequestGroup>& group, const Option* option,
- const std::string& opt)
-{
- if(!option->blank(opt)) {
- executeHook(option->get(opt), group->getGID());
- }
-}
-
static void executeStopHook
(const SharedHandle<DownloadResult>& result, const Option* option)
{
if(result->result == downloadresultcode::FINISHED &&
!option->blank(PREF_ON_DOWNLOAD_COMPLETE)) {
- executeHook(option->get(PREF_ON_DOWNLOAD_COMPLETE), result->gid);
+ util::executeHook(option->get(PREF_ON_DOWNLOAD_COMPLETE), result->gid);
} else if(result->result != downloadresultcode::IN_PROGRESS &&
!option->blank(PREF_ON_DOWNLOAD_ERROR)) {
- executeHook(option->get(PREF_ON_DOWNLOAD_ERROR), result->gid);
+ util::executeHook(option->get(PREF_ON_DOWNLOAD_ERROR), result->gid);
} else if(!option->blank(PREF_ON_DOWNLOAD_STOP)) {
- executeHook(option->get(PREF_ON_DOWNLOAD_STOP), result->gid);
+ util::executeHook(option->get(PREF_ON_DOWNLOAD_STOP), result->gid);
}
}
@@ -400,7 +346,8 @@ public:
group->releaseRuntimeResource(e_);
if(group->isPauseRequested()) {
group->setForceHaltRequested(false);
- executeHookByOptName(group, e_->getOption(), PREF_ON_DOWNLOAD_PAUSE);
+ util::executeHookByOptName
+ (group, e_->getOption(), PREF_ON_DOWNLOAD_PAUSE);
// TODO Should we have to prepend spend uris to remaining uris
// in case PREF_REUSE_URI is disabed?
} else {
@@ -546,7 +493,8 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
++count;
e->addCommand(commands);
commands.clear();
- executeHookByOptName(groupToAdd, e->getOption(), PREF_ON_DOWNLOAD_START);
+ util::executeHookByOptName
+ (groupToAdd, e->getOption(), PREF_ON_DOWNLOAD_START);
} catch(RecoverableException& ex) {
logger_->error(EX_EXCEPTION_CAUGHT, ex);
if(logger_->debug()) {
diff --git a/src/util.cc b/src/util.cc
index 2300234a..ea708f31 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -78,6 +78,8 @@
#include "bitfield.h"
#include "DownloadHandlerConstants.h"
#include "RequestGroup.h"
+#include "LogFactory.h"
+#include "Option.h"
#ifdef ENABLE_MESSAGE_DIGEST
# include "MessageDigestHelper.h"
#endif // ENABLE_MESSAGE_DIGEST
@@ -1344,6 +1346,60 @@ void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group)
}
}
+void executeHook(const std::string& command, gid_t gid)
+{
+ LogFactory::getInstance()->info("Executing user command: %s %s",
+ command.c_str(), util::itos(gid).c_str());
+#ifndef __MINGW32__
+ pid_t cpid = fork();
+ if(cpid == -1) {
+ LogFactory::getInstance()->error("fork() failed."
+ " Cannot execute user command.");
+ } else if(cpid == 0) {
+ execl(command.c_str(), command.c_str(), util::itos(gid).c_str(),
+ reinterpret_cast<char*>(0));
+ perror(("Could not execute user command: "+command).c_str());
+ exit(EXIT_FAILURE);
+ }
+#else
+ PROCESS_INFORMATION pi;
+ STARTUPINFO si;
+
+ memset(&si, 0, sizeof (si));
+ si.cb = sizeof(STARTUPINFO);
+
+ memset(&pi, 0, sizeof (pi));
+
+ std::string cmdline = command;
+ strappend(cmdline, " ", util::itos(gid));
+
+ DWORD rc = CreateProcess(
+ NULL,
+ (LPSTR)cmdline.c_str(),
+ NULL,
+ NULL,
+ true,
+ NULL,
+ NULL,
+ 0,
+ &si,
+ &pi);
+
+ if(!rc)
+ LogFactory::getInstance()->error("CreateProcess() failed."
+ " Cannot execute user command.");
+#endif
+}
+
+void executeHookByOptName
+(const SharedHandle<RequestGroup>& group, const Option* option,
+ const std::string& opt)
+{
+ if(!option->blank(opt)) {
+ executeHook(option->get(opt), group->getGID());
+ }
+}
+
} // namespace util
} // namespace aria2
diff --git a/src/util.h b/src/util.h
index 9e1c2a5f..4767d0c7 100644
--- a/src/util.h
+++ b/src/util.h
@@ -63,6 +63,7 @@ class BitfieldMan;
class BinaryStream;
class FileEntry;
class RequestGroup;
+class Option;
#define STRTOLL(X) strtoll(X, reinterpret_cast<char**>(0), 10)
#define STRTOULL(X) strtoull(X, reinterpret_cast<char**>(0), 10)
@@ -395,6 +396,12 @@ bool inSameCidrBlock(const std::string& ip1, const std::string& ip2, int bits);
void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group);
+void executeHook(const std::string& command, gid_t gid);
+
+void executeHookByOptName
+(const SharedHandle<RequestGroup>& group, const Option* option,
+ const std::string& opt);
+
} // namespace util
} // namespace aria2