summaryrefslogtreecommitdiffstats
path: root/other-licenses/nsis/Contrib/WebBrowser/Timers.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /other-licenses/nsis/Contrib/WebBrowser/Timers.cpp
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'other-licenses/nsis/Contrib/WebBrowser/Timers.cpp')
-rw-r--r--other-licenses/nsis/Contrib/WebBrowser/Timers.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/other-licenses/nsis/Contrib/WebBrowser/Timers.cpp b/other-licenses/nsis/Contrib/WebBrowser/Timers.cpp
new file mode 100644
index 0000000000..00844b7091
--- /dev/null
+++ b/other-licenses/nsis/Contrib/WebBrowser/Timers.cpp
@@ -0,0 +1,59 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0.If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <windows.h>
+#include "exdll.h"
+
+static void APIENTRY TimerCallback(LPVOID NSISFunctionAddr, DWORD, DWORD) {
+ g_executeCodeSegment((int)NSISFunctionAddr, nullptr);
+}
+
+PLUGINFUNCTION(CreateTimer) {
+ EXDLL_INIT();
+ extra->RegisterPluginCallback(gHInst, NSISPluginCallback);
+
+ TCHAR* funcAddrStr =
+ (TCHAR*)HeapAlloc(GetProcessHeap(), 0, g_stringsize * sizeof(TCHAR));
+ popstring(funcAddrStr);
+ // Apparently GetFunctionAddress returnes a 1-indexed offset, but
+ // ExecuteCodeSegment expects a 0-indexed one. Or something.
+ uintptr_t funcAddr = static_cast<uintptr_t>(_ttoi64(funcAddrStr)) - 1;
+ HeapFree(GetProcessHeap(), 0, funcAddrStr);
+
+ TCHAR* intervalStr =
+ (TCHAR*)HeapAlloc(GetProcessHeap(), 0, g_stringsize * sizeof(TCHAR));
+ popstring(intervalStr);
+ long interval = _ttol(intervalStr);
+ HeapFree(GetProcessHeap(), 0, intervalStr);
+
+ HANDLE timer = CreateWaitableTimer(nullptr, FALSE, nullptr);
+ if (!timer) {
+ return;
+ }
+
+ // The interval we were passed is in milliseconds, so we need to convert it
+ // to the 100-nanosecond units that SetWaitableTimer expects. We also need to
+ // make it negative, because that's what signifies a relative offset from now
+ // instead of an epoch-based time stamp.
+ LARGE_INTEGER dueTime;
+ dueTime.QuadPart = -(interval * 10000);
+
+ SetWaitableTimer(timer, &dueTime, interval, TimerCallback, (void*)funcAddr,
+ FALSE);
+
+ TCHAR timerStr[32] = _T("");
+ _ltot_s((long)timer, timerStr, 10);
+ pushstring(timerStr);
+}
+
+PLUGINFUNCTION(CancelTimer) {
+ TCHAR* timerStr =
+ (TCHAR*)HeapAlloc(GetProcessHeap(), 0, g_stringsize * sizeof(TCHAR));
+ popstring(timerStr);
+ HANDLE timer = reinterpret_cast<HANDLE>(_ttoi(timerStr));
+ HeapFree(GetProcessHeap(), 0, timerStr);
+
+ CancelWaitableTimer(timer);
+ CloseHandle(timer);
+}