1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_shell.hxx" 30*cdf0e10cSrcweir #include "internal/global.hxx" 31*cdf0e10cSrcweir #include "classfactory.hxx" 32*cdf0e10cSrcweir #include "internal/infotips.hxx" 33*cdf0e10cSrcweir #include "internal/propsheets.hxx" 34*cdf0e10cSrcweir #include "internal/columninfo.hxx" 35*cdf0e10cSrcweir #ifdef __MINGW32__ 36*cdf0e10cSrcweir #include <algorithm> 37*cdf0e10cSrcweir using ::std::max; 38*cdf0e10cSrcweir using ::std::min; 39*cdf0e10cSrcweir #endif 40*cdf0e10cSrcweir #include "internal/thumbviewer.hxx" 41*cdf0e10cSrcweir #include "internal/shlxthdl.hxx" 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir //----------------------------- 44*cdf0e10cSrcweir // 45*cdf0e10cSrcweir //----------------------------- 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir long CClassFactory::s_ServerLocks = 0; 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir //----------------------------- 50*cdf0e10cSrcweir // 51*cdf0e10cSrcweir //----------------------------- 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir CClassFactory::CClassFactory(const CLSID& clsid) : 54*cdf0e10cSrcweir m_RefCnt(1), 55*cdf0e10cSrcweir m_Clsid(clsid) 56*cdf0e10cSrcweir { 57*cdf0e10cSrcweir InterlockedIncrement(&g_DllRefCnt); 58*cdf0e10cSrcweir } 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir //----------------------------- 61*cdf0e10cSrcweir // 62*cdf0e10cSrcweir //----------------------------- 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir CClassFactory::~CClassFactory() 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir InterlockedDecrement(&g_DllRefCnt); 67*cdf0e10cSrcweir } 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir //----------------------------- 70*cdf0e10cSrcweir // IUnknown methods 71*cdf0e10cSrcweir //----------------------------- 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CClassFactory::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject) 74*cdf0e10cSrcweir { 75*cdf0e10cSrcweir *ppvObject = 0; 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir if (IID_IUnknown == riid || IID_IClassFactory == riid) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir IUnknown* pUnk = this; 80*cdf0e10cSrcweir pUnk->AddRef(); 81*cdf0e10cSrcweir *ppvObject = pUnk; 82*cdf0e10cSrcweir return S_OK; 83*cdf0e10cSrcweir } 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir return E_NOINTERFACE; 86*cdf0e10cSrcweir } 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir //----------------------------- 89*cdf0e10cSrcweir // 90*cdf0e10cSrcweir //----------------------------- 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CClassFactory::AddRef(void) 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir return InterlockedIncrement(&m_RefCnt); 95*cdf0e10cSrcweir } 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir //----------------------------- 98*cdf0e10cSrcweir // 99*cdf0e10cSrcweir //----------------------------- 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CClassFactory::Release(void) 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir long refcnt = InterlockedDecrement(&m_RefCnt); 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir if (0 == refcnt) 106*cdf0e10cSrcweir delete this; 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir return refcnt; 109*cdf0e10cSrcweir } 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir //----------------------------- 112*cdf0e10cSrcweir // IClassFactory methods 113*cdf0e10cSrcweir //----------------------------- 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CClassFactory::CreateInstance( 116*cdf0e10cSrcweir IUnknown __RPC_FAR *pUnkOuter, 117*cdf0e10cSrcweir REFIID riid, 118*cdf0e10cSrcweir void __RPC_FAR *__RPC_FAR *ppvObject) 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir if ((pUnkOuter != NULL)) 121*cdf0e10cSrcweir return CLASS_E_NOAGGREGATION; 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir IUnknown* pUnk = 0; 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir if (CLSID_PROPERTYSHEET_HANDLER == m_Clsid) 126*cdf0e10cSrcweir pUnk = static_cast<IShellExtInit*>(new CPropertySheet()); 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir else if (CLSID_INFOTIP_HANDLER == m_Clsid) 129*cdf0e10cSrcweir pUnk = static_cast<IQueryInfo*>(new CInfoTip()); 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir else if (CLSID_COLUMN_HANDLER == m_Clsid) 132*cdf0e10cSrcweir pUnk = static_cast<IColumnProvider*>(new CColumnInfo()); 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir else if (CLSID_THUMBVIEWER_HANDLER == m_Clsid) 135*cdf0e10cSrcweir pUnk = static_cast<IExtractImage*>(new CThumbviewer()); 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir POST_CONDITION(pUnk != 0, "Could not create COM object"); 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir if (0 == pUnk) 140*cdf0e10cSrcweir return E_OUTOFMEMORY; 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir HRESULT hr = pUnk->QueryInterface(riid, ppvObject); 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir // if QueryInterface failed the component will destroy itself 145*cdf0e10cSrcweir pUnk->Release(); 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir return hr; 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir //----------------------------- 151*cdf0e10cSrcweir // 152*cdf0e10cSrcweir //----------------------------- 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CClassFactory::LockServer(BOOL fLock) 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir if (fLock) 157*cdf0e10cSrcweir InterlockedIncrement(&s_ServerLocks); 158*cdf0e10cSrcweir else 159*cdf0e10cSrcweir InterlockedDecrement(&s_ServerLocks); 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir return S_OK; 162*cdf0e10cSrcweir } 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir //----------------------------- 165*cdf0e10cSrcweir // 166*cdf0e10cSrcweir //----------------------------- 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir bool CClassFactory::IsLocked() 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir return (s_ServerLocks > 0); 171*cdf0e10cSrcweir } 172