diff options
Diffstat (limited to 'xmerge/source/activesync/XMergeFactory.cpp')
-rw-r--r-- | xmerge/source/activesync/XMergeFactory.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/xmerge/source/activesync/XMergeFactory.cpp b/xmerge/source/activesync/XMergeFactory.cpp new file mode 100644 index 000000000000..024771d1e011 --- /dev/null +++ b/xmerge/source/activesync/XMergeFactory.cpp @@ -0,0 +1,92 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +// 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; +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |