From 463fae6c598ac8f980ed5f888169ca4f0893ecc0 Mon Sep 17 00:00:00 2001 From: Paper <37962225+mrpapersonic@users.noreply.github.com> Date: Sat, 2 Sep 2023 00:23:29 -0400 Subject: [PATCH 1/4] main.cc: prevent system from sleeping on Windows --- src/main.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.cc b/src/main.cc index f14cea6a..0816c336 100644 --- a/src/main.cc +++ b/src/main.cc @@ -68,7 +68,11 @@ error_code::Value main(int argc, char** argv) pargv[i] = winArgStrs.back().get(); } + SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED); + Context context(true, winArgc, pargv.get(), KeyVals()); + + SetThreadExecutionState(ES_CONTINUOUS); #else // !__MINGW32__ Context context(true, argc, argv, KeyVals()); #endif // !__MINGW32__ From 1f458f5a2da25ddd36e32cf18df55800b9bbfa05 Mon Sep 17 00:00:00 2001 From: Paper <37962225+mrpapersonic@users.noreply.github.com> Date: Sat, 2 Sep 2023 00:24:37 -0400 Subject: [PATCH 2/4] main.cc: update includes for Windows --- src/main.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.cc b/src/main.cc index 0816c336..fbaa9195 100644 --- a/src/main.cc +++ b/src/main.cc @@ -38,6 +38,7 @@ #ifdef __MINGW32__ # include +# include #endif // __MINGW32__ #include From 8f6a6484d2a823897478c53080bbbad168e3bc37 Mon Sep 17 00:00:00 2001 From: Paper <37962225+mrpapersonic@users.noreply.github.com> Date: Sat, 2 Sep 2023 00:52:46 -0400 Subject: [PATCH 3/4] *: make ignoring sleep mode optional --- src/Context.cc | 10 ++++++++++ src/OptionHandlerFactory.cc | 8 ++++++++ src/main.cc | 4 ---- src/prefs.cc | 2 ++ src/prefs.h | 2 ++ src/usage_text.h | 5 +++++ 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Context.cc b/src/Context.cc index d12775bb..0930ae14 100644 --- a/src/Context.cc +++ b/src/Context.cc @@ -221,6 +221,11 @@ Context::Context(bool standalone, int argc, char** argv, const KeyVals& options) if (op->getAsBool(PREF_DISABLE_IPV6)) { SocketCore::setProtocolFamily(AF_INET); } +#ifdef _WIN32 + if (op->getAsBool(PREF_DISABLE_SLEEP)) { + SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED); + } +#endif // _WIN32 SocketCore::setIpDscp(op->getAsInt(PREF_DSCP)); SocketCore::setSocketRecvBufferSize( op->getAsInt(PREF_SOCKET_RECV_BUFFER_SIZE)); @@ -313,6 +318,11 @@ Context::Context(bool standalone, int argc, char** argv, const KeyVals& options) reqinfo = std::make_shared(std::move(requestGroups), op, uriListParser); } +#ifdef _WIN32 + if (op->getAsBool(PREF_DISABLE_SLEEP)) { + SetThreadExecutionState(ES_CONTINUOUS); + } +#endif // _WIN32 } Context::~Context() = default; diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc index 2cd2c43e..1ed62275 100644 --- a/src/OptionHandlerFactory.cc +++ b/src/OptionHandlerFactory.cc @@ -738,6 +738,14 @@ std::vector OptionHandlerFactory::createOptionHandlers() op->addTag(TAG_ADVANCED); handlers.push_back(op); } +#if _WIN32 + { + OptionHandler* op(new BooleanOptionHandler( + PREF_DISABLE_SLEEP, TEXT_DISABLE_SLEEP, A2_V_FALSE, OptionHandler::OPT_ARG)); + op->addTag(TAG_ADVANCED); + handlers.push_back(op); + } +#endif // _WIN32 { OptionHandler* op(new BooleanOptionHandler( PREF_RPC_ALLOW_ORIGIN_ALL, TEXT_RPC_ALLOW_ORIGIN_ALL, A2_V_FALSE, diff --git a/src/main.cc b/src/main.cc index fbaa9195..e38f47f0 100644 --- a/src/main.cc +++ b/src/main.cc @@ -69,11 +69,7 @@ error_code::Value main(int argc, char** argv) pargv[i] = winArgStrs.back().get(); } - SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED); - Context context(true, winArgc, pargv.get(), KeyVals()); - - SetThreadExecutionState(ES_CONTINUOUS); #else // !__MINGW32__ Context context(true, argc, argv, KeyVals()); #endif // !__MINGW32__ diff --git a/src/prefs.cc b/src/prefs.cc index 2591b9f0..0e782391 100644 --- a/src/prefs.cc +++ b/src/prefs.cc @@ -335,6 +335,8 @@ PrefPtr PREF_STREAM_PIECE_SELECTOR = makePref("stream-piece-selector"); // value: true | false PrefPtr PREF_TRUNCATE_CONSOLE_READOUT = makePref("truncate-console-readout"); // value: true | false +PrefPtr PREF_DISABLE_SLEEP = makePref("disable-sleep-until-finished") +// value: true | false PrefPtr PREF_PAUSE = makePref("pause"); // value: default | full | hide PrefPtr PREF_DOWNLOAD_RESULT = makePref("download-result"); diff --git a/src/prefs.h b/src/prefs.h index 338fd6e6..aa259f39 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -288,6 +288,8 @@ extern PrefPtr PREF_STREAM_PIECE_SELECTOR; // value: true | false extern PrefPtr PREF_TRUNCATE_CONSOLE_READOUT; // value: true | false +extern PrefPtr PREF_DISABLE_SLEEP; +// value: true | false extern PrefPtr PREF_PAUSE; // value: default | full | hide extern PrefPtr PREF_DOWNLOAD_RESULT; diff --git a/src/usage_text.h b/src/usage_text.h index 0052b798..329daa6e 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -884,6 +884,11 @@ #define TEXT_TRUNCATE_CONSOLE_READOUT \ _(" --truncate-console-readout[=true|false] Truncate console readout to fit in\n"\ " a single line.") +#ifdef _WIN32 +#define TEXT_DISABLE_SLEEP + _(" --disable-sleep-until-finished[=true|false] Disables sleep mode on Windows\n" \ + " until downloads are finished.") +#endif // _WIN32 #define TEXT_PAUSE \ _(" --pause[=true|false] Pause download after added. This option is\n" \ " effective only when --enable-rpc=true is given.") From f308192f547b5fb33ed4cb9fa0529a138a615575 Mon Sep 17 00:00:00 2001 From: Paper Date: Sat, 2 Sep 2023 15:27:58 -0400 Subject: [PATCH 4/4] win32: print to the terminal if disabling sleep fails --- src/Context.cc | 3 ++- src/prefs.cc | 4 +++- src/prefs.h | 2 ++ src/usage_text.h | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Context.cc b/src/Context.cc index 0930ae14..9cbcfe6c 100644 --- a/src/Context.cc +++ b/src/Context.cc @@ -223,7 +223,8 @@ Context::Context(bool standalone, int argc, char** argv, const KeyVals& options) } #ifdef _WIN32 if (op->getAsBool(PREF_DISABLE_SLEEP)) { - SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED); + if (!SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED)) + A2_LOG_WARN("--disable-sleep-until-finished: Failed to disable sleep mode."); } #endif // _WIN32 SocketCore::setIpDscp(op->getAsInt(PREF_DSCP)); diff --git a/src/prefs.cc b/src/prefs.cc index 0e782391..332d190f 100644 --- a/src/prefs.cc +++ b/src/prefs.cc @@ -334,8 +334,10 @@ PrefPtr PREF_SHOW_CONSOLE_READOUT = makePref("show-console-readout"); PrefPtr PREF_STREAM_PIECE_SELECTOR = makePref("stream-piece-selector"); // value: true | false PrefPtr PREF_TRUNCATE_CONSOLE_READOUT = makePref("truncate-console-readout"); +#ifdef _WIN32 // value: true | false -PrefPtr PREF_DISABLE_SLEEP = makePref("disable-sleep-until-finished") +PrefPtr PREF_DISABLE_SLEEP = makePref("disable-sleep-until-finished"); +#endif // _WIN32 // value: true | false PrefPtr PREF_PAUSE = makePref("pause"); // value: default | full | hide diff --git a/src/prefs.h b/src/prefs.h index aa259f39..319a2fcb 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -287,8 +287,10 @@ extern PrefPtr PREF_SHOW_CONSOLE_READOUT; extern PrefPtr PREF_STREAM_PIECE_SELECTOR; // value: true | false extern PrefPtr PREF_TRUNCATE_CONSOLE_READOUT; +#ifdef _WIN32 // value: true | false extern PrefPtr PREF_DISABLE_SLEEP; +#endif // _WIN32 // value: true | false extern PrefPtr PREF_PAUSE; // value: default | full | hide diff --git a/src/usage_text.h b/src/usage_text.h index 329daa6e..cc0b0c99 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -885,7 +885,7 @@ _(" --truncate-console-readout[=true|false] Truncate console readout to fit in\n"\ " a single line.") #ifdef _WIN32 -#define TEXT_DISABLE_SLEEP +#define TEXT_DISABLE_SLEEP \ _(" --disable-sleep-until-finished[=true|false] Disables sleep mode on Windows\n" \ " until downloads are finished.") #endif // _WIN32