From ed5640d8b587fbcfed7dd7967f3de04b37a76f26 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:06:44 +0200 Subject: Adding upstream version 4:7.4.7. Signed-off-by: Daniel Baumann --- shell/source/win32/shlxthandler/classfactory.cxx | 137 +++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 shell/source/win32/shlxthandler/classfactory.cxx (limited to 'shell/source/win32/shlxthandler/classfactory.cxx') diff --git a/shell/source/win32/shlxthandler/classfactory.cxx b/shell/source/win32/shlxthandler/classfactory.cxx new file mode 100644 index 000000000..95da69252 --- /dev/null +++ b/shell/source/win32/shlxthandler/classfactory.cxx @@ -0,0 +1,137 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include "classfactory.hxx" +#include +#include +#include +#include +#include + + +LONG CClassFactory::s_ServerLocks = 0; + + +CClassFactory::CClassFactory(const CLSID& clsid) : + m_RefCnt(1), + m_Clsid(clsid) +{ + InterlockedIncrement(&g_DllRefCnt); +} + + +CClassFactory::~CClassFactory() +{ + InterlockedDecrement(&g_DllRefCnt); +} + + +// IUnknown methods + + +HRESULT STDMETHODCALLTYPE CClassFactory::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject) +{ + *ppvObject = nullptr; + + if (IID_IUnknown == riid || IID_IClassFactory == riid) + { + IUnknown* pUnk = this; + pUnk->AddRef(); + *ppvObject = pUnk; + return S_OK; + } + + return E_NOINTERFACE; +} + + +ULONG STDMETHODCALLTYPE CClassFactory::AddRef() +{ + return InterlockedIncrement(&m_RefCnt); +} + + +ULONG STDMETHODCALLTYPE CClassFactory::Release() +{ + LONG refcnt = InterlockedDecrement(&m_RefCnt); + + if (0 == refcnt) + delete this; + + return refcnt; +} + + +// IClassFactory methods + + +HRESULT STDMETHODCALLTYPE CClassFactory::CreateInstance( + IUnknown __RPC_FAR *pUnkOuter, + REFIID riid, + void __RPC_FAR *__RPC_FAR *ppvObject) +{ + if (pUnkOuter != nullptr) + return CLASS_E_NOAGGREGATION; + + IUnknown* pUnk = nullptr; + + if (CLSID_PROPERTYSHEET_HANDLER == m_Clsid) + pUnk = static_cast(new CPropertySheet()); + + else if (CLSID_INFOTIP_HANDLER == m_Clsid) + pUnk = static_cast(new CInfoTip()); + + else if (CLSID_COLUMN_HANDLER == m_Clsid) + pUnk = new CColumnInfo(); + + else if (CLSID_THUMBVIEWER_HANDLER == m_Clsid) + pUnk = static_cast(new CThumbviewer()); + + if (nullptr == pUnk) + { + return E_OUTOFMEMORY; + } + + HRESULT hr = pUnk->QueryInterface(riid, ppvObject); + + // if QueryInterface failed the component will destroy itself + pUnk->Release(); + + return hr; +} + + +HRESULT STDMETHODCALLTYPE CClassFactory::LockServer(BOOL fLock) +{ + if (fLock) + InterlockedIncrement(&s_ServerLocks); + else + InterlockedDecrement(&s_ServerLocks); + + return S_OK; +} + + +bool CClassFactory::IsLocked() +{ + return (s_ServerLocks > 0); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3