Pass first filename as 2nd argument to command specified by

--on-download-* option.
pull/1/head
Tatsuhiro Tsujikawa 2010-12-04 18:14:27 +09:00
parent c03ab007a3
commit 567b424907
4 changed files with 33 additions and 19 deletions

View File

@ -261,22 +261,23 @@ bool RequestGroupMan::removeReservedGroup(gid_t gid)
} }
namespace { namespace {
void executeStopHook void executeStopHook
(const SharedHandle<DownloadResult>& result, const Option* option) (const SharedHandle<RequestGroup>& group,
const Option* option,
error_code::Value result)
{ {
if(result->result == error_code::FINISHED && if(result == error_code::FINISHED &&
!option->blank(PREF_ON_DOWNLOAD_COMPLETE)) { !option->blank(PREF_ON_DOWNLOAD_COMPLETE)) {
util::executeHook(option->get(PREF_ON_DOWNLOAD_COMPLETE), util::executeHookByOptName(group, option, PREF_ON_DOWNLOAD_COMPLETE);
util::itos(result->gid)); } else if(result != error_code::IN_PROGRESS &&
} else if(result->result != error_code::IN_PROGRESS &&
!option->blank(PREF_ON_DOWNLOAD_ERROR)) { !option->blank(PREF_ON_DOWNLOAD_ERROR)) {
util::executeHook(option->get(PREF_ON_DOWNLOAD_ERROR), util::executeHookByOptName(group, option, PREF_ON_DOWNLOAD_ERROR);
util::itos(result->gid));
} else if(!option->blank(PREF_ON_DOWNLOAD_STOP)) { } else if(!option->blank(PREF_ON_DOWNLOAD_STOP)) {
util::executeHook(option->get(PREF_ON_DOWNLOAD_STOP), util::executeHookByOptName(group, option, PREF_ON_DOWNLOAD_STOP);
util::itos(result->gid));
} }
} }
} // namespace } // namespace
namespace { namespace {
@ -368,8 +369,8 @@ public:
} else { } else {
SharedHandle<DownloadResult> dr = group->createDownloadResult(); SharedHandle<DownloadResult> dr = group->createDownloadResult();
e_->getRequestGroupMan()->addDownloadResult(dr); e_->getRequestGroupMan()->addDownloadResult(dr);
executeStopHook(group, e_->getOption(), dr->result);
group->releaseRuntimeResource(e_); group->releaseRuntimeResource(e_);
executeStopHook(dr, e_->getOption());
} }
} }
} }

View File

@ -313,6 +313,7 @@ createBtMagnetRequestGroup(const std::string& magnetLink,
rg->setDiskWriterFactory rg->setDiskWriterFactory
(SharedHandle<DiskWriterFactory>(new ByteArrayDiskWriterFactory())); (SharedHandle<DiskWriterFactory>(new ByteArrayDiskWriterFactory()));
rg->setMetadataInfo(createMetadataInfo(magnetLink)); rg->setMetadataInfo(createMetadataInfo(magnetLink));
rg->markInMemoryDownload();
return rg; return rg;
} }
} // namespace } // namespace

View File

@ -80,6 +80,8 @@
#include "LogFactory.h" #include "LogFactory.h"
#include "Logger.h" #include "Logger.h"
#include "Option.h" #include "Option.h"
#include "DownloadContext.h"
#ifdef ENABLE_MESSAGE_DIGEST #ifdef ENABLE_MESSAGE_DIGEST
# include "MessageDigest.h" # include "MessageDigest.h"
# include "MessageDigestHelper.h" # include "MessageDigestHelper.h"
@ -1451,17 +1453,23 @@ void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group)
} }
} }
void executeHook(const std::string& command, const std::string& arg) namespace {
void executeHook
(const std::string& command,
const std::string& gid,
const std::string& firstFilename)
{ {
A2_LOG_INFO(fmt("Executing user command: %s %s", A2_LOG_INFO(fmt("Executing user command: %s %s %s",
command.c_str(), command.c_str(),
arg.c_str())); gid.c_str(),
firstFilename.c_str()));
#ifndef __MINGW32__ #ifndef __MINGW32__
pid_t cpid = fork(); pid_t cpid = fork();
if(cpid == -1) { if(cpid == -1) {
A2_LOG_ERROR("fork() failed. Cannot execute user command."); A2_LOG_ERROR("fork() failed. Cannot execute user command.");
} else if(cpid == 0) { } else if(cpid == 0) {
execl(command.c_str(), command.c_str(), arg.c_str(), execl(command.c_str(), command.c_str(), gid.c_str(), firstFilename.c_str(),
reinterpret_cast<char*>(0)); reinterpret_cast<char*>(0));
perror(("Could not execute user command: "+command).c_str()); perror(("Could not execute user command: "+command).c_str());
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -1476,7 +1484,7 @@ void executeHook(const std::string& command, const std::string& arg)
memset(&pi, 0, sizeof (pi)); memset(&pi, 0, sizeof (pi));
std::string cmdline = command; std::string cmdline = command;
strappend(cmdline, " ", arg); strappend(cmdline, " ", gid, " \"", firstFilename, "\"");
DWORD rc = CreateProcess( DWORD rc = CreateProcess(
NULL, NULL,
@ -1496,6 +1504,8 @@ void executeHook(const std::string& command, const std::string& arg)
#endif #endif
} }
} // namespace
void executeHookByOptName void executeHookByOptName
(const SharedHandle<RequestGroup>& group, const Option* option, (const SharedHandle<RequestGroup>& group, const Option* option,
const std::string& opt) const std::string& opt)
@ -1507,7 +1517,12 @@ void executeHookByOptName
(const RequestGroup* group, const Option* option, const std::string& opt) (const RequestGroup* group, const Option* option, const std::string& opt)
{ {
if(!option->blank(opt)) { if(!option->blank(opt)) {
executeHook(option->get(opt), util::itos(group->getGID())); const SharedHandle<DownloadContext> dctx = group->getDownloadContext();
std::string firstFilename;
if(!group->inMemoryDownload() && !dctx->getFileEntries().empty()) {
firstFilename = group->getFirstFilePath();
}
executeHook(option->get(opt), util::itos(group->getGID()), firstFilename);
} }
} }

View File

@ -416,9 +416,6 @@ bool inSameCidrBlock(const std::string& ip1, const std::string& ip2, int bits);
void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group); void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group);
// No throw
void executeHook(const std::string& command, const std::string& arg);
// No throw // No throw
void executeHookByOptName void executeHookByOptName
(const SharedHandle<RequestGroup>& group, const Option* option, (const SharedHandle<RequestGroup>& group, const Option* option,