diff options
Diffstat (limited to 'Src/Plugins/Library/ml_wire/ExternalCOM.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_wire/ExternalCOM.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_wire/ExternalCOM.cpp b/Src/Plugins/Library/ml_wire/ExternalCOM.cpp new file mode 100644 index 00000000..0586810d --- /dev/null +++ b/Src/Plugins/Library/ml_wire/ExternalCOM.cpp @@ -0,0 +1,85 @@ +#include "main.h" +#include "./externalCOM.h" +#include "./util.h" +#include "./rssCOM.h" + +#define DISPTABLE_CLASS ExternalCOM + +DISPTABLE_BEGIN() + DISPENTRY_ADD(DISPATCH_PODCAST, L"Podcast", OnPodcast) +DISPTABLE_END + +#undef DISPTABLE_CLASS + +ExternalCOM::ExternalCOM() +{} + +ExternalCOM::~ExternalCOM() +{} + +HRESULT ExternalCOM::CreateInstance(ExternalCOM **instance) +{ + if (NULL == instance) return E_POINTER; + + *instance = new ExternalCOM(); + if (NULL == *instance) return E_OUTOFMEMORY; + + return S_OK; +} + +STDMETHODIMP_( ULONG ) ExternalCOM::AddRef( void ) +{ + return _ref.fetch_add( 1 ); +} + +STDMETHODIMP_( ULONG ) ExternalCOM::Release( void ) +{ + if ( 0 == _ref.load() ) + return _ref.load(); + + LONG r = _ref.fetch_sub( 1 ); + if ( 0 == r ) + delete( this ); + + return r; +} + +STDMETHODIMP ExternalCOM::QueryInterface(REFIID riid, PVOID *ppvObject) +{ + if (NULL == ppvObject) return E_POINTER; + + if (IsEqualIID(riid, IID_IDispatch)) + *ppvObject = static_cast<IDispatch*>(this); + else if (IsEqualIID(riid, IID_IUnknown)) + *ppvObject = static_cast<IUnknown*>(this); + else + { + *ppvObject = NULL; + return E_NOINTERFACE; + } + + AddRef(); + return S_OK; +} + + +HRESULT ExternalCOM::OnPodcast(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + if (NULL != pvarResult) + { + VariantInit(pvarResult); + + RssCOM *rss; + if (SUCCEEDED(RssCOM::CreateInstance(&rss))) + { + V_VT(pvarResult) = VT_DISPATCH; + V_DISPATCH(pvarResult) = rss; + } + else + { + V_VT(pvarResult) = VT_NULL; + } + + } + return S_OK; +}
\ No newline at end of file |