diff options
Diffstat (limited to 'xmerge/source/activesync/XMergeFactory.cpp')
-rw-r--r-- | xmerge/source/activesync/XMergeFactory.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/xmerge/source/activesync/XMergeFactory.cpp b/xmerge/source/activesync/XMergeFactory.cpp new file mode 100644 index 000000000000..1c59cd79a8a0 --- /dev/null +++ b/xmerge/source/activesync/XMergeFactory.cpp @@ -0,0 +1,90 @@ +// XMergeFactory.cpp: implementation of the CXMergeFactory class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" + +#include "XMergeFilter.h" +#include "XMergeFactory.h" + +////////////////////////////////////////////////////////////////////// +// IUnknown implementation +////////////////////////////////////////////////////////////////////// +STDMETHODIMP CXMergeFactory::QueryInterface(REFIID riid, void **ppvObject) +{ + if(ppvObject == NULL) + return E_INVALIDARG; + + if(::IsEqualIID(riid, IID_IUnknown) || ::IsEqualIID(riid, IID_IClassFactory)) + { + *ppvObject = static_cast<IClassFactory*>(this); + } + else + { + *ppvObject = NULL; + return E_NOINTERFACE; + } + + reinterpret_cast<IUnknown*>(*ppvObject)->AddRef(); + return S_OK; +} + + +STDMETHODIMP_(ULONG) CXMergeFactory::AddRef() +{ + return ::InterlockedIncrement(&m_cRef); +} + + +STDMETHODIMP_(ULONG) CXMergeFactory::Release() +{ + if(::InterlockedDecrement(&m_cRef) == 0) + { + delete this; + return 0; + } + + return m_cRef; +} + + +////////////////////////////////////////////////////////////////////// +// IUnknown implementation +////////////////////////////////////////////////////////////////////// +STDMETHODIMP CXMergeFactory::CreateInstance(IUnknown *pUnkOuter, REFIID iid, void **ppvObject) +{ + if (ppvObject == NULL) + return E_INVALIDARG; + + if (pUnkOuter != NULL) // cannot aggregate + { + *ppvObject = NULL; + return CLASS_E_NOAGGREGATION; + } + + if (iid == IID_ICeFileFilter) + { + CXMergeFilter *pFilter = new CXMergeFilter(); + if(pFilter == NULL) + { + *ppvObject = NULL; + return E_OUTOFMEMORY; + } + + HRESULT hr = pFilter->QueryInterface(iid, ppvObject); + pFilter->Release(); + + return hr; + } + + return E_INVALIDARG; +} + + +STDMETHODIMP CXMergeFactory::LockServer(BOOL fLock) +{ + _Module.LockServer(fLock); + return S_OK; +} + + |