1*cdf0e10cSrcweir // XMergeFactory.cpp: implementation of the CXMergeFactory class. 2*cdf0e10cSrcweir // 3*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 4*cdf0e10cSrcweir 5*cdf0e10cSrcweir #include "stdafx.h" 6*cdf0e10cSrcweir 7*cdf0e10cSrcweir #include "XMergeFilter.h" 8*cdf0e10cSrcweir #include "XMergeFactory.h" 9*cdf0e10cSrcweir 10*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 11*cdf0e10cSrcweir // IUnknown implementation 12*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 13*cdf0e10cSrcweir STDMETHODIMP CXMergeFactory::QueryInterface(REFIID riid, void **ppvObject) 14*cdf0e10cSrcweir { 15*cdf0e10cSrcweir if(ppvObject == NULL) 16*cdf0e10cSrcweir return E_INVALIDARG; 17*cdf0e10cSrcweir 18*cdf0e10cSrcweir if(::IsEqualIID(riid, IID_IUnknown) || ::IsEqualIID(riid, IID_IClassFactory)) 19*cdf0e10cSrcweir { 20*cdf0e10cSrcweir *ppvObject = static_cast<IClassFactory*>(this); 21*cdf0e10cSrcweir } 22*cdf0e10cSrcweir else 23*cdf0e10cSrcweir { 24*cdf0e10cSrcweir *ppvObject = NULL; 25*cdf0e10cSrcweir return E_NOINTERFACE; 26*cdf0e10cSrcweir } 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir reinterpret_cast<IUnknown*>(*ppvObject)->AddRef(); 29*cdf0e10cSrcweir return S_OK; 30*cdf0e10cSrcweir } 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir STDMETHODIMP_(ULONG) CXMergeFactory::AddRef() 34*cdf0e10cSrcweir { 35*cdf0e10cSrcweir return ::InterlockedIncrement(&m_cRef); 36*cdf0e10cSrcweir } 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir STDMETHODIMP_(ULONG) CXMergeFactory::Release() 40*cdf0e10cSrcweir { 41*cdf0e10cSrcweir if(::InterlockedDecrement(&m_cRef) == 0) 42*cdf0e10cSrcweir { 43*cdf0e10cSrcweir delete this; 44*cdf0e10cSrcweir return 0; 45*cdf0e10cSrcweir } 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir return m_cRef; 48*cdf0e10cSrcweir } 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 52*cdf0e10cSrcweir // IUnknown implementation 53*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 54*cdf0e10cSrcweir STDMETHODIMP CXMergeFactory::CreateInstance(IUnknown *pUnkOuter, REFIID iid, void **ppvObject) 55*cdf0e10cSrcweir { 56*cdf0e10cSrcweir if (ppvObject == NULL) 57*cdf0e10cSrcweir return E_INVALIDARG; 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir if (pUnkOuter != NULL) // cannot aggregate 60*cdf0e10cSrcweir { 61*cdf0e10cSrcweir *ppvObject = NULL; 62*cdf0e10cSrcweir return CLASS_E_NOAGGREGATION; 63*cdf0e10cSrcweir } 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir if (iid == IID_ICeFileFilter) 66*cdf0e10cSrcweir { 67*cdf0e10cSrcweir CXMergeFilter *pFilter = new CXMergeFilter(); 68*cdf0e10cSrcweir if(pFilter == NULL) 69*cdf0e10cSrcweir { 70*cdf0e10cSrcweir *ppvObject = NULL; 71*cdf0e10cSrcweir return E_OUTOFMEMORY; 72*cdf0e10cSrcweir } 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir HRESULT hr = pFilter->QueryInterface(iid, ppvObject); 75*cdf0e10cSrcweir pFilter->Release(); 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir return hr; 78*cdf0e10cSrcweir } 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir return E_INVALIDARG; 81*cdf0e10cSrcweir } 82*cdf0e10cSrcweir 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir STDMETHODIMP CXMergeFactory::LockServer(BOOL fLock) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir _Module.LockServer(fLock); 87*cdf0e10cSrcweir return S_OK; 88*cdf0e10cSrcweir } 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir 91