diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /ipc/mscom/AgileReference.cpp | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ipc/mscom/AgileReference.cpp')
-rw-r--r-- | ipc/mscom/AgileReference.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/ipc/mscom/AgileReference.cpp b/ipc/mscom/AgileReference.cpp new file mode 100644 index 0000000000..76fe773b0a --- /dev/null +++ b/ipc/mscom/AgileReference.cpp @@ -0,0 +1,64 @@ +/* -*- 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/. */ + +#include "mozilla/mscom/AgileReference.h" + +#include <utility> +#include "mozilla/Assertions.h" +#include "mozilla/mscom/Utils.h" + +#if defined(__MINGW32__) + +// Declarations from Windows SDK specific to Windows 8.1 + +enum AgileReferenceOptions { + AGILEREFERENCE_DEFAULT = 0, + AGILEREFERENCE_DELAYEDMARSHAL = 1, +}; + +HRESULT WINAPI RoGetAgileReference(AgileReferenceOptions options, REFIID riid, + IUnknown* pUnk, + IAgileReference** ppAgileReference); + +// Unfortunately, at time of writing, MinGW doesn't know how to statically link +// to RoGetAgileReference. On these builds only, we substitute a runtime-linked +// function pointer. + +# include "mozilla/DynamicallyLinkedFunctionPtr.h" + +static const mozilla::StaticDynamicallyLinkedFunctionPtr< + decltype(&::RoGetAgileReference)> + pRoGetAgileReference(L"ole32.dll", "RoGetAgileReference"); + +# define RoGetAgileReference pRoGetAgileReference + +#endif // defined(__MINGW32__) + +namespace mozilla::mscom::detail { + +HRESULT AgileReference_CreateImpl(RefPtr<IAgileReference>& aRefPtr, REFIID riid, + IUnknown* aObject) { + MOZ_ASSERT(aObject); + MOZ_ASSERT(IsCOMInitializedOnCurrentThread()); + return ::RoGetAgileReference(AGILEREFERENCE_DEFAULT, riid, aObject, + getter_AddRefs(aRefPtr)); +} + +HRESULT AgileReference_ResolveImpl(RefPtr<IAgileReference> const& aRefPtr, + REFIID riid, void** aOutInterface) { + MOZ_ASSERT(aRefPtr); + MOZ_ASSERT(aOutInterface); + MOZ_ASSERT(IsCOMInitializedOnCurrentThread()); + + if (!aRefPtr || !aOutInterface) { + return E_INVALIDARG; + } + + *aOutInterface = nullptr; + return aRefPtr->Resolve(riid, aOutInterface); +} + +} // namespace mozilla::mscom::detail |