1*f8e2c85aSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*f8e2c85aSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*f8e2c85aSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*f8e2c85aSAndrew Rist * distributed with this work for additional information 6*f8e2c85aSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*f8e2c85aSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*f8e2c85aSAndrew Rist * "License"); you may not use this file except in compliance 9*f8e2c85aSAndrew Rist * with the License. You may obtain a copy of the License at 10*f8e2c85aSAndrew Rist * 11*f8e2c85aSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*f8e2c85aSAndrew Rist * 13*f8e2c85aSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*f8e2c85aSAndrew Rist * software distributed under the License is distributed on an 15*f8e2c85aSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*f8e2c85aSAndrew Rist * KIND, either express or implied. See the License for the 17*f8e2c85aSAndrew Rist * specific language governing permissions and limitations 18*f8e2c85aSAndrew Rist * under the License. 19*f8e2c85aSAndrew Rist * 20*f8e2c85aSAndrew Rist *************************************************************/ 21*f8e2c85aSAndrew Rist 22*f8e2c85aSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_shell.hxx" 26cdf0e10cSrcweir #include "internal/global.hxx" 27cdf0e10cSrcweir #include "classfactory.hxx" 28cdf0e10cSrcweir #include "internal/infotips.hxx" 29cdf0e10cSrcweir #include "internal/propsheets.hxx" 30cdf0e10cSrcweir #include "internal/columninfo.hxx" 31cdf0e10cSrcweir #ifdef __MINGW32__ 32cdf0e10cSrcweir #include <algorithm> 33cdf0e10cSrcweir using ::std::max; 34cdf0e10cSrcweir using ::std::min; 35cdf0e10cSrcweir #endif 36cdf0e10cSrcweir #include "internal/thumbviewer.hxx" 37cdf0e10cSrcweir #include "internal/shlxthdl.hxx" 38cdf0e10cSrcweir 39cdf0e10cSrcweir //----------------------------- 40cdf0e10cSrcweir // 41cdf0e10cSrcweir //----------------------------- 42cdf0e10cSrcweir 43cdf0e10cSrcweir long CClassFactory::s_ServerLocks = 0; 44cdf0e10cSrcweir 45cdf0e10cSrcweir //----------------------------- 46cdf0e10cSrcweir // 47cdf0e10cSrcweir //----------------------------- 48cdf0e10cSrcweir 49cdf0e10cSrcweir CClassFactory::CClassFactory(const CLSID& clsid) : 50cdf0e10cSrcweir m_RefCnt(1), 51cdf0e10cSrcweir m_Clsid(clsid) 52cdf0e10cSrcweir { 53cdf0e10cSrcweir InterlockedIncrement(&g_DllRefCnt); 54cdf0e10cSrcweir } 55cdf0e10cSrcweir 56cdf0e10cSrcweir //----------------------------- 57cdf0e10cSrcweir // 58cdf0e10cSrcweir //----------------------------- 59cdf0e10cSrcweir 60cdf0e10cSrcweir CClassFactory::~CClassFactory() 61cdf0e10cSrcweir { 62cdf0e10cSrcweir InterlockedDecrement(&g_DllRefCnt); 63cdf0e10cSrcweir } 64cdf0e10cSrcweir 65cdf0e10cSrcweir //----------------------------- 66cdf0e10cSrcweir // IUnknown methods 67cdf0e10cSrcweir //----------------------------- 68cdf0e10cSrcweir 69cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CClassFactory::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject) 70cdf0e10cSrcweir { 71cdf0e10cSrcweir *ppvObject = 0; 72cdf0e10cSrcweir 73cdf0e10cSrcweir if (IID_IUnknown == riid || IID_IClassFactory == riid) 74cdf0e10cSrcweir { 75cdf0e10cSrcweir IUnknown* pUnk = this; 76cdf0e10cSrcweir pUnk->AddRef(); 77cdf0e10cSrcweir *ppvObject = pUnk; 78cdf0e10cSrcweir return S_OK; 79cdf0e10cSrcweir } 80cdf0e10cSrcweir 81cdf0e10cSrcweir return E_NOINTERFACE; 82cdf0e10cSrcweir } 83cdf0e10cSrcweir 84cdf0e10cSrcweir //----------------------------- 85cdf0e10cSrcweir // 86cdf0e10cSrcweir //----------------------------- 87cdf0e10cSrcweir 88cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CClassFactory::AddRef(void) 89cdf0e10cSrcweir { 90cdf0e10cSrcweir return InterlockedIncrement(&m_RefCnt); 91cdf0e10cSrcweir } 92cdf0e10cSrcweir 93cdf0e10cSrcweir //----------------------------- 94cdf0e10cSrcweir // 95cdf0e10cSrcweir //----------------------------- 96cdf0e10cSrcweir 97cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CClassFactory::Release(void) 98cdf0e10cSrcweir { 99cdf0e10cSrcweir long refcnt = InterlockedDecrement(&m_RefCnt); 100cdf0e10cSrcweir 101cdf0e10cSrcweir if (0 == refcnt) 102cdf0e10cSrcweir delete this; 103cdf0e10cSrcweir 104cdf0e10cSrcweir return refcnt; 105cdf0e10cSrcweir } 106cdf0e10cSrcweir 107cdf0e10cSrcweir //----------------------------- 108cdf0e10cSrcweir // IClassFactory methods 109cdf0e10cSrcweir //----------------------------- 110cdf0e10cSrcweir 111cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CClassFactory::CreateInstance( 112cdf0e10cSrcweir IUnknown __RPC_FAR *pUnkOuter, 113cdf0e10cSrcweir REFIID riid, 114cdf0e10cSrcweir void __RPC_FAR *__RPC_FAR *ppvObject) 115cdf0e10cSrcweir { 116cdf0e10cSrcweir if ((pUnkOuter != NULL)) 117cdf0e10cSrcweir return CLASS_E_NOAGGREGATION; 118cdf0e10cSrcweir 119cdf0e10cSrcweir IUnknown* pUnk = 0; 120cdf0e10cSrcweir 121cdf0e10cSrcweir if (CLSID_PROPERTYSHEET_HANDLER == m_Clsid) 122cdf0e10cSrcweir pUnk = static_cast<IShellExtInit*>(new CPropertySheet()); 123cdf0e10cSrcweir 124cdf0e10cSrcweir else if (CLSID_INFOTIP_HANDLER == m_Clsid) 125cdf0e10cSrcweir pUnk = static_cast<IQueryInfo*>(new CInfoTip()); 126cdf0e10cSrcweir 127cdf0e10cSrcweir else if (CLSID_COLUMN_HANDLER == m_Clsid) 128cdf0e10cSrcweir pUnk = static_cast<IColumnProvider*>(new CColumnInfo()); 129cdf0e10cSrcweir 130cdf0e10cSrcweir else if (CLSID_THUMBVIEWER_HANDLER == m_Clsid) 131cdf0e10cSrcweir pUnk = static_cast<IExtractImage*>(new CThumbviewer()); 132cdf0e10cSrcweir 133cdf0e10cSrcweir POST_CONDITION(pUnk != 0, "Could not create COM object"); 134cdf0e10cSrcweir 135cdf0e10cSrcweir if (0 == pUnk) 136cdf0e10cSrcweir return E_OUTOFMEMORY; 137cdf0e10cSrcweir 138cdf0e10cSrcweir HRESULT hr = pUnk->QueryInterface(riid, ppvObject); 139cdf0e10cSrcweir 140cdf0e10cSrcweir // if QueryInterface failed the component will destroy itself 141cdf0e10cSrcweir pUnk->Release(); 142cdf0e10cSrcweir 143cdf0e10cSrcweir return hr; 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir //----------------------------- 147cdf0e10cSrcweir // 148cdf0e10cSrcweir //----------------------------- 149cdf0e10cSrcweir 150cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CClassFactory::LockServer(BOOL fLock) 151cdf0e10cSrcweir { 152cdf0e10cSrcweir if (fLock) 153cdf0e10cSrcweir InterlockedIncrement(&s_ServerLocks); 154cdf0e10cSrcweir else 155cdf0e10cSrcweir InterlockedDecrement(&s_ServerLocks); 156cdf0e10cSrcweir 157cdf0e10cSrcweir return S_OK; 158cdf0e10cSrcweir } 159cdf0e10cSrcweir 160cdf0e10cSrcweir //----------------------------- 161cdf0e10cSrcweir // 162cdf0e10cSrcweir //----------------------------- 163cdf0e10cSrcweir 164cdf0e10cSrcweir bool CClassFactory::IsLocked() 165cdf0e10cSrcweir { 166cdf0e10cSrcweir return (s_ServerLocks > 0); 167cdf0e10cSrcweir } 168