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
CClassFactory(const CLSID & clsid)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
~CClassFactory()60cdf0e10cSrcweir CClassFactory::~CClassFactory()
61cdf0e10cSrcweir {
62cdf0e10cSrcweir InterlockedDecrement(&g_DllRefCnt);
63cdf0e10cSrcweir }
64cdf0e10cSrcweir
65cdf0e10cSrcweir //-----------------------------
66cdf0e10cSrcweir // IUnknown methods
67cdf0e10cSrcweir //-----------------------------
68cdf0e10cSrcweir
QueryInterface(REFIID riid,void __RPC_FAR * __RPC_FAR * ppvObject)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
AddRef(void)88cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CClassFactory::AddRef(void)
89cdf0e10cSrcweir {
90cdf0e10cSrcweir return InterlockedIncrement(&m_RefCnt);
91cdf0e10cSrcweir }
92cdf0e10cSrcweir
93cdf0e10cSrcweir //-----------------------------
94cdf0e10cSrcweir //
95cdf0e10cSrcweir //-----------------------------
96cdf0e10cSrcweir
Release(void)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
CreateInstance(IUnknown __RPC_FAR * pUnkOuter,REFIID riid,void __RPC_FAR * __RPC_FAR * ppvObject)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
LockServer(BOOL fLock)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
IsLocked()164cdf0e10cSrcweir bool CClassFactory::IsLocked()
165cdf0e10cSrcweir {
166cdf0e10cSrcweir return (s_ServerLocks > 0);
167cdf0e10cSrcweir }
168