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