File indexing completed on 2024-04-21 05:42:25

0001 /*
0002   SPDX-FileCopyrightText: 2003-2006, Sergey Zorin. All rights reserved.
0003   SPDX-FileCopyrightText:  2018-2020 Michael Reeves reeves.87@gmail.com
0004   SPDX-License-Identifier: BSD-2-Clause
0005 */
0006 #include "class_factory.h"
0007 #include "diff_ext.h"
0008 #include "server.h"
0009 
0010 CLASS_FACTORY::CLASS_FACTORY() {
0011   _ref_count = 0L;
0012 
0013   SERVER::instance()->lock();
0014 }
0015 
0016 CLASS_FACTORY::~CLASS_FACTORY() {
0017   SERVER::instance()->release();
0018 }
0019 
0020 STDMETHODIMP
0021 CLASS_FACTORY::QueryInterface(REFIID riid, void** ppv) {
0022   HRESULT ret = E_NOINTERFACE;
0023   *ppv = nullptr;
0024 
0025   if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) {
0026     *ppv = static_cast<CLASS_FACTORY*>(this);
0027 
0028     AddRef();
0029 
0030     ret = NOERROR;
0031   }
0032 
0033   return ret;
0034 }
0035 
0036 STDMETHODIMP_(ULONG)
0037 CLASS_FACTORY::AddRef() {
0038   return InterlockedIncrement((LPLONG)&_ref_count);
0039 }
0040 
0041 STDMETHODIMP_(ULONG)
0042 CLASS_FACTORY::Release() {
0043   ULONG ret = 0L;
0044 
0045   if(InterlockedDecrement((LPLONG)&_ref_count) != 0)
0046     ret = _ref_count;
0047   else
0048     delete this;
0049 
0050   return ret;
0051 }
0052 
0053 STDMETHODIMP
0054 CLASS_FACTORY::CreateInstance(IUnknown* outer, REFIID refiid, void** obj) {
0055   HRESULT ret = CLASS_E_NOAGGREGATION;
0056   *obj = 0;
0057 
0058   // Shell extensions typically don't support aggregation (inheritance)
0059   if(outer == nullptr) {
0060     DIFF_EXT* ext = new DIFF_EXT();
0061 
0062     if(ext == nullptr)
0063       ret = E_OUTOFMEMORY;
0064     else
0065       ret = ext->QueryInterface(refiid, obj);
0066   }
0067 
0068   return ret;
0069 }
0070 
0071 STDMETHODIMP
0072 CLASS_FACTORY::LockServer(BOOL) {
0073   return NOERROR;
0074 }