summaryrefslogtreecommitdiffstats
path: root/ipc/mscom/ActivationContext.h
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/mscom/ActivationContext.h')
-rw-r--r--ipc/mscom/ActivationContext.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/ipc/mscom/ActivationContext.h b/ipc/mscom/ActivationContext.h
new file mode 100644
index 0000000000..3d0144528d
--- /dev/null
+++ b/ipc/mscom/ActivationContext.h
@@ -0,0 +1,101 @@
+/* -*- 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"
+#include "mozilla/mscom/ActCtxResource.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(ActCtxResource aResource);
+ 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(ACTCTXW& 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