summaryrefslogtreecommitdiffstats
path: root/ipc/mscom/ActivationContext.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /ipc/mscom/ActivationContext.h
parentInitial commit. (diff)
downloadfirefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz
firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ipc/mscom/ActivationContext.h')
-rw-r--r--ipc/mscom/ActivationContext.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/ipc/mscom/ActivationContext.h b/ipc/mscom/ActivationContext.h
new file mode 100644
index 0000000000..2f4635d32d
--- /dev/null
+++ b/ipc/mscom/ActivationContext.h
@@ -0,0 +1,100 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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/. */
+
+#ifndef mozilla_mscom_ActivationContext_h
+#define mozilla_mscom_ActivationContext_h
+
+#include <utility>
+
+#include "mozilla/Attributes.h"
+
+#if defined(MOZILLA_INTERNAL_API)
+# include "mozilla/ResultVariant.h"
+# include "nsString.h"
+#endif // defined(MOZILLA_INTERNAL_API)
+
+#include <windows.h>
+
+namespace mozilla {
+namespace mscom {
+
+class ActivationContext final {
+ public:
+ // This is the default resource ID that the Windows dynamic linker searches
+ // for when seeking a manifest while loading a DLL.
+ static constexpr WORD kDllManifestDefaultResourceId = 2;
+
+ ActivationContext() : mActCtx(INVALID_HANDLE_VALUE) {}
+
+ explicit ActivationContext(WORD aResourceId);
+ explicit ActivationContext(HMODULE aLoadFromModule,
+ WORD aResourceId = kDllManifestDefaultResourceId);
+
+ ActivationContext(ActivationContext&& aOther);
+ ActivationContext& operator=(ActivationContext&& aOther);
+
+ ActivationContext(const ActivationContext& aOther);
+ ActivationContext& operator=(const ActivationContext& aOther);
+
+ ~ActivationContext();
+
+ explicit operator bool() const { return mActCtx != INVALID_HANDLE_VALUE; }
+
+#if defined(MOZILLA_INTERNAL_API)
+ static Result<uintptr_t, HRESULT> GetCurrent();
+ static HRESULT GetCurrentManifestPath(nsAString& aOutManifestPath);
+#endif // defined(MOZILLA_INTERNAL_API)
+
+ private:
+ void Init(ACTCTX& aActCtx);
+ void AddRef();
+ void Release();
+
+ private:
+ HANDLE mActCtx;
+
+ friend class ActivationContextRegion;
+};
+
+class MOZ_NON_TEMPORARY_CLASS ActivationContextRegion final {
+ public:
+ template <typename... Args>
+ explicit ActivationContextRegion(Args&&... aArgs)
+ : mActCtx(std::forward<Args>(aArgs)...), mActCookie(0) {
+ Activate();
+ }
+
+ ActivationContextRegion();
+
+ explicit ActivationContextRegion(const ActivationContext& aActCtx);
+ ActivationContextRegion& operator=(const ActivationContext& aActCtx);
+
+ explicit ActivationContextRegion(ActivationContext&& aActCtx);
+ ActivationContextRegion& operator=(ActivationContext&& aActCtx);
+
+ ActivationContextRegion(ActivationContextRegion&& aRgn);
+ ActivationContextRegion& operator=(ActivationContextRegion&& aRgn);
+
+ ~ActivationContextRegion();
+
+ explicit operator bool() const { return !!mActCookie; }
+
+ ActivationContextRegion(const ActivationContextRegion&) = delete;
+ ActivationContextRegion& operator=(const ActivationContextRegion&) = delete;
+
+ bool Deactivate();
+
+ private:
+ void Activate();
+
+ ActivationContext mActCtx;
+ ULONG_PTR mActCookie;
+};
+
+} // namespace mscom
+} // namespace mozilla
+
+#endif // mozilla_mscom_ActivationContext_h